summaryrefslogtreecommitdiff
path: root/systems/msdos
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 /systems/msdos
Initial commit
Diffstat (limited to 'systems/msdos')
-rw-r--r--systems/msdos/GNU-texindex/texindex.README47
-rw-r--r--systems/msdos/asc2tex/asc2tex.txt18
-rw-r--r--systems/msdos/bbibtex.zoomsdosbin0 -> 103593 bytes
-rw-r--r--systems/msdos/djgpp/00_index.txt48
-rw-r--r--systems/msdos/djgpp/TeX.README641
l---------systems/msdos/dos-tp1
-rw-r--r--systems/msdos/dostp22/README183
-rw-r--r--systems/msdos/dpmigcc/nt09c.txt25
-rw-r--r--systems/msdos/dpmigcc/nt09cemx.txt19
-rw-r--r--systems/msdos/dpmigcc/rsxn141r.txt20
-rw-r--r--systems/msdos/dpmigcc/rsxnt141.txt22
-rw-r--r--systems/msdos/dpmigcc/rsxwdk2.txt40
-rw-r--r--systems/msdos/dpmigcc/rsxwdk2p.txt29
-rw-r--r--systems/msdos/dpmigcc/rsxwin31.txt31
-rw-r--r--systems/msdos/dviware/dvilj4/commands.h65
-rw-r--r--systems/msdos/dviware/dvilj4/config.h131
-rw-r--r--systems/msdos/dviware/dvilj4/dvi2xx.c4427
-rw-r--r--systems/msdos/dviware/dvilj4/emu387bin0 -> 42766 bytes
-rw-r--r--systems/msdos/dviware/dvilj4/findfile.c121
-rw-r--r--systems/msdos/dviware/dvilj4/lj4.bat15
-rw-r--r--systems/msdos/dviware/dvilj4/makefile73
-rw-r--r--systems/msdos/dviware/dvips/maketexp.bat52
-rw-r--r--systems/msdos/dviware/dvips/readme.pc113
l---------systems/msdos/dviware/dviwin1
-rw-r--r--systems/msdos/dviware/pccrude.zoobin0 -> 91057 bytes
-rw-r--r--systems/msdos/dviware/xdvi-dos/copying249
-rw-r--r--systems/msdos/dviware/xdvi-dos/copying.dj63
-rw-r--r--systems/msdos/dviware/xdvi-dos/read_dvx.tex79
-rw-r--r--systems/msdos/dviware/xdvi-dos/read_dvx.txt76
-rw-r--r--systems/msdos/dviware/xdvi-dos/readme268
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/dvi.h62
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/dvi_draw.c1049
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/dvi_init.c639
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/font_ope.c887
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/fontfmts.c21
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/fontsub.c62
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/gf.c294
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/makefile36
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/makefile.bak36
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/maketexp141
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/patchlev.h1
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/pk.c324
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/pxl.c166
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/tpic.c434
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/util.c216
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/vf.c123
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/xdvi.c3175
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/xdvi.h509
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/xdvi.ico27
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/xdvi_cur.h9
-rw-r--r--systems/msdos/dviware/xdvi-dos/src/xdvi_mas.h7
-rw-r--r--systems/msdos/dviware/xdvi-dos/texfonts.sub74
-rw-r--r--systems/msdos/dviware/xdvi-dos/xdvi.man396
-rw-r--r--systems/msdos/e4t/e4t-deu.html118
-rw-r--r--systems/msdos/e4t/e4t-eng.html109
-rw-r--r--systems/msdos/e4t/e4tinfod.txt11
-rw-r--r--systems/msdos/e4t/e4tinfoe.txt11
-rw-r--r--systems/msdos/e4t/e4tmihlp.txt11
-rw-r--r--systems/msdos/e4t/liesmich.e4t71
-rw-r--r--systems/msdos/e4t/readme.e4t64
-rw-r--r--systems/msdos/easytex/readme.txt322
-rw-r--r--systems/msdos/emtex-contrib/TeXtelmExtel/95_09_26.ver2
-rw-r--r--systems/msdos/emtex-contrib/TeXtelmExtel/read1st.txt106
-rw-r--r--systems/msdos/emtex-contrib/TeXtelmExtel/whatsnew.txt53
-rw-r--r--systems/msdos/emtex-contrib/bonus/emtex.tex1476
-rw-r--r--systems/msdos/emtex-contrib/contrib/bj10e.dvidot65
-rw-r--r--systems/msdos/emtex-contrib/contrib/diskette.bat526
-rw-r--r--systems/msdos/emtex-contrib/cyrtug/README9
-rw-r--r--systems/msdos/emtex-contrib/dpinnn/README96
-rw-r--r--systems/msdos/emtex-contrib/dvimfj/doc/dvimfj.doc24
-rw-r--r--systems/msdos/emtex-contrib/dvimfj/dvimfj.cfg36
-rw-r--r--systems/msdos/emtex-contrib/dvimfj/dvimfj.src/c.bat13
-rw-r--r--systems/msdos/emtex-contrib/dvimfj/dvimfj.src/commands.h67
-rw-r--r--systems/msdos/emtex-contrib/dvimfj/dvimfj.src/disdvi.c454
-rw-r--r--systems/msdos/emtex-contrib/dvimfj/dvimfj.src/dvimfj.c631
-rw-r--r--systems/msdos/emtex-contrib/edit-4.33/README35
-rw-r--r--systems/msdos/emtex-contrib/emt2tex/e2t_read.me49
-rw-r--r--systems/msdos/emtex-contrib/emtexgi/readme.txt14
-rw-r--r--systems/msdos/emtex-contrib/hp2tex/what_it.is111
-rw-r--r--systems/msdos/emtex-contrib/makeinst/readme.1st7
-rw-r--r--systems/msdos/emtex-contrib/zemtex/lj1990.cnf16
-rw-r--r--systems/msdos/emtex-contrib/zemtex/lj1992.cnf18
-rw-r--r--systems/msdos/emtex-contrib/zemtex/lj_amsz.flibin0 -> 251222 bytes
-rw-r--r--systems/msdos/emtex-contrib/zemtex/oz.tex1483
-rw-r--r--systems/msdos/emtex-contrib/zemtex/zemtex11.doc203
-rw-r--r--systems/msdos/emtex-fonts/contrib/00readme23
-rw-r--r--systems/msdos/emtex-fonts/contrib/ams101.flibin0 -> 287487 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/cmcyrfnt/INSTALL108
-rw-r--r--systems/msdos/emtex-fonts/contrib/cmcyrfnt/README49
-rw-r--r--systems/msdos/emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.flibin0 -> 1965043 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/dc_all.mfj81
-rw-r--r--systems/msdos/emtex-fonts/contrib/fdori101.flibin0 -> 608706 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/lj_dc_a.flibin0 -> 1541563 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/lj_dc_b.flibin0 -> 1674351 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/p6h_dc.readme16
-rw-r--r--systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgzbin0 -> 1290497 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgzbin0 -> 1449000 bytes
-rw-r--r--systems/msdos/emtex-fonts/contrib/testdc.tex58
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/README.fx_med_fonts21
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_0.flibin0 -> 332733 bytes
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_1.flibin0 -> 378921 bytes
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_2.flibin0 -> 436317 bytes
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_3.flibin0 -> 508265 bytes
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_4.flibin0 -> 597645 bytes
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_5.flibin0 -> 716081 bytes
-rw-r--r--systems/msdos/emtex-fonts/fx_med_fonts/fx_med_h.flibin0 -> 353621 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/README.PS189
-rw-r--r--systems/msdos/emtex-fonts/psfonts/fonttst1.tex68
-rw-r--r--systems/msdos/emtex-fonts/psfonts/fonttst2.tex30
-rw-r--r--systems/msdos/emtex-fonts/psfonts/lj.cnf12
-rw-r--r--systems/msdos/emtex-fonts/psfonts/newfonts.sub47
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_0.flibin0 -> 1260136 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_1.flibin0 -> 318265 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_2.flibin0 -> 485093 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_3.flibin0 -> 515917 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_4.flibin0 -> 631781 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_5.flibin0 -> 726233 bytes
-rw-r--r--systems/msdos/emtex-fonts/psfonts/ps_h.flibin0 -> 290905 bytes
-rw-r--r--systems/msdos/emtex/CHANGES.ENG460
-rw-r--r--systems/msdos/emtex/CHANGES.GER478
-rw-r--r--systems/msdos/emtex/DISKETTE.DOC82
-rw-r--r--systems/msdos/emtex/HELP.ENG1131
-rw-r--r--systems/msdos/emtex/HELP.GER1223
-rw-r--r--systems/msdos/emtex/INSTALL.ENG786
-rw-r--r--systems/msdos/emtex/INSTALL.GER846
-rw-r--r--systems/msdos/emtex/QUICK.ENG329
-rw-r--r--systems/msdos/emtex/QUICK.GER342
-rw-r--r--systems/msdos/emtex/README.BET235
-rw-r--r--systems/msdos/emtex/README.ENG579
-rw-r--r--systems/msdos/emtex/README.GER598
-rw-r--r--systems/msdos/emtex/bj_base.flibin0 -> 683063 bytes
-rw-r--r--systems/msdos/emtex/dj_base.flibin0 -> 578547 bytes
l---------systems/msdos/emtex/dvips1
-rw-r--r--systems/msdos/emtex/fax_base.flibin0 -> 395515 bytes
-rw-r--r--systems/msdos/emtex/fx_base.flibin0 -> 441499 bytes
-rw-r--r--systems/msdos/emtex/install.datbin0 -> 128481 bytes
-rw-r--r--systems/msdos/emtex/install.ovlbin0 -> 71680 bytes
-rw-r--r--systems/msdos/emtex/ito_base.flibin0 -> 316803 bytes
-rw-r--r--systems/msdos/emtex/lj_base.flibin0 -> 572499 bytes
-rw-r--r--systems/msdos/emtex/ljh_base.flibin0 -> 1226903 bytes
-rw-r--r--systems/msdos/emtex/p6h_base.flibin0 -> 683851 bytes
-rw-r--r--systems/msdos/emtex/p6l_base.flibin0 -> 363627 bytes
-rw-r--r--systems/msdos/emtex/p6m_base.flibin0 -> 450303 bytes
-rw-r--r--systems/msdos/emtex/qj_base.flibin0 -> 385079 bytes
-rw-r--r--systems/msdos/emtex/sty_base.flibin0 -> 690327 bytes
-rw-r--r--systems/msdos/ergotex/read_me40
l---------systems/msdos/ftetx1
-rw-r--r--systems/msdos/gtexedit/readme.asc23
-rw-r--r--systems/msdos/jemtex2/fontable.c178
-rw-r--r--systems/msdos/jemtex2/fontable.pas152
-rw-r--r--systems/msdos/jemtex2/jem2tex.c1317
-rw-r--r--systems/msdos/jemtex2/jem2tex.pas1209
-rw-r--r--systems/msdos/jemtex2/jguide.tex3660
-rw-r--r--systems/msdos/jemtex2/jis24bin0 -> 562032 bytes
-rw-r--r--systems/msdos/jemtex2/jis2mf.c996
-rw-r--r--systems/msdos/jemtex2/jis2mf.pas939
-rw-r--r--systems/msdos/lalaunch/lalaunch.cfg148
-rw-r--r--systems/msdos/lalaunch/readme.txt459
-rw-r--r--systems/msdos/lalaunch/vbrun300.dllbin0 -> 398416 bytes
-rw-r--r--systems/msdos/lated/readme.txt99
l---------systems/msdos/lxmail1
l---------systems/msdos/mma2ltx1
-rw-r--r--systems/msdos/musfilt/README55
-rw-r--r--systems/msdos/nb4latex/README31
-rw-r--r--systems/msdos/picins/picins.LIESMICH32
l---------systems/msdos/public-mf1
l---------systems/msdos/public-tex1
-rw-r--r--systems/msdos/pxlgen/mvcloi.if3bin0 -> 63452 bytes
-rw-r--r--systems/msdos/pxlgen/mvssbx10.if3bin0 -> 44950 bytes
-rw-r--r--systems/msdos/pxlgen/mvtt10.if3bin0 -> 46436 bytes
-rw-r--r--systems/msdos/pxlgen/readme131
-rw-r--r--systems/msdos/pxlgen/tfm.libbin0 -> 5224 bytes
-rw-r--r--systems/msdos/sbtex/dvf04.boo2719
-rw-r--r--systems/msdos/sbtex/dvf04.doc35
-rw-r--r--systems/msdos/sbtex/te.doc38
-rw-r--r--systems/msdos/ted/readme.ted481
-rw-r--r--systems/msdos/texshell/readme.ts153
-rw-r--r--systems/msdos/texshell/temesy18.lzhbin0 -> 735891 bytes
-rw-r--r--systems/msdos/text2dvi/text2dvi.doc665
-rw-r--r--systems/msdos/text2dvi/text2dvi.tblbin0 -> 2809 bytes
-rw-r--r--systems/msdos/tx/copying339
-rw-r--r--systems/msdos/tx/news6
-rw-r--r--systems/msdos/tx/readme58
-rw-r--r--systems/msdos/tx/src/frame.c30
-rw-r--r--systems/msdos/tx/src/makefile36
-rw-r--r--systems/msdos/tx/src/makefile.gcc37
-rw-r--r--systems/msdos/tx/src/spawno.doc486
-rw-r--r--systems/msdos/tx/src/spawns.libbin0 -> 14846 bytes
-rw-r--r--systems/msdos/tx/src/tx.c269
-rw-r--r--systems/msdos/tx/src/tx.h19
-rw-r--r--systems/msdos/tx/src/tx.rsp13
-rw-r--r--systems/msdos/tx/src/txcomm.c45
-rw-r--r--systems/msdos/tx/src/txdefs.h93
-rw-r--r--systems/msdos/tx/src/txdir.c352
-rw-r--r--systems/msdos/tx/src/txexpand.c64
-rw-r--r--systems/msdos/tx/src/txmain.c72
-rw-r--r--systems/msdos/tx/src/txmenu.c130
-rw-r--r--systems/msdos/tx/src/txprompt.c27
-rw-r--r--systems/msdos/tx/tx.cnf68
-rw-r--r--systems/msdos/tx/tx.doc324
-rwxr-xr-xsystems/msdos/tx1/!tx1read.doc848
l---------systems/msdos/tx1/READ.ME1
-rw-r--r--systems/msdos/utilities/beta/beta30sw.doc43
-rw-r--r--systems/msdos/utilities/vfcomb/vfc-eng.pdfbin0 -> 258690 bytes
-rw-r--r--systems/msdos/utilities/vfcomb/vfc-eng.tex2421
-rw-r--r--systems/msdos/vga2mf/00readme.txt83
-rw-r--r--systems/msdos/vga2mf/cp437.egabin0 -> 3584 bytes
-rw-r--r--systems/msdos/vga2mf/cp437.vgabin0 -> 4096 bytes
-rw-r--r--systems/msdos/vga2mf/cp850.egabin0 -> 3584 bytes
-rw-r--r--systems/msdos/vga2mf/cp850.vgabin0 -> 4096 bytes
-rw-r--r--systems/msdos/vga2mf/cp860.egabin0 -> 3584 bytes
-rw-r--r--systems/msdos/vga2mf/cp860.vgabin0 -> 4096 bytes
-rw-r--r--systems/msdos/vga2mf/cp863.egabin0 -> 3584 bytes
-rw-r--r--systems/msdos/vga2mf/cp863.vgabin0 -> 4096 bytes
-rw-r--r--systems/msdos/vga2mf/cp865.egabin0 -> 3584 bytes
-rw-r--r--systems/msdos/vga2mf/cp865.vgabin0 -> 4096 bytes
-rw-r--r--systems/msdos/vga2mf/cp880dv.egabin0 -> 3584 bytes
-rw-r--r--systems/msdos/vga2mf/cp880dv.vgabin0 -> 4096 bytes
-rw-r--r--systems/msdos/vga2mf/ega2mf.c187
-rw-r--r--systems/msdos/vga2mf/foo.bar10
-rw-r--r--systems/msdos/vga2mf/vga2mf.c193
-rw-r--r--systems/msdos/vga2mf/wnpc10.mf3420
-rw-r--r--systems/msdos/vga2mf/wnpc10.tex35
l---------systems/msdos/web1
224 files changed, 52823 insertions, 0 deletions
diff --git a/systems/msdos/GNU-texindex/texindex.README b/systems/msdos/GNU-texindex/texindex.README
new file mode 100644
index 0000000000..8c221048fd
--- /dev/null
+++ b/systems/msdos/GNU-texindex/texindex.README
@@ -0,0 +1,47 @@
+Christian Spieler Thursday, 02-April-1992
+
+This archive contains a patched version of the GNU index sorter
+"texindex" from the texinfo-2.14 package.
+The patches have been applied to get a working texindex on MSDOS systems.
+
+Contents of the archive:
+
+ texindex.c - the patched source
+ getopt.c - ..
+ getopt.h - ..
+ texindex.exe - executable for MSDOS compiled by MSC 5.10
+ alloca.mar - GNU's alloca() replacement for VMS
+ changes - a hacked change log
+ 00readme - this file
+
+Some hint for compiling on MSDOS:
+- The program needs a lot of data space, you have to use a large data model.
+ Since the code fits into one 64k segment, compact model is sufficient.
+- The default MSC stack allocation is too small. Reserving 8 kByte (0x2000)
+ of stack space seems to be sufficient for MSC.
+- For MSC 5.1, the following command should compile an executable (nearly)
+ identical to the distributed file:
+
+ cl -AC -Ox -W3 -Fm -F 2000 texindex.c getopt.c /link /exe
+
+ (The -W3 and -Fm flags are optional, remove them if you do not want
+ warning messages or a map file.)
+
+--
+Christian Spieler
+<spieler@linac.ikp.physik.th-darmstadt.de>
+
+
+======================================================================
+
+I have added texindex.pch which is a patch file to produce
+Christian's versions from the original ones. (Of course, you might
+also produce the original ones with this file, just call patch with
+-R.) And I've added COPYING (thou shalt not have an distribution
+without it ;-).
+
+Thanks to him for the fine work.
+
+--
+Joachim Schrod
+<schrod@iti.informatik.th-darmstadt.de>
diff --git a/systems/msdos/asc2tex/asc2tex.txt b/systems/msdos/asc2tex/asc2tex.txt
new file mode 100644
index 0000000000..9dff333f43
--- /dev/null
+++ b/systems/msdos/asc2tex/asc2tex.txt
@@ -0,0 +1,18 @@
+ASC2TeX ist ein Programm, mit dem Bildschirmfotos (ASCII)
+von IBM-PC's in eine LaTeX--Picture--Umgebung gewandelt werden
+koennen.
+Es setzt dabei fast alle Zeichen der Codepage 850 um.
+Diese Codepage deckt sich im wesentlichen mit der
+haeufig gebrauchten Page 437.
+Obwohl nur fuer Bildschirmfotos gedacht, koennen beliebige
+ASCII--Dateien umgesetzt werden, solange gewisse Randbedingungen
+eingehalten werden. Eine deutsche Bedienungsanleitung liegt bei.
+
+Lauffaehig ist ASC2TeX sowohl unter MS-DOS als auch unter
+OS/2 (ab 2.0).
+
+ASC2TeX darf frei kopiert werden, solange keine Gebuehr erhoben
+wird, die die reinen Kopierkosten wesentlich uebersteigt.
+
+Viel Spass
+ Thomas Goetz (in TeX: Thomas G\"otz)
diff --git a/systems/msdos/bbibtex.zoomsdos b/systems/msdos/bbibtex.zoomsdos
new file mode 100644
index 0000000000..8cfc622541
--- /dev/null
+++ b/systems/msdos/bbibtex.zoomsdos
Binary files differ
diff --git a/systems/msdos/djgpp/00_index.txt b/systems/msdos/djgpp/00_index.txt
new file mode 100644
index 0000000000..8f484fbd55
--- /dev/null
+++ b/systems/msdos/djgpp/00_index.txt
@@ -0,0 +1,48 @@
+Note: This list was created on Tue May 20 21:30 EST 2003
+Some files may have been added or deleted since that date.
+Contact dj@delorie.com (DJ Delorie) for additional information.
+
+NOTE: Type B is Binary; Type A is ASCII
+
+Directory v2apps/tex/
+ Filename Type Length Date Description
+=================================================
+TeX.README A 31,306 981110 a README file
+bm2fo20b.zip B 91,387 001210 Bm2font 2.0 binaries for Djgpp V2
+bm2fo20d.zip B 948,926 001210 Bm2font 2.0 documentation
+bm2fo20s.zip B 513,755 001210 Bm2font 2.0 sources
+dpdf094b.zip B 2,446,006 001117 DVI to PDF converter
+dpdf094s.zip B 261,705 001117 DVI to PDF converter sources
+dtl060b.zip B 92,105 000513 DTL package
+dtl060s.zip B 111,074 981105 DTL package sources
+dvdj09b.zip B 983,352 000513 DVI drivers for DeskJet 500/500c/550c printers
+dvdj09s.zip B 40,592 981105 DVI drivers for DeskJet 500/500c/550c printers
+dvdv11b.zip B 51,614 000513 Dvi2Dvi package
+dvdv11s.zip B 91,790 981105 Dvi2Dvi package sources
+dvga09b.zip B 986,750 000513 A DVI previewer for VGA (source in dvdj09s.zip)
+dvlj26b.zip B 1,348,429 000513 DVI drivers for LaserJet printers
+dvlj26s.zip B 134,371 981105 DVI drivers for LaserJet printers
+dvps578b.zip B 1,330,287 000513 DviPS driver
+dvps578s.zip B 1,022,897 981105 DviPS driver sources
+gspk116b.zip B 241,059 000513 GSFtoPK font-conversion program
+gspk116s.zip B 94,575 981105 GSFtoPK font-conversion program sources
+kpse32b.zip B 1,027,257 000513 Kpathsea library
+kpse32s.zip B 837,246 981105 Kpathsea library sources
+lchk126b.zip B 61,556 000513 LaCheck program
+lchk126s.zip B 79,592 981105 LaCheck program sources
+mflx083b.zip B 48,804 000513 MusicFlex program 0.8.3 for DJGPP V2
+mflx083s.zip B 71,312 981110 MusicFlex program 0.8.3 sources
+midx213b.zip B 108,761 000513 makeindex 2.13 for DJGPP V2
+midx213s.zip B 116,172 981110 makeindex 2.13 sources
+odps578b.zip B 154,438 000513 Omega DviPS 5.78 for DJGPP V2
+odps578s.zip B 219,062 981110 Omega DviPS 5.78 sources
+pspk15b.zip B 308,065 000513 PS2Pkm font-generation program
+pspk15s.zip B 322,124 981105 PS2Pkm font-generation program sources
+seet31b.zip B 177,434 000513 Seetex package 3.1
+seet31s.zip B 200,893 981105 Seetex package 3.1 sources
+t4ht-a8b.zip B 1,180,623 000513 TeX4Htm program (generates HTML) v.alpha-8
+t4ht-a8s.zip B 196,661 981105 TeX4Htm program (generates HTML) sources
+tmflib75.zip B 4,464,230 981105 Texmflib 7.5 for Web2c
+webc72b.zip B 3,473,296 000513 Web and Web2c v7.2
+webc72d.zip B 1,017,080 001108 Docs for Web2c, DviPS, Kpathsea
+webc72s.zip B 2,617,495 981105 Web and Web2c v7.2 sources
diff --git a/systems/msdos/djgpp/TeX.README b/systems/msdos/djgpp/TeX.README
new file mode 100644
index 0000000000..1d8226a5b4
--- /dev/null
+++ b/systems/msdos/djgpp/TeX.README
@@ -0,0 +1,641 @@
+
+ README file for the DJGPP port of TeX and related programs
+ ----------------------------------------------------------
+
+I. General
+ -------
+
+ This is a port of the Texk/Web2c 7.2b distribution to DJGPP v2.01.
+ The original Texk distribution is on CTAN mirror sites; primary
+ locations are:
+
+ ftp://ftp.cdrom.com/pub/tex/ctan (California, USA)
+ ftp://ftp.dante.de/tex-archive (Germany)
+ ftp://ftp.tex.ac.uk/tex-archive (England)
+
+ (``CTAN'' means ``Comprehensive TeX Archive Network''.) Texk is
+ stored on CTAN in several files:
+
+ systems/web2c/texklib.tar.gz
+ systems/web2c/web.tar.gz
+ systems/web2c/web2c.tar.gz
+ dviware/dvipsk.tar.gz
+ dviware/dviljk.tar.gz
+
+ The original source distributions of other TeX-related programs can
+ be found on CTAN either under the dviware directory or under the
+ support directory.
+
+ For more info about CTAN sites and the original source distributions
+ of the programs see the file etc/unixtex.ftp.
+
+ The ported binaries are split into several zip files:
+
+ tmflib75.zip -- the minimal TeX and Metafont library, required
+ webc72b.zip -- Web2c, TeX and related programs, optional
+ kpse32b.zip -- Kpathsea path-search library, optional
+ dvlj26b.zip -- DVI drivers for LaserJet printers, optional
+ dvps578b.zip -- DVI driver for PostScript printers, optional
+ dvga09b.zip -- DVI previewer for VGA adapters, optional
+ dvdj09b.zip -- DVI drivers for DeskJet printers, optional
+ dtl060b.zip -- DTL package for editing DVI files, optional
+ dvdv11b.zip -- Dvidvi, selects/rearranges DVI files, optional
+ gspk116b.zip -- Gsf2PK, creates PK fonts from GS fonts, optional
+ lchk126b.zip -- Lacheck, LaTeX document checker, optional
+ midx213b.zip -- MakeIndex, TeX/Troff index generator, optional
+ mflx083b.zip -- MusixFlx, line-breaking for MusixTeX, optional
+ odps578b.zip -- ODviPS, DviPS with Omega extensions, optional
+ pspk15b.zip -- Ps2Pk, creates PK fonts from PS type1, optional
+ seet31b.zip -- SeeTeX package, manipulates DVI files, optional
+ t4ht-a8b.zip -- TeX4HT, generates HTML from TeX input, optional
+
+ `dvlj26b.zip' includes drivers for LaserJet (dvilj), LaserJet 2P
+ (dvilj2p) and LaserJet 4 or later (dvilj4) printers; most people
+ will only need one of these programs, for whatever printer they
+ have.
+
+ `dvdj09b.zip' includes drivers for DeskJet 500 (dvi500), 500C
+ (dvi500c) and 550C (dvi550c) printers (dvi500c and dvi550c are
+ actually just ``symlinks'' to dvi500).
+
+ If you'd like to download the entire binary distribution, just
+ grab all these files and install them as described in section II
+ below. Note that some files appear in more than one zip archive,
+ so it is normal to get prompts from your unzip program asking
+ whether to overwrite existing files.
+
+ Typically, if you only want to work with TeX and print DVI files,
+ you will need some, but not all, of the *b.zip files marked as
+ ``optional'' above. However, since certain parts of Texk require
+ other parts at run time, it is not enough to download only the
+ package that you need. For example, if you only need to be able
+ to print DVI files on LaserJet printers, `dvlj26b.zip' alone will
+ not do, as it lacks the basic fonts used to generate missing fonts
+ on the fly.
+
+ One way to describe the dependencies between the various parts of
+ Texk is to list the main tasks that it allows you to perform and
+ tell which programs do you need to install for every task. The
+ following matrix shows that:
+
+ tmfl webc kpse dvlj dvps dvdj dvga
+ -----------------------------------------------------------------
+ Generate DVI files + +
+ Print DVI on LJ printer + +
+ Print DVI on DJ printer + +
+ Print DVI on PS printer + +
+ Preview TeX documents + +
+ Develop with Kpathsea + +
+ Print TeX documents + + ? ? ? +
+ Literate programming +
+ -----------------------------------------------------------------
+ Approximate disk space 25M 7M 2M 3M 3M 2M 2M
+
+ (A question mark `?' means you need one of the marked packages,
+ depending on the type of your printer.)
+
+ Note that ODviPS requires DviPS to be installed.
+
+ The above table also lists the necessary disk space for each
+ package; if you install all of them, you will need about 36Mbytes.
+ (These numbers may vary depending on your disk cluster size; on a
+ FAT-16 disk that is larger than 1GB, multiply the above numbers by
+ a factor of 2.)
+
+ Additional programs not listed in the table above are only needed
+ for specialized tasks that they are meant for. The above short
+ description of each package should give you a clue if you need it.
+ In general, if you want to be able to print documents with as many
+ fonts as possible, and if you have Ghostscript or PostScript type1
+ fonts installed on your system, you'll want Gsf2PK and Ps2Pk; if you
+ need to rearrange, edit, concatenate, and generally move around DVI
+ files, you'll want DTL, DviDvi and SeeTeX packages; and if you write
+ a lot of TeX documents, grab Lacheck and Makeindex.
+
+ Some other related tasks are printing Texinfo docs or converting
+ Texinfo documentation to PostScript format. For these, you will
+ need the `texindex' program and the `texi2dvi' shell script from
+ the GNU Texinfo package (available in v2gnu/txiNNNb.zip from DJGPP
+ archives), and the packages required to print a DVI file on your
+ type of printer, as listed in the above matrix.
+
+ The Web2c distribution (webcNNb.zip file) also includes Knuth's
+ `tangle' and `weave' programs. These will probably be unused
+ unless you want to experiment with so-called ``Literate
+ programming'' whereby the sources and the formatted docs of a
+ program are produced from a single master file written in a
+ special language called `Web'. (These programs are here because
+ TeX, MetaFont and other programs were themselves written by Donald
+ Knuth in Web.) If you are interested in this, check out some of
+ the news groups devoted to literate programming.
+
+ Note that the Texmflib distribution does not (and cannot) include
+ all the fonts that are required for typesetting various documents.
+ It only includes the basic fonts that are widely used in typical
+ jobs. If you encounter a case where the `maketex...' programs
+ cannot create a missing font, you will need to find it on one of
+ the CTAN sites (see the URLs at the beginning of this README
+ file). The fonts are kept on CTAN sites in the tex-archive/fonts
+ directory (look for files with a .tfm extension). Missing macro
+ packages (*.sty and *.?tx files) can be found in the
+ tex-archive/macros directory.
+
+ The sources are also divided into several zip files:
+
+ webc72s.zip -- original Knuth's programs and Web-to-C converter,
+ kpse32s.zip -- Kpathsea[rch] library for generic path searching
+ dvps578s.zip -- Dvipsk sources
+ dvlj26s.zip -- Dviljk sources
+ dvdj09s.zip -- sources for DeskJet drivers and the VGA previewer
+ dtl060s.zip -- sources for the DTL package
+ dvdv11s.zip -- sources for the dvidvi programs
+ gspk116s.zip -- sources of Gsf2PK program
+ lchk126s.zip -- sources for lacheck
+ midx213s.zip -- sources for makeindex program
+ mflx083s.zip -- sources for musixflx program
+ odps578s.zip -- sources for odvips
+ pspk15s.zip -- sources of the ps2pk package
+ seet31s.zip -- sources for the seetex package
+ t4ht-a8s.zip -- sources of the tex4ht program
+
+
+II. Installation of the binary packages
+ -----------------------------------
+
+ - Unzip the downloaded archives from the root of your DJGPP
+ installation tree. If you are doing this on Windows 9x, use an
+ unzip program that supports long filenames. Don't forget the
+ `-d' switch if you are using PKUNZIP.
+
+ - If your DJGPP.ENV includes the following two lines, then REMOVE
+ THEM:
+
+ +TEXMF=%DJDIR%/share/texmf
+ +TEXMFCNF=.;$SELFAUTODIR/share/texmf/web2c;%DJDIR%/share/texmf/web2c
+
+ The current Texk setup automatically takes care of defining these
+ variables correctly, and these variables can conflict with the new
+ setup introduced with version 7.2 of Web2c.
+
+ - The first few times when you run the DVI drivers, they will
+ create several fonts on the fly. This is normal behavior and
+ should not alarm you, since the distribution comes without any
+ gf or pk fonts whatsoever. The generated fonts are left on your
+ system for future jobs, so as you process more and more
+ documents, the probability of bumping into a missing font will
+ get lower.
+
+ The generated fonts will by default be installed inside the
+ share/texmf tree, where they will be available for future use by
+ the package programs. However, you might want the generated fonts
+ to go to a different hierarchy, for example if you'd like to purge
+ those files from time to time (to preserve disk space). If the
+ share/texmf tree is on write-protected media (e.g. CD-ROM), mktex*
+ programs will do that automatically; if not, you will need to set
+ the read-only bit of share/texmf and share/texmf/fonts, like this:
+
+ attrib +R c:/djgpp/share/texmf
+ attrib +R c:/djgpp/share/texmf/fonts
+
+ (DOS and Windows ignore the read-only bit for directories, so this
+ won't prevent other programs from writing to these trees or even
+ deleting them; but all programs that create files using the
+ Kpathsea library will notice this bit and won't put any files
+ there.)
+
+ When share/texmf is read-only, the default directory to put fonts
+ is %DJDIR%/var/texfonts (it will be created if it doesn't already
+ exist). If you want the fonts to go to another place, set the
+ variable VARTEXFONTS in the environment to point there. For
+ example:
+
+ set VARTEXFONTS=d:/var/tmp/texfonts
+
+ - Add the following (large) fragment to your `info/dir' file, unless
+ it's already there:
+
+TeX
+* DVI-to-Postscript: (dvips). Translating TeX DVI files to PostScript.
+* afm2tfm: (dvips)Invoking afm2tfm. Making Type 1 fonts available to TeX.
+* dvips: (dvips)Invoking Dvips. DVI-to-PostScript translator.
+* Kpathsea: (kpathsea). File lookup along search paths.
+* Web2c: (web2c). TeX, Metafont, and companion programs.
+* bibtex: (web2c)bibtex invocation. Maintaining bibliographies.
+* dmp: (web2c)dmp invocation. Troff->MPX (MetaPost pictures).
+* dvicopy: (web2c)dvicopy invocation. Virtual font expansion
+* dvitomp: (web2c)dvitomp invocation. DVI to MPX (MetaPost pictures).
+* dvitype: (web2c)dvitype invocation. DVI to human-readable text.
+* gftodvi: (web2c)gftodvi invocation. Generic font proofsheets.
+* gftopk: (web2c)gftopk invocation. Generic to packed fonts.
+* gftype: (web2c)gftype invocation. GF to human-readable text.
+* inimf: (web2c)inimf invocation. Initial Metafont.
+* inimpost: (web2c)inimpost invocation. Initial MetaPost.
+* initex: (web2c)initex invocation. Initial TeX.
+* makempx: (web2c)makempx invocation. MetaPost label typesetting.
+* mf: (web2c)mf invocation. Creating typeface families.
+* mft: (web2c)mft invocation. Prettyprinting Metafont source.
+* mltex: (web2c)MLTeX. Multi-lingual TeX.
+* mpost: (web2c)mpost invocation. Creating technical diagrams.
+* mpto: (web2c)mpto invocation. MetaPost label extraction.
+* newer: (web2c)newer invocation. Compare modification times.
+* patgen: (web2c)patgen invocation. Creating hyphenation patterns.
+* pktogf: (web2c)pktogf invocation. Packed to generic fonts.
+* pktype: (web2c)pktype invocation. PK to human-readable text.
+* pltotf: (web2c)pltotf invocation. Property list to TFM.
+* pooltype: (web2c)pooltype invocation. Display WEB pool files.
+* tangle: (web2c)tangle invocation. WEB to Pascal.
+* tex: (web2c)tex invocation. Typesetting.
+* tftopl: (web2c)tftopl invocation. TFM -> property list.
+* vftovp: (web2c)vftovp invocation. Virtual font -> virtual pl.
+* virmf: (web2c)virmf invocation. Virgin Metafont.
+* virmpost: (web2c)virmpost invocation. Virgin MetaPost.
+* virtex: (web2c)virtex invocation. Virgin TeX.
+* vptovf: (web2c)vptovf invocation. Virtual pl -> virtual font.
+* weave: (web2c)weave invocation. WEB to TeX.
+* kpsewhich: (kpathsea)Invoking kpsewhich. TeX file searching.
+* mktexmf: (kpathsea)mktex scripts. MF source generation.
+* mktexpk: (kpathsea)mktex scripts. PK bitmap generation.
+* mktextex: (kpathsea)mktex scripts. TeX source generation.
+* mktextfm: (kpathsea)mktex scripts. TeX font metric generation.
+* mktexlsr: (kpathsea)Filename database. Update ls-R.
+
+ - If you had a similar fragment in your info/dir file, make sure it
+ is *exactly* like listed above, especially in the last 5 lines:
+ the names of the mktex* programs were changed in this version of
+ Web2c to fit into the DOS 8+3 namespace limits, so the old
+ MakeTeX* entries are not useful anymore.
+
+ - If you don't have any program that is capable of reading Info
+ files, download and install a port of the GNU Texinfo
+ distribution. It is available as v2gnu/txiNNNb.zip from the
+ DJGPP ftp sites (NNN is the version number).
+
+ - If you are new to TeX and TeX-related issues, be sure to read
+ the docs! At the very least, you should read about the main
+ programs that you will be invoking, like `tex', `dvips',
+ `dvilj4' etc. Another suggested reading is the Kpathsea docs
+ which describes the way the programs search for their files, and
+ is therefore the place to look for ways to customize your
+ installation. (Note: `dvilj' programs are only documented in a
+ man page `dvilj.1' which unzips into your `info' subdirectory.
+ Use a pager such as `less' to read it.)
+
+ - If you are familiar with TeX (or if you feel you are, after
+ reading the above docs), you might consider editing the
+ configuration files to customize the programs.
+
+ The most important file is %DJDIR%/share/texmf/web2c/texmf.cnf
+ which defines default values for many variables and search paths.
+ It is extensively commented and will give you some ideas about
+ customization possibilities. If you do change this file, it is
+ recommended to remove the word ``original'' from its first line,
+ so that if you build a new version of Texk, the installation
+ process won't overwrite your customized file.
+
+ Dvips has its own system-wide configuration file:
+ share/texmf/dvips/config/config.ps; this lists some default
+ options and settings other than the pathnames from texmf.cnf.
+ Other, printer-specific configuration files are also there.
+
+ - Make sure your system allows at least 50 files to be open
+ simultaneously. Edit the FILES= setting of your CONFIG.SYS if
+ you need, and reboot the computer to let the new setting be in
+ effect.
+
+ - If you installed kpseNNb.zip to develop programs which use the
+ Kpathsea library, and your DJGPP library version is 2.01,
+ compile the patched library functions in the gnu/web2c-X.Y/djgpp
+ directory and put them into your library. For example:
+
+ gcc -c -O3 gnu/web2c-7.2/djgpp/*.c
+ ar rvs lib/libc.a gnu/web2c-7.2/djgpp/*.o
+
+ - That's it! Texk is now installed and ready for work. If you
+ have any problems, check out the "Troubleshooting" section
+ below.
+
+ The following are some general notes about the binary
+ distribution:
+
+ - Texk on Unix uses a few shell scripts for certain jobs. A
+ notable example is the mktex* scripts that are used to
+ generate missing fonts on the fly. The binary packages come
+ with both thes original shell scripts and with programs that
+ replace them. The replacement programs don't require you to
+ install Bash and auxiliary utilities such as `cat', `cp', `mv'
+ etc., and also run faster. However, if you would like to stick
+ to the original, rename or delete `maketex.exe', `makempx.exe'
+ and `dvihp.exe', remove the .sh extension from the bin/*.sh
+ files, and the Texk programs will call shell scripts like on
+ Unix (make sure you have Bash installed).
+
+ - DviVGA is really a quick hack (it was not part of the original
+ Texk package). It doesn't support any high-resolution SVGA
+ modes; the magnification is fixed when you invoke the program
+ and you can't change it while it runs; the text at default
+ magnification is barely readable; and the user interface leaves
+ a lot to be desired. (You can change magnification by using
+ the `-m' command-line option: 1000 means the default, larger
+ numbers magnify. However, note that each non-default
+ magnification will cause fonts to be generated for suitable DPI
+ values.) For now, DviVGA is provided as a stop-gap for those
+ who have no other way of viewing DVI files; volunteers are
+ welcome to add features.
+
+ As an alternative for viewing DVI files, consider installing a
+ port of Ghostscript and GhostView for Windows that will allow
+ you to view PostScript files (you can use Dvips to generate
+ PostScript from DVI).
+
+ - If your printer is not one of those for which a DVI driver is
+ included in this package, install Ghostscript and pipe the
+ output of `dvips' to it. Ghostscript supports many more
+ different printers beyond LaserJet and DeskJet.
+
+ - The documentation of the TeX4Ht package is in HTML format.
+ Since there is no standard place to put HTML files in the DJGPP
+ hierarchy, the docs are supplied in a compressed file
+ `manual.tgz' which unzips into %DJDIR%/gnu/web2c-7.2/tex4htk.
+ Use the DJTAR program to unpack `manual.tgz'.
+
+ - TeX4Ht might require to install and configure additional
+ programs, if you want incorporate graphics images in the HTML
+ files it produces. Be sure to read the file README.djgpp in the
+ web2c-7.2/tex4htk directory for the gory details.
+
+
+III.Building the packages from sources
+ ----------------------------------
+
+ - The following tools are REQUIRED to build and install Texk
+ programs (the parentheses list filenames of binary distributions
+ you can download from DJGPP archives if you don't have a
+ particular package):
+
+ Bash (bsh1147b.zip)
+ Fileutils (fil316b.zip)
+ Textutils (txt122b.zip)
+ Grep (grep22b.zip)
+ Patch (pat25b.zip)
+ Sh-utils (shl112b.zip)
+ Sed (sed302b.zip)
+ Diffutils (dif2721b.zip)
+ Findutils (find41b.zip)
+ Ed (ed-02b.zip)
+ Gawk (gwk303b.zip)
+ Bison (bsn125b.zip)
+ Flex (flx254b.zip)
+
+ All of these are available from the v2gnu directory on the usual
+ DJGPP sites.
+
+ - tmflibNN.zip and kpseNNs.zip are required to build any part of the
+ package. In addition, you will need to download the sources of
+ the programs you need to build (e.g., dvpsNNNs.zip for Dvips).
+ You will also need about 85M bytes of disk space to build the
+ full package.
+
+ - unzip the downloaded archives from the root of your DJGPP
+ installation tree. If you are doing this on Windows 9x, use an
+ unzip program that supports long filenames. Don't forget the
+ `-d' switch if you are using PKUNZIP.
+
+ This will create the `gnu/web2c-7.2' directory and unpack the
+ sources into the relevant subdirectories. It will also create
+ the `share/texmf' directory and unpack the contents of Texmflib
+ library there.
+
+ - For the port to work correctly, it needs patched versions of a
+ few library functions. The patched sources are supplied in the
+ djgpp subdirectory of the kpseNNs.zip distribution. Before
+ compiling Texk, you need to compile the *.c files in the djgpp
+ subdirectory and put them into your libc.a:
+
+ gcc -c -O3 *.c
+ ar rvs c:/djgpp/lib/libc.a *.o
+
+ (Change "c:/djgpp" to the correct pathname of your DJGPP
+ installation.)
+
+ - At this point, I suggest you to read the file
+ `kpathsea/INSTALL.txt'. It includes a detailed yet very
+ readable description of the various options available to you at
+ build and installation time.
+
+ - Make sure your TMPDIR environment variable points to a drive
+ with enough free space. Many DJGPP installations set this
+ variable to a RAM disk for performance reasons. Since RAM disks
+ tend to be small (a few Megabytes), a complex shell script may
+ fill it by temporary files, typically from pipes and `command`
+ expansions, after which point programs run by that shell will
+ start to fail. The Texk build process runs some very long and
+ complicated shell scripts which require around 4MB of free space
+ on TMPDIR filesystem (it failed for me when I had only 2.5MB).
+ If you cannot enlarge your RAM disk, point TMPDIR to a real disk
+ (the effect on the overall build time is insignificant, since
+ GCC will have hard time compiling some of the larger programs
+ with -O2 switch). TMPDIR is usually set on the DJGPP.ENV file,
+ but you can override it by setting TMPDIR from the DOS prompt.
+
+ - The default 256KB stack size limit of DJGPP programs is too
+ small for compiling some of the TeX programs. Make sure your
+ cc1.exe program has at least 768KB of stack. Here's how:
+
+ stubedit cc1.exe minstack=768k
+
+ (`stubedit' is part of the basic DJGPP development
+ environment).
+
+ - The source distribution comes pre-configured for DJGPP v2.01.
+ To build, chdir to the web2c-7.2 directory and issue this command
+ to build the programs:
+
+ make
+
+ Building the full Texk package takes a while (about 2 hours
+ on a 486/DX2-66, 35 minutes on a Pentium-166), so you might go
+ for a cup of coffee while it compiles. About half of this time
+ is for building programs in `web2c' subdirectory, so if you
+ don't need TeX, Metafont and related programs, I suggest not to
+ download webcNNs.zip.
+
+ (Please note that I haven't tried to build parts of the
+ distribution, I only built all of the programs at once. So if
+ you have any problems building, please report them to me.)
+
+ If you are building Texk more than 18 months since it was
+ released, you might see a warning message while LaTeX is built
+ which complains about old sources. In general, you can press
+ [Enter] in response to that message and let the build continue,
+ since the message is just a precaution. However, if you do care
+ to have the latest stuff, you will need to download the
+ latex/base directory from one of the CTAN mirrors and replace
+ with it the files in latex/base which come with tmflib75.zip.
+
+ The command "make" will by default build the kpathsea library,
+ the LJ4 and PostScript DVI drivers (`dvilj4' and `dvips'),
+ TeX, MetaFont and related programs in `web2c' directory, and any
+ of the auxiliary programs whose sources you downloaded. If you
+ need other programs, you will need to issue these additional
+ commands:
+
+ To build the programs that replace mktex... shell scripts
+ from the original package, do this:
+
+ cd contrib
+ make
+
+ To build DVI drivers for other LaserJet printers:
+
+ cd dviljk
+ make all (or e.g. "make dvilj2p" if you need a
+ driver for LaserJet 2P only)
+
+ To build DVI drivers for DeskJet 500/550C printers and the DVI
+ previewer for VGA display:
+
+ cd dvidjk
+ make
+
+ - You might want to reconfigure the package, for instance if you
+ want to build it with other built-in default pathnames, or if
+ changes in the DJGPP library require different HAVE_XXX macros
+ to be defined before you recompile. To this end, you need to
+ run the `configure' script in the web2c-X.Y directory. The
+ easiest way to do that is by calling the `djgpp/config.bat'
+ batch file, which sets some environment variables and then
+ invokes Bash to run the script with necessary arguments. (You
+ can edit the batch file if you want to run the script with
+ different arguments.) The command is this:
+
+ djgpp\config
+
+ - It is possible to configure and build Texk from a directory
+ other than where the sources reside (useful when you cannot
+ write to that directory, like if it's on a CD-ROM). In that
+ case, you need to invoke `configure.bat' with a single argument
+ which is the full pathname of the source directory. For
+ example:
+
+ f:\gnu\web2c-7.2\djgpp\config f:/gnu/web2c-7.2
+
+ Note that you MUST use Unix-style forward slashes in the
+ argument you pass to `config.bat', or else it will fail.
+
+ - The configure script will run for a while and recursively
+ configure the programs in subdirectories. (It takes about 20
+ minutes on my P166 to configure the full distribution.)
+
+ - After running `configure', just say "make" as explained above.
+
+ - If you have changed some of the programs in the package, it is a
+ good idea to run tests on them. The Makefile in the web2c
+ directory has a large number of xxx-check targets, where xxx is
+ the name of a program; you can run these one by one by going
+ into web2c and saying like so:
+
+ make gftopk-check
+
+ Some of the tests appear to fail (`diff' prints some actual
+ differences between the test results and the reference files
+ that come with the package. In most cases, this is normal
+ behavior (the programs were changed since the canonical results
+ were computed); the file `web2c/tests/check.log' includes the
+ output you should see for each test. If your results coincide
+ with `check.log' (except for the version of the package that the
+ programs print), you are doing fine.
+
+ Besides the web2c programs, some other packages have their own
+ test suites. A good rule of thumb is to chdir to the top
+ subdirectory of the package you want to test and type "make
+ check"; if this produces the "Nothing to be done for `check'"
+ message from Make, read the README file in that directory: some
+ of them describe manual procedures for testing the built package
+ (I have meticulously run these test procedures for every package
+ that has one, and added any files required to run the tests to
+ the tmflibNN.zip distribution, so you should expect all the
+ tests to pass if all's well.)
+
+ - Before installing, if you already have a previous version of
+ Texk installed, review your `texmf.cnf' configuration file (in
+ %TEXMF%/web2c directory). If you have changed it from the
+ original, you might want the installation process to leave it
+ alone and not overwrite it with the fresh copy from the
+ distribution. In that case, edit `texmf.cnf' and remove the
+ word "original" from its first line. This tells the
+ installation process to refrain from replacing that file.
+
+ Note that `texmf.cnf' file distributed with the binary packages
+ was edited to make it suitable for DJGPP, but the word
+ "original" was NOT removed from it!
+
+ Also note that the configuration setup has changed since version
+ 7.0 in minor but significant ways, and if you have good reasons
+ to keep your old texmf.cnf file, some manual work might be
+ needed to reconcile the new setup with your preferences of yore.
+
+ - To install the programs, say "make install" in the top
+ directory. This will create missing directories and copy the
+ programs and auxiliary files to their places. If you run "make"
+ without reconfiguring the package, the "install" targets assume
+ that DJGPP is rooted at C:\DJGPP and put everything there; you
+ can then move the files to their proper places, like so:
+
+ cp -Rp c:/djgpp/* d:/gnu/djdir
+ rm -rf c:/djgpp
+
+ (This assumes that DJGPP is actually installed in D:\GNU\DJDIR;
+ if not, change the last `cp' argument as appropriate.)
+
+ If you have built additional programs (like the `dvivga'
+ previewer), you will need to install them manually, since the
+ default "install" targets won't install them.
+
+IV. Troubleshooting
+ ---------------
+
+ I do NOT intend here to replace the various chapters in the docs
+ which explain how to solve problems and report bugs. Please read
+ the docs whenever you see any seemingly abnormal behavior. What's
+ below is intended to mention a few DOS- and DJGPP-specific
+ problems that you might see, and how to get around them.
+
+ First, a word of warning. Texk is a tremendously large and
+ complex package, with dozens of different programs, some of them
+ with many different options. While porting it, I've made a good-
+ faith effort to test everything I could, including using it to
+ generate printed versions of various TeX and Texinfo documents.
+ However, some bugs must be still there. In addition, some
+ programs in this release are ported to DJGPP for the first time.
+ Please treat this port accordingly and report related bugs to the
+ DJGPP news group (comp.os.msdos.djgpp) first.
+
+ One possible problem you could see is due to insufficient number
+ of available file handles. `Dvilj' is particularly prone to this
+ problem. If you ever see an error message to the effect that a
+ program has no more handles, edit your CONFIG.SYS and enlarge the
+ FILES= setting there.
+
+ Another related problem manifests itself by an error message like
+ so:
+
+ c:\djgpp\bin/mf.exe: cannot open
+
+ This usually happens when a DVI driver finds a missing font and
+ invokes the METAFONT program to generate them on the fly. Due to
+ peculiarities of file handles inheritance from parent to child
+ processes, the child process can sometimes fail to start because
+ the stub cannot open the .exe file. I think I've fixed these
+ problems, so you shouldn't see such messages, but if you do,
+ please report the details.
+
+ If the font-creation fails, a file named `missfont.log' is created
+ in the current directory, with the commands you should issue to
+ make these fonts. Many times, invoking that file as a batch file
+ will create the missing fonts, so you could then invoke the DVI
+ driver again and it will work.
+
+
+ Happy TeXing!
+
+ Eli Zaretskii <eliz@is.elta.co.il>
diff --git a/systems/msdos/dos-tp b/systems/msdos/dos-tp
new file mode 120000
index 0000000000..aa6239251c
--- /dev/null
+++ b/systems/msdos/dos-tp
@@ -0,0 +1 @@
+dostp22 \ No newline at end of file
diff --git a/systems/msdos/dostp22/README b/systems/msdos/dostp22/README
new file mode 100644
index 0000000000..25828d606d
--- /dev/null
+++ b/systems/msdos/dostp22/README
@@ -0,0 +1,183 @@
+PubliC (e)TeX/METAFONT/MetaPost, and the Dos-TP implementations of the
+utilities (for MS Dos, in Turbo Pascal)
+
+1. Files
+
+This distribution consists of quite a few .zip files grouped as follows:
+
+ SRCxxx sources
+ EXExxx precompiled programs
+ RUNxxx documentation plus a few support files
+
+where xxx indicates the components (individual programs or groups of
+programs).
+
+You will always need the RUNxxx files for whatever components you
+select to install. In addition, if you have a Turbo Pascal compiler
+(Version 5.0, 5.5, 6.0, or 7.0) and want to compile the programs ---
+possibly with some parameter values modified --- you need the SRCxxx
+files. Otherwise, if you can't or don't want to compile the programs
+yourself, you need the EXExxx files.
+
+You can choose from the following components more or less independently
+(where yyy is SRC, EXE, or RUN):
+
+ yyyDOSTP basic support, includes a utility program dostpqry that
+ allows to interrogate the Dos-TP file search mechanism.
+ Always required, SRCDOSTP required for all SRCxxx.
+
+ SRCASM sources for various assembler subroutines (mainly for TeX,
+ METAFONT, and MetaPost). In order to generate the .obj
+ files from their sources you need a suitable assembler
+ (preferably tasm, masm might work as well). All .obj
+ files are contained in SRCDOSTP, thus SRCASM is optional!
+
+ yyyWEB web system programs tangle and weave;
+ yyyPATCH slightly modified version of tangle and weave plus
+ patchtgl, patchweb, and patchwve.
+ WEB or PATCH required for all SRCxxx,
+ PATCH required for SRCETEX.
+
+ yyyTEXWA TeXware programs dvitype, patgen, pltotf, pooltype, and
+ tftopl.
+ Required for (e)trip and (m)trap tests.
+
+ yyyMFWAR MFware programs gftodvi, gftopk, gftype, mft, and pktype.
+ Required in order to generate PK fonts and for trap test.
+
+ yyyMPWAR MPware programs mptotex, dvitomp, and makempx.
+ Required by MetaPost.
+
+ yyyVFWAR programs related to virtual font (VF) files.
+
+ yyyFONTU font conversion utilities (to and from PK format).
+
+ yyyBIBTE BibTeX.
+
+ yyyTEX TeX (virtex and initex).
+ RUNTEX required for e-TeX, SRCTEX required for SRCETEX.
+
+ yyyETEX e-TeX (evirtex and einitex).
+
+ yyyMETAF METAFONT (virmf and inimf).
+
+ yyyMETAP MetaPost (virmp and inimp).
+
+2. Installation and the TeX Directory Structure (TDS)
+
+Let <texmf> denote the root of the TDS as described in the draft `A
+Directory Structure for TeX Files' --- typically 'c:\texmf' or similar.
+And let <zipdir> be the directory where the .zip files are located.
+Make <texmf> the current directory (on the current drive) and unpack all
+the .zip files, e.g., by the commands (from the command line, or replace
+'%i' by '%%i' in a .bat file):
+ cd <texmf>
+ for %i in (<zipdir>\*.zip) do unzip -o %i
+
+3. Generating the Programs from their Sources
+
+All SRCxxx file are installed in the directory <texmf>\dostp\<src>
+(where <src> is 'src22' for Dos-TP Version 2.2) and its subdirectories.
+
+In order to generate any of the programs you should change to the source
+directory:
+ cd <texmf>\dostp\<src>
+In that directory and its subdirectories there exists a system of MK.BAT
+batch files that provide a Unix make like functionality. You first have
+to configure them, in order to
+ * tell them the location of your Turbo Pascal compiler TPC.EXE,
+ * optionally tell them the name and location of your assembler,
+ * select which among the installed components you want to generate
+ and which tests you want to run on them. E.g., in order to
+ generate e-TeX you must install SRCTEX and SRCETEX. It is,
+ however, up to you whether you select to generate TeX and e-TeX or
+ just e-TeX.
+Use:
+ mk config
+and answer all questions. After that you can use:
+ mk to generate all selected programs
+ mk test to run all selected tests
+ mk trip just the trip test for TeX
+ mk etrip just the etrip test for e-TeX
+ mk trap just the trap test for METAFONT
+ mk mtrap just the mtrap test for MetaPost
+ mk install to install the generated programs
+ mx testx to run some additional tests (see below)
+ mk clean to remove most temporary files
+ mk realclean to remove all temporary files
+You can rerun 'mk config' at any time, you must rerun it after
+'mk realclean'.
+
+All files created by 'mk' are in the <texmf>\dostp\tmp directory, they
+are moved to their destination by 'mk install' and most are deleted by
+'mk clean'.
+
+All files created by 'mk test(x)' are in the <texmf>\dostp\tmp
+directory, most of them are deleted when a test has succeeded. Whereas
+most tests (those made by 'mk test') can be performed before or after
+the programs are installed (the executables are sought first in the
+<texmf>\dostp\tmp and then in the <texmf>\dostp\bin directory), some
+other tests (those made by 'testx') can only be performed successfully
+after the programs have been installed and the small executables 'tex'
+and 'mf' have been configured to invoke virtex/virmf with the plain
+format/base (see below) and are ready to be executed.
+
+4. Configuring your System
+
+4.1. The Dos-TP Configuration File
+
+You might wish to modify the Dos-TP configuration file
+<texmf>\dostp\texmf.cnf that contains the file search paths for various
+classes of input files. You may also want to keep a copy of that
+modified file, since the original file gets replaced by the standard one
+during the installation procedure.
+
+4.2. (e)TeX, METAFONT, and MetaPost
+
+You should use the TeXMFcnf utility in the <texmf>\dostp directory to
+configure small executable files such as 'tex', 'plaintex', 'latex',
+etc. that invoke (e)virtex/virmf/virmp with a suitable default
+format/base/mem, e.g.:
+
+ cd <texmf>\dostp
+ texmfcnf tex - tex % use format from input file (or plain)
+ texmfcnf tex plain plaintex % use `plain' format
+ texmfcnf etex - e-tex % use format from input file (or plain)
+ texmfcnf etex etex etex % use `etex' format
+ texmfcnf mf - mf % use base from input file (or plain)
+ texmfcnf mf plain plainmf % use `plain' base
+ texmfcnf mf cm cmmf % use `cm' base
+ texmfcnf mp - mp % use mem from input file (or plain)
+ texmfcnf mp plain plainmp % use `plain' mem
+
+5. Running the Programs
+
+All executables are in the <texmf>\dostp\bin directory, therefore you
+should add it to your Dos path. You SHOULD NOT, however, move all the
+executables from the <texmf>\dostp\bin directory to another directory
+already in the Dos path; this will most probably fail.
+
+All programs accept command line parameters, the <texmf>\dostp\doc
+directory contains detailed desriptions.
+
+In order to generate (e)TeX formats, METAFONT bases, and MetaPost mems
+run (e)INITEX, INIMF, or INIMP from the <texmf>\dostp\ini directory,
+e.g.:
+ cd <texmf>\dostp\ini
+ initex -cec850 plain.itx
+ einitex -cec850 -fetex *etex.src \dump
+ inimf -cec850 plain.imf
+ inimf &plain cm.imf
+ inimp -cec850 plain.imp
+
+You might have to get many (La)TeX, METAFONT and MetaPost source
+files and place them into the TDS tree, e.g., from one of the CTAN
+archives. If you wish to generate fonts, you can then, e.g., say:
+ mf \mode=ibmtont; mag=1; scrollmode; input logo8
+ gftopk logo8 <texmf>\fonts\pk\ibmtont\public\mflogo\dpi100\
+ cmmf \mode=cx; mag=1.2; scrollmode; input cmss8
+ gftopk cmss8 <texmf>\fonts\pk\cx\public\cm\dpi360\
+
+ ***** Happy TeXing *****
+
+--- Peter Breitenlohner (peb@mppmu.mpg.de) ------------ 06 Sep 98 ---
diff --git a/systems/msdos/dpmigcc/nt09c.txt b/systems/msdos/dpmigcc/nt09c.txt
new file mode 100644
index 0000000000..ecdb06bb31
--- /dev/null
+++ b/systems/msdos/dpmigcc/nt09c.txt
@@ -0,0 +1,25 @@
+-------------------------------------------------------------------------------
+ NT09C -- Rainer Schnitker -- rainer@mathematik.uni-bielefeld.de Dec 96
+-------------------------------------------------------------------------------
+
+Version: NT 0.9c
+
+Updates: NT09B-2x archive files
+
+Author: Rainer Schnitker
+
+Description: Recompiled EMX GNU C/C++ port for Win32 and DOS
+
+ Supported targets: Win32, DOS and OS/2
+
+ This binaries also requires the runtime package 'RSXNT13.ZIP'
+
+
+Base1:
+ NT09CDEV.ZIP: Development tools
+ NT09CBNU.ZIP: Gnu Binaries
+ NT09CGCC.ZIP: GNU C compiler
+
+Base2 (optional):
+ NT09CGPP.ZIP: GNU C++ compiler
+ NT09COBJ.ZIP: GNU Objective-C compiler
diff --git a/systems/msdos/dpmigcc/nt09cemx.txt b/systems/msdos/dpmigcc/nt09cemx.txt
new file mode 100644
index 0000000000..cf6a0a708d
--- /dev/null
+++ b/systems/msdos/dpmigcc/nt09cemx.txt
@@ -0,0 +1,19 @@
+-------------------------------------------------------------------------------
+ NT09CEMX -- Rainer Schnitker -- rainer@mathematik.uni-bielefeld.de Dec 97
+-------------------------------------------------------------------------------
+
+Version: 09.C
+
+Author: Rainer Schnitker
+
+Email: rainer@mathematik.uni-bielefeld.de
+
+Directories: location of RSXNT14.ZIP
+ location of EMX+GCC compiler contrib or tools
+
+Description: Win32 binaries for the EMX GNU-C/C++ compiler.
+
+ These binaries are recommend for EMX users, if they
+ are working under Win95 or WinNT. Long filename
+ are supported and the native binaries are faster than
+ the DOS parts.
diff --git a/systems/msdos/dpmigcc/rsxn141r.txt b/systems/msdos/dpmigcc/rsxn141r.txt
new file mode 100644
index 0000000000..60438b18b7
--- /dev/null
+++ b/systems/msdos/dpmigcc/rsxn141r.txt
@@ -0,0 +1,20 @@
+-------------------------------------------------------------------------------
+ RSXNTR 1.4.1 -- Rainer Schnitker -- rainer@mathematik.uni-bielefeld.de Apr 97
+-------------------------------------------------------------------------------
+
+Version: RSXNTR.ZIP RSXNT Runtime Modules (version 1.4.1)
+
+Author: Rainer Schnitker
+
+Email: rainer@mathematik.uni-bielefeld.de
+
+Registration: Free for noncommercial use
+
+Directories: - NT09Cxxx.ZIP compiler archive (emx+gcc for Win32)
+ - EMX+GCC compiler contrib or tools
+ - Win95 or NT compiler tools
+
+Description: Win32 SDK for GNU-C/C++ compiler (emx port)
+
+ Runtime files only (and docs)
+
diff --git a/systems/msdos/dpmigcc/rsxnt141.txt b/systems/msdos/dpmigcc/rsxnt141.txt
new file mode 100644
index 0000000000..1b85232949
--- /dev/null
+++ b/systems/msdos/dpmigcc/rsxnt141.txt
@@ -0,0 +1,22 @@
+-------------------------------------------------------------------------------
+ RSXNT 1.4.1 -- Rainer Schnitker -- rainer@mathematik.uni-bielefeld.de Apr 98
+-------------------------------------------------------------------------------
+
+Version: RSXNT (version 1.4.1)
+
+Author: Rainer Schnitker
+
+Email: rainer@mathematik.uni-bielefeld.de
+
+Registration: Free for noncommercial use
+
+Directories: - NT09Cxxx.ZIP compiler archive (emx+gcc for Win32)
+ - EMX+GCC compiler contrib or tools
+ - Win95 or NT compiler tools
+
+Description: Win32 SDK for GNU-C/C++ compiler (emx port)
+
+More descriptions:
+ RSXNT allows to create the following Win32 apps:
+ GUI, Console, DLL and dual-mode Console (Win32 and 32-bit DOS).
+ There is a help file in "\rsxnt\doc" for more information.
diff --git a/systems/msdos/dpmigcc/rsxwdk2.txt b/systems/msdos/dpmigcc/rsxwdk2.txt
new file mode 100644
index 0000000000..8c8c7e8b76
--- /dev/null
+++ b/systems/msdos/dpmigcc/rsxwdk2.txt
@@ -0,0 +1,40 @@
+-------------------------------------------------------------------------------
+RSXWDK - building 32bit Windows apps with GNU-C/C++ for MS-Windows 3.1 Jan 95
+-------------------------------------------------------------------------------
+
+Vendor Information:
+
+ There are two Zip files
+ RSXWDK2b.ZIP: rsxwdk binaries, libraries, include and help files
+ RSXWDK2s.ZIP: rsxwdk library source files
+
+ Possible directories:
+ emx-0.9a contrib dircetory
+ djgpp contrib directory
+ \win3\programr
+
+-------------------------------------------------------------------------------
+
+RSXWDK Copyright (c) by Rainer Schnitker 1994,1995
+ For more information extract "\rsxwdk\doc\rsxwdk.hlp" in rsxwdk2b.zip
+
+email to:
+ rainer@mathematik.uni-bielefeld.de
+
+-------------------------------------------------------------------------------
+
+The RSX Window Development Kit (release 2) contains:
+
+ RSXW32.EXE (Windows Extender) to run 32bit GNU-C Windows 3.1 programs
+ Include files for GNU-C to use 16-bit headers
+ 32-bit Windows libraries for the EMX compiler
+ 32-bit Windows libraries for the DJGPP compiler
+
+Software Requirements:
+ - MS-Windows 3.1
+ - RC.EXE, the resource compiler
+ - Windows.h (SDK 3.1) from a 16bit Compiler
+ - GNU-C compiler
+ a) EMX 0.8-0.9
+ b) DJGPP 1.11-1.12 (coff format)
+
diff --git a/systems/msdos/dpmigcc/rsxwdk2p.txt b/systems/msdos/dpmigcc/rsxwdk2p.txt
new file mode 100644
index 0000000000..8feb53d7cc
--- /dev/null
+++ b/systems/msdos/dpmigcc/rsxwdk2p.txt
@@ -0,0 +1,29 @@
+-------------------------------------------------------------------------------
+RSXWDK - building 32bit Windows apps with GNU-C/C++ for Win31 or Win95 Nov 95
+-------------------------------------------------------------------------------
+
+This RSXWDK2p.ZIP archive patches some files of
+ RSXWDK2b.ZIP: rsxwdk binaries, libraries, include and help files
+ RSXWDK2s.ZIP: rsxwdk library source files
+
+Don't delete the old two files, rsxwdk2p will not run without the others.
+
+Possible directories:
+ emx-0.9a contrib dircetory
+ djgpp contrib directory
+ \win3\programr
+
+-------------------------------------------------------------------------------
+
+RSXWDK Copyright (c) by Rainer Schnitker 1994,1995
+ For more information extract "\rsxwdk\doc\rsxwdk.hlp" in rsxwdk2u.zip
+
+email to:
+ rainer@mathematik.uni-bielefeld.de
+-------------------------------------------------------------------------------
+
+Updated files
+ rsxw32.exe: fixes Problems with DLL names
+ rsxwdk.hlp: updated help file
+ removed: missing in rsxwdk2b
+
diff --git a/systems/msdos/dpmigcc/rsxwin31.txt b/systems/msdos/dpmigcc/rsxwin31.txt
new file mode 100644
index 0000000000..00ce949856
--- /dev/null
+++ b/systems/msdos/dpmigcc/rsxwin31.txt
@@ -0,0 +1,31 @@
+-------------------------------------------------------------------------------
+RSXWIN31 -- Rainer Schnitker -- rainer@mathematik.uni-bielefeld.de Oct 96
+-------------------------------------------------------------------------------
+
+Version: RSXWIN 3.10 (replaces RSXWIN3D.ZIP)
+
+Author: Rainer Schnitker
+
+Email: rainer@mathematik.uni-bielefeld.de
+
+Registration: Free for noncommercial use
+
+Directories: 'win3\programming' or 'win3\util'
+ 'emx\contrib'
+ 'tex\emtex'
+
+Description: run EMX progs in a text-mode Win31 window (TeX386,GCC,Emacs)
+
+More descriptions:
+ RSXWIN3e can run EMX+GCC compiled programs in a MSW 3.1 window. RSXWIN
+ doesn't need a DOS Box - all stdin, stdout, keyboard and ANSI.SYS calls
+ are mapped to window functions. RSXWIN only needs 100 KB memory. Since
+ a DOS-box needs up to 1 MB you have more memory for your applications.
+ Paging is reduced and your programs are faster.
+
+ Supported programs:
+ TeX386 - from the EmTeX package
+ GCC - and tools
+ Emacs - 19.27 emx port
+ Info - Termcap and ansi.sys output programs
+
diff --git a/systems/msdos/dviware/dvilj4/commands.h b/systems/msdos/dviware/dvilj4/commands.h
new file mode 100644
index 0000000000..e926de318d
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/commands.h
@@ -0,0 +1,65 @@
+/* DVI COMMANDS */
+#define SETC_000 0 /* typeset character 0 and move right */
+#define SETC_127 127 /* typeset character 127 and move right */
+#define SET1 128 /* typeset a character and move right */
+#define SET2 129 /* ??? */
+#define SET3 130 /* ??? */
+#define SET4 131 /* ??? */
+#define SET_RULE 132 /* typeset a rule and move right */
+#define PUT1 133 /* typeset a character */
+#define PUT2 134 /* ??? */
+#define PUT3 135 /* ??? */
+#define PUT4 136 /* ??? */
+#define PUT_RULE 137 /* typeset a rule */
+#define NOP 138 /* no operation */
+#define BOP 139 /* beginning of page */
+#define EOP 140 /* ending of page */
+#define PUSH 141 /* save the current positions */
+#define POP 142 /* restore previous positions */
+#define RIGHT1 143 /* move right */
+#define RIGHT2 144 /* ??? */
+#define RIGHT3 145 /* ??? */
+#define RIGHT4 146 /* ??? */
+#define W0 147 /* move right by |w| */
+#define W1 148 /* move right and set |w| */
+#define W2 149 /* ??? */
+#define W3 150 /* ??? */
+#define W4 151 /* ??? */
+#define X0 152 /* move right by |x| */
+#define X1 153 /* move right and set |x| */
+#define X2 154 /* ??? */
+#define X3 155 /* ??? */
+#define X4 156 /* ??? */
+#define DOWN1 157 /* move down */
+#define DOWN2 158 /* ??? */
+#define DOWN3 159 /* ??? */
+#define DOWN4 160 /* ??? */
+#define Y0 161 /* move down by |y| */
+#define Y1 162 /* move down and set |y| */
+#define Y2 163 /* ??? */
+#define Y3 164 /* ??? */
+#define Y4 165 /* ??? */
+#define Z0 166 /* move down by |z| */
+#define Z1 167 /* move down and set |z| */
+#define Z2 168 /* ??? */
+#define Z3 169 /* ??? */
+#define Z4 170 /* ??? */
+#define FONT_00 171 /* set current font to 0 */
+#define FONT_63 234 /* set current font to 0 */
+#define FNT1 235 /* set current font */
+#define FNT2 236 /* Same as FNT1, except that arg is 2 bytes */
+#define FNT3 237 /* Same as FNT1, except that arg is 3 bytes */
+#define FNT4 238 /* Same as FNT1, except that arg is 4 bytes */
+#define XXX1 239 /* extension to \.DVI primitives */
+#define XXX2 240 /* Like XXX1, but 0<=k<65536 */
+#define XXX3 241 /* Like XXX1, but 0<=k<@t$2^{24}$@> */
+#define XXX4 242 /* potentially long extension to \.DVI
+ primitives */
+#define FNT_DEF1 243 /* define the meaning of a font number */
+#define FNT_DEF2 244 /* ??? */
+#define FNT_DEF3 245 /* ??? */
+#define FNT_DEF4 246 /* ??? */
+#define PRE 247 /* preamble */
+#define POST 248 /* postamble beginning */
+#define POST_POST 249 /* postamble ending */
+ /* undefined_commands 250,251,252,253,254,255 */
diff --git a/systems/msdos/dviware/dvilj4/config.h b/systems/msdos/dviware/dvilj4/config.h
new file mode 100644
index 0000000000..0a0d8798c3
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/config.h
@@ -0,0 +1,131 @@
+#define USEPXL
+
+/*
+ * default font path
+ * can be overridden by environment variable TEXPXL
+ * or -a option
+ * popular choice:
+ * #define FONTAREA "/usr/TeX/lib/tex/fonts" */
+#ifdef vms
+#define FONTAREA "tex$pkdir:"
+#else
+#define FONTAREA "/tex/fonts/canon"
+#endif
+
+/*
+ * if your LaserJet II P or LaserJet III or LaserJet 2000
+ * complains about not enough memory, you might try to reduce
+ * the value below or uncomment to use the default settings
+ */
+#ifdef LJ2P
+#define MAX_FONTS_PER_PAGE 255 /* maximum number of fonts per page */
+#endif
+
+/* Unix user: remove the following definition if you cannot access the
+ * appropriate C library functions
+ */
+#ifndef u3b2
+#define TIMING
+#endif
+
+#ifdef unix
+/* name of the program which is called to generate pk files which are missing
+ */
+#define MAKETEXPK "MakeTeXPK"
+#endif
+
+/*
+ * assure that LJ2 is defined when LJ2P is defined
+ */
+#ifdef LJ2P
+#ifndef LJ2
+#define LJ2
+#endif
+#endif
+
+/*
+ * assure that LJ is defined when LJ2 is defined
+ */
+#ifdef LJ2
+#ifndef LJ
+#define LJ
+#endif
+#endif
+
+/*
+ * assure that IBM3812 is not defined when LJ is defined
+ */
+#ifdef LJ
+#ifdef IBM3812
+#undef IBM3812
+#endif
+#endif
+
+
+#define TRUE (bool) 1
+#define FALSE (bool) 0
+#define UNKNOWN -1
+
+#define STRSIZE 255 /* stringsize for file specifications */
+
+typedef char bool;
+
+#ifdef hpux
+typedef char signed_char;
+#else
+#ifdef vms
+typedef char signed_char;
+#else
+#ifdef u3b2
+typedef short signed_char;
+#else
+/* this is the default !! */
+typedef signed char signed_char;
+#endif
+#endif
+#endif
+
+
+#ifndef u3b2
+#define ARITHMETIC_RIGHT_SHIFT
+#endif
+
+
+bool findfile();
+
+
+/*
+ * maximal number of characters in font file
+ * #define LASTFNTCHAR 127 7-bit classic version
+ * #define LASTFNTCHAR 255 8-bit fonts
+ */
+
+#ifdef SEVENBIT
+#define LASTFNTCHAR 127
+#else
+#define LASTFNTCHAR 255
+#endif
+
+
+
+/* this information is needed in findfile.c and dvi2xx.c, NO CUSTOMIZATION */
+#ifdef LJ
+#ifdef LJ4
+#define RESOLUTION 600
+#define MODE "hplf" /* mode definition for metafont */
+#else
+#define RESOLUTION 300
+#define MODE "localfont" /* mode definition for metafont */
+#endif
+#endif
+
+#ifdef IBM3812
+#define RESOLUTION 240
+#define MODE "IBMThreeEightOneTwo" /* mode definition for metafont */
+#endif
+
+
+
+
+
+
diff --git a/systems/msdos/dviware/dvilj4/dvi2xx.c b/systems/msdos/dviware/dvilj4/dvi2xx.c
new file mode 100644
index 0000000000..23516fb062
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/dvi2xx.c
@@ -0,0 +1,4427 @@
+#define VERSION "0.51alpha6"
+/**********************************************************************
+ **************************** Intro *********************************
+ **********************************************************************
+ * This program translates TeX's DVI-Code into device dependent
+ * code of either the
+ *
+ * - HP-LASERJET+ and compatibles (PCL), or the
+ * - IBM 3812 pageprinter
+ *
+ * depending on the preprocessor switches specified before compilation.
+ * The program is written to run on a PC XT/AT/PS2 under MS-DOS. It can
+ * be compiled nicely with MSC Rel. 3.0-5.1 with option -AL (large memory
+ * model). Take care that in the CONFIG.SYS file the FILES parameter
+ * is set to 20; otherwise reduce MAXOPEN. 640K are recommended.
+ * I use link option /stack:9000 to increase runtime stack.
+ * It also works without modifications under Unix System V.
+ **********************************************************************
+ * Adapted for the PC: Gustaf Neumann
+ * +1002 stuff University of Economics
+ * +3812 support Augasse 2-6
+ * +Output buffering A-1090 Vienna, AUSTRIA
+ * +lpt binary support Tel. *43-222-340525/533
+ * +pk-89 stuff 773
+ * +pixelpaths
+ * +alternative directory structure
+ * +code compiles also under Unix V (HP/UX)
+ * (thx Michael Haberler)
+ * +huge characters (a character bigger than 32K)
+ * formats PXL1001 and PXL 1002
+ * (use: raster graphics)
+ * +reduction of the produced code
+ * +new options -X -Y -c -g
+ * +changed options -r (LJ now default from first to last)
+ * -x,-y (accept floats)
+ * +new option -z for LJ: print testpage containing
+ * pagecounter after printjob
+ * +try to overcome font limit on LJ (max 16 fonts/page) and
+ * (max 32 fonts/document):
+ * additional fonts are drawn as bitmap-
+ * graphics.
+ * +allows to set character close to the paperedge on LJ
+ * +gf-supprt (by Joe Kelsey joe@Pacer.com)
+ * gf.c and gf.h from mitdevices/dvi2ps
+ * +clipping of rules
+ * +OS/2 defines from Rutger Berns, apprmb@hheouh50.bitnet
+ *
+ * BITNET/EARN: NEUMANN at AWIWUW11
+ **********************************************************************
+ * fixes in LJ-mode: rule-drawing,
+ * characters with 127<=height<=200
+ * reset printer at beginning and end of each job
+ * better positioning of rules
+ * 30.1.89 (0.48) bug fixed for files containing >32 fonts (thanks A. Brosig),
+ * different font assignment heuristic
+ * fixes in 3812-mode: 14.juli 87 positioning of rastered characters
+ * better positioning of rules
+ * general fixes
+ * 1.1.88 page origin set to 1in/1in (hopefully everywhere)
+ * 22.7.88 reset y-position for each page-eject
+ * 15.1.89 fixing bug is space allocation for EmitFileName
+ * (thanks to Bernhard Simon)
+ * 15.3.91 (0.49) landscape support for lj ii p, lj iii and lj 2000
+ * fixing rule drawing problems for IBM3812 in landcape mode,
+ * 256 character clean (lj family and IBM3812)
+ * 5.5.91 (0.50) -DSEVENBIT added for older LJ-emulations
+ * -D1, -D2, -D-, -D1-, -D2- options added due to suggestions
+ * from Tomasz Wolniewicz
+ **********************************************************************
+ * Preprocessor switches:
+ * #define DEBUG for massive printing of trace information
+ * when -d cmdline option specified
+ * #define IBM3812 produce output for the IBM3812 pageprinter
+ * #define LJ produce output for the HP Laserjet+ or LJ II
+ * #define LJ2P produce output for the HP Laserjet LJ IIP, LJ III
+ * or LaserJet 2000
+ * #define LJ_LARGE_FONT_MEMORY large FONT Memory for LJ printer family
+ * #define DRAWGLYPH draws PK-Glyphs on stderr
+ * #define USEPXL use PXL and PK fonts rather than gf fonts
+ */
+/**********************************************************************
+ ************************ Global Definitions ************************
+ **********************************************************************/
+/* #define IBM3812 */
+/* #define LJ */
+/* #define DRAWGLYPH */
+
+#include "config.h"
+
+#ifdef unix
+#define OS "Unix"
+#define READ_BINARY "r"
+#define WRITE_BINARY "w"
+#define labs(x) abs(x)
+#endif
+#ifdef MSDOS
+#define OS "MS-DOS"
+#define READ_BINARY "rb"
+#define WRITE_BINARY "wb"
+#define MSC5
+#endif
+#ifdef OS2
+#define OS "OS/2"
+#define READ_BINARY "rb"
+#define WRITE_BINARY "wb"
+#define MSC5
+#endif
+#ifdef vms
+#define OS "VMS"
+#include <ssdef.h>
+#include <stsdef.h>
+#define ftell vms_ftell /* use some external routines, because */
+#define fseek vms_fseek /* of some bugs in the VMS run time */
+#define getchar vms_getchar /* library */
+#define getenv vms_getenv
+#define ungetc vms_ungetc
+#define getname vms_getname
+#define READ_BINARY "rb"
+#define WRITE_BINARY "wb","rfm=fix","bls=512","mrs=512" /* fixed records */
+#define labs(x) abs(x)
+#endif
+
+#include "commands.h"
+#include <string.h>
+#include <signal.h>
+#include <stdio.h>
+#include <ctype.h>
+#ifdef vms
+#include <file.h>
+#else
+#include <fcntl.h>
+#endif
+#ifdef MSDOS
+#include <dos.h> /* only for binaryopen on device */
+#endif
+#ifdef unix
+#include <limits.h>
+#endif
+
+#define DVIFORMAT 2
+#define UNKNOWN -1
+#define FIRSTFNTCHAR 0
+
+#ifdef MSDOS
+#define OPEN_MAX 30 /* better than 50 */
+#endif
+
+#ifdef OPEN_MAX /* ... in a friendly unix system */
+#ifndef vms
+#define MAXOPEN (OPEN_MAX - 8)
+#else
+#define MAXOPEN 12 /* OPEN_MAX seems to be 8 on VMS systems */
+#endif
+#else
+#define MAXOPEN 24 /* limit on number of open font files */
+#endif
+#define NFNTCHARS LASTFNTCHAR+1
+#define STACK_SIZE 100 /* DVI-stack size */
+#define NONEXISTANT -1 /* offset for PXL files not found */
+#define NO_FILE ((FILE *)-1)
+#define NEW(A) ((A *) malloc(sizeof(A)))
+#define EQ(a,b) (strcmp(a,b)==0)
+#define MM_TO_PXL(x) (int)(((x)*RESOLUTION*10)/254)
+#define PT_TO_PXL(x) (int)((long)((x)*RESOLUTION*100l)/7224)
+#define PT_TO_DVI(x) (long)((x)*65536l)
+#define BOPENCMD fopen
+#define BINOPEN(f) BOPENCMD(f,READ_BINARY)
+/* SMALL_SIZE characters are loaded into font storage of the printer */
+/* LARGE_SIZE characters are rastered */
+/* HUGE_SIZE characters are not loaded into the memory of the host */
+#define SMALL_SIZE (unsigned char) 0
+#define LARGE_SIZE (unsigned char) 1
+#define HUGE_SIZE (unsigned char) 2
+#define HUGE_CHAR_PATTERN 32767l
+#define BYTES_PER_PIXEL_LINE 500 /* max number of bytes per pixel line */
+
+
+#define PK_POST 245
+#define PK_PRE 247
+#define PK_ID 89
+
+/* to speedup the program a little: redefinition of PixRound and PutWord */
+/*#define PIXROUND(x,c) ((((double)x+(double)(c>>1))/(double)c)+0.5)*/
+#define PIXROUND(x,c) (((x)+c)/c)
+#define PUTWORD(w) EMITC((char)(w>>8)&0xff); EMITC((char)w&0xff)
+/*************************************************************************/
+#define EMIT fprintf /* output a formatted string */
+#ifndef vms
+#define EMITB(len,b) fwrite(b,1,len,outfp) /* output binary data of len */
+#else
+ /* VMS doesn't like to use fwrite on a file with fixed record sizes,
+ so use number of putc calls */
+#define EMITB(len,b) for (kk = 0;kk < len; kk++) putc(*(b+kk),outfp);
+#endif
+#define EMITWORD(w) PUTWORD((w)) /* output a 2 byte word of data */
+
+#define MoveOver(b) h += (long) b
+#define MoveDown(a) v += (long) a
+#define qfprintf if (!G_quiet) fprintf
+#define qprintf if (!G_quiet) printf
+#define LARGER(a,b) (((a)>(b)) ? (a) : (b))
+
+#ifdef IBM3812
+#define PRINTER "IBM 3812 pageprinter"
+#define EMITC(c) PMPoutC(c) /* output a single character */
+#define PMPcont(l) PMPout(-1,(long)l) /* next l bytes continuous */
+#define PMPflush PMPout(0l,"") /* flush PMP-buffer */
+#define EMITL(l,d) PMPout((int)l,d) /* EMIT-logical: via PMP-buffer */
+#define hconvRESOLUTION 240
+#define vconvRESOLUTION 240
+#define CHAR_WIDTH_LARGE 100 /* limit for loading into printer font */
+#define CHAR_HEIGTH_LARGE 127 /* limit for loading into printer font */
+#define OUTBUFSIZE 20000 /* size of output buffer for PMP cmds */
+ /* has to be less max(signed int) */
+#define MAXFONTSTORAGE 130000l /* font storage in the 3812 pageprinter */
+#define EMITFILE_EXTENSION ".pmp" /* default extension of emit file */
+#define XDEFAULTOFF RESOLUTION /* y default offset on page 1 inch */
+#define YDEFAULTOFF RESOLUTION /* y default offset on page 1 inch */
+#define CHARSTRINGMAX 80 /* bufferlength for SetString */
+#define MAX_PAGE_WIDTH 2040
+#define MAX_PAGE_HEIGHT 3360
+/**********************************************************************/
+/************** Positioning for the 3812 ****************************/
+/**********************************************************************/
+#define VERT_HALF(n) ((short)((n+1)>>1)-1)
+#define HOR_HALF(n) ((short)(n>>1))
+#define MoveHor(n) if ((n)!=0) { PMPcont(3); PMPout(1,"\342"); EMITWORD((n)); }
+#define MoveVert(n) if ((n)!=0) { PMPcont(3); PMPout(1,"\343"); EMITWORD((n)); }
+#endif
+
+#ifdef LJ
+#ifdef LJ2P
+#define PRINTER "HP LaserJet IIP"
+#else
+#ifdef LJ2
+#define PRINTER "HP LaserJet II"
+#else
+#define PRINTER "HP LaserJet"
+#endif
+#endif
+#ifdef LJ4
+#define RESOLUTION 600
+#define hconvRESOLUTION 600
+#define vconvRESOLUTION 600
+#else
+#define RESOLUTION 300
+#define hconvRESOLUTION 300
+#define vconvRESOLUTION 300
+#endif
+#ifdef LJ2
+/* the printer limit of the LJ2P is actually 16384x16384,
+ * but to exploit it, one would need lots of memory in the printer
+ */
+#define CHAR_WIDTH_LARGE 300 /* limit for loading into printer font */
+#define CHAR_HEIGTH_LARGE 300 /* y_offset reaches the same size! */
+#else /* such as LaserJet+, Laserjet II */
+#define CHAR_WIDTH_LARGE 100 /* limit for loading into printer font */
+#define CHAR_HEIGTH_LARGE 127 /* y_offset reaches the same size! */
+#endif
+#define EMITFILE_EXTENSION ".lj" /* default extension of emit file */
+#ifndef MAX_FONTS_PER_PAGE
+#define MAX_FONTS_PER_PAGE 16 /* maximum number of fonts per page */
+#endif
+#define HANDLE_MAX_FONTS 255 /* max nr of fonts handled (rasterfont) */
+#define FONTS_DOWNLOADABLE 32 /* max nr of fonts that can be downloaded */
+#define MAXFONTSTORAGE (395l*1024l) /* standard user memory */
+#define EMITC(c) putc(c,outfp) /* output a single character */
+#define EMITL(l,d) EMITB(l,d) /* EMIT-logical = EMITB */
+#define XDEFAULTOFF RESOLUTION-54 /*x default offset on page 1 inch (LJ2)*/
+#define YDEFAULTOFF RESOLUTION+9 /* y default offset on page 1 inch */
+#define max(x,y) if ((y)>(x)) x = y
+#ifndef vms
+#define INT_ASCII(b,i) if (i == 0) b[0] = '\0'; else sprintf((char *)b,"%hd",i)
+#else
+#define INT_ASCII(b,i) if (i == 0) b[0] = '\0'; else sprintf((char *)b,"%d",i)
+#endif
+#endif
+
+#ifdef SEVENBIT
+#define VIS 33
+#define VIS2 (VIS+32)
+unsigned char
+VisChar(c)
+unsigned char c;
+{
+ c &= 0xff;
+ if (c < VIS)
+ return ((unsigned char)(160 + c));
+ if (c < 128)
+ return (c);
+ if (c < (255 - VIS2))
+ return ((unsigned char)(VIS2 + c));
+ return (255);
+}
+#else
+#define VisChar(c) (unsigned char)(c)
+#endif
+
+
+/**********************************************************************/
+/*********************** external definitions ***********************/
+/**********************************************************************/
+/*typedef char bool;*/
+
+#ifndef unix
+long access();
+FILE *BOPENCMD();
+void exit();
+int fclose();
+int fprintf();
+int fseek();
+char *index();
+int printf();
+int sscanf();
+int strcmp();
+char *strcpy();
+#ifdef MSC5
+unsigned int strlen();
+#endif
+void free();
+void setbuf();
+#endif
+#ifndef MSDOS
+char *malloc();
+char *getenv();
+#endif
+
+#ifdef MSDOS
+int intdos();
+#endif
+
+#ifndef USEPXL
+/* interface to gf.c */
+extern FILE *gfin;
+extern int checksum;
+extern long tfm_wd[], char_pointer[];
+extern char char_exists[];
+extern int num_cols, num_rows, num_bytes, x_offset, y_offset;
+extern unsigned char bits[];
+extern int gf_font_max_m, gf_font_max_n, gf_font_min_n;
+extern int gettochar();
+extern void readbits();
+extern void readpost();
+extern void seekpost();
+extern int seekchar();
+#endif
+
+
+/**********************************************************************/
+/************************* Global Procedures ************************/
+/**********************************************************************/
+/* Note: Global procedures are declared here in alphabetical order, with
+ those which do not return values typed "void". Their bodies occur in
+ alphabetical order following the main() procedure. The names are
+ kept unique in the first 6 characters for portability. */
+double ActualFactor();
+void AllDone();
+#ifdef MSDOS
+void AssureBinary(); /* DOS and Microsoft C dependent !!! */
+#endif
+void CopyFile();
+void CopyHPFile();
+void DecodeArgs();
+void DoBop();
+long DoConv();
+void DoSpecial();
+void EmitChar();
+void Fatal();
+void FindPostAmblePtr();
+void FormFeed();
+void GetBytes();
+void GetFontDef();
+char *GetKeyStr();
+bool GetKeyVal();
+bool IsSame();
+void lcase();
+void LoadAChar();
+long NoSignExtend();
+/* see cautionary note in code, re arithmetic vs logical shifts */
+void OpenFontFile();
+long PixRound();
+void PkRaster();
+void PutWord();
+void RasterLine();
+void RasterChar();
+void ReadFontDef();
+void ReadPostAmble();
+void SetChar();
+void SetFntNum();
+void SetPosn();
+void SetRule();
+void SetString();
+long SignExtend();
+/* see cautionary note in code, re arithmetic vs logical shifts */
+void SkipFontDef();
+void Warning();
+unsigned char skip_specials() ;
+
+#ifdef IBM3812
+void PMPout();
+void PMPoutC();
+#endif
+
+/**********************************************************************/
+/*********************** Font Data Structures ***********************/
+/**********************************************************************/
+
+struct char_entry { /* character entry */
+#ifdef USEPXL
+ unsigned short width, height; /* width and height in pixels */
+ short xOffset, yOffset, yyOffset; /* x offset and y offset in pixels*/
+#endif
+ struct {
+ bool isloaded;
+ union {
+ long fileOffset;
+ long *pixptr;
+ } address;
+ } where;
+ long tfmw; /* TFM width */
+ long cw; /* character width in pixels */
+ unsigned char flag_byte; /* for PK-files */
+ unsigned char charsize;
+};
+struct font_entry { /* font entry */
+ long k, c, s, d;
+ int a, l;
+ char n[STRSIZE]; /* FNT_DEF command parameters */
+ long font_mag; /* computed from FNT_DEF s and d parameters */
+ /*char psname[STRSIZE];*/ /* PostScript name of the font */
+ char name[STRSIZE]; /* full name of PXL file */
+ FILE * font_file_id; /* file identifier (NO_FILE if none) */
+#ifdef USEPXL
+ long magnification; /* magnification read from PXL file */
+ long designsize; /* design size read from PXL file */
+#endif
+ struct char_entry ch[NFNTCHARS]; /* character information */
+ struct font_entry *next;
+ unsigned short ncdl; /* #of different chars actually downloaded */
+ unsigned short plusid; /* Font id in Printer */
+ bool used_on_this_page;
+ enum PxlId {
+ id1001, id1002, pk89 } id;
+#ifdef LJ
+ unsigned short max_width, max_height, max_yoff;
+#endif
+};
+
+
+struct pixel_list {
+ FILE *pixel_file_id; /* file identifier */
+ int use_count; /* count of "opens" */
+};
+/**********************************************************************/
+/************************* Global Variables *************************/
+/**********************************************************************/
+long FirstPage = -1000000; /* first page to print (uses count0) */
+long LastPage = 1000000; /* last page to print */
+long PrintPages = 1000000; /* nr of pages to print */
+bool FirstPageSpecified = FALSE;
+bool LastPageSpecified = FALSE;
+char G_progname[STRSIZE]; /* program name */
+char filename[STRSIZE]; /* DVI file name */
+char rootname[STRSIZE]; /* DVI filename without extension */
+char *PXLpath = FONTAREA; /* PXL path name for search */
+char *HeaderFileName = ""; /* file name & path of Headerfile */
+char *EmitFileName = ""; /* file name & path for output */
+#ifdef IBM3812
+bool FirstAlternate = FALSE; /* first page from alternate casette ? */
+#endif
+bool Reverse = FALSE; /* process DVI pages in reverse order? */
+bool Landscape = FALSE; /* print document in ladscape mode */
+bool ResetPrinter = TRUE; /* reset printer at the begin of the job*/
+bool DoublePage = FALSE; /* print on both sides of a paper */
+bool PrintSecondPart = TRUE; /* print First Part when DoublePage */
+bool PrintFirstPart = TRUE; /* print Second Part when DoublePage */
+bool PrintEmptyPages = TRUE; /* print Empty pages in DoublePage mode*/
+short PageParity = 1;
+#ifdef LJ
+#ifdef LJ2P
+int DuplexMode = 0;
+#endif
+bool PrintTestPage = FALSE; /* print testpage with pagecounter after job */
+unsigned short pagesize = 0; /* page size value */
+unsigned short pgsiz_dots = 0; /* page size in dots (for rule-clipping)*/
+#endif
+#ifndef vms
+short G_errenc = 0; /* has an error been encountered? */
+#else
+long G_errenc = SS$_NORMAL; /* has an error been encountered? */
+#endif
+bool G_header = FALSE; /* copy header file to output? */
+bool G_quiet = FALSE; /* for quiet operation */
+bool G_noverbatim = TRUE; /* inform user about pxl-files used */
+bool G_nowarn = FALSE; /* don't print out warnings */
+short x_origin = XDEFAULTOFF; /* x-origin in dots */
+short y_origin = YDEFAULTOFF; /* y-origin in dots */
+short x_goffset; /* global x-offset in dots */
+short y_goffset; /* global y-offset in dots */
+unsigned short ncopies = 1; /* number of copies to print */
+long hconv, vconv; /* converts DVI units to pixels */
+long den; /* denominator specified in preamble */
+long num; /* numerator specified in preamble */
+long h; /* current horizontal position */
+long hh = 0; /* current h on device */
+long v; /* current vertical position */
+long vv = 0; /* current v on device */
+long mag; /* magnification specified in preamble */
+long usermag = 0; /* user specified magnification */
+int ndone = 0; /* number of pages converted */
+int nopen = 0; /* number of open PXL files */
+#ifdef vms
+int kk; /* loop variable for EMITB */
+#endif
+FILE *outfp = NULL; /* output file */
+FILE *pxlfp; /* PXL file pointer */
+FILE *dvifp = NULL; /* DVI file pointer */
+struct font_entry *prevfont = NULL; /* font_entry pointer previous font*/
+struct font_entry *fontptr; /* font_entry pointer */
+struct font_entry *hfontptr = NULL; /* font_entry pointer */
+struct font_entry *pfontptr = NULL; /* previous font_entry pointer */
+struct pixel_list pixel_files[MAXOPEN+1]; /* list of open PXL files */
+long postambleptr; /* Pointer to the postamble */
+long ppagep; /* previous page pointer */
+static int last_ry = UNKNOWN; /* last y-position on page */
+static int last_rx = UNKNOWN; /* last x-position on page */
+long StartPrintPages; /* notpad for double paged output */
+int WouldPrint = 0;
+bool ZeroPage = FALSE; /* Document starts with a Zero Page */
+bool EvenPage = FALSE; /* Document starts with an even Page */
+long LastPtobePrinted = 0;
+int G_ncdl = 0;
+
+long allocated_storage = 0; /* size of mallocated storage (statistics) */
+long power[32] ;
+long gpower[33] ;
+
+
+#ifdef DEBUG
+bool Debug = FALSE;
+#endif
+
+#ifdef LJ
+int fonts_used_on_this_page = MAX_FONTS_PER_PAGE+1;
+char rasterfont[HANDLE_MAX_FONTS];
+ /* raster if fonts/page>MAX_FONTS_PER_PAGE*/
+#endif
+
+long used_fontstorage = 0;
+
+#ifdef IBM3812
+char PMPformat[20];
+char CharString[CHARSTRINGMAX];
+unsigned int CharStringPos = 0;
+#define CharStringOut \
+ if (CharStringPos>0) { \
+ PMPcont(CharStringPos+1);\
+ PMPoutC((unsigned char)CharStringPos);\
+ PMPout(CharStringPos, CharString); \
+ CharStringPos=0; }
+#endif
+
+#ifdef TIMING
+/************************timing stuff*********************/
+#ifndef vms
+#include <sys/timeb.h>
+#else
+#include <timeb.h>
+#endif
+struct timeb timebuffer;
+double start_time;
+#endif
+
+
+
+
+/**********************************************************************/
+/******************************* main *******************************/
+/**********************************************************************/
+void
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ struct stack_entry { /* stack entry */
+ long h, v, w, x, y, z; /* what's on stack */
+ };
+ short command; /* current command */
+ long count[10]; /* the 10 counters at begining of each page*/
+ long cpagep; /* current page pointer */
+ bool Emitting = FALSE; /* outputting typsetting instructions? */
+ int i; /* command parameter; loop index */
+ int k; /* temporary parameter */
+ char n[STRSIZE]; /* command parameter */
+ int PassNo = 0; /* which pass over the DVI page are we on? */
+ bool SkipMode = FALSE; /* in skip mode flag */
+ int sp; /* stack pointer */
+ struct stack_entry stack[STACK_SIZE]; /* stack */
+ char SpecialStr[STRSIZE]; /* "\special" strings */
+ long val, val2; /* temporarys to hold command information */
+ long w; /* current horizontal spacing */
+ long x; /* current horizontal spacing */
+ long y; /* current vertical spacing */
+ long z; /* current vertical spacing */
+
+
+#ifdef vms
+ extern noshare int errno;
+ extern noshare char *sys_errlist[];
+#else
+ extern char *sys_errlist[];
+ extern int errno;
+#endif
+
+ setbuf(stderr, NULL);
+ (void) strcpy(G_progname, argv[0]);
+ DecodeArgs( argc, argv );
+
+ power [ 0 ] = 1 ;
+ for ( i = 1 ; i <= 31 ; i ++)
+ power [ i ] = power [ i - 1 ] << 1 ;
+ gpower[0] = 0l ;
+ for ( i = 1 ; i <= 32 ; i ++)
+ gpower[i] = gpower[i - 1] + power[i - 1] ;
+
+ if ((i = (int) NoSignExtend(dvifp, 1)) != PRE) {
+ Fatal(
+ "%s: PRE doesn't occur first--are you sure this is a DVI file?\n\n",
+ G_progname);
+ }
+ i = (int) SignExtend(dvifp, 1);
+ if (i != DVIFORMAT) {
+ Fatal( "%s: DVI format = %d, can only process DVI format %d files\n\n",
+ G_progname, i, DVIFORMAT);
+ }
+
+ if (*EmitFileName == '-')
+ outfp = stdout;
+ else
+ if ((outfp = fopen(EmitFileName, WRITE_BINARY)) == NULL)
+ Fatal("opening output file: fopen(%s) : %s",
+ EmitFileName,sys_errlist[errno]);
+
+#ifdef MSDOS
+ AssureBinary(outfp);
+#endif
+
+#ifdef TIMING
+ ftime(&timebuffer);
+ start_time = (timebuffer.time) + (float)(timebuffer.millitm) / 1000.0;
+#endif
+
+ /* it is important that these be the very first things output !!! */
+ if ( G_header )
+ CopyFile( HeaderFileName );
+
+ /*****************************/
+ /*for( i0=0; i0<nif; i0++ ) */ /* copy all included files */
+ /* CopyFile( Ifile[i0] ); */
+ /*****************************/
+
+#ifdef IBM3812
+ PMPout(3, "\307\310\366"); /* unload all fonts and macros */
+ EMITWORD(MAX_PAGE_WIDTH);
+ EMITWORD(MAX_PAGE_HEIGHT);
+ if (Landscape)
+ PMPout(2, "\322\1");
+#endif
+#ifdef LJ
+ if (ResetPrinter)
+ EMIT(outfp, "\033E");
+#ifdef LJ4
+ EMIT(outfp, "\033%%-12345X@PJL SET RESOLUTION=600\012");
+ EMIT(outfp, "@PJL SET PAGEPROTECT=OFF\012");
+ EMIT(outfp, "@PJL SET ENTER LANGUAGE=PCL\012");
+ EMIT(outfp, "\033&u600D\033*t600R");
+#endif
+#ifdef LJ2P
+ if (DuplexMode)
+ EMIT(outfp, "\033&l%dH",DuplexMode);
+#endif
+ if (Landscape)
+ EMIT(outfp, "\033&l1O\033*rF");
+ if (pagesize>0)
+#ifndef vms
+ EMIT(outfp, "\033&l%hdaE\033&aL",pagesize);
+#else
+ EMIT(outfp, "\033&l%daE\033&aL",pagesize);
+#endif
+ else
+ EMIT(outfp, "\033&lE\033&aL");
+
+ if (ncopies>1)
+#ifndef vms
+ EMIT(outfp, "\033&l%hdX",ncopies);
+#else
+ EMIT(outfp, "\033&l%dX",ncopies);
+#endif
+#endif
+ if (DoublePage) {
+ StartPrintPages = PrintPages;
+#ifdef IBM3812
+ Reverse = (bool)!Reverse; /* perverse and strange */
+#endif
+
+ }
+ if (Reverse) {
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr, "reverse\n");
+#endif
+ ReadPostAmble(TRUE);
+ fseek(dvifp, ppagep, 0);
+ } else {
+ ReadPostAmble(TRUE);
+ fseek(dvifp, 14l, 0);
+ k = (int) NoSignExtend(dvifp, 1);
+ GetBytes(dvifp, n, k);
+ }
+ PassNo = 0;
+
+ while (TRUE) {
+ command = (short) NoSignExtend(dvifp, 1) ;
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"CMD:\t%d\n", command);
+#endif
+ switch (command) {
+ case SET1:
+ case SET2:
+ case SET3:
+ case SET4:
+ val = NoSignExtend(dvifp, (int) command - SET1 + 1);
+ if (!SkipMode)
+ SetChar(val, command, PassNo, TRUE,FALSE);
+ break;
+ case SET_RULE:
+ val = NoSignExtend(dvifp, 4);
+ val2 = NoSignExtend(dvifp, 4);
+ if (Emitting)
+ SetRule(val, val2, 1);
+ break;
+ case PUT1:
+ case PUT2:
+ case PUT3:
+ case PUT4:
+ val = NoSignExtend(dvifp, (int) command - PUT1 + 1);
+ if (!SkipMode)
+ SetChar(val, command, PassNo, TRUE,FALSE);
+ break;
+ case PUT_RULE:
+ val = NoSignExtend(dvifp, 4);
+ val2 = NoSignExtend(dvifp, 4);
+ if (Emitting)
+ SetRule(val, val2, 0);
+ break;
+ case NOP:
+ break;
+ case BOP:
+ cpagep = ftell(dvifp) - 1;
+ for (i = 0; i <= 9; i++)
+ count[i] = NoSignExtend(dvifp, 4);
+ ppagep = NoSignExtend(dvifp, 4);
+ h = v = w = x = y = z = 0;
+ hh = vv = 0;
+ sp = 0;
+ fontptr = NULL;
+ prevfont = NULL;
+ DoBop();
+/*
+fprintf(stderr,"skimode %d, count %d, F %d, L %d\n",
+ (int)SkipMode,(int)count[0],(int)FirstPageSpecified,(int)LastPageSpecified);
+*/
+ SkipMode = (bool) ((FirstPageSpecified && count[0] < FirstPage) ||
+ (LastPageSpecified && count[0] > LastPage ));
+/*
+fprintf(stderr,"skimode %d, count %d, F %d, L %d\n",
+ (int)SkipMode,(int)count[0],(int)FirstPageSpecified,(int)LastPageSpecified);
+*/
+
+ if (DoublePage && !SkipMode) {
+ if (PassNo == 0) {
+ LastPtobePrinted=count[0];
+ if (!Reverse && (WouldPrint == 0)) {
+ if (count[0] == 0l) {
+ ZeroPage = TRUE;
+ EvenPage = FALSE;
+ }
+ else {
+ EvenPage = (bool) ( (count[0]<0? labs(count[0])+1: count[0]) %2 == 0);
+
+ if (PrintEmptyPages && EvenPage && PageParity==1) {
+ WouldPrint ++;
+ if (PrintFirstPart) {
+ qfprintf(stderr,"[EvenPage] ");
+ FormFeed();
+ }
+ }
+ }
+ }
+ WouldPrint ++;
+/*
+ printf("doublepage %d, page parity = %d, 1=%d 2=%d, Reverse %d, WouldPrint %d, fpZ %d\n",
+ (int)DoublePage, (int)PageParity,(int)PrintFirstPart,(int)PrintSecondPart,
+ (int)Reverse, (int)WouldPrint, (int)ZeroPage);
+*/
+ }
+ if (!PrintFirstPart && PageParity==1) {
+ if (count[0]==0l) {
+ ZeroPage = TRUE;
+ EvenPage = FALSE;
+ }
+ SkipMode = TRUE;
+ }
+ else {
+/*
+fprintf(stderr,"FirstPart\n count %d, mod %d, pp %d\n",(int)count[0],(int)count[0]%2,PageParity);
+*/
+ SkipMode = (bool)(PageParity != (short)(
+ (count[0]<0? labs(count[0])+1: count[0])%2));
+ if (count[0]==0l) SkipMode=(bool)!SkipMode;
+ }
+
+ }
+ Emitting = (bool)((PassNo != 0) && !SkipMode);
+/*
+fprintf(stderr,"Emitting= %d, PassNo=%d, SkipMode = %d\n",(int)Emitting,(int)PassNo,(int)SkipMode);
+*/
+ if ( !SkipMode ) {
+ if ( PassNo == 0)
+ qfprintf(stderr, "[%ld", count[0]);
+ }
+ break;
+ case EOP:
+ if ( !SkipMode ) {
+ if ( PassNo == 0 ) {
+ /* start second pass on current page */
+ fseek(dvifp, cpagep, 0);
+ PassNo = 1;
+ } else {
+ /* end of second pass, and of page processing */
+
+ last_ry = UNKNOWN;
+ FormFeed();
+ ++ndone;
+
+ qfprintf(stderr, "] ");
+ if ( (ndone % 10) == 0 )
+ qfprintf(stderr, "\n");
+
+ if (DoublePage) --PrintPages;
+ if (--PrintPages < 1) AllDone(TRUE);
+ PassNo = 0;
+ }
+ } else
+ PassNo = 0;
+
+ if ( PassNo == 0 && Reverse ) {
+ if ( ppagep > 0 )
+ fseek(dvifp, ppagep, 0);
+ else {
+ if (DoublePage && !SkipMode)
+ ZeroPage = (bool)(count[0]==0l);
+
+ if (ZeroPage)
+ EvenPage = FALSE;
+ else
+ EvenPage = (bool) ((int)LastPtobePrinted%2 == 0);
+
+ AllDone(FALSE);
+ }
+ }
+ break;
+ case PUSH:
+ if (sp >= STACK_SIZE)
+ Fatal("stack overflow");
+ stack[sp].h = h;
+ stack[sp].v = v;
+ stack[sp].w = w;
+ stack[sp].x = x;
+ stack[sp].y = y;
+ stack[sp].z = z;
+ sp++;
+ break;
+ case POP:
+ --sp;
+ if (sp < 0)
+ Fatal("stack underflow");
+ h = stack[sp].h;
+ v = stack[sp].v;
+ w = stack[sp].w;
+ x = stack[sp].x;
+ y = stack[sp].y;
+ z = stack[sp].z;
+ break;
+ case RIGHT1:
+ case RIGHT2:
+ case RIGHT3:
+ case RIGHT4:
+ val = SignExtend(dvifp, (int) command - RIGHT1 + 1);
+ if (Emitting)
+ MoveOver(val);
+ break;
+ case W0:
+ if (Emitting)
+ MoveOver(w);
+ break;
+ case W1:
+ case W2:
+ case W3:
+ case W4:
+ w = SignExtend(dvifp, (int)command - W1 + 1);
+ if (Emitting)
+ MoveOver(w);
+ break;
+ case X0:
+ if (Emitting)
+ MoveOver(x);
+ break;
+ case X1:
+ case X2:
+ case X3:
+ case X4:
+ x = SignExtend(dvifp, (int)command - X1 + 1);
+ if (Emitting)
+ MoveOver(x);
+ break;
+ case DOWN1:
+ case DOWN2:
+ case DOWN3:
+ case DOWN4:
+ val = SignExtend(dvifp, (int)command - DOWN1 + 1);
+ if (Emitting)
+ MoveDown(val);
+ break;
+ case Y0:
+ if (Emitting)
+ MoveDown(y);
+ break;
+ case Y1:
+ case Y2:
+ case Y3:
+ case Y4:
+ y = SignExtend(dvifp, (int)command - Y1 + 1);
+ if (Emitting)
+ MoveDown(y);
+ break;
+ case Z0:
+ if (Emitting)
+ MoveDown(z);
+ break;
+ case Z1:
+ case Z2:
+ case Z3:
+ case Z4:
+ z = SignExtend(dvifp, (int)command - Z1 + 1);
+ if (Emitting)
+ MoveDown(z);
+ break;
+ case FNT1:
+ case FNT2:
+ case FNT3:
+ case FNT4:
+ if (!SkipMode) {
+ SetFntNum(NoSignExtend(dvifp, (int)command -FNT1 +1),Emitting);
+ }
+ break;
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ k = (int) NoSignExtend(dvifp, (int)command - XXX1 + 1);
+ GetBytes(dvifp, SpecialStr, k);
+ if (Emitting)
+ DoSpecial(SpecialStr, k);
+ break;
+ case FNT_DEF1:
+ case FNT_DEF2:
+ case FNT_DEF3:
+ case FNT_DEF4:
+ k = (int) NoSignExtend(dvifp, (int)command - FNT_DEF1 + 1);
+ SkipFontDef(); /* SkipFontDef(k); */
+ break;
+ case PRE:
+ Fatal("PRE occurs within file");
+ break;
+ case POST:
+ AllDone(FALSE);
+ PassNo = 0;
+ break;
+ case POST_POST:
+ Fatal("POST_POST with no preceding POST");
+ break;
+ default:
+ if (command >= FONT_00 && command <= FONT_63) {
+ if (!SkipMode)
+ SetFntNum((long) command - FONT_00, Emitting);
+ } else if (command >= SETC_000 && command <= SETC_127) {
+ if (!SkipMode) {
+ SetString(command, PassNo);
+ }
+ } else
+ Fatal("%d is an undefined command", command);
+ break;
+ }
+ } /* while TRUE */
+}
+
+
+/*-->ActualFactor*/
+/**********************************************************************/
+/************************** ActualFactor ****************************/
+/**********************************************************************/
+double /* compute the actual size factor given the approximation */
+ActualFactor(unmodsize)
+long unmodsize; /* actually factor * 1000 */
+{
+ double realsize; /* the actual magnification factor */
+ realsize = (double)unmodsize / 1000.0;
+ if (abs((int)(unmodsize - 1095l))<2)
+ realsize = 1.095445115; /*stephalf*/
+ else if (abs((int)(unmodsize - 1315l))<2)
+ realsize = 1.31453414; /*stepihalf*/
+ else if (abs((int)(unmodsize - 1577l))<2)
+ realsize = 1.57744097; /*stepiihalf*/
+ else if (abs((int)(unmodsize - 1893l))<2)
+ realsize = 1.89292916; /*stepiiihalf*/
+ else if (abs((int)(unmodsize - 2074l))<2)
+ realsize = 2.0736; /*stepiv*/
+ else if (abs((int)(unmodsize - 2488l))<2)
+ realsize = 2.48832; /*stepv*/
+ else if (abs((int)(unmodsize - 2986l))<2)
+ realsize = 2.985984; /*stepvi*/
+ /* the remaining magnification steps are represented with sufficient
+ accuracy already */
+ return(realsize);
+}
+
+
+/*-->AllDone*/
+/**********************************************************************/
+/****************************** AllDone ******************************/
+/**********************************************************************/
+void
+AllDone(PFlag)
+bool PFlag;
+{
+ double time;
+
+ if (DoublePage && (PageParity==1)) { /* Shall we go around again?*/
+ int k,rc;
+ char n[STRSIZE];
+
+ if (PrintEmptyPages && EvenPage && Reverse && PrintFirstPart) {
+ WouldPrint ++;
+ qfprintf(stderr,"[EvenPage] ");
+ FormFeed();
+ }
+#ifdef LJ
+ Reverse = (bool)!Reverse;
+#endif
+ if (Reverse) {
+ if (!PFlag) {
+ fseek (dvifp, postambleptr, 0);
+ (void) NoSignExtend(dvifp, 1);
+ ppagep = NoSignExtend(dvifp, 4);
+ }
+ fseek(dvifp, ppagep, 0);
+ } else {
+ fseek(dvifp, 14l, 0);
+ k = (int) NoSignExtend(dvifp, 1);
+ GetBytes(dvifp, n, k);
+ }
+
+ if (PrintSecondPart) {
+ if (PrintFirstPart) {
+ qfprintf(stderr,"\n----------------------starting second pass\n");
+#ifdef LJ
+ EMIT(outfp, "\033&l2H"); /* Manual Feed */
+#endif
+#ifdef IBM3812
+ PMPout(6,"\326\001\305\300\326\252");
+ /* set display; ring bell; stop; clear display */
+ PMPflush;
+#endif
+ }
+
+ if (PrintEmptyPages && Reverse) {
+ if (ZeroPage) WouldPrint++;
+ if ((WouldPrint%2) == 1) {
+ qfprintf(stderr,"[Padding] ");
+ FormFeed();
+ }
+ }
+ WouldPrint = 0;
+ if (PrintEmptyPages && !Reverse && ZeroPage) {
+ WouldPrint++;
+ qfprintf(stderr,"[ZeroPage] ");
+ FormFeed();
+ }
+ PageParity = 0;
+ PrintPages = StartPrintPages;
+ return;
+ }
+ }
+
+ if (EvenPage && DoublePage && !Reverse) WouldPrint++;
+
+ if (PrintEmptyPages && DoublePage && PrintSecondPart) {
+ if (Reverse) {
+ if (ZeroPage) {
+ WouldPrint ++;
+ qfprintf(stderr,"[ZeroPage] ");
+ FormFeed();
+ }
+ }
+ else if ((WouldPrint%2) != 0) {
+ qfprintf(stderr,"[Padding] ");
+ FormFeed();
+ }
+ }
+
+#ifdef IBM3812
+ PMPout(10, "\373\010PMP.init"); /* re-init printer */
+ PMPflush;
+
+ if (used_fontstorage > MAXFONTSTORAGE) {
+ Warning("\n\7used font_storage of %s: %ld Bytes (of %ld)\7",
+ PRINTER, used_fontstorage, MAXFONTSTORAGE);
+ Warning("Try to format file in separate runs!");
+ } else
+ qfprintf(stderr,
+ "\nAll done, used font_storage of %s: %ld Bytes (of %ld)",
+ PRINTER, used_fontstorage, MAXFONTSTORAGE);
+#endif
+#ifdef LJ
+ qfprintf(stderr, "\nAll done, used font_storage of %s: %ld Bytes",
+ PRINTER, used_fontstorage);
+ EMIT(outfp, "\033E");
+ EMIT(outfp, "\033%%-12345X");
+ if (PrintTestPage) EMIT(outfp, "\033z");
+#ifdef vms
+ /* last record is not flushed to file, unless it is completely filled */
+ for (kk = (int)((*outfp)->_cnt); kk > 0; --kk) putc('\0',outfp);
+ fflush(outfp);
+#endif
+#endif
+
+ if (!G_quiet) {
+ fprintf(stderr,"\nDynamically allocated storage: %ld Bytes \n",
+ allocated_storage);
+ fprintf(stderr,"%d characters downloaded as soft fonts\n", G_ncdl);
+
+#ifdef TIMING
+ ftime(&timebuffer);
+ time = ((timebuffer.time) + (float)(timebuffer.millitm) / 1000.0) -start_time;
+
+ if (ndone > 0) {
+ fprintf(stderr,
+ "Time of complete run: %.2f seconds, %d page(s), %.2f seconds/page",
+ time, ndone, time / ndone);
+ fprintf(stderr," (%.2f ppm)\n",(ndone * 60) / time);
+ }
+ fprintf(stderr,"\n");
+#endif
+ }
+
+ exit(G_errenc);
+}
+
+
+/*-->CopyFile*/ /* copy a file straight through to output */
+/*********************************************************************/
+/***************************** CopyFile ******************************/
+/*********************************************************************/
+void
+CopyFile( str )
+char *str;
+{
+ FILE * spfp;
+ char t;
+ if ( (spfp = BINOPEN(str)) == NULL ) {
+ Warning("Unable to open file %s", str );
+ return;
+ }
+ qfprintf(stderr," [%s", str);
+ for (t = (char)getc(spfp); !feof(spfp); t = (char)getc(spfp))
+ putc(t, outfp);
+ fclose(spfp);
+ qfprintf(stderr,"]");
+}
+
+
+/*-->CopyHPFile*/ /* copy a HP file to output removing unwanted control codes*/
+/*********************************************************************/
+/***************************** CopyHPFile ******************************/
+/*********************************************************************/
+void
+CopyHPFile( str )
+char *str;
+{
+ FILE * spfp;
+ char t,numstr[20];
+ int count,rx,ry,miny,minx,num;
+
+ if ( (spfp = BINOPEN(str)) == NULL ) {
+ Warning("Unable to open file %s", str );
+ return;
+ }
+ minx=32767; /* Set to a high value initially */
+ miny=32767;
+
+/* Pass through the input PCL file twice. The first time find the smallest */
+/* x- and y-offsets so that they can be subtracted out when sending */
+/* positioning commands later. The second pass strips the unwanted commands */
+/* from the input file and outputs the rest */
+
+ qfprintf(stderr," [%s", str);
+ for (t = (char)getc(spfp); !feof(spfp); t = (char)getc(spfp))
+ {
+ if (t==0x1B) /* Find the escape character */
+ {
+ t=(char) getc(spfp);
+ if (t==0x2A) /* This indiactes the start of a graphics command */
+ {
+
+ t=(char) getc(spfp);
+ switch(t)
+ {
+ case(0x70):
+ /* These are the graphics positioning commands */
+ /* Find the smallest x and y offsets */
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);t<0x40;t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ num= atoi (numstr);
+
+ /* Take into account the possible different ordering */
+ /* of the commands (x first, y first) */
+
+ if ((t==0x59)||(t==0x79))
+ {
+ if (numstr[0]!='+'&&numstr[0]!='-'&&numstr[0]!='-')
+ if (num<miny) miny=num;
+ if (t==0x79)
+ {
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);t<0x40;t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ num=atoi (numstr);
+ if(numstr[0]!='+'&&numstr[0]!='-'&&numstr[0]!='-')
+ if (num<minx) minx=num;
+ }
+ }
+ if ((t==0x58)||(t==0x78))
+ {
+ if (numstr[0]!='+'&&numstr[0]!='-'&&numstr[0]!='-')
+ if (num<minx) minx=num;
+ if (t==0x78)
+ {
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);t<0x40;t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ num= atoi (numstr);
+ if (numstr[0]!='+'&&numstr[0]!='-'&&numstr[0]!='-')
+ if (num<miny) miny=num;
+ }
+ }
+ break;
+ /* Ignore all other commands for the moment - just read them */
+ case(0x74):
+ for (t=(char) getc(spfp);t != 0x52; t=(char) getc(spfp));
+ break;
+
+ case(0x72):
+ for (t=(char) getc(spfp);((t< 0x40)||(t>0x60)); t=(char) getc(spfp));
+ break;
+
+ case(0x62):
+ num=0;
+ count=0;
+ /* Read in the correct number of bytes of raster graphics */
+ /* so that we don't get commands and raster graphics confused */
+
+ for (t=(char) getc(spfp);((t<0x40)||(t>=0x60));t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ if (t==0x4D)
+ for(t=numstr[count=0];t!=0;t=numstr[++count]);
+ if (t==0x57)
+ {
+ for(t=numstr[count=0];t!=0;t=numstr[++count]);
+ for(count= atoi(numstr);count>0;count--)
+ t=(char) getc(spfp);
+ }
+ break;
+
+ case(0x63):
+ for (t=(char) getc(spfp);((t< 0x40)||(t>0x60)); t=(char) getc(spfp));
+ break;
+
+ default:
+ break;
+
+
+ }
+ }
+ }
+ }
+ fclose(spfp);
+ qfprintf(stderr,"]");
+
+ if ( (spfp = BINOPEN(str)) == NULL ) {
+ Warning("Unable to open file %s", str );
+ return;
+ }
+ qfprintf(stderr," [%s", str);
+
+/* Pass through the input file again but this time output the */
+/* retained PCL commands */
+
+ for (t = (char)getc(spfp); !feof(spfp); t = (char)getc(spfp))
+ {
+ if (t==0x1B)
+ {
+ t=(char) getc(spfp);
+ if (t==0x2A)
+ {
+ t=(char) getc(spfp);
+ switch(t)
+ {
+ case(0x70):
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);t<0x40;t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ num= atoi (numstr);
+ if ((t==0x59)||(t==0x79))
+ {
+ if (numstr[0]!='+'&&numstr[0]!='-')
+ {
+ /* Subtract the minimum offset found in first pass */
+ /* and add in the current vertical offset */
+ ry=num-miny+(int)PIXROUND(v,vconv)+y_goffset;
+ /* Output the new positioning command */
+ EMIT(outfp,"\033*p%dY",ry);
+ }
+
+ else if (num>=0) EMIT(outfp,"\033*p%c%dY",numstr[0],num);
+ else EMIT(outfp,"\033*p%dY",num);
+
+ if (t==0x79)
+ {
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);t<0x40;t=(char) getc(spfp))
+ numstr[count++]=t; /* reconstructed code */
+ numstr[count]=0;
+ num=atoi (numstr);
+ if(numstr[0]!='+'&&numstr[0]!='-')
+ {
+ /*Add in correct horizontal offset */
+ rx=num-minx+(int)PIXROUND(h,hconv)+x_goffset;
+ EMIT(outfp,"\033*p%dX",rx);
+ }
+ else if (num>=0) EMIT(outfp,"\033*p%c%dX",numstr[0],num);
+ else EMIT(outfp,"\033*p%dX",num);
+ }
+ }
+
+ if ((t==0x58)||(t==0x78))
+ {
+ if(numstr[0]!='+'&&numstr[0]!='-')
+ {
+ /*Add in the correct horizontal offset*/
+ rx=num-minx+(int)PIXROUND(h,hconv)+x_goffset;
+ EMIT(outfp,"\033*p%dX",rx);
+ }
+ else if (num>=0) EMIT(outfp,"\033*p%c%dX",numstr[0],num);
+ else EMIT(outfp,"\033*p%dX",num);
+
+ if (t==0x78)
+ {
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);t<0x40;t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ num= atoi (numstr);
+ if(numstr[0]!='+'&&numstr[0]!='-')
+ {
+ /*Add in correct vertical offset*/
+ ry=num-miny+(int)PIXROUND(v,vconv)+y_goffset;
+ EMIT(outfp,"\033*p%dY",ry);
+ }
+ else if (num >=0) EMIT(outfp,"\033*p%c%dY",numstr[0],num);
+ else EMIT(outfp,"\033*p%dY",num);
+ }
+ }
+ break;
+
+ case(0x74):
+ /* Set the Raster resolution */
+ EMIT(outfp,"\033*t");
+ for (t=(char) getc(spfp);t != 0x52; t=(char) getc(spfp))
+ putc(t,outfp);
+ putc(t,outfp);
+ break;
+
+ case(0x72):
+ /* Raster Graphics commands such as start */
+ EMIT(outfp,"\033*r");
+ for (t=(char) getc(spfp);((t< 0x40)||(t>0x60)); t=(char) getc(spfp))
+ putc(t,outfp);
+ putc(t,outfp);
+ break;
+
+ case(0x62):
+ /* Transfer the correct number of bytes of raster graphics */
+ EMIT(outfp,"\033*b");
+ num=0;
+ count=0;
+ for (t=(char) getc(spfp);((t<0x40)||(t>=0x60));t=(char) getc(spfp))
+ numstr[count++]=t;
+ numstr[count]=0;
+ if (t==0x4D)
+ {
+ for(t=numstr[count=0];t!=0;t=numstr[++count])
+ putc(t,outfp);
+ EMIT(outfp,"M");
+ }
+ if (t==0x57)
+ {
+ for(t=numstr[count=0];t!=0;t=numstr[++count])
+ putc(t,outfp);
+ EMIT(outfp,"W");
+ for(count= atoi(numstr);count>0;count--)
+ {
+ t=(char) getc(spfp);
+ putc(t,outfp);
+ }
+ }
+ break;
+
+ case(0x63):
+ /* Rectangular draw commands */
+ EMIT(outfp,"\033*c");
+ for (t=(char) getc(spfp);((t< 0x40)||(t>0x60)); t=(char) getc(spfp))
+ putc(t,outfp);
+ putc(t,outfp);
+ break;
+
+ default:
+ break;
+
+
+ }
+ }
+ }
+ }
+ fclose(spfp);
+ qfprintf(stderr,"]");
+}
+
+
+
+/*-->DecodeArgs*/
+/*********************************************************************/
+/***************************** DecodeArgs ****************************/
+/*********************************************************************/
+void
+DecodeArgs( argc, argv )
+int argc;
+char *argv[];
+{
+ int argind; /* argument index for flags */
+ char curarea[STRSIZE]; /* current file area */
+ char curname[STRSIZE]; /* current file name */
+ char *tcp, *tcp1; /* temporary character pointers */
+ char *this_arg;
+ double x_offset=0.0, y_offset=0.0;
+
+ if ((tcp = getenv("TEXPXL")) != NULL) PXLpath = tcp;
+
+ argind = 1;
+ while (argind < argc) {
+ tcp = argv[argind];
+ if (*tcp == '-') {
+ ++tcp;
+ switch (*tcp) {
+ case 'a': /* a se default: J
+ PXLpath = ++tcp;
+ break;
+#ifdef IBM3812
+ case 'b': /* first page from alternate casette */
+ FirstAlternate = TRUE;
+ break;
+#endif
+ case 'c': /* number of copies to print */
+ if ( sscanf(tcp + 1, "%hd", &ncopies) != 1 )
+ Fatal("Argument of -c is not a valid integer\n");
+ if (ncopies<1) {
+ Warning("argument of -c < 1; set to 1!");
+ ncopies=1;
+ }
+ break;
+#ifdef DEBUG
+ case '-': /* d selects Debug output */
+ Debug = TRUE;
+ break;
+#endif
+#ifdef LJ2P
+ case 'd': /* d selects DUPLEX mode */
+ tcp++;
+ if (*tcp == '1' ) DuplexMode = 1;
+ else if (*tcp == '2') DuplexMode = 2;
+ else {
+ Warning("Invalid DUPLEX mode, assuming DUPLEX=1, Long-Edge Binding");
+ DuplexMode = 1;
+ }
+ break;
+#endif
+ case 'D': /* D selects DoublePage */
+ DoublePage = TRUE;
+ tcp++;
+ if (*tcp == '1' || *tcp == '2') {
+ if (*tcp == '2') PrintFirstPart = FALSE;
+ else PrintSecondPart = FALSE;
+ tcp++;
+ }
+ if (*tcp == '-') PrintEmptyPages = FALSE;
+ break;
+
+ case 'e': /* emit file is specified */
+ EmitFileName = ++tcp;
+#ifdef MSDOS
+ /* delete trailing ':' (causing hangup) */
+ if (EmitFileName[strlen(EmitFileName)-1] == ':')
+ EmitFileName[strlen(EmitFileName)-1] = '\0';
+#endif
+#ifdef OS2 /* repeated to avoid problems with stupid c preprocessors */
+ /* delete trailing ':' (causing hangup) */
+ if (EmitFileName[strlen(EmitFileName)-1] == ':')
+ EmitFileName[strlen(EmitFileName)-1] = '\0';
+#endif
+ break;
+ case 'f': /* next arg is starting pagenumber */
+ if ( sscanf(tcp + 1, "%ld", &FirstPage) != 1 )
+ Fatal("Argument is not a valid integer\n");
+ FirstPageSpecified = TRUE;
+ break;
+#ifdef LJ
+ case 'g': /* do not reset printer (go) */
+ ResetPrinter = FALSE;
+ break;
+#endif
+ case 'h': /* copy header file through to output */
+ HeaderFileName = ++tcp;
+ G_header = TRUE;
+ break;
+#if defined(LJ2P) || defined(IBM3812)
+ case 'l': /* landscape */
+ Landscape = TRUE;
+ break;
+#endif
+ case 'x': /* specify x-offset */
+ this_arg = 0;
+ if (!(*++tcp)) {
+ this_arg = (++argind >= argc ? 0 : argv[argind]);
+ } else {
+ this_arg = tcp;
+ }
+ if (!this_arg
+ || sscanf(this_arg,"%lf", &x_offset) != 1)
+ Fatal("Argument of -x is not a valid floating point number\n");
+ break;
+ case 'y': /* specify y-offset */
+ this_arg = 0;
+ if (!(*++tcp)) {
+ this_arg = (++argind >= argc ? 0 : argv[argind]);
+ } else {
+ this_arg = tcp;
+ }
+ if (!this_arg || sscanf(this_arg, "%lf", &y_offset) != 1)
+ Fatal("Argument of -y is not a valid floating point number\n");
+ break;
+ case 'X': /* specify X-origin in dots */
+ this_arg = 0;
+ if (!(*++tcp)) {
+ this_arg = (++argind >= argc ? 0 : argv[argind]);
+ } else {
+ this_arg = tcp;
+ }
+ if (!this_arg || sscanf(this_arg,"%hd", &x_origin) != 1)
+ Fatal("Argument of -X is not a valid integer\n");
+ break;
+ case 'Y': /* specify Y-origin in dots */
+ this_arg = 0;
+ if (!(*++tcp)) {
+ this_arg = (++argind >= argc ? 0 : argv[argind]);
+ } else {
+ this_arg = tcp;
+ }
+ if (!this_arg ||
+ sscanf(this_arg, "%hd", &y_origin) != 1)
+ Fatal("Argument of -Y is not a valid integer\n");
+ break;
+ case 'm': /* specify magnification to use */
+ switch ( (*++tcp) ) {
+ case '#':
+ /* next arg is a magnification to use */
+ if ( sscanf(tcp + 1, "%ld", &usermag) != 1 )
+ Fatal("Argument of mag is not a valid integer\n");
+ break;
+ case '0':
+ usermag = 1000;
+ break;
+ case 'h':
+ case 'H':
+ usermag = 1095;
+ break;
+ case '1':
+ usermag = 1200;
+ break;
+ case 'q':
+ usermag = 1250;
+ break;
+ case '2':
+ usermag = 1440;
+ break;
+ case '3':
+ usermag = 1728;
+ break;
+ case '4':
+ usermag = 2074;
+ break;
+ case '5':
+ usermag = 2488;
+ break;
+ default:
+ Fatal("%c is a bad mag step\n", *tcp);
+ }
+ break;
+#ifdef SUPERCOMMENT
+ case 'o': /* PostScript command to send */
+ if ( ++argind >= argc )
+ Fatal("No argument following -o\n", 0);
+ PScmd[nps++] = argv[argind];
+ break;
+#endif
+ case 'p': /* print n pages */
+ if ( sscanf(tcp + 1, "%ld", &PrintPages) != 1 )
+ Fatal("Argument is not a valid integer\n");
+ if (PrintPages < 1)
+ Fatal("Argument of -p must be greater than 0\n");
+ break;
+ case 'q': /* quiet operation */
+ G_quiet = TRUE;
+ break;
+ case 'r': /* switch order to process pages */
+ Reverse = (bool)(!Reverse);
+ break;
+#ifdef LJ
+ case 's': /* specify X-origin in dots */
+ this_arg = 0;
+ if (!(*++tcp)) this_arg = (++argind >= argc ? 0 : argv[argind]);
+ else this_arg = tcp;
+ if (!this_arg || sscanf(this_arg,"%hd", &pagesize) != 1)
+ Fatal("Argument of -s is not a valid integer\n");
+ switch (pagesize) {
+ case 1: pgsiz_dots = 3150; break; /* executive */
+ case 2: pgsiz_dots = 3300; break; /* letter */
+ case 3: pgsiz_dots = 4200; break; /* legal */
+ case 26: pgsiz_dots = 3507; break; /* a4 */
+ case 80: pgsiz_dots = 2250; break; /* monarc */
+ case 81: pgsiz_dots = 2850; break; /* com10 */
+ case 90: pgsiz_dots = 2598; break; /* int dl */
+ case 91: pgsiz_dots = 2704; break; /* int c5 */
+ default: Fatal(
+#ifndef vms
+ "%hd is a bad value for pagesize (1,2,3,26,80,81,90,91)",
+#else
+ "%d is a bad value for pagesize (1,2,3,26,80,81,90,91)",
+#endif
+ pagesize);
+ }
+ break;
+#endif
+ case 't': /* ending pagenumber */
+ if ( sscanf(tcp + 1, "%ld", &LastPage) != 1 )
+ Fatal("Argument is not a valid integer\n");
+ LastPageSpecified = TRUE;
+ break;
+ case 'v': /* verbatim mode (print pxl-file names) */
+ G_noverbatim = FALSE;
+ break;
+ case 'w': /* don't print out warnings */
+ G_nowarn = TRUE;
+ break;
+#ifdef LJ
+ case 'z':
+ PrintTestPage = (bool)(!PrintTestPage);
+ break;
+#endif
+ default:
+ fprintf(stderr, "%c is not a legal flag\n", *tcp);
+ }
+ } else {
+
+ (void) strcpy(filename, tcp);
+ tcp = strrchr(argv[argind], '/');
+ /* split into directory + file name */
+ if (tcp == NULL) {
+ curarea[0] = '\0';
+ tcp = argv[argind];
+ } else {
+ (void) strcpy(curarea, argv[argind]);
+ curarea[tcp-argv[argind]+1] = '\0';
+ tcp += 1;
+ }
+
+ (void) strcpy(curname, tcp);
+ /* split into file name + extension */
+ tcp1 = strchr(tcp, '.');
+ if (tcp1 == NULL) {
+ (void) strcpy(rootname, curname);
+ strcat(curname, ".dvi");
+ } else {
+ *tcp1 = '\0';
+ (void) strcpy(rootname, curname);
+ *tcp1 = '.';
+ }
+
+ (void) strcpy(filename, curarea);
+ (void) strcat(filename, curname);
+
+ if ((dvifp = BINOPEN(filename)) == NULL) {
+ Fatal("%s: can't find DVI file \"%s\"\n\n",
+ G_progname, filename);
+ }
+ }
+ argind++;
+ }
+
+ x_goffset = (short) MM_TO_PXL(x_offset) + x_origin;
+ y_goffset = (short) MM_TO_PXL(y_offset) + y_origin;
+
+ if (dvifp == NULL) {
+ fprintf(stderr,"\nThis is the DVI to %s converter version %s",
+ PRINTER, VERSION);
+#ifdef SEVENBIT
+ fprintf(stderr,", 7bit");
+#endif
+ fprintf(stderr," (%s)\n", OS);
+ fprintf(stderr,"usage: %s [OPTIONS] dvifile\n", G_progname);
+
+ fprintf(stderr,"OPTIONS are:\n");
+#ifdef DEBUG
+ fprintf(stderr,"\t-- ..... turns debug output on\n");
+#endif
+ fprintf(stderr,
+ "\t-aX ..... X= searchpath leading to pixel-files (.pk or .pxl)\n");
+#ifdef IBM3812
+ fprintf(stderr,
+ "\t-b ..... take paper for first page from alternate casette\n");
+#endif
+ fprintf(stderr,"\t-cX ..... X= number of copies\n");
+#ifdef LJ2P
+ fprintf(stderr,"\t-dX ..... duplex, X=1: long-edge, 2: short-edge binding\n");
+#endif
+ fprintf(stderr,"\t-D ..... turns doublepage output on; ");
+ fprintf(stderr,"-D1 odd pages only, -D2 even\n");
+ fprintf(stderr,"\t-eX ..... X= output file\n");
+ fprintf(stderr,"\t-fX ..... print from begin of page number X\n");
+#ifdef LJ
+ fprintf(stderr,
+ "\t-g ..... do not reset printer at begin of job (go)\n");
+#endif
+ fprintf(stderr,"\t-hX ..... X= name of headerfile\n");
+#ifdef LJ2P
+ fprintf(stderr,"\t-l ..... landscape mode\n");
+#endif
+ fprintf(stderr,"\t-mX ..... magnification X=0;h;1;2;3;4;5;#xxxx\n");
+ fprintf(stderr,"\t-pX ..... print X pages\n");
+ fprintf(stderr,"\t-q ..... quiet operation\n");
+ fprintf(stderr,"\t-r ..... process pages in reverse order\n");
+#ifdef LJ
+ fprintf(stderr,"\t-sX ..... set paper size to X (see documentation)\n");
+#endif
+ fprintf(stderr,"\t-tX ..... print to end of page number X\n");
+ fprintf(stderr,"\t-w ..... don't print out warnings\n");
+ fprintf(stderr,"\t-v ..... tell user which pixel-files are used\n");
+ fprintf(stderr,"\t-xX ..... X= x-offset on printout in mm\n");
+ fprintf(stderr,"\t-yX ..... X= y-offset on printout in mm\n");
+ fprintf(stderr,"\t-XO ..... O= x page origin in dots (default=%d)\n",
+ XDEFAULTOFF );
+ fprintf(stderr,"\t-YO ..... O= y page origin in dots (default=%d)\n",
+ YDEFAULTOFF );
+#ifdef LJ
+ fprintf(stderr,
+ "\t-z ..... print test page with pagecounter after job\n");
+#endif
+ exit(1);
+ }
+ if (EQ(EmitFileName, "")) {
+ if ((EmitFileName = malloc( STRSIZE )) != NULL)
+ allocated_storage += STRSIZE;
+ else
+ Fatal("Can't allocate storage of %d bytes\n",STRSIZE);
+ (void) strcpy(EmitFileName, curname);
+ tcp1 = strchr(EmitFileName, '.');
+ *tcp1 = '\0';
+ strcat(EmitFileName, EMITFILE_EXTENSION);
+ }
+}
+
+
+/*-->DoConv*/
+/*********************************************************************/
+/******************************** DoConv ***************************/
+/*********************************************************************/
+long
+DoConv(num, den, convResolution)
+long num, den;
+int convResolution;
+{
+ /*register*/ double conv;
+ conv = ((double)num / (double)den) *
+ ((double)mag / 1000.0) *
+ ((double)convResolution/254000.0);
+
+ return((long) ((1.0/conv)+0.5));
+}
+
+
+/*-->DoSpecial*/
+/*********************************************************************/
+/***************************** DoSpecial ***************************/
+/*********************************************************************/
+typedef enum {
+ None, String, Integer, Number, Dimension}
+
+
+ValTyp;
+typedef struct {
+ char *Key; /* the keyword string */
+ char *Val; /* the value string */
+ ValTyp vt; /* the value type */
+ union { /* the decoded value */
+ int i;
+ float n;
+ } v;
+} KeyWord;
+typedef struct {
+ char *Entry;
+ ValTyp Typ;
+} KeyDesc;
+#define PSFILE 0
+#define ORIENTATION 1
+#define RESETPOINTS 2
+#define DEFPOINT 3
+#define FILL 4
+#define GRAY 5
+#define PATTERN 6
+#define HPFILE 7
+KeyDesc KeyTab[] = {
+ { "file", String },
+ { "orientation", Integer},
+ { "resetpoints", String},
+ { "defpoint", String},
+ { "fill", String},
+ { "gray", Integer},
+ { "pattern", Integer},
+ { "hpfile", String}
+ /*,
+ {"hsize", Dimension},
+ {"vsize", Dimension},
+ {"hoffset", Dimension},
+ {"voffset", Dimension},
+ {"hscale", Number},
+ {"vscale", Number}*/
+
+
+};
+
+
+#define NKEYS (sizeof(KeyTab)/sizeof(KeyTab[0]))
+void
+DoSpecial( str, n )
+/* interpret a \special command, made up of keyword=value pairs */
+char *str;
+int n;
+{
+char spbuf[STRSIZE], xs[STRSIZE], ys[STRSIZE];
+char *sf = NULL;
+float x,y;
+long x_pos, y_pos;
+KeyWord k;
+int i, j, j1;
+static int GrayScale=10, Pattern=1;
+static bool GrayFill=TRUE;
+static long p_x[80], p_y[80];
+str[n] = '\0';
+spbuf[0] = '\0';
+
+SetPosn(h, v);
+while ( (str = GetKeyStr(str, &k)) != NULL ) {
+ /* get all keyword-value pairs */
+ /* for compatibility, single words are taken as file names */
+ if ( k.vt == None && access(k.Key, 0) == 0) {
+ if ( sf )
+ Warning("More than one \\special file name given. %s ignored", sf);
+ (void) strcpy(spbuf, k.Key);
+ sf = spbuf;
+/*
+ for (j = 1; ((sf[j]=='/' ? sf[j]='\\':sf[j]) != '\0'); j++);
+*/
+ } else if ( GetKeyVal( &k, KeyTab, NKEYS, &i ) && i != -1 )
+ switch (i) {
+ case PSFILE:
+ case HPFILE:
+ if ( sf )
+ Warning("More than one \\special file name given. %s ignored",
+ sf);
+ (void) strcpy(spbuf, k.Val);
+ sf = spbuf;
+/*
+ for (j=1; ((sf[j]=='/' ? sf[j]='\\':sf[j]) != '\0'); j++) ;
+*/
+ break;
+ case ORIENTATION:
+#ifdef IBM3812
+ if ((k.v.i >= 0) && (k.v.i < 4)) {
+ last_ry = UNKNOWN;
+ sprintf(PMPformat, "\322%c", (unsigned char)k.v.i);
+ PMPout(2, PMPformat);
+ if (k.v.i == 1) Landscape = TRUE;
+ else if (k.v.i == 0) Landscape = FALSE;
+#endif
+#ifdef LJ
+ if ((k.v.i >= 0) && (k.v.i < 2)) {
+ last_ry = UNKNOWN;
+ EMIT(outfp, "\033&l%dO\033*rF", (unsigned char)k.v.i);
+#endif
+ } else
+ Warning( "Invalid orientation (%d)given; ignored.", k.v.i);
+ break;
+ case RESETPOINTS:
+ (void) strcpy(spbuf, k.Val);
+
+ sf = NULL;
+ break;
+
+ case DEFPOINT:
+ (void) strcpy(spbuf, k.Val);
+ i=sscanf(spbuf,"%d(%[^,],%s)",&j,xs,ys);
+ if (i>0) {
+ x_pos=h; y_pos=v;
+ if (i>1) {
+ if (sscanf(xs,"%fpt",&x)>0) {
+ fprintf(stderr,"x = %f\n",x);
+ x_pos = PT_TO_DVI(x);
+ }
+ }
+ if (i>2) {
+ if (sscanf(ys,"%fpt",&y)>0) {
+ fprintf(stderr,"y = %f\n",y);
+ y_pos = PT_TO_DVI(y);
+ }
+ }
+ p_x[j]=x_pos;
+ p_y[j]=y_pos;
+ } else
+ Warning("invalid point definition\n");
+
+ sf = NULL;
+ break;
+
+ case FILL:
+ (void) strcpy(spbuf, k.Val);
+ i=sscanf(spbuf,"%d/%d %s",&j,&j1,xs);
+ if (i>1) {
+#ifdef LJ
+ SetPosn(p_x[j], p_y[j]);
+ x_pos = (long)PIXROUND(p_x[j1]-p_x[j], hconv);
+ y_pos = (long)PIXROUND(p_y[j1]-p_y[j], vconv);
+ if (labs(x_pos)<labs(y_pos)) x_pos=x_pos+3;
+ else y_pos=y_pos+3;
+ if (GrayFill) {
+ EMIT(outfp, "\033*c%lda%ldb%dg2P", x_pos, y_pos, GrayScale);
+ } else {
+ EMIT(outfp, "\033*c%lda%ldb%dg3P", x_pos, y_pos, Pattern);
+ }
+ last_ry = UNKNOWN;
+#endif
+ }
+ break;
+ case GRAY:
+ if ((k.v.i >= 0) && (k.v.i < 101)) {
+ GrayScale = k.v.i;
+ GrayFill = TRUE;
+ } else
+ Warning( "Invalid gray scale (%d) given; ignored.", k.v.i);
+ break;
+ case PATTERN:
+ if ((k.v.i >= 0) && (k.v.i < 7)) {
+ Pattern = k.v.i;
+ GrayFill = FALSE;
+ } else
+ Warning( "Invalid pattern (%d) given; ignored.", k.v.i);
+ break;
+
+ default:
+ Warning("Can't handle %s=%s command; ignored.", k.Key, k.Val);
+ break;
+ }
+ else
+ Warning("Invalid keyword or value in \\special - <%s> ignored", k.Key);
+}
+if ( sf ) {
+ last_ry = UNKNOWN;
+#ifdef IBM3812
+ PMPflush;
+#endif
+ if (i==HPFILE)
+ CopyHPFile( sf );
+ else
+ CopyFile( sf );
+ }
+}
+
+
+/*-->EmitChar*/
+/**********************************************************************/
+/**************************** EmitChar ******************************/
+/**********************************************************************/
+void /* output a character bitmap */
+EmitChar(c, ce)
+long c;
+struct char_entry *ce;
+{
+ register int i;
+ register unsigned char *sl;
+ unsigned short nbpl, nwpl;
+ long total;
+#ifdef LJ
+ unsigned char cnv_buffer[10];
+#endif
+
+
+#ifdef LJ
+/*
+printf("Emit character %c(%d) id=%d, yoff=%d[%d], w=%d[%d], h=%d[%d]\n",
+ (char)c,(int)c,
+ fontptr->plusid,
+ ce->yOffset, fontptr->max_yoff,
+ ce->width, fontptr->max_width,
+ ce->height, fontptr->max_height
+);
+*/
+#endif
+
+
+
+ if ( fontptr->ncdl == 0 ) {
+#ifdef IBM3812
+ used_fontstorage += 1028;
+#endif
+#ifdef LJ
+ if (fontptr->max_width == 0) { /* we have no realistic values */
+ fontptr->max_yoff = CHAR_HEIGTH_LARGE;
+ fontptr->max_width = CHAR_WIDTH_LARGE;
+ fontptr->max_height = CHAR_HEIGTH_LARGE*2;
+ }
+
+ /* open font dict before first char, set active font */
+ INT_ASCII(cnv_buffer,fontptr->plusid);
+#ifdef LJ4
+ EMIT(outfp, "\033*c%sD\033)s68W", cnv_buffer);
+ EMITB(6, "\0\104\024\2\0\0");
+#else
+ EMIT(outfp, "\033*c%sD\033)s26W", cnv_buffer);
+#ifdef SEVENBIT
+ EMITB(6, "\0\032\0\1\0\0");
+#else
+ EMITB(6, "\0\032\0\2\0\0");
+#endif
+#endif /* LJ 4 */
+ EMITWORD( fontptr->max_yoff);
+ EMITWORD( fontptr->max_width);
+ EMITWORD( fontptr->max_height);
+ EMITB(8, "\0\1\1\25\0\4\0\4");
+ EMITB(6, "\0\0\0\0\0\0");
+#ifdef LJ4
+ EMITB(22,"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0");
+ EMITB(16," ");
+ EMITB(4 ,"\2\130\2\130");
+#endif
+ EMIT(outfp, "\033*c4F");
+#endif
+ }
+ if ( fontptr != prevfont ) { /* because this isn't done on pass 0 */
+#ifdef LJ
+ INT_ASCII(cnv_buffer,fontptr->plusid);
+ EMIT(outfp, "\033(%sX", cnv_buffer);
+#endif
+ prevfont = fontptr;
+ }
+
+#ifdef USEPXL
+ if (fontptr->id == pk89) {
+ nbpl = ((int)(ce->width) + 7) >> 3;
+ total = (long)ce->height * nbpl;
+ } else if (fontptr->id == id1002) {
+ nbpl = ((int)(ce->width) + 7) >> 3;
+ total = (long)ce->height * nbpl;
+ } else if (fontptr->id == id1001) {
+ nwpl = ((int)(ce->width) + 31) >> 5;
+ nbpl = ((int)(ce->width) + 7) >> 3;
+ total = (long)ce->height * nbpl;
+ }
+#else
+ nbpl = (num_cols + 7) >> 3;
+ total = num_rows * nbpl;
+#endif
+/***************************************************************
+ if ( ((char) c == 'i') && (fontptr->plusid == 0)) {
+ long j;
+ printf("cols=%ld, ncols=%ld\n",nwpl,nbpl);
+
+ printf("%ld Bytes:->",total);
+ for (j=0; j<total;j++) {
+ char *ch; char ic;
+ ch = (char *)(ce->where.address.pixptr);
+ ic = *(ch+j);
+ printf("%X.",ic);
+ }
+ printf("<- Now Emitting\n");
+ }
+***************************************************************/
+#ifdef USEPXL
+#ifdef IBM3812
+ if ((short)(ce->height) - ce->yOffset > 55) {
+ ce->yyOffset = (short) ce->height - ce->yOffset;
+ ce->yOffset = (short) ce->height;
+ } else {
+ ce->yyOffset = (short) 0;
+ }
+#endif
+#ifdef LJ
+ ce->yyOffset = (short) 0;
+#endif
+#endif
+
+ /* ce->cw = (long)(((double)ce->tfmw / (double)hconv) +0.5); */
+ /* set active font to nn, load font pattern xx ... */
+#ifdef IBM3812
+ PMPcont(total + 9);
+#ifdef USEPXL
+ sprintf(PMPformat, "\323%c\360%c%c%c",
+ (unsigned char)fontptr->plusid,
+ (unsigned char)VisChar((char)c),
+ (unsigned char)ce->height,
+ (unsigned char)ce->width);
+ PMPout(6, PMPformat);
+ PMPoutC((char)(-(ce->xOffset)));
+ PMPoutC((char)(ce->cw - (-ce->xOffset + ce->width)));
+ PMPoutC((char)(ce->yOffset));
+#else
+ sprintf(PMPformat, "\323%c\360%c%c%c",
+ (unsigned char)fontptr->plusid,
+ (unsigned char)VisChar((char)c),
+ (unsigned char)num_rows,
+ (unsigned char)num_cols);
+ PMPout(6, PMPformat);
+ PMPoutC((char)(-x_offset));
+ PMPoutC((char)(ce->cw - (-x_offset + num_cols)));
+ PMPoutC((char)num_rows-y_offset);
+#endif
+#endif
+#ifdef LJ
+ INT_ASCII(cnv_buffer,fontptr->plusid);
+ EMIT(outfp, "\033*c%sd%dE\033(s%ldW", cnv_buffer,
+ (unsigned int)VisChar((char)c), (long)(total + 16));
+ EMITB(4, "\4\0\016\1");
+/* EMITC((char)(Landscape==TRUE)); */
+ EMITC((char)0);
+ EMITC((char)0);
+#ifdef USEPXL
+ EMITWORD(-ce->xOffset);
+ EMITWORD(ce->yOffset);
+ EMITWORD(ce->width);
+ EMITWORD(ce->height);
+#else
+ EMITWORD(-x_offset);
+ EMITWORD(num_rows-y_offset);
+ EMITWORD(num_cols);
+ EMITWORD(num_rows);
+#endif
+ EMITWORD((int)ce->cw * 4);
+#endif
+#ifdef USEPXL
+
+ if (fontptr->id == pk89)
+ PkRaster(ce, FALSE);
+ else if (fontptr->id == id1002)
+ for (i = 0; i < (int) ce->height; i++) {
+ sl = ((unsigned char *)(ce->where.address.pixptr) + i * nbpl);
+ EMITL(nbpl, sl);
+ }
+ else if (fontptr->id == id1001)
+ for (i = 0; i < (int) ce->height; i++) {
+ sl = (unsigned char *)(ce->where.address.pixptr + i * nwpl);
+ EMITL(nbpl, sl);
+ }
+#else
+ for (i = num_rows; i > 0; i--)
+ {
+ EMITL (nbpl, bits + (i-1) * nbpl);
+ }
+#endif
+#ifdef IBM3812
+#ifdef USEPXL
+ used_fontstorage += (long)ce->height * ((ce->width + 15) >> 4)
+ *2 + 14;
+#else
+ used_fontstorage += (long)num_rows * ((num_cols + 15) >> 4)
+ *2 + 14;
+#endif
+#endif
+#ifdef LJ
+#ifdef USEPXL
+ used_fontstorage += 64 * (((int)((ce->height * ce->width) - 1) / 64) + 1);
+#else
+ used_fontstorage += 64 * ((((num_rows * num_cols) - 1) / 64) + 1);
+#endif
+#endif
+ fontptr->ncdl += 1;
+ G_ncdl += 1;
+}
+
+
+/*-->RasterLine*/
+/**********************************************************************/
+/**************************** RasterLine ****************************/
+/**********************************************************************/
+void
+RasterLine(ce, nbpl, current_line, buffer)
+struct char_entry *ce;
+unsigned short nbpl, current_line;
+char *buffer;
+{
+#ifdef IBM3812
+ long total;
+ static unsigned short maxlines;
+
+ if (current_line == 0) {
+#ifdef USEPXL
+ maxlines = ce->height;
+
+ MoveVert(-ce->yOffset); /* move cursor up */
+ MoveHor(-ce->xOffset); /* move cursor right */
+#else
+ maxlines = num_rows;
+
+ MoveVert(-(num_rows-y_offset)); /* move cursor up */
+ MoveHor(-x_offset); /* move cursor right */
+#endif
+ last_ry = UNKNOWN; /* next time full positioning */
+ }
+
+ if (current_line % maxlines == 0) {
+ if (current_line > 0) { /* maxlines lines have been printed*/
+ MoveVert(maxlines); /* move cursor down */
+ last_ry = UNKNOWN; /* next time full positioning */
+ }
+#ifdef USEPXL
+ total = (long)(ce->height - current_line) * (long)nbpl;
+#else
+ total = (long)(num_rows - current_line) * (long)nbpl;
+#endif
+ if ((total + 9) > 65535) {
+ maxlines = (unsigned short)((65535 - 9) / nbpl);
+ total = (long)maxlines * (long)nbpl;
+ }
+
+ PMPcont(total + 9);
+ PMPout(2, "\365\0");
+ EMITWORD(maxlines);
+#ifdef USEPXL
+ EMITWORD(ce->width);
+#else
+ EMITWORD(num_cols);
+#endif
+ PMPoutC((unsigned char) (total >> 16) & 0xFF);
+ PMPoutC((unsigned char) (total >> 8 ) & 0xFF);
+ PMPoutC((unsigned char) total & 0xFF);
+ }
+ EMITL((int)nbpl, buffer);
+#endif
+#ifdef LJ
+ register int emitbytes;
+
+ for (emitbytes = (int)nbpl;
+ (*(buffer + emitbytes - 1) == '\0') && (emitbytes > 0);
+ emitbytes--) ;
+ EMIT(outfp, "\033*b%dW", emitbytes);
+ EMITL(emitbytes, buffer);
+#endif
+}
+
+
+/*-->RasterChar*/
+/**********************************************************************/
+/**************************** RasterChar ****************************/
+/**********************************************************************/
+void /* raster a character bitmap */
+RasterChar(ce)
+struct char_entry *ce;
+{
+ int i;
+ register unsigned char *sl;
+ unsigned short nbpl, nwpl;
+ unsigned char raster_line_buf[BYTES_PER_PIXEL_LINE];
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"Raster character ...size=%d \n", (int)ce->charsize );
+#endif
+
+#ifdef USEPXL
+ if (fontptr->id == pk89) {
+ nbpl = ((int)(ce->width) + 7) >> 3;
+ } else if (fontptr->id == id1002) {
+ nbpl = ((int) ce->width + 7) >> 3;
+ } else if (fontptr->id == id1001) {
+ nwpl = ((int) ce->width + 31) >> 5;
+ nbpl = ((int) ce->width + 7) >> 3;
+ }
+#else
+ nbpl = (num_cols + 7) >> 3;
+#endif
+
+#ifdef LJ
+#ifdef LJ4
+ EMIT(outfp, "\033*t600R\033*r1A");
+#else
+ EMIT(outfp, "\033*t300R\033*r1A");
+#endif
+#endif
+
+ { /* read pixel from file */
+ if ((ce->charsize == HUGE_SIZE) && (fontptr->id != pk89))
+ OpenFontFile();
+#ifdef USEPXL
+ fseek(pxlfp, ce->where.address.fileOffset, 0);
+#else
+ fseek(gfin, ce->where.address.fileOffset, 0);
+ gettochar();
+ readbits();
+#endif
+ }
+
+#ifdef USEPXL
+ if (fontptr->id == pk89)
+ PkRaster(ce, TRUE);
+ else if (fontptr->id == id1002) {
+ for (i = 0; i < (int) ce->height; i++) {
+ if (ce->charsize == HUGE_SIZE) {
+ fread(raster_line_buf, 1, (int) nbpl, pxlfp);
+ sl = raster_line_buf;
+ } else
+ sl = ((unsigned char *)(ce->where.address.pixptr)
+ + i * nbpl);
+
+ RasterLine(ce, (unsigned int)nbpl, i, sl);
+ }
+ } else if (fontptr->id == id1001) {
+ long filediff;
+ filediff = (long)nwpl * 4 - nbpl;
+ for (i = 0; i < (int) ce->height; i++) {
+ if (ce->charsize == HUGE_SIZE) {
+ fread(raster_line_buf, 1, (int) nbpl, pxlfp);
+ /* skip fill bytes */
+ fseek(pxlfp, filediff, 1);
+ sl = raster_line_buf;
+ } else
+ sl = (unsigned char *)(ce->where.address.pixptr + i * nwpl);
+
+ RasterLine(ce, (unsigned int)nbpl, i, sl);
+ }
+ }
+#else
+ for (i = num_rows; i > 0; i--)
+ RasterLine(ce, (unsigned int)nbpl, i, bits + (i-1) * nbpl);
+#endif
+#ifdef LJ
+ EMIT(outfp, "\033*rB");
+#endif
+ last_ry = UNKNOWN;
+}
+
+
+/*-->Fatal*/
+/**********************************************************************/
+/****************************** Fatal *******************************/
+/**********************************************************************/
+void
+Fatal(fmt, a, b, c) /* issue a fatal error message */
+char *fmt; /* format */
+char *a, *b, *c; /* arguments */
+{
+ fprintf(stderr, "\n");
+ fprintf(stderr, "%s: FATAL--", G_progname);
+ fprintf(stderr, fmt, a, b, c);
+ fprintf(stderr, "\n\n");
+#ifndef vms
+ exit(2);
+#else
+ exit(SS$_ABORT);
+#endif
+}
+
+
+/*-->FindPostAmblePtr*/
+/**********************************************************************/
+/************************ FindPostAmblePtr **************************/
+/**********************************************************************/
+void
+FindPostAmblePtr(postambleptr)
+long *postambleptr;
+/* this routine will move to the end of the file and find the start
+ of the postamble */
+{
+ long i;
+ fseek (dvifp, 0l, 2); /* goto end of file */
+ *postambleptr = ftell (dvifp) - 4;
+ fseek (dvifp, *postambleptr, 0);
+ while (TRUE) {
+ fseek (dvifp, --(*postambleptr), 0);
+ if (((i = NoSignExtend(dvifp, 1)) != 223) &&
+ (i != DVIFORMAT))
+ Fatal ("Bad end of DVI file");
+ if (i == DVIFORMAT)
+ break;
+ }
+ fseek (dvifp, (*postambleptr) - 4, 0);
+ (*postambleptr) = NoSignExtend(dvifp, 4);
+ fseek (dvifp, *postambleptr, 0);
+}
+
+
+/*-->GetBytes*/
+/**********************************************************************/
+/***************************** GetBytes *****************************/
+/**********************************************************************/
+void
+GetBytes(fp, cp, n) /* get n bytes from file fp */
+/*register*/ FILE *fp; /* file pointer */
+register char *cp; /* character pointer */
+int n; /* number of bytes */
+{
+ while (n--)
+ *cp++ = (char)getc(fp);
+}
+
+
+/*-->GetFontDef*/
+/**********************************************************************/
+/**************************** GetFontDef *****************************/
+/**********************************************************************/
+void
+GetFontDef()
+/***********************************************************************
+ Read the font definitions as they are in the postamble of the DVI
+ file.
+***********************************************************************/
+{
+ unsigned char byte;
+ while (((byte = (unsigned char) NoSignExtend(dvifp, 1)) >= FNT_DEF1) &&
+ (byte <= FNT_DEF4)) {
+ switch (byte) {
+ case FNT_DEF1:
+ ReadFontDef ( NoSignExtend(dvifp, 1));
+ break;
+ case FNT_DEF2:
+ ReadFontDef ( NoSignExtend(dvifp, 2));
+ break;
+ case FNT_DEF3:
+ ReadFontDef ( NoSignExtend(dvifp, 3));
+ break;
+ case FNT_DEF4:
+ ReadFontDef ( NoSignExtend(dvifp, 4));
+ break;
+ default:
+ Fatal ("Bad byte value in font defs");
+ break;
+ }
+ }
+ if (byte != POST_POST)
+ Fatal ("POST_POST missing after fontdefs");
+}
+
+
+/*-->GetKeyStr*/
+/**********************************************************************/
+/***************************** GetKeyStr ****************************/
+/**********************************************************************/
+/* extract first keyword-value pair from string (value part may be null)
+ * return pointer to remainder of string
+ * return NULL if none found
+ */
+char KeyStr[STRSIZE];
+char ValStr[STRSIZE];
+char
+*GetKeyStr( str, kw )
+char *str;
+KeyWord *kw;
+{
+ char *s, *k, *v, t;
+ if ( !str )
+ return( NULL );
+ for ( s = str; *s == ' '; s++)
+ ; /* skip over blanks */
+ if ( *s == '\0' )
+ return( NULL );
+ for ( k = KeyStr; /* extract keyword portion */
+ *s != ' ' && *s != '\0' && *s != '=';
+ *k++ = *s++)
+ ;
+ *k = '\0';
+ kw->Key = KeyStr;
+ kw->Val = v = NULL;
+ kw->vt = None;
+ for ( ; *s == ' '; s++)
+ ; /* skip over blanks */
+ if ( *s != '=' ) /* look for "=" */
+ return( s );
+ for ( s++; *s == ' '; s++); /* skip over blanks */
+ if ( *s == '\'' || *s == '\"' ) /* get string delimiter */
+ t = *s++;
+ else
+ t = ' ';
+ for ( v = ValStr; /* copy value portion up to delim */
+ *s != t && *s != '\0';
+ *v++ = *s++)
+ ;
+ if ( t != ' ' && *s == t )
+ s++;
+ *v = '\0';
+ kw->Val = ValStr;
+ kw->vt = String;
+ return( s );
+}
+
+
+/*-->GetKeyVal*/
+/**********************************************************************/
+/***************************** GetKeyVal ****************************/
+/**********************************************************************/
+/* get next keyword-value pair decode value according to table entry */
+bool
+GetKeyVal( kw, tab, nt, tno)
+KeyWord *kw;
+KeyDesc tab[];
+int nt;
+int *tno;
+{
+ int i;
+ char c = '\0';
+ *tno = -1;
+ for (i = 0; i < nt; i++)
+ if ( IsSame(kw->Key, tab[i].Entry) ) {
+ *tno = i;
+ switch ( tab[i].Typ ) {
+ case None:
+ if ( kw->vt != None )
+ return( FALSE );
+ break;
+ case String:
+ if ( kw->vt != String )
+ return( FALSE );
+ break;
+ case Integer:
+ if ( kw->vt != String )
+ return( FALSE );
+ if ( sscanf(kw->Val, "%d%c",
+ &(kw->v.i), &c) != 1
+ || c != '\0' )
+ return( FALSE );
+ break;
+/* case Number:
+ * case Dimension:
+ * if( kw->vt != String ) return( FALSE );
+ * if( sscanf(kw->Val,"%f%c",
+ * &(kw->v.n), &c) != 1
+ * || c != '\0' ) return( FALSE );
+ * break;
+ */
+ }
+ kw->vt = tab[i].Typ;
+ return( TRUE );
+ }
+ return( TRUE );
+}
+
+
+
+/*-->IsSame*/
+/**********************************************************************/
+/******************************* IsSame *****************************/
+/**********************************************************************/
+bool /* compare strings, ignore case */
+IsSame(a, b)
+char *a, *b;
+{
+ char *x, *y;
+ x = a;
+ y = b;
+ for ( ; *a != '\0'; )
+ if ( tolower(*a++) != tolower(*b++) )
+ return( FALSE );
+ return( *x == *y ? TRUE : FALSE );
+}
+
+
+/*-->NoSignExtend*/
+/**********************************************************************/
+/*************************** NoSignExtend ***************************/
+/**********************************************************************/
+long
+NoSignExtend(fp, n) /* return n byte quantity from file fd */
+register FILE *fp; /* file pointer */
+register int n; /* number of bytes */
+{
+ long x; /* number being constructed */
+ x = 0;
+ while (n--) {
+ x <<= 8;
+ x |= getc(fp);
+ }
+ return(x);
+}
+
+
+/*-->OpenFontFile*/
+/**********************************************************************/
+/************************** OpenFontFile *****************************/
+/**********************************************************************/
+void
+OpenFontFile()
+/***********************************************************************
+ The original version of this dvi driver reopened the font file each
+ time the font changed, resulting in an enormous number of relatively
+ expensive file openings. This version keeps a cache of up to
+ MAXOPEN open files, so that when a font change is made, the file
+ pointer, pxlfp, can usually be updated from the cache. When the
+ file is not found in the cache, it must be opened. In this case,
+ the next empty slot in the cache is assigned, or if the cache is
+ full, the least used font file is closed and its slot reassigned for
+ the new file. Identification of the least used file is based on the
+ counts of the number of times each file has been "opened" by this
+ routine. On return, the file pointer is always repositioned to the
+ beginning of the file.
+***********************************************************************/
+{
+ int i, least_used, current;
+ struct pixel_list tmp;
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"open font file %d\n", fontptr->font_file_id);
+#endif
+/*
+fprintf(stderr,"? %lx == %lx\n", pfontptr,fontptr);
+*/
+ if ((pfontptr == fontptr) && (pxlfp != NO_FILE))
+ return; /* we need not have been called */
+
+ if (fontptr->font_file_id == NO_FILE)
+ return; /* we need not have been called */
+
+ tmp = pixel_files[1];
+ for (current = 1;
+ (current <= nopen) && (tmp.pixel_file_id != fontptr->font_file_id); ) {
+ ++current;
+ tmp = pixel_files[current];
+ }
+ /* try to find file in open list */
+
+ if (current <= nopen) /* file already open */ {
+ if ( (pxlfp = pixel_files[current].pixel_file_id) != NO_FILE )
+ fseek(pxlfp, 0l, 0);
+ /* reposition to start of file */
+ } else {
+ /* file not in open list */
+ if (nopen < MAXOPEN) /* just add it to list */
+ current = ++nopen;
+ else {
+ /* list full -- find least used file, */
+ /* close it, and reuse slot for new file */
+ least_used = 1;
+ for (i = 2; i <= MAXOPEN; ++i)
+ if (pixel_files[least_used].use_count>pixel_files[i].use_count)
+ least_used = i;
+ if (pixel_files[least_used].pixel_file_id != NO_FILE) {
+ FILE * fid;
+ struct font_entry *fp;
+ fid = pixel_files[least_used].pixel_file_id;
+ /* mark file as being closed in the entry */
+ fp = hfontptr;
+ while (fp != NULL && fp->font_file_id != fid) fp = fp->next;
+ if (fp == NULL)
+ Fatal("Open file %x not found in font entry list.\n", fid);
+ else {
+ fp->font_file_id = NULL;
+ }
+ fclose( fid );
+ }
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"\n__reuse slot %d\n", least_used);
+#endif
+ current = least_used;
+ }
+ if ((pxlfp = BINOPEN(fontptr->name)) == NULL) {
+ Warning("PXL-file %s could not be opened", fontptr->name);
+ pxlfp = NO_FILE;
+ } else {
+#ifdef DEBUG
+ if (Debug) fprintf(stderr,
+ "Opening File <%s> /%x/, Size(font_entry)=%d\n",
+ fontptr->name, pxlfp, sizeof(struct font_entry ));
+#endif
+
+ }
+ pixel_files[current].pixel_file_id = pxlfp;
+ pixel_files[current].use_count = 0;
+ }
+ pfontptr = fontptr; /* make previous = current font */
+ fontptr->font_file_id = pxlfp; /* set file identifier */
+ pixel_files[current].use_count++; /* update reference count */
+#ifndef USEPXL
+ gfin = pxlfp;
+#endif
+}
+
+
+/*-->PixRound*/
+/**********************************************************************/
+/***************************** PixRound *****************************/
+/**********************************************************************/
+long
+PixRound(x, conv) /* return rounded number of pixels */
+long x; /* in DVI units */
+long conv; /* conversion factor */
+{
+ return((x + conv) / conv);
+}
+
+
+/*-->ReadFontDef*/
+/**********************************************************************/
+/**************************** ReadFontDef ***************************/
+/**********************************************************************/
+void
+ReadFontDef(k)
+long k;
+{
+ long t;
+ unsigned short i;
+ char nname[STRSIZE];
+ int nmag;
+ struct font_entry *tfontptr; /* temporary font_entry pointer */
+ struct char_entry *tcharptr; /* temporary char_entry pointer */
+ static int plusid = 0;
+ bool font_found = FALSE;
+#ifdef LJ
+ int depth, max_depth;
+#endif
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"Mallocating %d Bytes)...\n",
+ sizeof(struct font_entry ));
+#endif
+
+ if ((tfontptr = NEW(struct font_entry )) == NULL)
+ Fatal("can't malloc space for font_entry");
+
+ allocated_storage += sizeof(struct font_entry );
+
+ tfontptr->next = hfontptr;
+ tfontptr->font_file_id = NULL;
+ fontptr = hfontptr = tfontptr;
+ tfontptr->ncdl = 0;
+ tfontptr->k = k;
+ tfontptr->c = NoSignExtend(dvifp, 4); /* checksum */
+ tfontptr->s = NoSignExtend(dvifp, 4); /* space size */
+ tfontptr->d = NoSignExtend(dvifp, 4); /* design size */
+ tfontptr->a = (int) NoSignExtend(dvifp, 1); /* length for font name */
+ tfontptr->l = (int) NoSignExtend(dvifp, 1); /* device length */
+
+#ifdef LJ
+ tfontptr->max_width = tfontptr->max_height = tfontptr->max_yoff =
+ max_depth = 0;
+#endif
+
+ GetBytes(dvifp, tfontptr->n, tfontptr->a + tfontptr->l);
+ tfontptr->n[tfontptr->a+tfontptr->l] = '\0';
+
+ tfontptr->font_mag = (long)((
+ ActualFactor((long)(1000.0*tfontptr->s/(double)tfontptr->d+0.5))
+ * ActualFactor(mag)
+#ifdef USEPXL
+ * RESOLUTION * 5.0
+#else
+ * RESOLUTION
+#endif
+ ) + 0.5);
+/*
+printf("[%ld]=%lf * %lf * %lf + 0.5 = %ld\n",
+ ((long)(1000.0*tfontptr->s/(double)tfontptr->d+0.5)),
+ ActualFactor((long)(1000.0*tfontptr->s/(double)tfontptr->d+0.5)),
+ ActualFactor(mag),
+ (double)RESOLUTION * 5,
+ tfontptr->font_mag );
+*/
+
+
+ if (!(font_found = (bool)
+ findfile(PXLpath, tfontptr->n, tfontptr->font_mag, tfontptr->name,FALSE))) {
+ Warning(tfontptr->name); /* contains error messsage */
+ tfontptr->font_file_id = NO_FILE;
+ }
+ else if (!( (G_noverbatim) || (G_quiet) ) )
+ fprintf(stderr,"%d: using font <%s>\n",
+ plusid,tfontptr->name);
+
+ tfontptr->plusid = plusid;
+ plusid++;
+
+ /* sprintf(tfontptr->psname,"%s.%ld.%d",
+ tfontptr->n,tfontptr->font_mag,tfontptr->plusid);*/
+
+#ifdef LJ
+ if (plusid >= HANDLE_MAX_FONTS)
+ Fatal("can handle only %d fonts! ask a wizzard..\n",
+ HANDLE_MAX_FONTS);
+#endif
+ if (tfontptr != pfontptr) {
+ if (font_found) OpenFontFile();
+ else
+ pxlfp = NO_FILE;
+ }
+#ifdef USEPXL
+ if ( pxlfp == NO_FILE ) { /* allow missing pxl files */
+ tfontptr->magnification = 0;
+ tfontptr->designsize = 0;
+#endif
+ for (i = FIRSTFNTCHAR; i <= LASTFNTCHAR; i++) {
+ tcharptr = &(tfontptr->ch[i]);
+#ifdef USEPXL
+ tcharptr->width = 0;
+ tcharptr->height = 0;
+ tcharptr->xOffset = 0;
+ tcharptr->yOffset = 0;
+#endif
+ tcharptr->where.isloaded = FALSE;
+ tcharptr->where.address.fileOffset = NONEXISTANT;
+ tcharptr->tfmw = 0;
+ }
+#ifdef USEPXL
+ return;
+ }
+ t = (long) NoSignExtend(pxlfp, 1);
+ if (t == 0) {
+ t = (long) NoSignExtend(pxlfp, 1);
+ t = (long) NoSignExtend(pxlfp, 2);
+ if (t == 1002)
+ tfontptr->id = id1002;
+ else if (t == 1001)
+ tfontptr->id = id1001;
+ else
+ Fatal("Unknown Version of PXL-format\n");
+ } else {
+ if (t == PK_PRE) {
+ unsigned char temp_byte;
+ temp_byte = (unsigned char) NoSignExtend(pxlfp, 1);
+ if (temp_byte != PK_ID) Fatal(
+ "Wrong Version of pk file! (%d should be 89)\n",
+ (int)temp_byte);
+ else
+ tfontptr->id = pk89;
+ } else
+ Fatal("unknown font format in file <%s> !\n",fontptr->name);
+ }
+
+ if ((tfontptr->id == id1002) || (tfontptr->id == id1001)) {
+ fseek(pxlfp, -20l, 2);
+
+ t = NoSignExtend(pxlfp, 4);
+ if ((tfontptr->c != 0) && (t != 0) && (tfontptr->c != t))
+ Warning("font = \"%s\",\n->tfm checksum = %lX,\n->pxl checksum = %lX",
+ tfontptr->name, tfontptr->c, t);
+ tfontptr->magnification = NoSignExtend(pxlfp, 4);
+ tfontptr->designsize = NoSignExtend(pxlfp, 4);
+
+ if (tfontptr->id == id1001)
+ fseek(pxlfp, (long) (NoSignExtend(pxlfp, 4) * 4), 0);
+ else
+ fseek(pxlfp, (long) NoSignExtend(pxlfp, 4) , 0);
+
+ for (i = FIRSTFNTCHAR; i <= 127; i++) { /* only defined for 7bit*/
+ tcharptr = &(tfontptr->ch[i]);
+ tcharptr->width = (unsigned short) NoSignExtend(pxlfp, 2);
+ tcharptr->height = (unsigned short) NoSignExtend(pxlfp, 2);
+ tcharptr->xOffset = (short) SignExtend(pxlfp, 2);
+ tcharptr->yOffset = (short) SignExtend(pxlfp, 2);
+ tcharptr->where.isloaded = FALSE;
+ if (tfontptr->id == id1001)
+ tcharptr->where.address.fileOffset = NoSignExtend(pxlfp,4) * 4;
+ else
+ tcharptr->where.address.fileOffset = NoSignExtend(pxlfp,4);
+ tcharptr->tfmw = (long)
+ ( (double)(NoSignExtend(pxlfp, 4))
+ * (double)tfontptr->s / (double) 0x100000 );
+ tcharptr->cw = (long)(((double)tcharptr->tfmw/(double)hconv) + 0.5);
+
+ if (tcharptr->width > CHAR_WIDTH_LARGE ||
+ tcharptr->height > CHAR_HEIGTH_LARGE )
+ tcharptr->charsize = LARGE_SIZE;
+ else
+ tcharptr->charsize = SMALL_SIZE;
+#ifdef LJ
+ max(tfontptr->max_width,tcharptr->width);
+ max(tfontptr->max_height,tcharptr->height);
+ if (tcharptr->yOffset > 0 && (int)tfontptr->max_yoff < (int)tcharptr->yOffset)
+ tfontptr->max_yoff = tcharptr->yOffset;
+ if ((depth = tcharptr->height - tcharptr->yOffset)>max_depth)
+ max_depth = depth;
+#endif
+
+ }
+#ifdef LJ
+ tfontptr->max_height = max_depth ? tfontptr->max_yoff+max_depth :
+ tfontptr->max_yoff+1;
+#endif
+ } else { /* PK 89 format */
+ unsigned char temp_byte;
+ register unsigned char flag_byte;
+ long hppp, vppp, pkloc, packet_length, temp;
+ int car, ii;
+
+ /* read comment */
+ for ( ii = temp_byte = (unsigned char) NoSignExtend(pxlfp, 1);
+ ii>0; ii--) {
+ flag_byte = (unsigned char) NoSignExtend(pxlfp, 1);
+#ifdef DEBUG
+ if (Debug) fprintf(stderr, "%c", flag_byte ) ;
+#endif
+ }
+#ifdef DEBUG
+ if (Debug) fprintf(stderr, "\n");
+#endif
+ pkloc = 3 + (int)temp_byte;
+ tfontptr->designsize = NoSignExtend(pxlfp, 4);
+
+ t = NoSignExtend(pxlfp, 4);
+ if ((tfontptr->c != 0) && (t != 0) && (tfontptr->c != t))
+ Warning("font = \"%s\",\n->tfm checksum = %lX,\n->pxl checksum = %lX",
+ tfontptr->name, tfontptr->c, t);
+
+ hppp = NoSignExtend(pxlfp, 4);
+ vppp = NoSignExtend(pxlfp, 4);
+ if (hppp != vppp)
+ Warning("aspect ratio is %ld:%ld (should be 1:1)!", hppp,vppp);
+ tfontptr->magnification = (long)(hppp * 72.27 * 5 / 65536l + 0.5);
+
+ pkloc += 16;
+ flag_byte = skip_specials(&pkloc);
+
+ while (flag_byte != PK_POST) {
+ if ((flag_byte & 7) == 7) {
+ /* fprintf(stderr,"\nRead long character preamble\n"); */
+
+ packet_length = (unsigned long)NoSignExtend(pxlfp,4);
+ if ((car = (int)NoSignExtend(pxlfp, 4)) > (LASTFNTCHAR))
+ Fatal("Bad character (%d) in PK-File\n",(int)car) ;
+
+ tcharptr = &(tfontptr->ch[car]);
+ tcharptr->where.address.fileOffset = pkloc;
+ /* set pkloc to end_of_packet */
+ pkloc += packet_length + 8;
+
+ tcharptr->tfmw = (long) NoSignExtend(pxlfp, 4);
+ (void) NoSignExtend(pxlfp, 4); /* horesc not used */
+ (void) NoSignExtend(pxlfp, 4); /* not used */
+
+ tcharptr ->width = (unsigned short) NoSignExtend(pxlfp, 4);
+ tcharptr ->height = (unsigned short) NoSignExtend(pxlfp, 4);
+ tcharptr ->xOffset = (short) SignExtend(pxlfp, 4);
+ tcharptr ->yOffset = (short) SignExtend(pxlfp, 4);
+ tcharptr ->where.isloaded = FALSE;
+ } else if (flag_byte & 4) {
+ /* fprintf(stderr,"Read extended short character preamble\n"); */
+
+ packet_length = ((long) flag_byte & 3) * 65536l +
+ (unsigned short) NoSignExtend(pxlfp, 2);
+ if ((car = (int)NoSignExtend(pxlfp, 1)) > (LASTFNTCHAR))
+ Fatal("Bad character (%d) in PK-File\n",(int)car) ;
+
+ tcharptr = &(tfontptr->ch[car]);
+ tcharptr->where.address.fileOffset = pkloc;
+ /* set pkloc to end_of_packet */
+ pkloc += packet_length + 3;
+
+ tcharptr->tfmw = (long) NoSignExtend(pxlfp, 3);
+/*
+ { register unsigned short t;
+ t = (unsigned short) NoSignExtend(pxlfp, 1);
+ tcharptr->tfmw = t * 65536l +
+ (unsigned short) NoSignExtend(pxlfp, 2);
+ }
+*/
+ /* horesc not used */
+ (void) NoSignExtend(pxlfp, 2) ;
+ tcharptr ->width = (unsigned short) NoSignExtend(pxlfp,2);
+ tcharptr ->height = (unsigned short) NoSignExtend(pxlfp,2);
+ tcharptr ->xOffset = (short) SignExtend(pxlfp, 2);
+ tcharptr ->yOffset = (short) SignExtend(pxlfp, 2);
+ tcharptr ->where.isloaded = FALSE;
+ } else {
+ /* fprintf(stderr,"<Read short character preamble@>\n"); */
+
+ packet_length = ((long)flag_byte & 3) * 256 +
+ NoSignExtend(pxlfp, 1) ;
+ if ((car = (int)NoSignExtend(pxlfp, 1)) > (LASTFNTCHAR))
+ Fatal("Bad character (%d) in PK-File\n",(int)car) ;
+
+ tcharptr = &(tfontptr->ch[car]);
+ tcharptr->where.address.fileOffset = pkloc;
+ /* set pkloc to end_of_packet */
+ pkloc += packet_length + 2 ;
+
+ tcharptr->tfmw = (long) NoSignExtend(pxlfp, 3);
+/*
+ { register unsigned short t;
+ t = (unsigned short) NoSignExtend(pxlfp, 1);
+ tcharptr->tfmw = t * 65536l +
+ (unsigned short) NoSignExtend(pxlfp, 2);
+ }
+*/
+ /* horesc not used */
+ (void) NoSignExtend(pxlfp, 1) ;
+ tcharptr ->width = (unsigned short) NoSignExtend(pxlfp,1);
+ tcharptr ->height = (unsigned short) NoSignExtend(pxlfp,1);
+ tcharptr ->xOffset = (short) SignExtend(pxlfp, 1);
+ tcharptr ->yOffset = (short) SignExtend(pxlfp, 1);
+ tcharptr ->where.isloaded = FALSE;
+ }
+
+ tcharptr->tfmw = (long)
+ ( tcharptr->tfmw * (double)tfontptr->s / (double) 0x100000 );
+
+ tcharptr->cw = (long)(((double)tcharptr->tfmw /
+ (double)hconv) + 0.5);
+
+ if (tcharptr->width > CHAR_WIDTH_LARGE ||
+ tcharptr->height > CHAR_HEIGTH_LARGE )
+ tcharptr->charsize = LARGE_SIZE;
+ else
+ tcharptr->charsize = SMALL_SIZE;
+
+#ifdef LJ
+/*
+printf("char=%d: this=%d, max_width=%d, this=%d,max_height=%d, this=%d,max_yoff=%d\n",
+ car, tcharptr->width, tfontptr->max_width,
+ tcharptr->height,tfontptr->max_height,
+ tcharptr->yOffset,tfontptr->max_yoff);
+*/
+ max(tfontptr->max_width, tcharptr->width);
+ max(tfontptr->max_height,tcharptr->height);
+ if (tcharptr->yOffset > 0 && (int)tfontptr->max_yoff < (int)tcharptr->yOffset)
+ tfontptr->max_yoff = tcharptr->yOffset;
+
+ if ((depth = tcharptr->height - tcharptr->yOffset) > max_depth)
+ max_depth = depth;
+#endif
+/*
+fprintf(stderr,"char=%d, yotcharptr=%lx, flag_byte=%d, font=%lx\n",car, tcharptr,flag_byte,tfontptr);
+*/
+ tcharptr->flag_byte = flag_byte;
+ fseek(pxlfp, (long) pkloc, 0);
+ flag_byte = skip_specials(&pkloc);
+
+ } /* end of while */
+#ifdef LJ
+tfontptr->max_height = max_depth ? tfontptr->max_yoff+max_depth :
+ tfontptr->max_yoff+1;
+#endif
+
+/*
+printf("fontid=%d: max_width=%u, max_height=%d, max_yoff=%u\n",
+ tfontptr->plusid, tfontptr->max_width,
+ tfontptr->max_height, tfontptr->max_yoff);
+*/
+
+#else
+ if ( pxlfp == NO_FILE ) /* allow missing pxl files */
+ return;
+
+ gfin = pxlfp;
+ seekpost();
+ readpost();
+ if ((tfontptr->c != 0) && (checksum != 0) && (tfontptr->c != checksum))
+ Warning("font = \"%s\",\n-->font checksum = %d,\n-->dvi checksum = %d",
+ tfontptr->name, tfontptr->c, checksum);
+
+ for(i=FIRSTFNTCHAR; i<=LASTFNTCHAR; i++) {
+ if (char_exists[i]) {
+ tcharptr = &(tfontptr->ch[i]);
+ tcharptr->tfmw = (long)(((float)tfm_wd[i]*(float)tfontptr->s) /
+ (float)((long)1l<<20));
+ tcharptr->where.address.fileOffset = char_pointer[i];
+ }
+#ifdef LJ
+/* GF USER PLEASE CHECK IF THIS CODE WORKS
+ tfontptr->max_width = gf_font_max_m;
+ tfontptr->max_height = gf_font_max_n;
+ tfontptr->max_yoff = gf_font_min_n;
+*/
+#endif
+#endif
+/*****************************************************************************/
+/*if (tcharptr->charsize==LARGE_SIZE)
+ printf("%d:\t <%c> w=%d h=%d xO=%d yO=%d tfmw=%ld cw=%ld %d\n",
+ i,(char) i,
+ tcharptr->width,tcharptr->height,tcharptr->xOffset,tcharptr->yOffset,
+ tcharptr->tfmw, tcharptr->cw, (int)(tcharptr->charsize));
+ */
+/*****************************************************************************/
+ }
+ }
+
+
+unsigned char
+skip_specials( pkloc )
+long *pkloc;
+{
+ long i, j;
+ register unsigned char flag_byte;
+ do {
+ flag_byte = (unsigned char) NoSignExtend(pxlfp, 1);
+/*
+fprintf(stderr,"flagbyte = %d, pkloc=%ld\n",(int)flag_byte,*pkloc);
+*/
+
+ (*pkloc) ++;
+ if (flag_byte >= 240)
+ switch (flag_byte) {
+ case 240:
+ case 241:
+ case 242:
+ case 243 : {
+ i = 0 ;
+ for (j = 240; j <= (long)flag_byte; j++) {
+ i = 256 * i + NoSignExtend(pxlfp, 1) ;
+ (*pkloc) ++;
+ }
+ for (j = 1; j <= i; j++) {
+ (void) NoSignExtend(pxlfp, 1) ;
+ (*pkloc) ++;
+ }
+ break;
+ }
+ case 244 : {
+ i = NoSignExtend(pxlfp, 4);
+ (*pkloc) += 4;
+ break;
+ }
+ case 245 :
+ break;
+ case 246 :
+ break ;
+ case 247:
+ case 248:
+ case 249:
+ case 250:
+ case 251:
+ case 252:
+ case 253:
+ case 254:
+ case 255: {
+ Fatal("Unexpected flagbyte %d!\n",
+ (int)flag_byte) ;
+ }
+ }
+ } while (!((flag_byte < 240) || (flag_byte == PK_POST))) ;
+ return(flag_byte);
+}
+
+
+/*-->ReadPostAmble*/
+/**********************************************************************/
+/************************** ReadPostAmble ***************************/
+/**********************************************************************/
+/***********************************************************************
+ This routine is used to read in the postamble values. It
+ initializes the magnification and checks the stack height prior to
+ starting printing the document.
+***********************************************************************/
+void
+ReadPostAmble(load)
+bool load;
+{
+ FindPostAmblePtr (&postambleptr);
+ if (NoSignExtend(dvifp, 1) != POST)
+ Fatal ("POST missing at head of postamble");
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"got POST command\n");
+#endif
+ ppagep = NoSignExtend(dvifp, 4);
+ num = NoSignExtend(dvifp, 4);
+ den = NoSignExtend(dvifp, 4);
+ mag = NoSignExtend(dvifp, 4);
+ if ( usermag > 0 && usermag != mag )
+ Warning("DVI magnification of %ld over-ridden by user (%ld)",
+ mag, usermag );
+ if ( usermag > 0 )
+ mag = usermag;
+ hconv = DoConv(num, den, hconvRESOLUTION);
+ vconv = DoConv(num, den, vconvRESOLUTION);
+ (void) NoSignExtend(dvifp, 4); /* height-plus-depth of tallest page */
+ (void) NoSignExtend(dvifp, 4); /* width of widest page */
+ if (NoSignExtend(dvifp, 2) >= STACK_SIZE)
+ Fatal ("Stack size is too small");
+ (void) NoSignExtend(dvifp, 2); /* this reads the number of pages in */
+ /* the DVI file */
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"now reading font defs");
+#endif
+ if (load)
+ GetFontDef ();
+}
+
+
+/*-->LoadAChar*/
+/**********************************************************************/
+/***************************** LoadAChar ******************************/
+/**********************************************************************/
+void
+LoadAChar(c, ptr)
+long c;
+register struct char_entry *ptr;
+{
+ long *pr;
+ long bytes;
+
+ if (ptr->where.address.fileOffset == NONEXISTANT) {
+ ptr->where.isloaded = FALSE;
+ return;
+ }
+
+ OpenFontFile();
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr, "LoadAChar: <%c>(%ld) from file at pos %ld\n",
+ (char)c,c,ptr->where.address.fileOffset);
+#endif
+
+#ifdef USEPXL
+
+ fseek(pxlfp, ptr->where.address.fileOffset, 0);
+
+ if (fontptr->id == pk89) {
+#ifdef PARANOIA
+ unsigned char temp;
+ temp = (unsigned char) NoSignExtend(pxlfp, 1);
+
+ if ((int)(ptr->flag_byte) != (int)temp) {
+ fprintf(stderr,"font=%lx, ptr=%lx\n",fontptr,ptr);
+ Fatal("%d: oh boy! old flag %d, new flag %d, ptr=%lx\n",
+ (int)c,(int)(ptr->flag_byte),(int)temp,ptr);
+ }
+#endif
+
+ if ((ptr->flag_byte & 7) == 7) {
+ bytes = ((long) NoSignExtend(pxlfp, 4)) - 28;
+ fseek(pxlfp, ptr->where.address.fileOffset + 36, 0);
+/*
+fprintf(stderr,"bytes=%d, seeking at %ld\n",
+ bytes, ptr->where.address.fileOffset + 36);
+*/
+ } else if ((ptr->flag_byte & 4) == 4) {
+ bytes = ((long)ptr->flag_byte & 3)
+ * 65536l + NoSignExtend(pxlfp, 2) - 13;
+ fseek(pxlfp, ptr->where.address.fileOffset + 16, 0);
+ } else {
+ bytes = ((long)ptr->flag_byte & 3)
+ * 256 + NoSignExtend(pxlfp, 1) - 8;
+ fseek(pxlfp, ptr->where.address.fileOffset + 10, 0);
+ }
+ } else if (fontptr->id == id1002)
+ bytes = ((( (long)ptr->width + 7) >> 3) * (long) ptr->height);
+ else if (fontptr->id == id1001)
+ bytes = 4 * (((long)ptr->width + 31) >> 5) * (long)ptr->height;
+
+ if (bytes > 0) {
+ /* do NOT load Huge characters */
+ if ((bytes > HUGE_CHAR_PATTERN) && (fontptr->id != pk89)) {
+ qfprintf(stderr,"Huge Character <%c> (%ld Bytes)\n", (char)c, bytes);
+ ptr->charsize = HUGE_SIZE;
+ ptr->where.isloaded = FALSE;
+ } else {
+ if ( (pr = (long *)malloc( bytes )) == NULL )
+ Fatal("Unable to allocate %ld bytes for char <%c>\n",
+ bytes, (char)c);
+/*
+ * else fprintf(stderr,"allocating %ld bytes char <%c>(%d)\t at 0x%lx\n",
+ * bytes, (char)c,(int)c,pr);
+ */
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,
+ "Allocating Char <%c>, FileOffset=%lX, Bytes=%ld (%d) <%d>\n",
+ (char) c, ptr->where.address.fileOffset, bytes,
+ (int)bytes, (unsigned int)bytes);
+#endif
+ allocated_storage += bytes;
+ fread(pr, 1, (int) bytes , pxlfp);
+ ptr->where.address.pixptr = pr;
+ }
+ }
+#else
+ fseek(gfin, ptr->where.address.fileOffset, 0);
+ gettochar();
+ readbits();
+ if (num_bytes > HUGE_CHAR_PATTERN)
+ ptr->charsize = HUGE_SIZE;
+#endif
+ ptr->where.isloaded = TRUE;
+ if (ptr->charsize != SMALL_SIZE
+#ifdef LJ
+ /* we might have problems at the edge of the paper with diff. sized characters
+ * the correct treatment would be to check whether the bounding box of
+ * tfontptr is within the paper relative to the current position
+ */
+ || fontptr->max_height > CHAR_HEIGTH_LARGE
+ || (rasterfont[fontptr->plusid])
+#endif
+ )
+ return;
+
+ EmitChar(c, ptr);
+#ifdef USEPXL
+ /* we should really free the space used by the PXL data after this
+ point, but it is not large, and besides, we may want to be
+ more clever in the future, about sending bitmaps. So keep
+ the data around */
+#endif
+}
+/*-->SetChar*/
+/**********************************************************************/
+/***************************** SetChar ******************************/
+/**********************************************************************/
+void
+SetChar(c, command, PassNo, do_posn,in_string)
+long c;
+short command;
+int PassNo;
+bool do_posn,in_string;
+{
+ register struct char_entry *ptr; /* temporary char_entry pointer */
+ bool pos_after = FALSE;
+
+ ptr = &(fontptr->ch[c]);
+ if (!((ptr->where.isloaded) || (ptr->charsize == HUGE_SIZE)))
+ LoadAChar(c, ptr);
+ if (PassNo == 0)
+ return;
+
+ if (do_posn) {
+#ifdef IBM3812
+ if (CharStringPos>0) {
+ fprintf(stderr,"!!!! That should never happen!!!\n");
+ CharStringOut;
+ }
+#endif
+ SetPosn(h, v);
+ }
+
+/*
+printf("(%d) hh=%ld (+%ld/+%ld), h=%ld, xh=%ld,xhh=%ld, [%ld|%ld] ->%d\n",
+ (int)do_posn,hh,(long)ptr->cw,(long)ptr->cw*(long)hconv,h,
+ PIXROUND(h, hconv),
+ PIXROUND(hh, hconv),
+ labs((hh-h)),hconv,(labs((hh-h))>hconv)
+ );
+*/
+
+ if (in_string && (labs((hh-h))>hconv)) {
+#ifdef IBM3812
+ CharStringOut;
+#endif
+ SetPosn(h, v);
+ }
+
+/*
+fprintf(stderr,"raster?=%d - last_ry=%d, last_rx=%d,mmax-height=%d\n",
+ (int)last_ry < fontptr->max_height, (int)last_ry,(int)last_rx,
+ (int)fontptr->max_height);
+*/
+
+ if (fontptr->font_file_id != NO_FILE) { /* ignore missing fonts */
+ if (ptr->charsize != SMALL_SIZE
+#ifdef LJ
+ /* the LaserJet cannot printcahracters where the bounding box lies outside the
+ * paper edge. Missing: right paper edge
+ */
+ || last_ry < (int)fontptr->max_height
+ || fontptr->max_height > CHAR_HEIGTH_LARGE
+ || (rasterfont[fontptr->plusid])
+#endif
+ ) {
+ int tmp;
+ char sign;
+
+#ifdef LJ
+ if (!do_posn) {
+ SetPosn(h, v);
+ }
+#ifdef USEPXL
+ tmp = (int) -ptr->yOffset;
+#else
+ tmp = (int) num_rows-y_offset;
+#endif
+ if (tmp != 0) {
+ if (tmp < 0) {
+ sign = '-'; tmp = -tmp;
+ } else
+ sign = '+';
+ EMIT(outfp, "\033*p%c%dY", sign, tmp);
+ }
+#ifdef USEPXL
+ tmp = (int) -ptr->xOffset;
+#else
+ tmp = (int) -x_offset;
+#endif
+ if (tmp != 0) {
+ if (tmp < 0) {
+ sign = '-'; tmp = -tmp;
+ } else
+ sign = '+';
+ EMIT(outfp, "\033*p%c%dX", sign, tmp);
+ }
+#endif
+#ifdef IBM3812
+ CharStringOut;
+#endif
+#ifdef DEBUG
+ if (Debug)
+#ifndef vms
+ fprintf(stderr,"Raster character <%c> %hd\n", (char) c,(short)c);
+#else
+ fprintf(stderr,"Raster character <%c> %d\n", (char) c,(short)c);
+#endif
+#endif
+ RasterChar(ptr);
+ pos_after = TRUE;
+ } else {
+ unsigned char cc;
+ cc = VisChar((char)c);
+#ifdef IBM3812
+#ifdef USEPXL
+ if ( ptr->yyOffset || (!in_string) ) {
+ CharStringOut;
+ MoveVert(ptr->yyOffset);
+ sprintf(PMPformat, "\01%c", cc);
+ PMPout(2, PMPformat);
+ MoveVert((int)-(ptr->yyOffset));
+ } else {
+#endif
+ if (CharStringPos==CHARSTRINGMAX)
+ CharStringOut;
+
+ CharString[CharStringPos] = cc;
+ CharStringPos++;
+#ifdef USEPXL
+ }
+#endif
+#endif
+#ifdef LJ
+#define TRANSPARENTCHAR(ch) \
+ if ((ch == 0l) || (ch >= 7l && ch <= 15l) || (ch == 27l)) \
+ EMIT(outfp, "\033&p1X%c", (unsigned char)ch); \
+ else EMITC((unsigned char)ch)
+#ifdef USEPXL
+ if (ptr->yyOffset) {
+#ifndef vms
+ EMIT(outfp, "\033*p+%hdY", ptr->yyOffset);
+ TRANSPARENTCHAR(cc);
+ EMIT(outfp, "\033*p-%hdY", ptr->yyOffset); /* GUGUGU 255 */
+#else
+ EMIT(outfp, "\033*p+%dY", ptr->yyOffset);
+ TRANSPARENTCHAR(cc);
+ EMIT(outfp, "\033*p-%dY", ptr->yyOffset); /* GUGUGU 255 */
+#endif
+ } else
+#endif
+/* EMITC( (unsigned char)c);*/
+ { TRANSPARENTCHAR(cc);}
+#endif
+ }
+ hh += (long) ptr->cw*hconv;
+ }
+ if (command <= SET4)
+ h += ptr->tfmw;
+ if (pos_after) {
+ SetPosn(h, v);
+ }
+}
+
+
+void
+DoBop()
+{
+ struct font_entry *p;
+#ifdef LJ
+ register short i;
+ if (fonts_used_on_this_page > MAX_FONTS_PER_PAGE) {
+ for (i = 0; i < HANDLE_MAX_FONTS; i++)
+ rasterfont[i] = FALSE;
+ }
+ fonts_used_on_this_page = 0;
+#endif
+ for (p = hfontptr; p; p = p->next) {
+ p->used_on_this_page = FALSE;
+ }
+}
+
+
+/*-->SetFntNum*/
+/**********************************************************************/
+/**************************** SetFntNum *****************************/
+/**********************************************************************/
+void
+SetFntNum(k, Emitting)
+long k;
+bool Emitting;
+/* this routine is used to specify the font to be used in printing future
+ characters */
+{
+#ifdef LJ
+ static unsigned short plusid = 0;
+#endif
+ fontptr = hfontptr;
+ while ((fontptr != NULL) && (fontptr->k != k))
+ fontptr = fontptr->next;
+ if (fontptr == NULL)
+ Fatal("font %ld undefined", k);
+ if (Emitting && (fontptr->font_file_id != NO_FILE) ) {
+ if (!fontptr->used_on_this_page) {
+ fontptr->used_on_this_page = TRUE;
+#ifdef LJ
+ if (++fonts_used_on_this_page > MAX_FONTS_PER_PAGE) {
+ qfprintf(stderr,"this is the %d. font on this page!",
+ fonts_used_on_this_page);
+ qfprintf(stderr," (max = %d) rastering characters!\n",
+ MAX_FONTS_PER_PAGE);
+ rasterfont[fontptr->plusid] = TRUE;
+ }
+#endif
+ }
+
+ /* activate font */
+#ifdef IBM3812
+ sprintf(PMPformat, "\323%c", (unsigned char)fontptr->plusid);
+ PMPout(2, PMPformat);
+#endif
+#ifdef LJ
+ if (!rasterfont[fontptr->plusid]) {
+ if (fontptr->plusid>0) EMIT(outfp, "\033(%dX", fontptr->plusid);
+ else EMIT(outfp, "\033(X");
+ }
+/* else printf("I am doing rasterfont for plusid=%d instead\n",
+ fontptr->plusid);
+*/
+#endif
+ }
+#ifdef LJ /* reassignment of printer font id 0.48 */
+ else if (fontptr->font_file_id != NO_FILE) {
+ if (fontptr->ncdl == 0) {
+#ifdef DEBUG
+ if (Debug)
+ printf("Changing plusid from %d to %d\n", fontptr->plusid, (int)plusid);
+#endif
+ fontptr -> plusid = plusid;
+ plusid ++;
+ }
+ }
+#endif
+}
+
+
+/*-->SetPosn*/
+/**********************************************************************/
+/***************************** SetPosn ******************************/
+/**********************************************************************/
+void /* output a positioning command */
+SetPosn(x, y)
+long x, y;
+{
+ int rx, ry;
+ rx = (int)PIXROUND(x, hconv) + x_goffset;
+ ry = (int)PIXROUND(y, vconv) + y_goffset;
+
+/*
+* fprintf(stderr,"setposn to %ld/%ld, %d/%d\n",x,y,rx,ry);
+*/
+
+#ifdef IBM3812
+ PMPcont(3);
+ PMPoutC('\340');
+ EMITWORD(LARGER(rx,0));
+
+ if (last_ry != ry) { /* necessary to set new y-position */
+ PMPcont(3);
+ PMPoutC('\341');
+ EMITWORD(LARGER(ry,0));
+ }
+#endif
+#ifdef LJ
+ if (last_ry != ry) /* necessary to set new y-position */
+ EMIT(outfp, "\033*p%dx%dY", LARGER(rx,0), LARGER(ry,0));
+ else
+ EMIT(outfp, "\033*p%dX", LARGER(rx,0));
+#endif
+
+ last_ry = ry; /* last y-position on output device */
+ last_rx = rx; /* last x-position on output device */
+/*
+ * must know where device "really" is horizontally, for rel. posning.
+ * (maybe in the future), but we always use direct positioning for
+ * vertical movement.
+ */
+ /* hh = rx * hconv; */
+ hh = x;
+ vv = y;
+/*
+ * fprintf(stderr,"DoPosn: x=%ld, y=%ld, rx=%d, ry=%d, hh=%ld, vv=%ld\n",
+ * x,y,rx,ry,hh,vv);
+ */
+}
+
+
+#ifdef IBM3812
+/*-->PMPLine*/
+/**********************************************************************/
+/***************************** PMPLine ******************************/
+/**********************************************************************/
+void /* drawing lines on the 3812 using PMP vector commands */
+PMPLine(w, y, x)
+int w, y, x;
+{
+
+ if ((w == 0) || ((x == 0) && (y == 0)))
+ return;
+
+/*
+fprintf(stderr,"w=%d / %d - %d, y=%d / %d - %d, x=%d / %d - %d\n",
+ w,(char)(w & 0xff),(int)((signed_char)(w & 0xff)),
+ y,(char)(y & 0xff),(int)((signed_char)(y & 0xff)),
+ x,(char)(x & 0xff),(int)((signed_char)(x & 0xff)));
+*/
+
+ if ( (((signed_char)(x & 0xff)) == x ) &&
+ ( ((signed_char)(y & 0xff)) == y ) ) {
+ PMPcont(6);
+ PMPout(1, "\370");
+ EMITWORD(3); /* length of vector */
+ PMPoutC((unsigned char)(0x80 | 0x00 | (unsigned char) w));
+ PMPoutC((signed_char)(y & 0xff));
+ PMPoutC((signed_char)(x & 0xff));
+/*
+ fprintf(stderr,"F8 00 03: w=%d, x=%d(%d-%.2X), y=%d(%d-%.2X),\n",
+ w,x,(char)(x & 0xff),(signed_char)(x & 0xff),
+ y,(char)(y & 0xff),(signed_char)(y & 0xff));
+*/
+
+ } else {
+ PMPcont(8);
+ PMPout(1, "\370");
+ EMITWORD(4 + 1); /* length of vector */
+ PMPoutC((unsigned char)(0xC0 | 0x00 | (unsigned char) w));
+ EMITWORD(y);
+ EMITWORD(x);
+/*
+ fprintf(stderr,"F8 00 05: w=%d, x=%d, y=%d,\n", w,x,y);
+*/
+ }
+}
+
+
+#endif
+/*-->SetRule*/
+/**********************************************************************/
+/***************************** SetRule ******************************/
+/**********************************************************************/
+void /* this routine will draw a rule */
+SetRule(a, b, Set)
+long a, b;
+int Set;
+{
+ long xx, yy;
+#ifdef IBM3812
+ short hor_offset, vert_offset, ll;
+#endif
+ if ( a > 0 && b > 0 ) {
+ SetPosn(h, v); /* lower left corner */
+ xx = (long)PIXROUND(b, hconv); /* width */
+ yy = (long)PIXROUND(a, vconv); /* height */
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"Rule xx=%ld, yy=%ld\n", xx, yy);
+#endif
+
+#ifdef IBM3812
+ hor_offset = (short)(last_ry - yy);
+ if (hor_offset < 0) yy += hor_offset;
+ if (last_rx < 0) xx += last_rx;
+
+ if (Landscape) {
+ if (last_ry > MAX_PAGE_WIDTH) yy += MAX_PAGE_WIDTH-last_ry;
+ hor_offset = (short)(MAX_PAGE_HEIGHT - (last_rx + xx));
+ } else {
+ if (last_ry > MAX_PAGE_HEIGHT) yy += MAX_PAGE_HEIGHT-last_ry;
+ hor_offset = (short)(MAX_PAGE_WIDTH - (last_rx + xx));
+ }
+ if (hor_offset < 0) xx += hor_offset;
+
+ if ((xx > 31) && (yy > 31)) {
+/*
+ * fill area by multiple lines (kind of a mess)
+ * process for simplicity always horizontally
+ */
+
+/* printf("large box: w=%d, x=%d, y=%d\n",(int)yy,(int)xx,0);*/
+
+ hor_offset = HOR_HALF(30);
+ MoveHor(hor_offset);
+ vert_offset = VERT_HALF(30);
+ MoveVert(-vert_offset);
+ ll = (short)xx - 30;
+
+ for (; yy > 30; yy -= 30) {
+ PMPLine(30, 0, ll);
+ MoveHor(-ll);
+ MoveVert(-30);
+ }
+
+ hor_offset = -hor_offset + HOR_HALF(yy);
+ MoveHor(hor_offset);
+ vert_offset = (vert_offset - 30) + VERT_HALF(yy);
+ MoveVert(-vert_offset);
+
+ PMPLine((int)yy, 0, (int)(xx - yy));
+
+ } else if ( (yy < xx) && (xx > 0) ) {
+
+/* printf("hori rule: w=%d, x=%d, y=%d\n",(int)yy,(int)(xx-yy),0);*/
+
+ hor_offset = HOR_HALF(yy);
+ vert_offset = VERT_HALF(yy);
+
+ MoveHor(hor_offset);
+ MoveVert(-vert_offset);
+
+ PMPLine((int)yy, 0, (int)(xx - yy));
+ } else if ( (xx < yy) && (yy > 0)) {
+
+ hor_offset = HOR_HALF(xx);
+ vert_offset = VERT_HALF(xx);
+/*
+ printf("move: x=%d, y=%d\n",hor_offset,-vert_offset);
+ printf("vert rule: w=%d, x=%d, y=%d\n",(int)xx,0,(int)-(yy-xx));
+*/
+ MoveHor(hor_offset);
+ MoveVert(-vert_offset);
+
+ PMPLine((int)xx, (int)-(yy - xx), 0);
+ } else if (xx == yy) {
+ short y0; /* small square box!! */
+
+ y0 = (short)yy / 2;
+ hor_offset = HOR_HALF(y0);
+ MoveHor(hor_offset);
+ vert_offset = VERT_HALF(y0);
+ MoveVert(-vert_offset);
+ ll = (short)xx - y0;
+
+ PMPLine((int)y0, 0, ll);
+
+ hor_offset = -(ll + hor_offset);
+ vert_offset = (y0 - vert_offset);
+
+ yy -= (long)y0;
+ hor_offset += HOR_HALF(yy);
+ MoveHor(hor_offset);
+ vert_offset += VERT_HALF(yy);
+ MoveVert(-vert_offset);
+
+ PMPLine((int)yy, 0, (int)xx - yy);
+ }
+#endif
+#ifdef LJ
+ if (last_ry + 1 < yy) yy = last_ry + 1;
+ if (last_rx < 0) xx += last_rx;
+
+ if (((int)pgsiz_dots >0) && ((int)last_ry > (int)pgsiz_dots))
+ yy += (long)pgsiz_dots - (long)last_ry;
+
+ if ((yy>0) && (xx>0))
+ EMIT(outfp, "\033*p-%ldY\033*c%lda%ldbP", yy - 1, xx, yy);
+#endif
+ last_ry = UNKNOWN; /* next time full positioning */
+ }
+ if (Set)
+ h += b;
+}
+
+
+/*-->SetString*/
+/**********************************************************************/
+/***************************** SetString ****************************/
+/**********************************************************************/
+void
+SetString(firstch, PassNo) /* read and set a consecutive string of chars */
+short firstch;
+int PassNo;
+{
+ short c;
+ register unsigned short i;
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr, "SetString ");
+#endif
+ for (i = 0, c = firstch; c >= SETC_000 && c <= SETC_127; i++) {
+#ifdef DEBUG
+ if (Debug)
+ fprintf (stderr, "%d ", c);
+#endif
+ SetChar((long)c, c, PassNo, (bool)(i==0),TRUE);
+ c = (short) NoSignExtend(dvifp, 1);
+ }
+ fseek(dvifp, -1l, 1); /* backup one character */
+#ifdef IBM3812
+ CharStringOut;
+#endif
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr, "...SetString\n");
+#endif
+}
+
+#ifndef ARITHMETIC_RIGHT_SHIFT
+long signTab[5] = {0,0x00000080,0x00008000,0x00800000,0x00000000};
+long extendTab[5] = {0,0xffffff00,0xffff0000,0xff000000,0x00000000};
+#endif
+
+/*-->SignExtend*/
+/**********************************************************************/
+/**************************** SignExtend ****************************/
+/**********************************************************************/
+long
+SignExtend(fp, n) /* return n byte quantity from file fd */
+register FILE *fp; /* file pointer */
+register int n; /* number of bytes */
+{
+ int n1; /* number of bytes */
+ long x,x0; /* number being constructed */
+ x = getc(fp); /* get first (high-order) byte */
+ n1 = n--;
+ while (n--) {
+ x <<= 8;
+ x |= getc(fp);
+ }
+/*
+ * NOTE: This code assumes that the right-shift is an arithmetic, rather
+ * than logical, shift which will propagate the sign bit right. According
+ * to Kernighan and Ritchie, this is compiler dependent!
+ */
+
+/*
+ x0 = x;
+ */
+
+#ifdef ARITHMETIC_RIGHT_SHIFT
+ x <<= 32 - 8 * n1;
+ x >>= 32 - 8 * n1; /* sign extend */
+#else
+ if (x & signTab[n1]) x |= extendTab[n1];
+#endif
+
+/*
+ fprintf(stderr,"\tSignExtend(fp,%d)=%X, was=%X,%d\n", n1, x,x0,x0&signTab[n1]);
+ */
+
+#ifdef DEBUG
+ if (Debug)
+ fprintf(stderr,"\tSignExtend(fp,%d)=%X\n", n1, x);
+#endif
+ return(x);
+}
+
+
+/*-->SkipFontDef*/
+/**********************************************************************/
+/**************************** SkipFontDef ***************************/
+/**********************************************************************/
+void
+SkipFontDef()
+{
+ int a, l;
+ char n[STRSIZE];
+
+ (void) NoSignExtend(dvifp, 4);
+ (void) NoSignExtend(dvifp, 4);
+ (void) NoSignExtend(dvifp, 4);
+ a = (int) NoSignExtend(dvifp, 1);
+ l = (int) NoSignExtend(dvifp, 1);
+ GetBytes(dvifp, n, a + l);
+}
+
+
+/*-->Warning*/
+/**********************************************************************/
+/***************************** Warning ******************************/
+/**********************************************************************/
+void /* issue a warning */
+Warning(fmt, a, b, c, d)
+char *fmt; /* format */
+char *a, *b, *c, *d; /* arguments */
+{
+#ifndef vms
+ G_errenc = 1;
+#else
+ G_errenc = (SS$_ABORT | STS$M_INHIB_MSG); /* no message on screen */
+#endif
+ if ( G_nowarn || G_quiet )
+ return;
+
+ fprintf(stderr, "warning : ");
+ fprintf(stderr, fmt, a, b, c, d);
+ fprintf(stderr, "\n");
+}
+
+void
+PutWord(w)
+int w;
+{
+ EMITC((char)(w >> 8) & 0xff);
+ EMITC((char)w & 0xff);
+}
+
+
+#ifdef IBM3812
+/*-->PMPout*/
+/*****************************************************************************/
+/* This routine produces the PMP-envelopes for the 3812. Its semantics are:
+
+ first arg == 0 ... flush buffer
+ first arg == -1 ... number of bytes specified in the second argument
+ have to be continuous, that is they must not
+ be disrupted by ENTER PMP etc.
+ first arg > 0 output first arg bytes
+
+ If arg2 > OUTBUFSIZE ... flush buffer,
+ switch to unbuffered mode
+ (dont't collect PMP commands)
+ If arg2+bufferpointer > OUTBUFSIZE ... flush buffer,
+ block will fit into buffer
+ otherwise ..... block will fit into buffer
+
+ Buffering is done to reduce the ENTER PMP-commands. Initially
+ the 3812 is in PC-ASCII mode. In order to issue a PMP-command it is
+ necessary to enter PMP mode. The ENTER-PMP-command contains the
+ number of bytes that will be interpreted as PMP-commands. In the
+ most naive approach for each primitive command (eg. set cursor) you
+ have to produce a seperate ENTER-PMP-envelope (5 bytes). It is
+ favourable to collect as many PMP commands as possible in one envelope. */
+/*****************************************************************************/
+void
+PMPout(l, s)
+char *s;
+int l;
+{
+ static char buffer[OUTBUFSIZE];
+ static unsigned short bp = 0; /* range 0..OUTBUFSIZE */
+ static long continuous = 0l;
+ static bool buffered = TRUE;
+
+ if (l == 0) {
+ if (bp == 0)
+ return;
+ EMIT(outfp, "\033[C%c%c", (unsigned char)(bp & 0xFF),
+ (unsigned char)(bp >> 8));
+ EMITB((int)bp, buffer);
+ bp = 0;
+ return;
+ }
+ if (l == -1) {
+ continuous = (long)s;
+ if (continuous + (long)bp + 5l > (long) OUTBUFSIZE)
+ PMPflush;
+ buffered = (bool) ((continuous + 5l <= (long) OUTBUFSIZE));
+ if (!buffered) {
+ EMIT(outfp, "\033[C%c%c",
+ (unsigned char)(continuous & 0xFF),
+ (unsigned char)((continuous >> 8) & 0xFF));
+ }
+ return;
+ }
+ if (buffered) {
+ register int i;
+ if ( ((long)l + bp) > OUTBUFSIZE)
+ PMPflush;
+ for (i = 0; i < l; i++)
+ buffer[bp+i] = s[i];
+ bp += (unsigned short)l;
+ } else {
+ EMITB((int)l, s);
+ buffered = (bool) ((continuous -= (long)l) <= 0) ;
+ }
+}
+
+
+void
+PMPoutC(c)
+char (c);
+{
+ PMPout(1, &c);
+}
+
+
+#endif
+#ifdef MSDOS
+/*-->AssureBinary*/
+/**********************************************************************/
+/*************************** AssureBinary *****************************/
+/**********************************************************************/
+/* This procedure is both DOS AND MSC dependent. The MSC file open on */
+/* a device ignores the 'binary' of the "wb" parameter and opens the */
+/* file in ascii mode. This procedure sets the file f to binary mode */
+/* if it is connected to a device that is not console input or output */
+/* or the null device. For other operating systems this routine is */
+/* useless. (Background: MSDOS 3.2 Technical Reference upd 1 pg 6-137 */
+/**********************************************************************/
+void
+AssureBinary(f)
+FILE *f;
+{
+ union REGS regs; /* registers for bios call */
+
+ regs.h.ah = (unsigned char) 0x44; /* IOCTL */
+ regs.h.al = (unsigned char) 0x00; /* get device information */
+ regs.x.bx = (unsigned int) fileno(f); /* handle from MSC */
+ intdos(&regs, &regs); /* call DOS interrupt */
+ /* ---> result in DX */
+
+ if ( (regs.h.dl & 0x80) /* file handle points to a device */
+ && !(regs.h.dl & 0x07) ) /* neither console i/o or null */ {
+
+ regs.h.dl |= 0x20; /* set BINARY bit in device info */
+
+ regs.h.ah = (unsigned char) 0x44; /* IOCTL */
+ regs.h.al = (unsigned char) 0x01; /* set device information*/
+ regs.x.bx = (unsigned int) fileno(f); /* handle from MSC */
+ regs.h.dh = (unsigned char) 0x00; /* clear DH */
+ intdos(&regs, &regs); /* call DOS interrupt */
+ }
+}
+
+
+#endif
+
+#ifdef USEPXL
+bool getbit ();
+unsigned char getnyb ();
+long pk_packed_num ();
+
+
+#define PKBYTE *pkloc; pkloc ++
+#define OUTCHAR(c) raster_line_buf[bp]= (unsigned char)c; bp++
+
+unsigned char bitweight, inputbyte ;
+unsigned char dyn_f ;
+unsigned char *pkloc;
+int repeatcount;
+
+void /* <Read and translate raster description@>*/
+PkRaster(ce, raster)
+struct char_entry *ce;
+bool raster;
+{
+ int rp;
+ int current_line;
+ int wordwidth ;
+ bool turnon;
+ unsigned short nbpl;
+ long rowsleft, word, wordweight, hbit, count, i, j, tl;
+ long row[101] ;
+ unsigned char raster_line_buf[BYTES_PER_PIXEL_LINE];
+ unsigned short bp;
+
+
+ if (ce->charsize == HUGE_SIZE)
+ Fatal( "cannot process currently PK font patterns of that size!\n");
+
+
+ current_line = 0;
+ pkloc = (unsigned char *)ce->where.address.pixptr;
+ dyn_f = (unsigned char)(ce->flag_byte >> 4);
+ turnon = (bool)((ce->flag_byte & 8) == 8);
+ wordwidth = (int)(ce->width + 31) >> 5 ;
+ nbpl = ((int)(ce->width) + 7) >> 3;
+
+ bitweight = 0 ;
+ if (dyn_f == 14) {
+ /*printf("<Get raster by bits@>\n");*/
+ for (i = 1; i <= (long)ce->height; i++) {
+ word = 0 ;
+ wordweight = 31 ;
+ bp = 0; /* Sowa */
+
+#ifdef DRAWGLYPH
+ printf(" |");
+#endif
+ for (j = 1; j <= (long) ce->width; j++) {
+ bool getbit;
+ /* bp = 0; SOWA/
+/*******************************************begin Getbit *********/
+ bitweight /= 2 ;
+ if ( bitweight == 0 ) {
+ inputbyte = PKBYTE ;
+ bitweight = 128 ;
+ }
+ getbit = (bool)
+ ( inputbyte >= bitweight ) ;
+ if ( getbit )
+ inputbyte -= bitweight ;
+/*********************************************end Getbit *********/
+
+ if (getbit)
+ word += power[wordweight] ;
+
+ wordweight --;
+ if (wordweight == -1) {
+
+#ifdef DRAWGLYPH
+ { int k;
+ for (k=31; k>=0; k--) {
+ if ((power[k] & word)!=0) printf("M");
+ else printf(".");
+ }
+ }
+#endif
+
+ OUTCHAR((word >> 24 & 0xFF));
+ OUTCHAR((word >> 16 & 0xFF));
+ OUTCHAR((word >> 8 & 0xFF));
+ OUTCHAR((word & 0xFF));
+
+ word = 0 ;
+ wordweight = 31 ;
+ }
+ }
+ if (wordweight < 31) {
+#ifdef COMMENT
+#ifdef DRAWGLYPH
+ { int k;
+ for (k=15; k>=0; k--) {
+ if ((power[k] & word)!=0) printf("Z");
+ else printf(":");
+ }
+ }
+ printf("|\n ----|");
+#endif
+#endif
+
+ for (j = 3; j >= (wordwidth * 4 - (long)nbpl);
+ j--) {
+
+ OUTCHAR(((word >> (j << 3)) & 0xff));
+
+#ifdef DRAWGLYPH
+ { int k;
+ for (k=7; k>=0; k--) {
+ if ((power[k] & ((word >> (j << 3)) & 0xff))!=0) printf("M");
+ else printf(".");
+ }
+ }
+#endif
+
+ }
+ }
+
+ if (raster) {
+ RasterLine(ce, (unsigned int)nbpl,
+ current_line, raster_line_buf);
+ current_line++;
+ } else
+ EMITL(bp, raster_line_buf);
+
+#ifdef DRAWGLYPH
+ printf("|\n");
+#endif
+ }
+ } else {
+ /* printf("@<Create normally packed raster@>\n"); */
+ rowsleft = (long) ce->height ;
+ hbit = (long) ce->width ;
+ repeatcount = 0 ;
+ wordweight = 32 ;
+ word = 0 ;
+ rp = 1 ;
+ while ( rowsleft > 0 ) {
+ count = pk_packed_num() ;
+ bp = 0;
+
+ 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] ;
+
+ row[rp] = word ;
+
+ /* printf(" @<Send row@> \n");*/
+ for (i = 0; i <= (long) repeatcount; i++) { int ii;
+
+#ifdef DRAWGLYPH
+ printf("*** |");
+#endif
+ for (ii = 1; ii < wordwidth; ii++) {
+ tl = row[ii];
+
+ OUTCHAR((tl >> 24 & 0xFF));
+ OUTCHAR((tl >> 16 & 0xFF));
+ OUTCHAR((tl >> 8 & 0xFF));
+ OUTCHAR((tl & 0xFF));
+
+#ifdef DRAWGLYPH
+ { int k;
+ for (k=31; k>=0; k--) {
+ if ((power[k] & row[ii])!=0) printf("M");
+ else printf(".");
+ }
+ }
+#endif
+ }
+ tl = row[wordwidth];
+ for (j = 3; j >= (wordwidth *4 - (long)nbpl);
+ j--) {
+
+ OUTCHAR(((tl >> (j << 3)) & 0xff));
+
+#ifdef DRAWGLYPH
+ { int k;
+ for (k=7; k>=0; k--) {
+ if ((power[k] & ((tl >> (j << 3)) & 0xff))!=0) printf("M");
+ else printf(".");
+ }
+ }
+#endif
+ }
+
+ if (raster) {
+ RasterLine(ce,
+ (unsigned int)nbpl,
+ current_line,
+ raster_line_buf);
+ current_line++;
+ } else
+ EMITL(bp, raster_line_buf);
+
+ bp = 0;
+
+#ifdef DRAWGLYPH
+ printf("| ");
+ for (j=1;j<=(long)wordwidth;j++) printf("%02lX/",row[j]);
+ printf(" raster=%d\n",raster);
+#endif
+ }
+
+ rowsleft -= (long)repeatcount + 1 ;
+ repeatcount = 0 ;
+ rp = 1 ;
+ word = 0 ;
+ wordweight = 32 ;
+ count -= hbit ;
+ hbit = (long)ce->width ;
+ } else {
+ if (turnon) word += gpower[wordweight] ;
+ row[rp] = word ;
+ rp = rp + 1 ;
+ word = 0 ;
+ count -= wordweight ;
+ hbit -= wordweight ;
+ wordweight = 32 ;
+ }
+ } /* .....while count > 0 */
+ if (turnon)
+ turnon = FALSE;
+ else
+ turnon = TRUE;
+ } /* ...... rowsleft > 0 */
+ if ((rowsleft != 0) || (hbit != (long)ce->width))
+ Fatal("Bad pk file----more bits than required!\n");
+ } /* .... create normally packed raster */
+}
+
+
+unsigned char getnyb ()
+{
+ register unsigned char temp ;
+ if ( bitweight == 0 ) {
+ inputbyte = PKBYTE ;
+ bitweight = 16 ;
+ }
+ temp = inputbyte / bitweight ;
+ inputbyte -= temp * bitweight ;
+ bitweight /= 16 ;
+ return ( temp ) ;
+}
+
+
+long
+pk_packed_num ()
+{ /*@<Packed number procedure@>= */
+ register int i;
+ long j;
+
+ i = (int)getnyb();
+ if (i == 0) {
+ do {
+ j = (long)getnyb();
+ i++;
+ } while (j == 0) ;
+ while (i > 0) {
+ j = j * 16 + (long)getnyb() ;
+ i--;
+ };
+ return (j - 15 + (13 - dyn_f) * 16 + dyn_f) ;
+ } else if (i <= (int)dyn_f) {
+ return ((long)i);
+ } else if (i < 14) {
+ return ((i-(long)dyn_f - 1) * 16 + (long)getnyb() + dyn_f + 1);
+ } else {
+ if (i == 14) {
+ repeatcount = (int) pk_packed_num() ;
+ } else {
+ repeatcount = 1 ;
+ }
+ /* printf("repeatcount = [%d]\n",repeatcount); */
+ return (pk_packed_num()) ; /* tail end recursion !! */
+ }
+}
+#endif
+
+#ifndef USEPXL
+void bad_gf(n)
+ int n;
+{
+ Fatal("Bad gf file, case %d\n",n); /* See gf.c */
+}
+#endif
+/*-->FormFeed*/
+/**********************************************************************/
+/***************************** FormFeed ******************************/
+/**********************************************************************/
+void
+FormFeed()
+{
+
+#ifdef IBM3812
+ unsigned short pages;
+ if ( (ndone == 0) && (FirstAlternate)){
+ for (pages = 1; pages < ncopies; pages++) {
+ PMPout(2, "\321\300"); /* PMP-command xD1C0 */
+ }
+ PMPout(2, "\321\100"); /* PMP-command xD140 */
+ } else {
+ for (pages = 1; pages < ncopies; pages++){
+ PMPout(2, "\321\200"); /* PMP-command xD180 */
+ }
+ PMPout(2, "\321\0"); /* PMP-command xD100 */
+ }
+#endif
+#ifdef LJ
+ EMITC('\f');
+#endif
+}
diff --git a/systems/msdos/dviware/dvilj4/emu387 b/systems/msdos/dviware/dvilj4/emu387
new file mode 100644
index 0000000000..fa2700b379
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/emu387
Binary files differ
diff --git a/systems/msdos/dviware/dvilj4/findfile.c b/systems/msdos/dviware/dvilj4/findfile.c
new file mode 100644
index 0000000000..e1126c9cc9
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/findfile.c
@@ -0,0 +1,121 @@
+#include "config.h"
+#include <string.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+int stat();
+char *path_segment();
+
+bool
+findfile(path,n,fontmag,name)
+char path[STRSIZE]; /* PIXEL path */
+char n[STRSIZE]; /* name of font */
+long fontmag; /* magnification */
+char name[STRSIZE]; /* full name of PXL file (returned) */
+{
+ char local_path[STRSIZE];
+ char *pathpt;
+ struct stat s;
+ int rc = -1;
+ int resolution, i;
+
+ resolution = (int)(fontmag/5.0 +0.5) ;
+
+ for(i=0; (pathpt=path_segment((bool)(i==0),path,local_path))!=NULL;i++)
+ {
+#ifdef USEPXL
+ sprintf(name,"%s/%d/%s.pk",pathpt,resolution,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s/%d/%s.pxl",pathpt,resolution,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s.pk",n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s.pxl",n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s/%ld/%s.pk",pathpt,fontmag,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s/%ld/%s.pxl",pathpt,fontmag,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+#ifndef MSDOS
+ sprintf(name,"%s/%d/%s.pk",pathpt,resolution,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s/%d/%s.pxl",pathpt,resolution,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+#endif
+ sprintf(name,"%s/%d/%s.",pathpt,resolution,n);
+ rc = stat(name,&s);
+#ifndef MSDOS
+ }
+ }
+#endif
+ }
+ }
+ }
+ }
+ }
+ }
+#else
+ sprintf(name,"%s/%d/%s.gf",pathpt,resolution,n);
+ if ((rc = stat(name,&s))!=0)
+ {
+ sprintf(name,"%s/%ld/%s.gf",pathpt,fontmag,n);
+ rc = stat(name,&s);
+ }
+#endif
+ if (rc==0) return(TRUE);
+ };
+
+#ifdef FUTURE
+ for(i=0; (pathpt=path_segment((bool)(i==0),VFPATH,local_path))!=NULL;i++) {
+ sprintf(name,"%s/%s.vfm",pathpt,n);
+ printf("searching virtual font <%s>\n",name);
+ if (stat(name,&s) == 0) return(TRUE);
+ }
+#endif
+
+#ifdef USEPXL
+ /* return error messaage */
+ sprintf(name,"font not found: <%s>/<%d;%ld>/%s.gf",
+ path,resolution,fontmag,n);
+#else
+ sprintf(name,"font not found: <%s>/<%d;%ld>/%s.<pk;pxl>",
+ path,resolution,fontmag,n);
+#endif
+
+return(FALSE);
+}
+
+char *
+path_segment(first,full_path,local_path)
+bool first;
+char *full_path, *local_path;
+{
+ static char *pppt;
+ char *pathpt;
+
+ if (first) pathpt = strcpy(local_path,full_path);
+ else pathpt = pppt;
+ if (pathpt != NULL) {
+#ifdef unix
+ pppt = strchr(pathpt , ':' );
+#else
+ pppt = strchr(pathpt , ';' );
+#endif
+#ifdef MSDOS
+ pppt = strchr(pathpt , ';' );
+#endif
+ if (pppt != NULL) {
+ *pppt = '\0';
+ pppt++;
+ }
+ }
+return pathpt;
+}
diff --git a/systems/msdos/dviware/dvilj4/lj4.bat b/systems/msdos/dviware/dvilj4/lj4.bat
new file mode 100644
index 0000000000..3edfb113a5
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/lj4.bat
@@ -0,0 +1,15 @@
+@echo off
+set TMPDIR=g:/
+rem ^^^ this is where gcc's temp files go
+set GO32TMP=g:/
+rem ^^^ this is where your paging file goes - if not set, the
+rem variables TMP and TEMP are checked in that order
+set 387=NO
+set go32=emu c:/tex/emu387
+c:\tex\dvilj4 -v %1 %2 %3 %4
+rem c:\tex\dvilj4 -eprn -v -ac:\tex\fonts\canon %1 %2 %3 %4
+rem ^^^ in case you have a printer :-)
+set TMPDIR=
+set GO32TMP=
+set 387=
+set go32= \ No newline at end of file
diff --git a/systems/msdos/dviware/dvilj4/makefile b/systems/msdos/dviware/dvilj4/makefile
new file mode 100644
index 0000000000..075d61db7e
--- /dev/null
+++ b/systems/msdos/dviware/dvilj4/makefile
@@ -0,0 +1,73 @@
+# makefile for the dvi-to-(3812 || lj + || lj II || lj IIp ) filter.
+#
+CFLAGS=-O -DMSDOS
+# BINDIR=/usr/TeX/bin
+# MANDIR=/usr/TeX/man
+# MANSEC=1
+CC=gcc
+
+OBJS=findlj.o find3812.o
+HFILES=commands.h config.h
+PROGRAMS=dvilj2p dvilj2 dvi3812 dvilj dviljp
+
+all: $(PROGRAMS) dvi2xx.txt
+
+dvi3812: dvi2xx.c find3812.o $(HFILES)
+ $(CC) ${CFLAGS} -DIBM3812 -o $@ dvi2xx.c find3812.o ${LFLAGS}
+
+dvilj2p: dvi2xx.c findlj.o commands.h config.h
+ $(CC) -O -DMSDOS -DLJ2P -DLJ -o dvilj2p dvi2xx.c findlj.o
+ strip dvilj2p
+ aout2exe dvilj2p
+ del dvilj2p
+
+dvilj4: dvi2xx.c findlj.o commands.h config.h
+ $(CC) -O -DMSDOS -DLJ4 -DLJ -o dvilj4 dvi2xx.c findlj.o
+ strip dvilj4
+ aout2exe dvilj4
+ del dvilj4
+
+dvilj2: dvi2xx.c findlj.o $(HFILES)
+ $(CC) ${CFLAGS} -DLJ2 -o $@ dvi2xx.c findlj.o ${LFLAGS}
+
+dvilj: dvi2xx.c findlj.o $(HFILES)
+ $(CC) ${CFLAGS} -DLJ -DSEVENBIT -o $@ dvi2xx.c findlj.o ${LFLAGS}
+
+dviljp: dvi2xx.c findlj.o $(HFILES)
+ $(CC) ${CFLAGS} -DLJ2P -DSEVENBIT -o $@ dvi2xx.c findlj.o ${LFLAGS}
+
+findlj.o: findfile.c config.h
+ $(CC) -O -DMSDOS -DLJ -c findfile.c
+ copy findfile.o findlj.o
+ del findfile.o
+
+find3812.o: findfile.c config.h
+ $(CC) ${CFLAGS} -DIBM3812 -c findfile.c
+ copy findfile.o findlj.o
+ del findfile.o
+
+clean:
+ rm -f core $(OBJS) $(PROGRAMS)
+
+DISTFILES = \
+ ./dvi2xx.c ./commands.h ./config.h ./findfile.c ./Makefile \
+ ./testpage.tex ./dvi2xx.history ./dvi2xx.man ./dvi2xx.txt ./graybox.sty \
+ ./dvi2xx.051 ./README ./sample2.tex ./2up.sty ./README.pcl
+
+
+install:
+ @for f in $(PROGRAMS); do \
+ echo installing $$f in $(BINDIR); \
+ install -c $$f $(BINDIR); \
+ done
+ cp dvi2xx.man dvi2xx.$(MANSEC)
+ install dvi2xx.$(MANSEC) $(MANDIR)/man$(MANSEC)
+
+dvi2xx.txt: dvi2xx.man
+ -nroff -man dvi2xx.man | col -b > dvi2xx.txt
+
+
+
+
+
+
diff --git a/systems/msdos/dviware/dvips/maketexp.bat b/systems/msdos/dviware/dvips/maketexp.bat
new file mode 100644
index 0000000000..61253ee70c
--- /dev/null
+++ b/systems/msdos/dviware/dvips/maketexp.bat
@@ -0,0 +1,52 @@
+@echo off
+REM
+REM This script file makes a new TeX PK font, because one wasn't
+REM found. Parameters are:
+REM
+REM name dpi bdpi magnification [mode]
+REM
+REM `name' is the name of the font, such as `cmr10'. `dpi' is
+REM the resolution the font is needed at. `bdpi' is the base
+REM resolution, useful for figuring out the mode to make the font
+REM in. `magnification' is a string to pass to MF as the
+REM magnification. `mode', if supplied, is the mode to use.
+REM
+REM Because of MSDOS memory constraints, this batch file just
+REM creates a mfjob file, so that the fonts can be created later.
+REM
+
+REM NAME=%1 DPI=%2 BDPI=%3 MAG=%4 MODE=%5
+
+if exist dvips.mfj goto :second
+echo %% dvips.mfj - created by dvips > dvips.mfj
+echo input [modes]; >> dvips.mfj
+echo Created dvips.mfj
+
+:second
+echo { >> dvips.mfj
+echo base=plain; >> dvips.mfj
+echo font=%1; >> dvips.mfj
+echo mag=%4; >> dvips.mfj
+
+if "%5" == "" goto :nomode
+if "%5" == "imagen" goto :hpmode
+if "%5" == "hplaser" goto :hpmode
+
+:goodmode
+echo mode=%5[%3]; >> dvips.mfj
+echo output=pk[c:\texfonts\%5\@Rrdpi\@f]; >> dvips.mfj
+goto :donemode
+
+:hpmode
+echo mode=hplaser[%3]; >> dvips.mfj
+echo output=pk[c:\texfonts\pixel.lj\@Rrdpi\@f]; >> dvips.mfj
+goto :donemode
+
+:nomode
+echo m; >> dvips.mfj
+
+:donemode
+echo } >> dvips.mfj
+
+echo Run "mfjob dvips"
+:exit
diff --git a/systems/msdos/dviware/dvips/readme.pc b/systems/msdos/dviware/dvips/readme.pc
new file mode 100644
index 0000000000..13e278ce14
--- /dev/null
+++ b/systems/msdos/dviware/dvips/readme.pc
@@ -0,0 +1,113 @@
+Some notes on installing dvips 5.5 on MS-DOS
+by Russell Lang <rjl@monu1.cc.monash.edu.au> 21st January 1993
+
+These notes are not by Tomas Rokicki.
+Tomas Rokicki does not use MS-DOS ( smart person :-) and so will be
+unable to answer questions about MS-DOS problems.
+
+This set of MSDOS files for dvips contains:
+README.pc This file.
+makefile.tc Makefile for Borland C++.
+makefile.emx Makefile for ndmake and emx/gcc.
+config.ps config.ps modified for MSDOS
+maketexp.bat Batch file to make tex pk files.
+maketexp.cmd OS/2 batch file to make tex pk files.
+winmain.c WinMain() routine for Windows dvips.
+dvipswin.rc Windows Resource file containing radical eye icon.
+dvipswin.def Windows defaults file.
+
+If you have the Unix tar file, the steps involved in making
+dvips on a PC are:
+- On Unix, in the dvips directory, give the following commands:
+ make texc.lpro
+ nroff -man dvips.1 > pc/dvips.doc
+ nroff -man afm2tfm.1 > pc/afm2tfm.doc
+- Copy dvips/* and dvips/pc/* directories to the PC.
+- copy PStfms/*.tfm to C:\EMTEX\TFM on the PC
+ (then optionally delete pst*.tfm, rpst*.tfm, pop*.tfm rpop*.tfm,
+ pad*.tfm rpad*.tfm)
+- copy PSvfs/*.vf to C:\TEXFONTS\VF on the PC
+ (then optionally delete pst*.vf, pop*.vf, pad*.vf)
+- edit dvipsmac.tex and replace the line
+ \generictrue
+ with
+ %\generictrue
+
+For Borland C++:
+- edit paths and directories in pc/makefile.tc and pc/config.ps.
+- 'make -fpc/makefile.tc'
+- if that works, try 'make -fpc/makefile.tc install'.
+- change to another directory (to avoid using the Unix config.ps)
+ and then try to run dvips!
+
+For emx/gcc:
+- edit paths and directories in pc/makefile.emx and pc/config.ps.
+- 'ndmake -f pc/makefile.emx'
+- if that works, try 'ndmake -f pc/makefile.emx install'.
+- change to another directory (to avoid using the Unix config.ps)
+ and then try to run dvips32!
+- This version of dvips has not been tested thoroughly.
+ See the EMX documentation for the EMX DOS extender.
+- It is hoped that this version will work under OS/2.
+
+If you have MS-DOS ZIP files, they will contain a compiled version of dvips.
+
+To install this in the emTeX directories on drive C:, use
+ pkunzip -d -o dvips* c:\
+
+The MSDOS version of dvips differs from the description in
+dvips.tex in the following ways:
+- path separators are ';' not ':'
+- directory separators are '\' not '/'
+- The user's initialization file is "dvips.ini" not ".dvipsrc".
+- pipes to printers not supported. Output must go to a file.
+- MakeTeXPk is a batch file. Since MSDOS has insufficient memory
+ to run both dvips and Metafont at the same time, this batch file
+ will typically write out a set of commands for running Metafont
+ later. The maketexp.bat supplied writes out an mfjob file for emTeX.
+ maketexp.bat will probably need customising for your site.
+- To automatically make fonts, use emTeX's dvidrv as follows:
+ dvidrv dvips file.dvi
+ dvidrv sets an option -pj=mfjobfile for dvips, where mfjobfile
+ is the name of a temporary mfjob file.
+ If there are missing fonts, dvips will write this mfjob file
+ and then ask:
+ Exit to make missing fonts now (y/n)?
+ If you answer yes, dvips exits with errorlevel 8 which tells
+ dvidrv to call mfjob to make the fonts, and then to call dvips again.
+ For this to work, dvidrv, dvips, mfjob and mf must be located in
+ the PATH, and the environment variables for mfjob and mf set
+ correctly. A font mode must be set with the 'M' option in config.ps.
+ If the -pj option is set, dvips will not call MakeTeXPk.bat
+- limited emTeX specials. The following ones are supported:
+ \special{em:message xxx}
+ \special{em:point n}
+ \special{em:line a[h|v|p],b[h|v|p] [,width]}
+ \special{em:linewidth width}
+ \special{em:moveto}
+ \special{em:lineto}
+ \special{em:graph xxx[,width[,height]]}
+ The line cut parameters [h|v|p] of the \special{em:line ...} command
+ are ignored. Lines are ended with a rounded cap.
+ A maximum of 1613 different point numbers are permitted on each page.
+ The \special{em:graph xxx} should work with PCX, MSP1, MSP2 and
+ BMP files. Compressed BMP files have not been tested.
+ The graph file may be scaled by giving an optional width and
+ height (expressed in the same way as TeX dimensions).
+ An example: \special{em:graph scrdump.pcx,100mm,75mm}
+
+See the config.ps file for other changes.
+
+If you want to use a different directory arrangement, modify the
+paths in config.ps. If you want to store config.ps or psfonts.map
+in a different place, either recompile dvips or use the environment
+variable TEXCONFIG.
+
+The program dvips can use emTeX font libraries created with the
+fontlib /2 option. PXL fonts within font libraries will be ignored.
+
+Borland C++ gives a large number of 'possible incorrect assignment'
+warnings.
+
+If you run out of memory running dvips, try using the `-Z0 -a' or
+just the `-a' command line options.
diff --git a/systems/msdos/dviware/dviwin b/systems/msdos/dviware/dviwin
new file mode 120000
index 0000000000..6a6d4658f8
--- /dev/null
+++ b/systems/msdos/dviware/dviwin
@@ -0,0 +1 @@
+../../../dviware/dviwin \ No newline at end of file
diff --git a/systems/msdos/dviware/pccrude.zoo b/systems/msdos/dviware/pccrude.zoo
new file mode 100644
index 0000000000..7e90251958
--- /dev/null
+++ b/systems/msdos/dviware/pccrude.zoo
Binary files differ
diff --git a/systems/msdos/dviware/xdvi-dos/copying b/systems/msdos/dviware/xdvi-dos/copying
new file mode 100644
index 0000000000..e038c461ac
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/copying
@@ -0,0 +1,249 @@
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 1, February 1989
+
+ Copyright (C) 1989 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 license agreements of most software companies try to keep users
+at the mercy of those companies. By contrast, our 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. The
+General Public License applies to the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, 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 a 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 tell them 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.
+
+ 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 Agreement 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 work containing the
+Program or a portion of it, either verbatim or with modifications. Each
+licensee is addressed as "you".
+
+ 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
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program. You may charge a fee for the physical act of
+transferring a copy.
+
+ 2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+ a) cause the modified files to carry prominent notices stating that
+ you changed the files and the date of any change; and
+
+ b) cause the whole of any work that you distribute or publish, that
+ in whole or in part contains the Program or any part thereof, either
+ with or without modifications, to be licensed at no charge to all
+ third parties under the terms of this General Public License (except
+ that you may choose to grant warranty protection to some or all
+ third parties, at your option).
+
+ c) If the modified program normally reads commands interactively when
+ run, you must cause it, when started running for such interactive use
+ in the simplest and most usual 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 General
+ Public License.
+
+ d) 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.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+ 3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 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
+ Paragraphs 1 and 2 above; or,
+
+ b) accompany it with a written offer, valid for at least three
+ years, to give any third party free (except for a nominal charge
+ for the cost of distribution) a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ c) accompany it with the information you received as to where the
+ corresponding source code may be obtained. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it. For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+ 4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License. However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+ 5. By copying, distributing or modifying 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.
+
+ 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.
+
+ 7. 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 the 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
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+ 8. 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
+
+ 9. 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.
+
+ 10. 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 humanity, 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 1, 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) 19xx 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 a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ program `Gnomovision' (a program to direct compilers to make passes
+ at assemblers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/systems/msdos/dviware/xdvi-dos/copying.dj b/systems/msdos/dviware/xdvi-dos/copying.dj
new file mode 100644
index 0000000000..3d87ae3ce2
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/copying.dj
@@ -0,0 +1,63 @@
+This is the file "copying.dj".
+
+ Copyright Information for sources and executables that are marked
+ Copyright (C) DJ Delorie
+ 24 Kirsten Ave
+ Rochester NH 03867-2954
+
+This document is Copyright (C) DJ Delorie and may be distributed
+verbatim, but changing it is not allowed.
+
+Source code copyright DJ Delorie is distributed under the terms of the
+GNU General Public Licence, with the following exceptions:
+
+
+* Source code copyright DJ Delorie is distributed under the terms of the
+ GNU General Public Licence, with the following exceptions:
+ ("go32.exe" refers to go32.exe and debug32.exe)
+
+ * There are no conditions on distributing copies of stub.exe as
+ it is originally distributed in this software package, prepended
+ onto a binary or otherwise. This is the recommended distribution
+ mechanism for applications.
+
+ * Binaries of emu387 may be distributed with no restrictions.
+
+ * If a user creates an application, prepends a copy of go32.exe onto
+ the beginning of it, and distributes it free of charge, then the
+ user is under no obligations to distribute source or pay royalties.
+ Note that the copyright terms of the FSF and/or UCB must be
+ obeyed regardless of this.
+
+ * If a user creates an application, prepends a copy of go32.exe onto
+ the beginning of it, and charges a fee for the software, then a
+ royalty of $5 or 5% of the selling price per copy sold must be paid
+ to DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954. Note that
+ shareware programs are not considered "sold" until payment is rendered
+ for them.
+
+ * For all other cases, source code for go32.exe must be distributed
+ with any distributed copies of go32.exe.
+
+ * Software that requires go32.exe to run, but is not distributed with
+ a copy of go32.exe, incurs no obligations with regards to the
+ above sections.
+
+ * Contact me for special terms if none of the above are suitable.
+
+ * Donations are always appreciated.
+
+ The intent of this copyright is this: If you make money by using the
+ programs I wrote, I get some of it. If you use your sources to
+ teach others how to write programs, I'll support you.
+
+Changes to source code copyright BSD or FSF are copyright DJ Delorie, but
+fall under the terms of the original copyright.
+
+A copy of the file "COPYING" is included with this document. If you did not
+receive a copy of "COPYING", you may obtain one from whence this document
+was obtained, or by writing:
+ Free Software Foundation
+ 675 Mass Ave
+ Cambridge, MA 02139
+ USA
diff --git a/systems/msdos/dviware/xdvi-dos/read_dvx.tex b/systems/msdos/dviware/xdvi-dos/read_dvx.tex
new file mode 100644
index 0000000000..18cd070d15
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/read_dvx.tex
@@ -0,0 +1,79 @@
+% This is a LaTeX file
+%
+% This file contains details of the XDVI port to DJGPP
+\documentstyle{article}
+\begin{document}
+
+
+\title{{\bf XDVI} for {\bf PC} under {\bf DV/X}}
+\author {Eric Ho \\ 9041477@SSCVAX.CIS.MCMASTER.CA}
+\maketitle
+
+This program is re-compiled using {\bf DJGPP}. As a result, the program
+expects 386 CPU and up with FPU as well as {\bf GO32}.
+Original {\bf XDVI} source is obtained from
+{\bf export.lcs.mit.edu:/contrib}.
+
+\section{Modifications}
+
+There are not many modifications done to the original xdvi except that
+fonts not available can now be substituted by specifying them in a file.
+The environmental variable {\bf TEXFONTSUB} points to this file. For example,
+{\bf TEXFONTSUB}=c:/xdvi/texfonts.sub". The filename texfonts.sub is arbitrary.
+One can rename it to some other name as long as the environmental variable
+TEXFONTSUB points to it. Format of the font substitute file (ASCII) is
+as follows:
+
+\vspace {10 pt}
+
+{\bf amr10} -$>$ {\bf cmr10}
+
+{\bf src2} -$>$ {\bf dest2}
+
+etc.
+\vspace {10 pt}
+
+where src2 is the unavailable font and dest2 is the font we intended to
+substitute. It is exactly as the font substitution machcanism found in
+{\bf DVIVGA}.
+
+For those interested in the image processing features provided by XDVI,
+please browse through the source and see if I did anything wrong
+in choosing suitable image quality since I do not know anything about
+image processing.
+
+Default \TeX font directory is "c:/tex/fonts." However, this can be overridden
+by specifying another directory through some environmental variable. Please
+look at the file {\it readme} for details.
+
+Finally, I have tested only the "pk" font version of XDVI,
+therefore the performance of using "gf" and "pxl" is unknown. These two
+versions of XDVI are however also modified to look up font substitute file. To
+use the other version one must re-compile the source. To obtain the other
+versions one must re-compile XDVI with appropiate switches set.
+
+\section{Optimizing XDVI}
+
+Opening and searching text file using DJGPP will add significant overhead
+to the execution due to mode switching. Also, I found most of substitutions
+are converting AM font to CM font (I only have cm font at home). Therefore,
+I also modified the program to convert amxxxx to cmxxxx internally to speed
+up execution. To choose this option one should recompile the source without
+defining {\bf FONTSUB} (i.e., take out -D{\bf FONTSUB} in the makefile). Finally,
+the makefile enclosed is compatible with both {\bf NDMAKE45}
+and Borlan?'s {\bf MAKE} utility.
+
+\section{Bugs}
+
+I have not yet found any bugs after I have performed some testings.
+However, I conducted the test without mouse attaching to my system (because I
+don't have one). Accordingly, I have no idea how XDVI will behave with mouse
+connected to the system. Finally, I tested only the {\bf pk} font version
+of XDVI, therefore the performance of using {\bf gf} and {\bf pxl} is unknown.
+
+\section{Acknowledgment}
+
+I wish to thank {\bf DJ, et. al.} for their excellent compiler. Also thank all
+authors of the original XDVI for their contribution.
+
+\end{document}
diff --git a/systems/msdos/dviware/xdvi-dos/read_dvx.txt b/systems/msdos/dviware/xdvi-dos/read_dvx.txt
new file mode 100644
index 0000000000..a0e076fd54
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/read_dvx.txt
@@ -0,0 +1,76 @@
+ XDVI for PC under DV/X
+ ----------------------
+
+
+This program is re-compiled using DJGPP. As a result, it expects 386 and
+up CPU with FPU as well as GO32. Original XDVI source is obtained from
+export.lcs.mit.edu:/contrib.
+==============================================================================
+
+Modifications
+-------------
+
+There are not many modifications done to the original xdvi except that
+fonts not available can now be substituted by specifying them in a file.
+The environmental variable "TEXFONTSUB" points to this file. For example,
+"TEXFONTSUB=c:\xdvi\texfonts.sub". The filename texfonts.sub is arbitrary.
+One can rename it to some other name as long as the environmental variable
+TEXFONTSUB points to it.
+
+
+Format of the font substitute (ASCII) file:
+
+amr10 -> cmr10
+src2 -> dest2
+ :
+ :
+
+where src2 is the unavailable font and dest2 is the font we intended to
+substitute. It is exactly as the font substitution machcanism found in
+DVIVGA.
+
+For those interested in the image processing features provided by XDVI,
+please browse through the source and see if I did anything wrong
+in choosing suitable image quality since I do not know anything about
+image processing.
+
+Default TeX font directory is "c:\tex\fonts." However, this can be overridden
+by specifying another directory through some environmental variable. Please
+look at the file "readme" for details.
+
+Finally, I have tested only the "pk" font version of XDVI,
+therefore the performance of using "gf" and "pxl" is unknown. These two
+versions of XDVI are however also modified to look up font substitute file.
+To obtain the other two versions one must re-compile XDVI with appropiate
+switches set.
+===============================================================================
+
+Optimizing the program
+----------------------
+
+Opening and searching text file using DJGPP will add significant overhead
+to the execution due to mode switching. Also, I found most of substitutions
+are converting AM font to CM font (I only have cm font at home). Therefore,
+I also modified the program to convert amxxxx to cmxxxx internally to speed
+up execution. To choose this option one should recompile the source without
+defining FONTSUB (i.e., take out -DFONTSUB in the makefile). Finally,
+the makefile enclosed is compatible with both NDMAKE45 and Borland's MAKE
+utility.
+===============================================================================
+
+Bugs
+----
+
+I have not yet found any bugs afte I have performed some testings. However,
+I conducted the test without mouse attaching to my system (because I do not
+ have one). Accordingly, I have no idea how XDVI will behave with mouse
+connected. Finally, I have tested only the "pk" font version of XDVI,
+therefore the performance of using "gf" and "pxl" is unknown. These two
+versions of XDVI are however also modified to look up font substitute file.
+===============================================================================
+
+Acknowledgment
+--------------
+
+I wish to thank DJ, et. al. for their excellent compiler. Also thank all
+authors of the original XDVI for their contribution.
diff --git a/systems/msdos/dviware/xdvi-dos/readme b/systems/msdos/dviware/xdvi-dos/readme
new file mode 100644
index 0000000000..8f07ff7d51
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/readme
@@ -0,0 +1,268 @@
+INSTALLATION INSTRUCTIONS
+
+To install, do the following:
+ 1. Read the ENVIRONMENT section of xdvi_man.sed to determine the correct
+ default values for the XDVIFONTS and XDVISIZES environment variables.
+ Edit the Imakefile or Makefile and change the values of the make
+ variables DEFAULT_FONT_PATH and DEFAULT_FONT_SIZES to these values.
+ If your site uses virtual fonts, do the same thing with the
+ DEFAULT_VF_PATH variable. Note that support of virtual fonts in xdvi
+ does not include support of built-in Postscript<tm> fonts.
+
+ (Note: for X10 compilation, use Makefile_10 instead of Makefile.)
+
+ You may also wish to change other compilation options; they are
+ described later in this file.
+
+ 2. make xdvi and try it out. If the settings in step one are incorrect,
+ you can use the corresponding environment variables to quickly try out
+ different values. If the values set in step 1 were incorrect,
+ rm font_open.o and go back to step 1.
+
+ If you get the error that the #include file <stdlib.h> does not exist,
+ then you should include -DX_NOT_STDC_ENV in the DEFS variable in the
+ Makefile or Imakefile. In X11R5 or later this problem should not
+ come up.
+
+ 3. make xdvi.man.
+
+ 4. Install xdvi and xdvi.man.
+
+
+ The X10 flag only affects xdvi.c (and the flags MSBITFIRST, BMSHORT,
+ and BMLONG, see below).
+
+ Note in particular the compilation flags USE_PK, USE_GF, and USE_PXL,
+ which can be set to reflect which font formats are actually used at
+ your site.
+
+Other compilation flags are:
+ SYSV (dvi_init.c font_open.c xdvi.c) Set for System V
+ compilation.
+ VMS Set for VMS compilation.
+ MSBITFIRST (X11 only; xdvi.c dvi_draw.c gf.c pk.c pxl.c) Store
+ bitmaps internally with the most significant bit at
+ the left. For performance reasons, it would be best
+ to set this to coincide with what your server uses.
+ Use the keystroke '^P' to find information in this
+ regard. Generally, you should use MSBITFIRST if and
+ only if '^P' reports bitord = 1, and BMSHORT/BMLONG
+ (below) should be set to match whatever '^P' reports
+ under "Unit =". But, if bitord = byteord, then the
+ latter setting should not matter much.
+ BMSHORT (X11 only; xdvi.c dvi_draw.c gf.c pk.c pxl.c) Store
+ bitmaps in short integers instead of bytes. See
+ MSBITFIRST for other relevant comments. To check
+ performance, you can use:
+ time xdvi -d 8 file.dvi
+ BMLONG (X11 only; xdvi.c dvi_draw.c gf.c pk.c pxl.c) Store
+ bitmaps in long integers instead of bytes.
+ ALTFONT (xdvi.c) Default font to use if the font named in the
+ dvi file cannot be found. Can be set to NULL. By
+ default, it is "cmr10".
+ SEARCH_SUBDIRECTORIES (font_open.c) Enable recursive searching of
+ subdirectories for font files (* and ** specifiers).
+ This also enables the TEXFONTS_SUBDIR environment
+ variable and the DEFAULT_SUBDIR_PATH makefile variable.
+ XDVIFONTS_ONLY (font_open.c) Never check the TEXFONTS environment
+ variable. Normally xdvi checks TEXFONTS if the
+ XDVIFONTS variable is not set. This option is
+ recommended if the version of TeX in use requires
+ that the TEXFONTS variable be set. See the relevant
+ paragraph in xdvi_man.sed for more details. This
+ option turns off that paragraph.
+ NOTOOL (X11 only; xdvi.c) Compile using raw X calls.
+ BUTTONS (xdvi.c) Put radio buttons on the right side of the
+ window for commonly used commands.
+ A4 (xdvi.c) Use European size paper by default.
+ NOQUERY (xdvi.c) Set this if you have trouble compiling the
+ definition of drawingWidgetClass.
+ TEXXET (everything) Enables op-codes 250 and 251 (used for
+ right-to-left languages).
+ BDPI (xdvi.c) Default number of pixels per inch to use.
+ GREY (everything) Use greyscale anti-aliasing for
+ displaying shrunken bitmaps.
+ MAKEPK (font_open.c) If a font is not found, then try to
+ call Metafont to create the font. When using this
+ option, remember to set the paths in MakeTeXPK
+ correctly for your site, and be sure that the
+ destination directory for MakeTeXPK appears in your
+ DEFAULT_FONT_PATH variable.
+ MAKEPKCMD=\"/usr/local/tex/bin/MakeTeXPK\" (font_open.c) Same as the
+ above, but this variant explicitly declares which
+ command to use to create the font.
+
+All flags should be set in the appropriate Makefile via the variable ``DEFS''.
+
+================================================================
+
+ This program is the combined work of many people, including but not
+restricted to:
+ Eric Cooper, CMU
+ Bob Scheifler, MIT LCS
+ Paal Kvamme, Norwegian Institute of Technology
+ H\aa vard Eidnes, Norwegian Institute of Technology
+ Mark Eichin, MIT SIPB
+ Paul Vojta, UC Berkeley
+ Jeffrey Lee, U of Toronto
+ Donald Richardson, Clarkson Univ.
+At the present time, the person to send bug reports to is Paul Vojta,
+ vojta@math.berkeley.edu.
+
+In addition to the various comp.sources.x archives, current versions of this
+program can also be obtained via anonymous ftp from the following location:
+ export.lcs.mit.edu [18.24.0.12] file contrib/xdvi.tar.Z
+To ease the load on export, you may also check other X archives, for example:
+ gatekeeper.dec.com [16.1.0.2] file pub/X11/contrib/xdvi.tar.Z
+
+Paul Vojta, 17 March 1992
+
+================================================================
+
+Note for IBM RS6000 users: some of the libraries are in non-obvious places:
+
+ libXmu /usr/lpp/X11/Xamples/lib/Xmu/libXmu.a
+ libXaw /usr/lpp/X11/Xamples/lib/Xaw/libXaw.a
+
+These should be moved to /usr/lib or some more reasonable place (or use
+symlinks), and ditto for the include files, which are initially placed
+in /usr/lpp/X11/Xamples/include.
+
+================================================================
+
+Notes of historical nature follow. Most recent changes are listed at the end
+of the file.
+
+================================================================
+
+This directory contains a version of xdvi capable of reading GF, PXL
+and PK font files. This version of xdvi is based on the source that
+"came with" X v10r3. Xdvi was modified by Paal Kvamme at the Norwegian
+Institute of Technology, based on the modifications I had made to
+dviimp (a dvi to ImPress converter). This code was again more or less
+directly translated from the web source of PKtoPX.
+
+If you discover (and fix) any bugs in this code, please notify me, so
+I can make the corresponding changes myself.
+
+---------
+H}vard Eidnes (TeXish: H\aa vard Eidnes)
+Division of Computer Science
+Norwegian Institute of Technology
+
+E-Mail: h_eidnes%vax.runit.unit.uninett@nta-vax.arpa
+================================================================
+Also has path search added by Mark Eichin, looks in TEXFONTS
+================================================================
+
+================================================================
+Additional notes:
+ X11 version now works on the IBM PC/RT as well as VAX.
+ [eichin:19880313.1330EST]
+================================================================
+*MORE* fixes (for athena release locker) [eichin:19880722.2058EST]
+Fixes:
+ narrow vertical and horizontal lines no longer disappear.
+ bogus underlining (which usually occured on even sample sizes
+of odd sized characters) no longer occurs.
+ -S number (or typing number followed by S) will adjust the
+sampling fraction; 0 is special cased to mean if anything in the
+sampled zone is set, set the sample, else clear it. Interesting to
+experiment with, though not useful for reading (the default value of 3
+is just right.)
+ -display and -geometry arguments work (so do old style forms,
+though they were broken before)
+ fixed one of the PK debugging messages to print the correct
+font name instead of printing the pointer as text.
+ included Ken Raeburn <raeburn>'s changes to support multiple
+screens.
+================================================================
+More changes:
+
+ 1. Incorporated the bitmap under a viewport widget using the toolkit
+ (X11 only);
+ 2. Added an icon and icon geometry arguments (X11 only);
+ 3. Supported window resizing;
+ 4. Added a 'c' option to move whatever is currently under the cursor to
+ the center of the window;
+ 5. Added an 'R' option to reread the .dvi file, and added logic to make
+ 'R' happen automatically whenever any part of the window is exposed
+ and the dvi file changes (so that you can iconify xdvi, run tex,
+ deiconify xdvi, and voila!);
+ 6. Added a 'magnifying glass': when you push a button, a window pops
+ up, showing the region of the page, unshrunk;
+ 7. Added support for gf fonts;
+ 8. Upgraded font searching (at our site we use /usr/custom/tex82/gf
+ for gf fonts, /usr/custom/tex82/pk for pk fonts, etc.);
+ 9. Made numerous internal changes (removed all the lint I could,
+ made unshrunk bitmaps permanently resident, which speeds up size
+ changing, made table.h necessary only for pxl.h, split up the source
+ file into xdvi.c, dvi.c, gf.c, pxl.c, and pk.c, made shrinking occur
+ relative to the character's hot point, etc.)
+ 10. The program reads SIGIO signals and processes incoming events
+ immediately, so that it can stop displaying things that would be
+ erased anyway. If these interrupts are not coming through, then
+ it also checks for incoming events every several dozen characters
+ displayed.
+ 11. Further split up dvi.c into dvi_init.c and dvi_draw.c; added
+ compilation options for various internal bitmap representations.
+ Fixed it so gcc won't give warnings, and so it works with R3 toolkit.
+-- Patchlevel 2: --
+ 12. Added MAXCHARS compilation option. Eliminated the nonsense with
+ generating table.h.
+-- Patchlevel 3: --
+ 13. Added -altfont command line option and SYSV compilation option.
+================================================================================
+
+4/1989 Modified for System V boxes. -DSYSV compiler option.
+
+Donald Richardson, donr@crystal.mie.clarkson.edu
+
+================================================================================
+-- Patchlevel 4: --
+ 14. Removed MAXCHARS compilation option. It's automatic now. Made X10
+ scrolling smoother. Implemented the moving magnifying glass.
+-- Patchlevel 5: --
+ 15. Implemented compilation without the toolkit, as well as scrollbars
+ and tpic support in X10. Also this version should work with color
+ VAXstations, although overstrike characters will come out incorrectly.
+ 16. Fixed a bug in gf reading routines: specials at the beginning of
+ a character def. were not being processed. Thanks to
+ kevin@amath.washington.edu for a bug report and fix.
+ 17. Added 'k' keystroke.
+-- Patchlevel 6: --
+ 18. Added buttons on the right side of the window.
+ 19. Added -pagewidth and -pageheight command line options and A4
+ compilation option.
+ 20. Added a yet more robust font finding algorithm.
+-- Patchlevel 7: --
+ 21. Replaced -pagewidth and -pageheight options with -paper.
+-- Patchlevel 8: --
+ 22. Added compatibility for X11R4 and VMS. Fixed up alignment of rules.
+-- Patchlevel 9: --
+ 23. Removed obsolete '#' and '=' options from the X11 version: they
+ interfere with emacs.
+-- Patchlevel 10: --
+ 24. Implemented arrow keys, expert mode, searching for the font's actual
+ size first, the -[xy]offset and -sw options, and numerous bug fixes.
+-- Patchlevel 11: --
+ 25. Implemented recursive searching for font files in subdirectories.
+ 26. Changed +sw to -hushspecials and implemented -hush.
+ 27. Modified mksedscript so that the man page comes out neater.
+ 28. Added a -keep option and resource to match the `k' keystroke.
+-- Patchlevel 12: --
+ 29. Implemented virtual fonts (this does not include built-in
+ Postscript<tm> fonts!!!).
+ 30. X11R5 support, and numerous bug fixes.
+-- Patchlevel 13: --
+ 31. Added support for TeXXeT.
+-- Patchlevel 14: --
+ 32. Added support for greyscale anti-aliasing.
+-- Patchlevel 15: --
+ 33. Added support for MakeTeXPK, as in dvips.
+-- Patchlevel 16: --
+ 34. In the code for greyscale anti-aliasing, try to allocate a colormap
+ so that GXor operations can be used for drawing. Also interpolate
+ between foreground and background colors.
+
+Paul Vojta, vojta@math.berkeley.edu
diff --git a/systems/msdos/dviware/xdvi-dos/src/dvi.h b/systems/msdos/dviware/xdvi-dos/src/dvi.h
new file mode 100644
index 0000000000..ca2b7bc78b
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/dvi.h
@@ -0,0 +1,62 @@
+/*
+ * Mnemonics for bytes in dvi file.
+ */
+
+#define SETCHAR0 0
+#define SET1 128
+#define SETRULE 132
+#define PUT1 133
+#define PUTRULE 137
+#define NOP 138
+#define BOP 139
+#define EOP 140
+#define PUSH 141
+#define POP 142
+#define RIGHT1 143
+#define RIGHT2 144
+#define RIGHT3 145
+#define RIGHT4 146
+#define W0 147
+#define W1 148
+#define W2 149
+#define W3 150
+#define W4 151
+#define X0 152
+#define X1 153
+#define X2 154
+#define X3 155
+#define X4 156
+#define DOWN1 157
+#define DOWN2 158
+#define DOWN3 159
+#define DOWN4 160
+#define Y0 161
+#define Y1 162
+#define Y2 163
+#define Y3 164
+#define Y4 165
+#define Z0 166
+#define Z1 167
+#define Z2 168
+#define Z3 169
+#define Z4 170
+#define FNTNUM0 171
+#define FNT1 235
+#define FNT2 236
+#define FNT3 237
+#define FNT4 238
+#define XXX1 239
+#define XXX2 240
+#define XXX3 241
+#define XXX4 242
+#define FNTDEF1 243
+#define FNTDEF2 244
+#define FNTDEF3 245
+#define FNTDEF4 246
+#define PRE 247
+#define POST 248
+#define POSTPOST 249
+#define SREFL 250
+#define EREFL 251
+
+#define TRAILER 223 /* Trailing bytes at end of file */
diff --git a/systems/msdos/dviware/xdvi-dos/src/dvi_draw.c b/systems/msdos/dviware/xdvi-dos/src/dvi_draw.c
new file mode 100644
index 0000000000..4c8b0989a7
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/dvi_draw.c
@@ -0,0 +1,1049 @@
+/*
+ * DVI previewer for X.
+ *
+ * Eric Cooper, CMU, September 1985.
+ *
+ * Code derived from dvi-imagen.c.
+ *
+ * Modification history:
+ * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS.
+ * 7/1988 Modified for X.11 --Mark Eichin, MIT
+ * 12/1988 Added 'R' option, toolkit, magnifying glass
+ * --Paul Vojta, UC Berkeley.
+ * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto
+ * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ.
+ * 3/1990 Added VMS support --Scott Allendorf, U of Iowa
+ * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem
+ * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen
+ * and Lee Hetherington, MIT
+ *
+ * Compilation options:
+ * SYSV compile for System V
+ * VMS compile for VMS
+ * X10 compile for X10
+ * NOTOOL compile without toolkit (X11 only)
+ * BUTTONS compile with buttons on the side of the window (needs toolkit)
+ * MSBITFIRST store bitmaps internally with most significant bit first
+ * BMSHORT store bitmaps in shorts instead of bytes
+ * BMLONG store bitmaps in longs instead of bytes
+ * ALTFONT default for -altfont option
+ * A4 use European size paper
+ * TEXXET support reflection dvi codes (right-to-left typesetting)
+ * GREY use grey levels to shrink fonts
+ */
+
+#include <ctype.h>
+#include "xdvi.h"
+#include "dvi.h"
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#endif
+
+#if NeedVarargsPrototypes /* this is for tell_oops */
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#ifdef DOPRNT /* define this if vfprintf gives you trouble */
+#define vfprintf(stream, message, args) _doprnt(message, args, stream)
+#endif
+
+static struct frame frame0; /* dummy head of list */
+#ifdef TEXXET
+static struct frame *scan_frame; /* head frame for scanning */
+#endif
+
+#ifndef DVI_BUFFER_LEN
+#define DVI_BUFFER_LEN 512
+#endif
+
+static ubyte dvi_buffer[DVI_BUFFER_LEN];
+static struct frame *current_frame;
+
+#ifndef TEXXET
+#define DIR 1
+#else
+#define DIR currinf.dir
+#endif
+
+/*
+ * Explanation of the following constant:
+ * offset_[xy] << 16: margin (defaults to one inch)
+ * shrink_factor << 16: one pixel page border
+ * shrink_factor << 15: rounding for pixel_conv
+ */
+#define OFFSET_X (offset_x << 16) + (shrink_factor * 3 << 15)
+#define OFFSET_Y (offset_y << 16) + (shrink_factor * 3 << 15)
+
+#ifndef BMLONG
+#ifndef BMSHORT
+unsigned char bit_masks[9] = {
+ 0x0, 0x1, 0x3, 0x7,
+ 0xf, 0x1f, 0x3f, 0x7f,
+ 0xff
+};
+#else /* BMSHORT */
+unsigned short bit_masks[17] = {
+ 0x0, 0x1, 0x3, 0x7,
+ 0xf, 0x1f, 0x3f, 0x7f,
+ 0xff, 0x1ff, 0x3ff, 0x7ff,
+ 0xfff, 0x1fff, 0x3fff, 0x7fff,
+ 0xffff
+};
+#endif /* BMSHORT */
+#else /* BMLONG */
+unsigned long bit_masks[33] = {
+ 0x0, 0x1, 0x3, 0x7,
+ 0xf, 0x1f, 0x3f, 0x7f,
+ 0xff, 0x1ff, 0x3ff, 0x7ff,
+ 0xfff, 0x1fff, 0x3fff, 0x7fff,
+ 0xffff, 0x1ffff, 0x3ffff, 0x7ffff,
+ 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff,
+ 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff,
+ 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+ 0xffffffff
+};
+#endif /* BMLONG */
+
+#ifdef VMS
+#define off_t int
+#endif
+extern off_t lseek();
+
+#ifndef SEEK_SET /* if <unistd.h> is not provided (or for <X11R5) */
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#endif
+
+static void draw_part();
+
+/*
+ * Byte reading routines for dvi file.
+ */
+
+#define xtell(pos) (lseek(fileno(dvi_file), 0L, SEEK_CUR) - \
+ (currinf.end - (pos)))
+
+static ubyte
+xxone()
+{
+ if (currinf.virtual) {
+ ++currinf.pos;
+ return EOP;
+ }
+ currinf.end = dvi_buffer +
+ read(fileno(dvi_file), (char *) (currinf.pos = dvi_buffer),
+ DVI_BUFFER_LEN);
+ return currinf.end > dvi_buffer ? *(currinf.pos)++ : EOF;
+}
+
+#define xone() (currinf.pos < currinf.end ? *(currinf.pos)++ : xxone())
+
+static unsigned long
+xnum(size)
+ register ubyte size;
+{
+ register long x = 0;
+
+ while (size--) x = (x << 8) | xone();
+ return x;
+}
+
+static long
+xsnum(size)
+ register ubyte size;
+{
+ register long x;
+
+#ifdef __STDC__
+ x = (signed char) xone();
+#else
+ x = xone();
+ if (x & 0x80) x -= 0x100;
+#endif
+ while (--size) x = (x << 8) | xone();
+ return x;
+}
+
+#define xsfour() xsnum(4)
+
+static void
+xskip(offset)
+ long offset;
+{
+ currinf.pos += offset;
+ if (!currinf.virtual && currinf.pos > currinf.end)
+ (void) lseek(fileno(dvi_file), (long) (currinf.pos - currinf.end),
+ SEEK_CUR);
+}
+
+#if NeedVarargsPrototypes
+static NORETURN void
+tell_oops(_Xconst char *message, ...)
+#else
+/* VARARGS */
+static NORETURN void
+tell_oops(va_alist)
+ va_dcl
+#endif
+{
+#if !NeedVarargsPrototypes
+ _Xconst char *message;
+#endif
+ va_list args;
+
+ Fprintf(stderr, "%s: ", prog);
+#if NeedVarargsPrototypes
+ va_start(args, message);
+#else
+ va_start(args);
+ message = va_arg(args, _Xconst char *);
+#endif
+ (void) vfprintf(stderr, message, args);
+ va_end(args);
+ if (currinf.virtual)
+ Fprintf(stderr, " in virtual font %s\n", currinf.virtual->fontname);
+ else
+ Fprintf(stderr, ", offset %ld\n", xtell(currinf.pos - 1));
+ exit(1);
+}
+
+
+/*
+ * Code for debugging options.
+ */
+
+static void
+print_bitmap(bitmap)
+ register struct bitmap *bitmap;
+{
+ register BMUNIT *ptr = (BMUNIT *) bitmap->bits;
+ register int x, y, i;
+
+ if (ptr == NULL) oops("print_bitmap called with null pointer.");
+ Printf("w = %d, h = %d, bytes wide = %d\n",
+ bitmap->w, bitmap->h, bitmap->bytes_wide);
+ for (y = 0; y < bitmap->h; ++y) {
+ for (x = bitmap->bytes_wide; x > 0; x -= BYTES_PER_BMUNIT) {
+#ifndef MSBITFIRST
+ for (i = 0; i < BITS_PER_BMUNIT; ++i)
+#else
+ for (i = BITS_PER_BMUNIT - 1; i >= 0; --i)
+#endif
+ Putchar((*ptr & (1 << i)) ? '@' : ' ');
+ ++ptr;
+ }
+ Putchar('\n');
+ }
+}
+
+static void
+print_char(ch, g)
+ ubyte ch;
+ struct glyph *g;
+{
+ Printf("char %d", ch);
+ if (isprint(ch))
+ Printf(" (%c)", ch);
+ Putchar('\n');
+ Printf("x = %d, y = %d, dvi = %ld\n", g->x, g->y, g->dvi_adv);
+ print_bitmap(&g->bitmap);
+}
+
+static _Xconst char *dvi_table1[] = {
+ "SET1", NULL, NULL, NULL, "SETRULE", "PUT1", NULL, NULL,
+ NULL, "PUTRULE", "NOP", "BOP", "EOP", "PUSH", "POP", "RIGHT1",
+ "RIGHT2", "RIGHT3", "RIGHT4", "W0", "W1", "W2", "W3", "W4",
+ "X0", "X1", "X2", "X3", "X4", "DOWN1", "DOWN2", "DOWN3",
+ "DOWN4", "Y0", "Y1", "Y2", "Y3", "Y4", "Z0", "Z1",
+ "Z2", "Z3", "Z4"};
+
+static _Xconst char *dvi_table2[] = {
+ "FNT1", "FNT2", "FNT3", "FNT4", "XXX1", "XXX2", "XXX3", "XXX4",
+ "FNTDEF1", "FNTDEF2", "FNTDEF3", "FNTDEF4", "PRE", "POST", "POSTPOST",
+ "SREFL", "EREFL", NULL, NULL, NULL, NULL};
+
+static void
+print_dvi(ch)
+ ubyte ch;
+{
+ _Xconst char *s;
+
+ Printf("%4d %4d ", PXL_H, PXL_V);
+ if (ch <= SETCHAR0 + 127) {
+ Printf("SETCHAR%-3d", ch - SETCHAR0);
+ if (isprint(ch))
+ Printf(" (%c)", ch);
+ Putchar('\n');
+ return;
+ }
+ else if (ch < FNTNUM0) s = dvi_table1[ch - 128];
+ else if (ch <= FNTNUM0 + 63) {
+ Printf("FNTNUM%d\n", ch - FNTNUM0);
+ return;
+ }
+ else s = dvi_table2[ch - (FNTNUM0 + 64)];
+ if (s) Puts(s);
+ else
+ tell_oops("unknown op-code %d", ch);
+}
+
+
+/*
+ * Count the number of set bits in a given region of the bitmap
+ */
+
+char sample_count[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
+
+static int
+sample(bits, bytes_wide, bit_skip, w, h)
+ BMUNIT *bits;
+ int bytes_wide, bit_skip, w, h;
+{
+ BMUNIT *ptr, *endp;
+ register BMUNIT *cp;
+ int bits_left;
+ register int n, bit_shift, wid;
+
+ ptr = bits + bit_skip / BITS_PER_BMUNIT;
+ endp = ADD(bits, h * bytes_wide);
+ bits_left = w;
+#ifndef MSBITFIRST
+ bit_shift = bit_skip % BITS_PER_BMUNIT;
+#else
+ bit_shift = BITS_PER_BMUNIT - bit_skip % BITS_PER_BMUNIT;
+#endif
+ n = 0;
+ while (bits_left) {
+#ifndef MSBITFIRST
+ wid = BITS_PER_BMUNIT - bit_shift;
+#else
+ wid = bit_shift;
+#endif
+ if (wid > bits_left) wid = bits_left;
+ if (wid > 4) wid = 4;
+#ifdef MSBITFIRST
+ bit_shift -= wid;
+#endif
+ for (cp = ptr; cp < endp; cp = ADD(cp, bytes_wide))
+ n += sample_count[(*cp >> bit_shift) & bit_masks[wid]];
+#ifndef MSBITFIRST
+ bit_shift += wid;
+ if (bit_shift == BITS_PER_BMUNIT) {
+ bit_shift = 0;
+ ++ptr;
+ }
+#else
+ if (bit_shift == 0) {
+ bit_shift = BITS_PER_BMUNIT;
+ ++ptr;
+ }
+#endif
+ bits_left -= wid;
+ }
+ return n;
+}
+
+#ifdef GREY
+static void
+shrink_glyph_grey(g)
+ register struct glyph *g;
+{
+ int rows_left, rows, init_cols, cols_left;
+ register int cols;
+ int x, y;
+ long thesample;
+ BMUNIT *old_ptr;
+
+ /* These machinations ensure that the character is shrunk according to
+ its hot point, rather than its upper left-hand corner. */
+ g->x2 = g->x / shrink_factor;
+ init_cols = g->x - g->x2 * shrink_factor;
+ if (init_cols <= 0) init_cols += shrink_factor;
+ else ++g->x2;
+ g->bitmap2.w = g->x2 + ROUNDUP(g->bitmap.w - g->x, shrink_factor);
+ /* include row zero with the positively numbered rows */
+ cols = g->y + 1; /* spare register variable */
+ g->y2 = cols / shrink_factor;
+ rows = cols - g->y2 * shrink_factor;
+ if (rows <= 0) {
+ rows += shrink_factor;
+ --g->y2;
+ }
+ g->bitmap2.h = g->y2 + ROUNDUP(g->bitmap.h - cols, shrink_factor) + 1;
+
+ g->image2 = XCreateImage(DISP, DefaultVisualOfScreen(SCRN),
+ DefaultDepthOfScreen(SCRN),
+ ZPixmap, 0, (char *) NULL,
+ g->bitmap2.w, g->bitmap2.h,
+ BITS_PER_BMUNIT, 0);
+ g->pixmap2 = g->image2->data = xmalloc((unsigned)
+ g->image2->bytes_per_line * g->bitmap2.h,
+ "character pixmap");
+
+ old_ptr = (BMUNIT *) g->bitmap.bits;
+ rows_left = g->bitmap.h;
+ y = 0;
+ while (rows_left) {
+ x = 0;
+ if (rows > rows_left) rows = rows_left;
+ cols_left = g->bitmap.w;
+ cols = init_cols;
+ while (cols_left) {
+ if (cols > cols_left) cols = cols_left;
+
+ thesample = sample(old_ptr, g->bitmap.bytes_wide,
+ g->bitmap.w - cols_left, cols, rows);
+ XPutPixel(g->image2, x, y, pixeltbl[thesample]);
+
+ cols_left -= cols;
+ cols = shrink_factor;
+ x++;
+ }
+ *((char **) &old_ptr) += rows * g->bitmap.bytes_wide;
+ rows_left -= rows;
+ rows = shrink_factor;
+ y++;
+ }
+
+ while (y < g->bitmap2.h) {
+ for (x = 0; x < g->bitmap2.w; x++)
+ XPutPixel(g->image2, x, y, *pixeltbl);
+ y++;
+ }
+
+ g->y2 = g->y / shrink_factor;
+}
+#endif /* GREY */
+
+static void
+shrink_glyph(g)
+ register struct glyph *g;
+{
+ int shrunk_bytes_wide, shrunk_height;
+ int rows_left, rows, init_cols, cols_left;
+ register int cols;
+ BMUNIT *old_ptr, *new_ptr;
+ register BMUNIT m, *cp;
+ int min_sample = shrink_factor * shrink_factor * density / 100;
+
+ /* These machinations ensure that the character is shrunk according to
+ its hot point, rather than its upper left-hand corner. */
+ g->x2 = g->x / shrink_factor;
+ init_cols = g->x - g->x2 * shrink_factor;
+ if (init_cols <= 0) init_cols += shrink_factor;
+ else ++g->x2;
+ g->bitmap2.w = g->x2 + ROUNDUP(g->bitmap.w - g->x, shrink_factor);
+ /* include row zero with the positively numbered rows */
+ cols = g->y + 1; /* spare register variable */
+ g->y2 = cols / shrink_factor;
+ rows = cols - g->y2 * shrink_factor;
+ if (rows <= 0) {
+ rows += shrink_factor;
+ --g->y2;
+ }
+ g->bitmap2.h = shrunk_height = g->y2 +
+ ROUNDUP(g->bitmap.h - cols, shrink_factor) + 1;
+ alloc_bitmap(&g->bitmap2);
+ old_ptr = (BMUNIT *) g->bitmap.bits;
+ new_ptr = (BMUNIT *) g->bitmap2.bits;
+ shrunk_bytes_wide = g->bitmap2.bytes_wide;
+ rows_left = g->bitmap.h;
+ bzero((char *) new_ptr, shrunk_bytes_wide * shrunk_height);
+ while (rows_left) {
+ if (rows > rows_left) rows = rows_left;
+ cols_left = g->bitmap.w;
+#ifndef MSBITFIRST
+ m = (1 << 0);
+#else
+ m = (1 << (BITS_PER_BMUNIT-1));
+#endif
+ cp = new_ptr;
+ cols = init_cols;
+ while (cols_left) {
+ if (cols > cols_left) cols = cols_left;
+ if (sample(old_ptr, g->bitmap.bytes_wide,
+ g->bitmap.w - cols_left, cols, rows) >= min_sample)
+ *cp |= m;
+#ifndef MSBITFIRST
+ if (m == (BMUNIT)(1 << (BITS_PER_BMUNIT-1))) {
+ m = (1 << 0);
+ ++cp;
+ }
+ else m <<= 1;
+#else
+ if (m == (1 << 0)) {
+ m = (1 << (BITS_PER_BMUNIT-1));
+ ++cp;
+ }
+ else m >>= 1;
+#endif
+ cols_left -= cols;
+ cols = shrink_factor;
+ }
+ *((char **) &new_ptr) += shrunk_bytes_wide;
+ *((char **) &old_ptr) += rows * g->bitmap.bytes_wide;
+ rows_left -= rows;
+ rows = shrink_factor;
+ }
+ g->y2 = g->y / shrink_factor;
+ if (debug & DBG_BITMAP)
+ print_bitmap(&g->bitmap2);
+}
+
+/*
+ * Find font #n.
+ */
+
+static void
+change_font(n)
+ unsigned long n;
+{
+ register struct tn *tnp;
+
+ currinf.fontp = NULL;
+ for (tnp = currinf.tn_head; tnp != NULL; tnp = tnp->next)
+ if (tnp->TeXnumber == n) {
+ currinf.fontp = tnp->fontp;
+ if (!(currinf.fontp->flags & FONT_LOADED))
+ load_font(currinf.fontp);
+ break;
+ }
+ if (currinf.fontp == NULL) tell_oops("non-existent font #%d", n);
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+}
+
+
+/*
+ * Open a font file.
+ */
+
+static void
+open_font_file(fontp)
+ struct font *fontp;
+{
+ if (fontp->file == NULL) {
+ fontp->file = xfopen(fontp->filename);
+ if (fontp->file == NULL)
+ oops("Font file disappeared: %s", fontp->filename);
+ }
+}
+
+
+/*
+ * Routines to print characters.
+ */
+
+#ifndef TEXXET
+#define ERRVAL 0L
+#else
+#define ERRVAL
+#endif
+
+#ifndef TEXXET
+long
+set_char(ch)
+#else
+void
+set_char(cmd, ch)
+ WIDEARG(ubyte, int) cmd;
+#endif
+ WIDEARG(ubyte, int) ch;
+{
+ register struct glyph *g;
+#ifdef TEXXET
+ long dvi_h_sav;
+#endif
+
+ if (ch > maxchar) realloc_font(currinf.fontp, WIDEARG(,(int)) ch);
+ if ((g = &currinf.fontp->glyph[ch])->bitmap.bits == NULL) {
+ if (g->addr == 0) {
+ if (!hush_chars)
+ Fprintf(stderr, "Character %d not defined in font %s\n", ch,
+ currinf.fontp->fontname);
+ g->addr = -1;
+ return ERRVAL;
+ }
+ if (g->addr == -1)
+ return ERRVAL; /* previously flagged missing char */
+ open_font_file(currinf.fontp);
+ Fseek(currinf.fontp->file, g->addr, 0);
+ (*currinf.fontp->read_char)(currinf.fontp, ch);
+ if (debug & DBG_BITMAP) print_char((ubyte) ch, g);
+ currinf.fontp->timestamp = ++current_timestamp;
+ }
+
+#ifdef TEXXET
+ dvi_h_sav = DVI_H;
+ if (currinf.dir < 0) DVI_H -= g->dvi_adv;
+ if (scan_frame == NULL) {
+#endif
+ if (shrink_factor == 1)
+ put_bitmap(&g->bitmap, PXL_H - g->x, PXL_V - g->y);
+ else {
+#ifdef GREY
+ if (use_grey) {
+ if (g->pixmap2 == NULL) {
+ shrink_glyph_grey(g);
+ }
+ put_image(g->image2, PXL_H - g->x2, PXL_V - g->y2);
+ } else {
+ if (g->bitmap2.bits == NULL) {
+ shrink_glyph(g);
+ }
+ put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2);
+ }
+#else
+ if (g->bitmap2.bits == NULL) {
+ shrink_glyph(g);
+ }
+ put_bitmap(&g->bitmap2, PXL_H - g->x2, PXL_V - g->y2);
+#endif
+ }
+#ifndef TEXXET
+ return g->dvi_adv;
+#else
+ }
+ if (cmd == PUT1)
+ DVI_H = dvi_h_sav;
+ else
+ if (currinf.dir > 0) DVI_H += g->dvi_adv;
+#endif
+}
+
+
+#ifndef TEXXET
+long
+set_vf_char(ch)
+#else
+void
+set_vf_char(cmd, ch)
+ WIDEARG(ubyte, int) cmd;
+#endif
+ WIDEARG(ubyte, int) ch;
+{
+ register struct macro *m;
+ struct drawinf oldinfo;
+ ubyte oldmaxchar;
+ static ubyte c;
+#ifdef TEXXET
+ long dvi_h_sav;
+#endif
+
+ if (ch > maxchar) realloc_virtual_font(currinf.fontp, ch);
+ if ((m = &currinf.fontp->macro[ch])->pos == NULL) {
+ if (!hush_chars)
+ Fprintf(stderr, "Character %d not defined in font %s\n", ch,
+ currinf.fontp->fontname);
+ m->pos = m->end = &c;
+ return ERRVAL;
+ }
+#ifdef TEXXET
+ dvi_h_sav = DVI_H;
+ if (currinf.dir < 0) DVI_H -= m->dvi_adv;
+ if (scan_frame == NULL) {
+#endif
+ oldinfo = currinf;
+ oldmaxchar = maxchar;
+ WW = XX = YY = ZZ = 0;
+ currinf.tn_head = currinf.fontp->vf_chain;
+ currinf.pos = m->pos;
+ currinf.end = m->end;
+ currinf.virtual = currinf.fontp;
+ draw_part(current_frame, currinf.fontp->dimconv);
+ if (currinf.pos != currinf.end + 1)
+ tell_oops("virtual character macro does not end correctly");
+ currinf = oldinfo;
+ maxchar = oldmaxchar;
+#ifndef TEXXET
+ return m->dvi_adv;
+#else
+ }
+ if (cmd == PUT1)
+ DVI_H = dvi_h_sav;
+ else
+ if (currinf.dir > 0) DVI_H += m->dvi_adv;
+#endif
+}
+
+
+#ifndef TEXXET
+static long
+set_no_char(ch)
+#else
+static void
+set_no_char(cmd, ch)
+ ubyte cmd;
+#endif
+ ubyte ch;
+{
+ if (currinf.virtual) {
+ currinf.fontp = currinf.virtual->first_font;
+ if (currinf.fontp != NULL) {
+ if (!(currinf.fontp->flags & FONT_LOADED))
+ load_font(currinf.fontp);
+ maxchar = currinf.fontp->maxchar;
+ currinf.set_char_p = currinf.fontp->set_char_p;
+#ifndef TEXXET
+ return (*currinf.set_char_p)(ch);
+#else
+ (*currinf.set_char_p)(cmd, ch);
+ return;
+#endif
+ }
+ }
+ tell_oops("attempt to set character of unknown font");
+ /* NOTREACHED */
+}
+
+
+/*
+ * Set rule. Arguments are coordinates of lower left corner.
+ */
+
+static void
+set_rule(h, w)
+ int h, w;
+{
+#ifndef TEXXET
+ put_rectangle(PXL_H, PXL_V - h + 1, w, h, False);
+#else
+ put_rectangle(PXL_H - (currinf.dir < 0 ? w - 1 : 0), PXL_V - h + 1,
+ w, h, False);
+#endif
+}
+
+static void
+put_border(w, h)
+ int w, h;
+{
+ put_rectangle(0, 0, w, 1, True); /* top */
+ put_rectangle(w, 0, 1, h, True); /* right */
+ put_rectangle(1, h, w, 1, True); /* bottom */
+ put_rectangle(0, 1, 1, h, True); /* left */
+}
+
+static void
+special(nbytes)
+ long nbytes;
+{
+ static char *cmd = NULL;
+ static long cmdlen = -1;
+ char *p;
+
+ if (cmdlen < nbytes) {
+ if (cmd) free(cmd);
+ cmd = xmalloc((unsigned) nbytes + 1, "special");
+ cmdlen = nbytes;
+ }
+ p = cmd;
+ for (;;) {
+ int i = currinf.end - currinf.pos;
+
+ if (i > nbytes) i = nbytes;
+ bcopy((_Xconst char *) currinf.pos, p, i);
+ currinf.pos += i;
+ p += i;
+ nbytes -= i;
+ if (nbytes == 0) break;
+ (void) xxone();
+ --(currinf.pos);
+ }
+ *p = '\0';
+ applicationDoSpecial(cmd);
+}
+
+#define xspell_conv(n) spell_conv0(n, current_dimconv)
+
+static void
+draw_part(minframe, current_dimconv)
+ struct frame *minframe;
+ double current_dimconv;
+{
+ ubyte ch;
+#ifdef TEXXET
+ struct drawinf oldinfo;
+ ubyte oldmaxchar;
+ off_t file_pos;
+ int refl_count;
+#endif
+
+ currinf.fontp = NULL;
+ currinf.set_char_p = set_no_char;
+#ifdef TEXXET
+ currinf.dir = 1;
+ scan_frame = NULL; /* indicates we're not scanning */
+#endif
+ for (;;) {
+ ch = xone();
+ if (debug & DBG_DVI)
+ print_dvi(ch);
+ if (ch <= SETCHAR0 + 127)
+#ifndef TEXXET
+ DVI_H += (*currinf.set_char_p)(ch);
+#else
+ (*currinf.set_char_p)(ch, ch);
+#endif
+ else if (FNTNUM0 <= ch && ch <= FNTNUM0 + 63)
+ change_font((unsigned long) (ch - FNTNUM0));
+ else {
+ long a, b;
+
+ switch (ch) {
+ case SET1:
+ case PUT1:
+#ifndef TEXXET
+ a = (*currinf.set_char_p)(xone());
+ if (ch != PUT1) DVI_H += a;
+#else
+ (*currinf.set_char_p)(ch, xone());
+#endif
+ break;
+
+ case SETRULE:
+ /* Be careful, dvicopy outputs rules with
+ height = 0x80000000. We don't want any
+ SIGFPE here. */
+ a = xsfour();
+ b = xspell_conv(xsfour());
+#ifndef TEXXET
+ if (a > 0 && b > 0)
+#else
+ if (a > 0 && b > 0 && scan_frame == NULL)
+#endif
+ set_rule(pixel_round(xspell_conv(a)),
+ pixel_round(b));
+ DVI_H += DIR * b;
+ break;
+
+ case PUTRULE:
+ a = xspell_conv(xsfour());
+ b = xspell_conv(xsfour());
+#ifndef TEXXET
+ if (a > 0 && b > 0)
+#else
+ if (a > 0 && b > 0 && scan_frame == NULL)
+#endif
+ set_rule(pixel_round(a), pixel_round(b));
+ break;
+
+ case NOP:
+ break;
+
+ case BOP:
+ xskip((long) 11 * 4);
+ DVI_H = OFFSET_X;
+ DVI_V = OFFSET_Y;
+ PXL_V = pixel_conv(DVI_V);
+ WW = XX = YY = ZZ = 0;
+ break;
+
+ case EOP:
+ if (current_frame != minframe)
+ tell_oops("stack not empty at EOP");
+ return;
+
+ case PUSH:
+ if (current_frame->next == NULL) {
+ struct frame *newp = (struct frame *)
+ xmalloc(sizeof(struct frame), "stack frame");
+ current_frame->next = newp;
+ newp->prev = current_frame;
+ newp->next = NULL;
+ }
+ current_frame = current_frame->next;
+ current_frame->data = currinf.data;
+ break;
+
+ case POP:
+ if (current_frame == minframe)
+ tell_oops("more POPs than PUSHes");
+ currinf.data = current_frame->data;
+ current_frame = current_frame->prev;
+ break;
+
+#ifdef TEXXET
+ case SREFL:
+ if (scan_frame == NULL) {
+ /* we're not scanning: save some info. */
+ oldinfo = currinf;
+ oldmaxchar = maxchar;
+ if (!currinf.virtual)
+ file_pos = xtell(currinf.pos);
+ scan_frame = current_frame; /* now we're scanning */
+ refl_count = 0;
+ break;
+ }
+ /* we are scanning */
+ if (current_frame == scan_frame) ++refl_count;
+ break;
+
+ case EREFL:
+ if (scan_frame != NULL) { /* if we're scanning */
+ if (current_frame == scan_frame && --refl_count < 0)
+ {
+ /* we've hit the end of our scan */
+ scan_frame = NULL;
+ /* first: push */
+ if (current_frame->next == NULL) {
+ struct frame *newp = (struct frame *)
+ xmalloc(sizeof(struct frame),
+ "stack frame");
+ current_frame->next = newp;
+ newp->prev = current_frame;
+ newp->next = NULL;
+ }
+ current_frame = current_frame->next;
+ current_frame->data = currinf.data;
+ /* next: restore old file position, XX, etc. */
+ if (!currinf.virtual) {
+ off_t bgn_pos = xtell(dvi_buffer);
+
+ if (file_pos >= bgn_pos) {
+ oldinfo.pos = dvi_buffer
+ + (file_pos - bgn_pos);
+ oldinfo.end = currinf.end;
+ }
+ else {
+ (void) lseek(fileno(dvi_file), file_pos,
+ SEEK_SET);
+ oldinfo.pos = oldinfo.end;
+ }
+ }
+ currinf = oldinfo;
+ maxchar = oldmaxchar;
+ /* and then: recover position info. */
+ DVI_H = current_frame->data.dvi_h;
+ DVI_V = current_frame->data.dvi_v;
+ PXL_V = current_frame->data.pxl_v;
+ /* and finally, reverse direction */
+ currinf.dir = -currinf.dir;
+ }
+ break;
+ }
+ /* we're not scanning, */
+ /* so just reverse direction and then pop */
+ currinf.dir = -currinf.dir;
+ currinf.data = current_frame->data;
+ current_frame = current_frame->prev;
+ break;
+#endif /* TEXXET */
+
+ case RIGHT1:
+ case RIGHT2:
+ case RIGHT3:
+ case RIGHT4:
+ DVI_H += DIR * xspell_conv(xsnum(ch - RIGHT1 + 1));
+ break;
+
+ case W1:
+ case W2:
+ case W3:
+ case W4:
+ WW = xspell_conv(xsnum(ch - W0));
+ case W0:
+ DVI_H += DIR * WW;
+ break;
+
+ case X1:
+ case X2:
+ case X3:
+ case X4:
+ XX = xspell_conv(xsnum(ch - X0));
+ case X0:
+ DVI_H += DIR * XX;
+ break;
+
+ case DOWN1:
+ case DOWN2:
+ case DOWN3:
+ case DOWN4:
+ DVI_V += xspell_conv(xsnum(ch - DOWN1 + 1));
+ PXL_V = pixel_conv(DVI_V);
+ break;
+
+ case Y1:
+ case Y2:
+ case Y3:
+ case Y4:
+ YY = xspell_conv(xsnum(ch - Y0));
+ case Y0:
+ DVI_V += YY;
+ PXL_V = pixel_conv(DVI_V);
+ break;
+
+ case Z1:
+ case Z2:
+ case Z3:
+ case Z4:
+ ZZ = xspell_conv(xsnum(ch - Z0));
+ case Z0:
+ DVI_V += ZZ;
+ PXL_V = pixel_conv(DVI_V);
+ break;
+
+ case FNT1:
+ case FNT2:
+ case FNT3:
+ case FNT4:
+ change_font(xnum(ch - FNT1 + 1));
+ break;
+
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ a = xnum(ch - XXX1 + 1);
+ if (a > 0)
+ special(a);
+ break;
+
+ case FNTDEF1:
+ case FNTDEF2:
+ case FNTDEF3:
+ case FNTDEF4:
+ xskip((long) (12 + ch - FNTDEF1 + 1));
+ xskip((long) xone() + (long) xone());
+ break;
+
+#ifndef TEXXET
+ case SREFL:
+ case EREFL:
+#endif
+ case PRE:
+ case POST:
+ case POSTPOST:
+ tell_oops("shouldn't happen: %s encountered",
+ dvi_table2[ch - (FNTNUM0 + 64)]);
+ break;
+
+ default:
+ tell_oops("unknown op-code %d", ch);
+ } /* end switch*/
+ } /* end else (ch not a SETCHAR or FNTNUM) */
+ } /* end for */
+}
+
+#undef xspell_conv
+
+void
+draw_page()
+{
+ /* Check for changes in dvi file. */
+ if (!check_dvi_file()) return;
+
+ put_border(ROUNDUP(unshrunk_paper_w, shrink_factor) + 1,
+ ROUNDUP(unshrunk_paper_h, shrink_factor) + 1);
+
+ (void) lseek(fileno(dvi_file), page_offset[current_page], SEEK_SET);
+
+ bzero((char *) &currinf.data, sizeof(currinf.data));
+ currinf.tn_head = tn_head;
+ currinf.pos = currinf.end = dvi_buffer;
+ currinf.virtual = NULL;
+ draw_part(current_frame = &frame0, dimconv);
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/dvi_init.c b/systems/msdos/dviware/xdvi-dos/src/dvi_init.c
new file mode 100644
index 0000000000..f257cd579f
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/dvi_init.c
@@ -0,0 +1,639 @@
+/*
+ * DVI previewer for X.
+ *
+ * Eric Cooper, CMU, September 1985.
+ *
+ * Code derived from dvi-imagen.c.
+ *
+ * Modification history:
+ * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS.
+ * 7/1988 Modified for X.11 --Mark Eichin, MIT
+ * 12/1988 Added 'R' option, toolkit, magnifying glass
+ * --Paul Vojta, UC Berkeley.
+ * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto
+ * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ.
+ * 3/1990 Added VMS support --Scott Allendorf, U of Iowa
+ * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem
+ * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen
+ * and Lee Hetherington, MIT
+ *
+ * Compilation options:
+ * SYSV compile for System V
+ * VMS compile for VMS
+ * X10 compile for X10
+ * NOTOOL compile without toolkit (X11 only)
+ * BUTTONS compile with buttons on the side of the window (needs toolkit)
+ * MSBITFIRST store bitmaps internally with most significant bit first
+ * BMSHORT store bitmaps in shorts instead of bytes
+ * BMLONG store bitmaps in longs instead of bytes
+ * ALTFONT default for -altfont option
+ * A4 use European size paper
+ * TEXXET support reflection dvi codes (right-to-left typesetting)
+ * GREY use grey levels to shrink fonts
+ */
+
+#include "xdvi.h"
+#include "dvi.h"
+#include <sys/stat.h>
+
+#ifdef sun
+extern char *sprintf();
+#endif
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#else
+char *realloc();
+#endif
+#if defined(macII) && !defined(__STDC__) /* stdlib.h doesn't define these */
+char *realloc();
+#endif /* macII */
+
+#define PK_PRE 247
+#define PK_ID 89
+#define PK_MAGIC (PK_PRE << 8) + PK_ID
+#define GF_PRE 247
+#define GF_ID 131
+#define GF_MAGIC (GF_PRE << 8) + GF_ID
+#define VF_PRE 247
+#define VF_ID_BYTE 202
+#define VF_MAGIC (VF_PRE << 8) + VF_ID_BYTE
+#define PXL_MAGIC1 0
+#define PXL_MAGIC2 1001
+
+#define dvi_oops(str) longjmp(dvi_env, (int) str);
+
+static struct stat fstatbuf;
+
+static Boolean font_not_found;
+
+/*
+ * DVI preamble and postamble information.
+ */
+static char job_id[300];
+static long numerator, denominator, magnification;
+
+/*
+ * Offset in DVI file of last page, set in read_postamble().
+ */
+static long last_page_offset;
+
+
+/*
+ * free_vf_chain frees the vf_chain structure.
+ */
+
+static void
+free_vf_chain(tnp)
+ struct tn *tnp;
+{
+ while (tnp != NULL) {
+ register struct tn *tnp1 = tnp->next;
+ free((char *) tnp);
+ tnp = tnp1;
+ }
+}
+
+
+/*
+ * Release all shrunken bitmaps for all fonts.
+ */
+
+void
+reset_fonts()
+{
+ register struct font *f;
+ register struct glyph *g;
+
+ for (f = font_head; f != NULL; f = f->next)
+ if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL))
+ for (g = f->glyph; g <= f->glyph + f->maxchar; ++g) {
+ if (g->bitmap2.bits) {
+ free(g->bitmap2.bits);
+ g->bitmap2.bits = NULL;
+ }
+#ifdef GREY
+ if (g->pixmap2) {
+ XDestroyImage(g->image2);
+ g->pixmap2 = NULL;
+ }
+#endif
+ }
+}
+
+/*
+ * realloc_font allocates the font structure to contain (newsize + 1)
+ * characters.
+ */
+
+void
+realloc_font(fontp, newsize)
+ struct font *fontp;
+ WIDEARG(ubyte, int) newsize;
+{
+ struct glyph *glyph;
+
+ glyph = fontp->glyph = (struct glyph *) realloc((char *) fontp->glyph,
+ ((unsigned int) newsize + 1) * sizeof(struct glyph));
+ if (glyph == NULL) oops("! Cannot reallocate space for glyph array.");
+ if (newsize > fontp->maxchar)
+ bzero((char *) (glyph + fontp->maxchar + 1),
+ (int) (newsize - fontp->maxchar) * sizeof(struct glyph));
+ maxchar = fontp->maxchar = newsize;
+}
+
+
+/*
+ * realloc_virtual_font does the same thing for virtual fonts.
+ */
+
+void
+realloc_virtual_font(fontp, newsize)
+ struct font *fontp;
+ WIDEARG(ubyte, int) newsize;
+{
+ struct macro *macro;
+
+ macro = fontp->macro = (struct macro *) realloc((char *) fontp->macro,
+ ((unsigned int) newsize + 1) * sizeof(struct macro));
+ if (macro == NULL) oops("! Cannot reallocate space for macro array.");
+ if (newsize > fontp->maxchar)
+ bzero((char *) (macro + fontp->maxchar + 1),
+ (int) (newsize - fontp->maxchar) * sizeof(struct macro));
+ maxchar = fontp->maxchar = newsize;
+}
+
+
+/*
+ * load_font locates the raster file and reads the index of characters,
+ * plus whatever other preprocessing is done (depending on the format).
+ */
+
+void
+load_font(fontp)
+ struct font *fontp;
+{
+ float fsize = fontp->fsize;
+ int dpi = fsize + 0.5;
+ char *font_found;
+ int size_found;
+ int magic;
+
+ fontp->flags |= FONT_LOADED;
+ fontp->file = font_open(fontp->fontname, &font_found,
+ (WIDEARG(float, double)) fsize, &size_found, fontp->magstepval,
+ &fontp->filename);
+ if (fontp->file == NULL) {
+ Fprintf(stderr, "Can't find font %s.\n", fontp->fontname);
+ font_not_found = True;
+ return;
+ }
+ --n_files_left;
+ if (font_found != NULL) {
+ Fprintf(stderr,
+ "Can't find font %s; using %s instead at %d dpi\n",
+ fontp->fontname, font_found, dpi);
+ free(fontp->fontname);
+ fontp->fontname = font_found;
+ }
+ else if (size_found > (int) (5 * 1.002 * fsize + 0.5) ||
+ size_found < (int) (5 * 0.998 * fsize + 0.5))
+ Fprintf(stderr,
+ "Can't find font %s at %d dpi; using %d dpi instead.\n",
+ fontp->fontname, dpi, (size_found + 2) / 5);
+ fontp->fsize = (float) size_found / 5;
+ fontp->timestamp = ++current_timestamp;
+ fontp->maxchar = maxchar = 255;
+ fontp->set_char_p = set_char;
+ magic = two(fontp->file);
+#ifdef USE_PK
+ if (magic == PK_MAGIC) read_PK_index(fontp);
+ else
+#endif
+#ifdef USE_GF
+ if (magic == GF_MAGIC) read_GF_index(fontp);
+ else
+#endif
+ if (magic == VF_MAGIC) read_VF_index(fontp);
+ else
+#ifdef USE_PXL
+ if (magic == PXL_MAGIC1 && two(fontp->file) == PXL_MAGIC2)
+ read_PXL_index(fontp);
+ else
+#endif
+ oops("Cannot recognize format for font file %s", fontp->filename);
+
+ if (fontp->flags & FONT_VIRTUAL) {
+ while (maxchar > 0 && fontp->macro[maxchar].pos == NULL) --maxchar;
+ if (maxchar < 255)
+ realloc_virtual_font(fontp, WIDEARG(,(int)) maxchar);
+ }
+ else {
+ while (maxchar > 0 && fontp->glyph[maxchar].addr == 0) --maxchar;
+ if (maxchar < 255)
+ realloc_font(fontp, WIDEARG(,(int)) maxchar);
+ }
+}
+
+
+/*
+ * MAGSTEPVALUE - If the given magnification is close to a \magstep
+ * or a \magstephalf, then return twice the number of \magsteps.
+ * Otherwise return NOMAGSTP.
+ */
+
+#define NOMAGSTP (-29999)
+#define NOBUILD 29999
+
+static int
+magstepvalue(mag)
+ float *mag;
+{
+ int m = 0;
+ double fmag = *mag;
+ double xmag = pixels_per_inch;
+ float margin = fmag * 0.002;
+
+ if (fmag < pixels_per_inch)
+ for (;;) {
+ if (xmag - fmag < margin && -(xmag - fmag) < margin) {
+ *mag = xmag;
+ return m;
+ }
+ if (xmag < fmag) break;
+ xmag *= 0.9128709292;
+ --m;
+ }
+ else
+ for (;;) {
+ if (xmag - fmag < margin && -(xmag - fmag) < margin) {
+ *mag = xmag;
+ return m;
+ }
+ if (xmag > fmag) break;
+ xmag *= 1.095445115;
+ ++m;
+ }
+ return NOMAGSTP;
+}
+
+
+/*
+ * reuse_font recursively sets the flags for font structures being reused.
+ */
+
+static void
+reuse_font(fontp)
+ struct font *fontp;
+{
+ struct tn *tnp;
+
+ if (fontp->flags & FONT_IN_USE) return;
+
+ fontp->flags |= FONT_IN_USE;
+ if (list_fonts)
+ Printf("(reusing) %s at %d dpi\n", fontp->fontname,
+ (int) (fontp->fsize + 0.5));
+ if (fontp->flags & FONT_VIRTUAL)
+ for (tnp = fontp->vf_chain; tnp != NULL; tnp = tnp->next)
+ reuse_font(tnp->fontp);
+}
+
+
+/*
+ * define_font reads the rest of the fntdef command and then reads in
+ * the specified pixel file, adding it to the global linked-list holding
+ * all of the fonts used in the job.
+ */
+void
+define_font(file, cmnd, vfparent, tn_headpp)
+ FILE *file;
+ WIDEARG(ubyte, unsigned int) cmnd;
+ struct font *vfparent; /* vf parent of this font, or NULL */
+ struct tn **tn_headpp; /* addr of head of list of TeXnumbers */
+{
+ register struct tn *tnp;
+ struct font *fontp;
+ float fsize;
+ double scale_dimconv;
+ int scale;
+ int design;
+ int magstepval;
+ int len;
+ char *fontname;
+ int size;
+
+ tnp = (struct tn *) xmalloc((unsigned) sizeof(struct tn),
+ "TeXnumber structure");
+ tnp->next = *tn_headpp;
+ *tn_headpp = tnp;
+ tnp->TeXnumber = num(file, (int) cmnd - FNTDEF1 + 1);
+ (void) four(file); /* checksum */
+ scale = four(file);
+ design = four(file);
+ len = one(file) + one(file);
+ fontname = xmalloc((unsigned) len + 1, "font name");
+ Fread(fontname, sizeof(char), len, file);
+ fontname[len] = '\0';
+ if(debug & DBG_PK)
+ Printf("Define font \"%s\" scale=%d design=%d\n",
+ fontname, scale, design);
+ if (vfparent == NULL) {
+ fsize = 0.001 * scale / design * magnification * pixels_per_inch;
+ scale_dimconv = dimconv;
+ }
+ else {
+ /*
+ * The scaled size is given in units of vfparent->scale * 2 ** -20
+ * SPELL units, so we convert it into SPELL units by multiplying by
+ * vfparent->dimconv.
+ * The design size is given in units of 2 ** -20 pt, so we convert
+ * into SPELL units by multiplying by
+ * (pixels_per_inch * 2**16) / (72.27 * 2**20).
+ */
+ fsize = (72.27 * (1<<4)) * vfparent->dimconv * scale / design;
+ scale_dimconv = vfparent->dimconv;
+ }
+ magstepval = magstepvalue(&fsize);
+ size = 5 * fsize + 0.5;
+ /*
+ * reuse font if possible
+ */
+ for (fontp = font_head;; fontp = fontp->next) {
+ if (fontp == NULL) { /* if font doesn't exist yet */
+ if (list_fonts)
+ Printf("%s at %d dpi\n", fontname, (int) (fsize + 0.5));
+ fontp = (struct font *) xmalloc((unsigned) sizeof(struct font),
+ "font structure");
+ fontp->dimconv = scale * scale_dimconv / (1<<20);
+ fontp->fontname = fontname;
+ fontp->fsize = fsize;
+ fontp->magstepval = magstepval;
+ fontp->flags = FONT_IN_USE;
+ if (vfparent == NULL) load_font(fontp);
+ fontp->next = font_head;
+ font_head = fontp;
+ break;
+ }
+ if (strcmp(fontname, fontp->fontname) == 0
+ && size == (int) (5 * fontp->fsize + 0.5)) {
+ /* if font already in use */
+ reuse_font(fontp);
+ free(fontname);
+ break;
+ }
+ }
+ tnp->fontp = fontp;
+}
+
+
+/*
+ * process_preamble reads the information in the preamble and stores
+ * it into global variables for later use.
+ */
+static void
+process_preamble()
+{
+ ubyte k;
+
+ if (one(dvi_file) != PRE)
+ dvi_oops("DVI file doesn't start with preamble");
+ if (one(dvi_file) != 2)
+ dvi_oops("Wrong version of DVI output for this program");
+ numerator = four(dvi_file);
+ denominator = four(dvi_file);
+ magnification = four(dvi_file);
+ dimconv = (((double) numerator * magnification)
+ / ((double) denominator * 1000.));
+ dimconv = dimconv * (((long) pixels_per_inch)<<16) / 254000;
+ specialConv = pixels_per_inch * magnification / 1000000.0;
+ k = one(dvi_file);
+ Fread(job_id, sizeof(char), (int) k, dvi_file);
+ job_id[k] = '\0';
+}
+
+/*
+ * find_postamble locates the beginning of the postamble
+ * and leaves the file ready to start reading at that location.
+ */
+#define TMPSIZ 516 /* 4 trailer bytes + 512 junk bytes allowed */
+static void
+find_postamble()
+{
+ long pos;
+ ubyte temp[TMPSIZ];
+ ubyte *p;
+ ubyte *p1;
+ ubyte byte;
+
+ Fseek(dvi_file, (long) 0, 2);
+ pos = ftell(dvi_file) - TMPSIZ;
+ if (pos < 0) pos = 0;
+ Fseek(dvi_file, pos, 0);
+ p = temp + fread((char *) temp, sizeof(char), TMPSIZ, dvi_file);
+ for (;;) {
+ p1 = p;
+ while (p1 > temp && *(--p1) != TRAILER) ;
+ p = p1;
+ while (p > temp && *(--p) == TRAILER) ;
+ if (p <= p1 - 4) break; /* found 4 TRAILER bytes */
+ if (p <= temp) dvi_oops("DVI file corrupted");
+ }
+ pos += p - temp;
+ byte = *p;
+ while (byte == TRAILER) {
+ Fseek(dvi_file, --pos, 0);
+ byte = one(dvi_file);
+ }
+ if (byte != 2)
+ dvi_oops("Wrong version of DVI output for this program");
+ Fseek(dvi_file, pos - 4, 0);
+ Fseek(dvi_file, sfour(dvi_file), 0);
+}
+
+
+/*
+ * read_postamble reads the information in the postamble,
+ * storing it into global variables.
+ * It also takes care of reading in all of the pixel files for the fonts
+ * used in the job.
+ */
+static void
+read_postamble()
+{
+ ubyte cmnd;
+ struct font *fontp;
+ struct font **fontpp;
+
+ if (one(dvi_file) != POST)
+ dvi_oops("Postamble doesn't begin with POST");
+ last_page_offset = four(dvi_file);
+ if (numerator != four(dvi_file)
+ || denominator != four(dvi_file)
+ || magnification != four(dvi_file))
+ dvi_oops("Postamble doesn't match preamble");
+ /* read largest box height and width */
+ unshrunk_page_h = (spell_conv(sfour(dvi_file)) >> 16) + offset_y;
+ if (unshrunk_page_h < unshrunk_paper_h)
+ unshrunk_page_h = unshrunk_paper_h;
+ unshrunk_page_w = (spell_conv(sfour(dvi_file)) >> 16) + offset_x;
+ if (unshrunk_page_w < unshrunk_paper_w)
+ unshrunk_page_w = unshrunk_paper_w;
+ (void) two(dvi_file); /* max stack size */
+ total_pages = two(dvi_file);
+ font_not_found = False;
+ while ((cmnd = one(dvi_file)) >= FNTDEF1 && cmnd <= FNTDEF4)
+ define_font(dvi_file, cmnd, (struct font *) NULL, &tn_head);
+ if (cmnd != POSTPOST)
+ dvi_oops("Non-fntdef command found in postamble");
+ if (font_not_found)
+ dvi_oops("Not all pixel files were found");
+ /*
+ * free up fonts no longer in use
+ */
+ fontpp = &font_head;
+ while ((fontp = *fontpp) != NULL)
+ if (fontp->flags & FONT_IN_USE)
+ fontpp = &fontp->next;
+ else {
+ if (debug & DBG_PK)
+ Printf("Discarding font \"%s\" at %d dpi\n",
+ fontp->fontname, (int) (fontp->fsize + 0.5));
+ *fontpp = fontp->next; /* remove from list */
+ free(fontp->fontname);
+ if (fontp->flags & FONT_LOADED) {
+ if (fontp->file != NULL) {
+ Fclose(fontp->file);
+ ++n_files_left;
+ }
+ free(fontp->filename);
+ if (fontp->flags & FONT_VIRTUAL) {
+ register struct macro *m;
+
+ for (m = fontp->macro;
+ m <= fontp->macro + fontp->maxchar; ++m)
+ if (m->free_me) free((char *) m->pos);
+ free((char *) fontp->macro);
+ free_vf_chain(fontp->vf_chain);
+ }
+ else {
+ register struct glyph *g;
+
+ for (g = fontp->glyph;
+ g <= fontp->glyph + fontp->maxchar; ++g) {
+ if (g->bitmap.bits != NULL) free(g->bitmap.bits);
+ if (g->bitmap2.bits != NULL) free(g->bitmap2.bits);
+#ifdef GREY
+ if (g->pixmap2 != NULL) XDestroyImage(g->image2);
+#endif
+ }
+ free((char *) fontp->glyph);
+ }
+ free((char *) fontp);
+ }
+ }
+}
+
+static void
+prepare_pages()
+{
+ int i;
+
+ page_offset = (long *) xmalloc((unsigned) total_pages * sizeof(long),
+ "page directory");
+ i = total_pages;
+ page_offset[--i] = last_page_offset;
+ Fseek(dvi_file, last_page_offset, 0);
+ /*
+ * Follow back pointers through pages in the DVI file,
+ * storing the offsets in the page_offset table.
+ */
+ while (i > 0) {
+ Fseek(dvi_file, (long) (1+4+(9*4)), 1);
+ Fseek(dvi_file, page_offset[--i] = four(dvi_file), 0);
+ }
+}
+
+void
+init_page()
+{
+ page_w = ROUNDUP(unshrunk_page_w, mane.shrinkfactor) + 2;
+ page_h = ROUNDUP(unshrunk_page_h, mane.shrinkfactor) + 2;
+}
+
+/*
+ * init_dvi_file is the main subroutine for reading the startup information
+ * from the dvi file.
+ */
+
+static void
+init_dvi_file()
+{
+ (void) fstat(fileno(dvi_file), &fstatbuf);
+ dvi_time = fstatbuf.st_mtime;
+ process_preamble();
+ find_postamble();
+ read_postamble();
+ prepare_pages();
+ init_page();
+ if (current_page >= total_pages) current_page = total_pages - 1;
+ hush_spec_now = hush_spec;
+}
+
+/**
+ ** open_dvi_file opens the dvi file and calls init_dvi_file() to
+ ** initialize it.
+ **/
+
+void
+open_dvi_file()
+{
+ char *errmsg;
+
+ if ((dvi_file = fopen(dvi_name, OPEN_MODE)) == NULL) {
+ int n = strlen(dvi_name);
+ char *file = dvi_name;
+
+ if (strcmp(dvi_name + n - sizeof(".dvi") + 1, ".dvi") == 0) {
+ perror(dvi_name);
+ exit(1);
+ }
+ dvi_name = xmalloc((unsigned) n + sizeof(".dvi"), "dvi file name");
+ Sprintf(dvi_name, "%s.dvi", file);
+ if ((dvi_file = fopen(dvi_name, OPEN_MODE)) == NULL) {
+ perror(dvi_name);
+ exit(1);
+ }
+ }
+
+ if (errmsg = (char *) setjmp(dvi_env)) oops(errmsg);
+ init_dvi_file();
+}
+
+/**
+ ** Check for changes in dvi file.
+ **/
+
+Boolean
+check_dvi_file()
+{
+ struct font *fontp;
+
+ if (dvi_file == NULL || fstat(fileno(dvi_file), &fstatbuf) != 0
+ || fstatbuf.st_mtime != dvi_time) {
+ if (dvi_file) Fclose(dvi_file);
+ free((char *) page_offset);
+ dvi_file = fopen(dvi_name, OPEN_MODE);
+ if (dvi_file == NULL)
+ dvi_oops("Cannot reopen dvi file.");
+ if (list_fonts) Putchar('\n');
+ free_vf_chain(tn_head);
+ tn_head = NULL;
+ for (fontp = font_head; fontp != NULL; fontp = fontp->next)
+ fontp->flags &= ~FONT_IN_USE;
+ init_dvi_file();
+ redraw_page();
+ return False;
+ }
+ return True;
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/font_ope.c b/systems/msdos/dviware/xdvi-dos/src/font_ope.c
new file mode 100644
index 0000000000..78d9b412a9
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/font_ope.c
@@ -0,0 +1,887 @@
+/*
+ * font_open.c(font, font_ret, mag, mag_ret, magstepval, name)
+ * Find and open gf, pk, or pxl files in the given path, having the given
+ * name and magnification. It tries gf files first, followed by pk and pxl
+ * files. The path variable should be of the form path1:path2:...:pathn,
+ * and each of the paths will be tried successively. Strings in pathi of
+ * the form %f, %p, and %d will be replaced by the font name, "gf" or "pk"
+ * or "pxl", and the magnification, respectively. If no %f appears in a
+ * path specifier, then the string "/%f.%d%p" is added on the end. This
+ * procedure is repeated for each of the possible magnifications allowed,
+ * and if it fails then the procedure will try changing the point size
+ * as well. If all of the above fails, then alt_font will be tried.
+ *
+ * If the variable SEARCH_SUBDIRECTORIES is set, then the environment
+ * variable TEXFONTS_SUBDIR and the #define variable DEFAULT_SUBDIR_PATH
+ * will be enabled, as well as ``*'' and ``**'' specifiers. The
+ * SUBDIR_PATH things will be appended to the end of the usual path, with
+ * a `*' at the end of each component. The `*' means that subdirectories
+ * will be searched up to one level; `**' means that subdirectories
+ * will be recursively searched to any level. Neither specifier may be
+ * preceded by a `%' specifier (after the most recent colon).
+ *
+ * If the file is found, then a file pointer is returned, and the following
+ * values are set:
+ * *font_ret a pointer to a string containing the font name (if
+ * different from the font requested).
+ * *mag_ret the actual magnification found.
+ * *name a pointer to a string containing the file name
+ *
+ * If the file is not found, then the return value is NULL.
+ *
+ * Often there are so many fonts that we need to manage the number of
+ * simultaneously open files. For that reason, these routines call
+ * xfopen() instead of fopen(), which should manage the number of open
+ * font files.
+ *
+ */
+
+/*--------------------------- Msdos ---------------------------------------*/
+/* ericho */
+#ifdef __MSDOS__
+
+#define DEFAULT_FONT_PATH "/tex/fonts"
+#define DEFAULT_VF_PATH "/tex/fonts/vf"
+#define DEFAULT_FONT_SIZES "300:328.6:360:432:518.4:622:746.4"
+
+#ifdef FONTSUB
+#include <stdio.h>
+extern FILE *fontsubfile;
+extern char *subfont (FILE *,char *);
+#endif
+
+#endif
+/*--------------------------- Msdos ---------------------------------------*/
+
+#include "xdvi.h"
+#include <errno.h>
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h> /* has getenv() */
+#include <math.h> /* has atof() */
+#else
+extern char *getenv();
+#ifndef atof
+double atof();
+#endif
+#endif
+
+/*
+ * If you think you have to change DEFAULT_TAIL, then you haven't read the
+ * documentation closely enough.
+ */
+#ifndef VMS
+#define PATH_SEP ':'
+
+#ifndef __MSDOS__ /* eric ho */
+#define DEFAULT_TAIL "/%f.%d%p"
+#else
+#define DEFAULT_TAIL "/%d/%f.%p"
+#endif
+
+#define DEFAULT_VF_TAIL "/%f.vf"
+#else /* VMS */
+#define PATH_SEP '/'
+#define DEFAULT_TAIL ":%f.%d%p"
+#define DEFAULT_VF_TAIL ":%f.vf"
+#endif /* VMS */
+
+static _Xconst char *font_path;
+static _Xconst char *default_font_path = DEFAULT_FONT_PATH;
+static _Xconst char *vf_path;
+static _Xconst char *default_vf_path = DEFAULT_VF_PATH;
+#ifdef SEARCH_SUBDIRECTORIES
+static char default_subdir_path[] = DEFAULT_SUBDIR_PATH;
+#endif
+static int *sizes, *sizend;
+static char default_size_list[] = DEFAULT_FONT_SIZES;
+
+#ifdef _POSIX_SOURCE
+#include <limits.h>
+#ifdef PATH_MAX
+#define FILENAMESIZE PATH_MAX
+#endif
+#endif
+
+#ifndef FILENAMESIZE
+#define FILENAMESIZE 512
+#endif
+
+#ifdef sun
+char *sprintf();
+#endif
+
+#ifdef SEARCH_SUBDIRECTORIES
+/* We will need some system include files to deal with directories. */
+/* <sys/types.h> was included by xdvi.h. */
+
+#include <sys/stat.h>
+
+static int is_dir ();
+
+#if defined(SYSV) || defined(_POSIX_SOURCE)
+#include <dirent.h>
+typedef struct dirent *directory_entry_type;
+#else
+#include <sys/dir.h>
+typedef struct direct *directory_entry_type;
+#endif
+
+/* Declare the routine to get the current working directory. */
+
+#ifdef HAVE_GETWD
+extern char *getwd ();
+#define GETCWD(b, len) ((b) ? getwd (b) : getwd (xmalloc (len, "getwd")))
+#else
+/* POSIX says getcwd result is undefined if the pointer is NULL; at least
+ on a Convex, the result is a coredump. Hence the GETCWD macro
+ below is defined, as it works regardless of what getcwd() does
+ with a NULL pointer */
+#define GETCWD(b, len) ((b) ? getcwd (b,len) \
+ : getcwd (xmalloc (len, "getcwd"),len))
+#ifdef _POSIX_SOURCE
+#include <unistd.h> /* getcwd prototype */
+#else
+#if NeedFunctionPrototypes
+extern char *getcwd (char *, int);
+#else
+extern char *getcwd ();
+#endif /* not NeedFunctionPrototypes */
+#endif /* not _POSIX_SOURCE */
+#endif /* not HAVE_GETWD */
+
+static char *cwd;
+
+/* The following is a data structure containing the precomputed names of
+ subdirectories to be recursively searched. */
+
+static struct subdir_entry {
+ char *name; /* partial string */
+ _Xconst char *index; /* reference point in {,default_}font_path */
+ struct subdir_entry *next; /* link in list */
+}
+ *subdir_head = NULL,
+ *next_subdir;
+
+#ifndef S_ISDIR
+#define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
+#endif
+
+
+
+/* Return true if FN is a directory or a symlink to a directory,
+ false if not. */
+
+static int
+is_dir (fn)
+ char *fn;
+{
+ struct stat stats;
+
+ return stat (fn, &stats) == 0 && S_ISDIR (stats.st_mode);
+}
+
+/*
+ * Compute extra length of subdirectory entries, including a star for each.
+ */
+
+static int
+extra_len(str1, str2)
+ char *str1, *str2;
+{
+ int bias = 0;
+ char *p = str1;
+ char *q;
+
+ do {
+ q = index(p, PATH_SEP);
+ if (q == NULL) q = p + strlen(p);
+ if (q == p) {
+ if (str2 != NULL) {
+ bias += extra_len(str2, (char *) NULL);
+ str2 = NULL;
+ }
+ }
+ else ++bias; /* don't forget the star */
+ p = q + 1;
+ }
+ while (p[-1] != '\0');
+ return bias + p - str1;
+}
+
+/*
+ * Add the specifiers (and double stars) for the given strings (user
+ * string, plus default string) to the destination string.
+ */
+
+static void
+add_subdir_paths(dst, dst_first, src, src_default)
+ char *dst, *dst_first, *src, *src_default;
+{
+ char *q;
+
+ do {
+ q = index(src, PATH_SEP);
+ if (q == NULL) q = src + strlen(src);
+ if (q == src) {
+ if (src_default != NULL) {
+ add_subdir_paths(dst, dst_first, src_default, (char *)NULL);
+ dst += strlen(dst);
+ src_default = NULL;
+ }
+ }
+ else {
+ if (dst != dst_first) *dst++ = PATH_SEP;
+ bcopy(src, dst, q - src);
+ dst += q - src;
+ *dst++ = '*';
+ }
+ src = q + 1;
+ }
+ while (src[-1] != '\0');
+ *dst = '\0';
+}
+
+/*
+ * Make a subdirectory entry.
+ */
+
+static struct subdir_entry *
+make_subdir_entry(index, name)
+ _Xconst char *index;
+ char *name;
+{
+ struct subdir_entry *new_entry;
+ static struct subdir_entry **subdir_tail = &subdir_head;
+
+ *subdir_tail = new_entry = (struct subdir_entry *)
+ xmalloc(sizeof(struct subdir_entry), "subdirectory list entry");
+ subdir_tail = &(new_entry->next);
+ new_entry->name = strcpy(xmalloc(strlen(name) + 1,
+ "subdirectory entry string"), name);
+ new_entry->index = index;
+ new_entry->next = NULL;
+ return new_entry;
+}
+
+/*
+ * Create the subdirectory linked list for the given initial string
+ */
+
+static void
+add_subdirs(str, len, recurs)
+ _Xconst char *str;
+ int len;
+ Boolean recurs;
+{
+ int len1 = len;
+ char temp[FILENAMESIZE];
+ struct subdir_entry *next_subdir;
+ DIR *dir;
+ directory_entry_type e;
+
+ bcopy(str, temp, len);
+ if (len > 0 && temp[len - 1] != '/') temp[len1++] = '/';
+ temp[len1] = '\0';
+ next_subdir = make_subdir_entry(str, temp + len);
+ do {
+ /* By changing directories, we save a bunch of string
+ concatenations (and make the pathnames the kernel looks up
+ shorter). */
+ Strcpy(temp + len, next_subdir->name);
+ if (chdir (temp) != 0) continue;
+
+ dir = opendir (".");
+ if (dir == NULL) continue;
+
+ len1 = strlen(temp);
+ if (len1 == 0 || temp[len1 - 1] != '/') temp[len1++] = '/';
+ while ((e = readdir (dir)) != NULL) {
+ if (is_dir (e->d_name) && strcmp (e->d_name, ".") != 0
+ && strcmp (e->d_name, "..") != 0) {
+ Strcpy(temp + len1, e->d_name);
+ (void) make_subdir_entry(str, temp + len);
+ }
+ }
+ (void) closedir (dir);
+
+
+ /* Change back to the current directory, in case the path
+ contains relative directory names. */
+ if (chdir (cwd) != 0) {
+ perror (cwd);
+ exit (errno);
+ }
+ }
+ while (recurs && (next_subdir = next_subdir->next) != NULL);
+}
+
+/*
+ * Recursively figure out the subdirectory tree and precompute the
+ * list of subdirectories to search.
+ */
+
+static void
+compute_subdir_paths(fp, fp_default)
+ _Xconst char *fp;
+ _Xconst char *fp_default;
+{
+ _Xconst char *star_loc = NULL;
+ _Xconst char *endp;
+
+ do {
+ if (star_loc == NULL) {
+ star_loc = index(fp, '*');
+ if (star_loc == NULL) star_loc = fp + strlen(fp);
+ }
+ endp = index(fp, PATH_SEP);
+ if (endp == NULL) endp = fp + strlen(fp);
+ if (endp == fp) {
+ if (fp_default != NULL) {
+ compute_subdir_paths(fp_default, (char *) NULL);
+ fp_default = NULL;
+ }
+ }
+ else if (star_loc < endp) {
+ add_subdirs(fp, star_loc - fp, star_loc[1] == '*');
+ star_loc = NULL;
+ }
+ fp = endp + 1;
+ }
+ while (fp[-1] != '\0');
+}
+#endif /* SEARCH_SUBDIRECTORIES */
+
+static void
+get_sizes(size_list, spp)
+ char *size_list;
+ int **spp;
+{
+ if (*size_list == PATH_SEP) ++size_list;
+ for (;;) {
+ *(*spp)++ = atof(size_list) * 5 + 0.5;
+ size_list = index(size_list, PATH_SEP);
+ if (size_list == NULL) return;
+ ++size_list;
+ }
+}
+
+void
+init_font_open()
+{
+ char *size_list;
+ int *sp, *sp1, *sp2;
+ unsigned int n;
+ char *p;
+#ifdef SEARCH_SUBDIRECTORIES
+ char *q;
+#endif
+
+ if ((font_path = getenv("XDVIFONTS")) == NULL
+#ifndef XDVIFONTS_ONLY
+ && (font_path = getenv("PKFONTS")) == NULL
+ && (font_path = getenv("TEXFONTS")) == NULL
+#endif
+ ) {
+ font_path = default_font_path;
+ default_font_path = NULL;
+ }
+
+#ifdef SEARCH_SUBDIRECTORIES
+ p = getenv ("TEXFONTS_SUBDIR");
+ if (p == NULL) p = "";
+ q = xmalloc((unsigned) strlen(font_path)
+ + extra_len(p, default_subdir_path) + 1,
+ "initializing font searching");
+ Strcpy(q, font_path);
+ add_subdir_paths(q + strlen(q), q, p, default_subdir_path);
+ font_path = q;
+
+ /* Unfortunately, we can't look in the environment for the current
+ directory, because if we are running under a program (let's say
+ Emacs), the PWD variable might have been set by Emacs' parent
+ to the current directory at the time Emacs was invoked. This
+ is not necessarily the same directory the user expects to be
+ in. So, we must always call getcwd(3) or getwd(3), even though
+ they are slow and prone to hang in networked installations. */
+ cwd = GETCWD ((char *) NULL, FILENAMESIZE + 2);
+ if (cwd == NULL) {
+ perror ("getcwd");
+ exit (errno);
+ }
+ compute_subdir_paths(font_path, default_font_path);
+#endif
+
+ if ((vf_path = getenv("XDVIVFS")) == NULL
+#ifndef XDVIFONTS_ONLY
+ && (vf_path = getenv("VFFONTS")) == NULL
+#endif
+ ) {
+ vf_path = default_vf_path;
+ default_vf_path = NULL;
+ }
+
+ size_list = getenv("XDVISIZES");
+ n = 1; /* count number of sizes */
+ if (size_list == NULL || *size_list == PATH_SEP)
+ for (p = default_size_list; (p = index(p, PATH_SEP)) != NULL; ++p)
+ ++n;
+ if (size_list != NULL)
+ for (p = size_list; (p = index(p, PATH_SEP)) != NULL; ++p) ++n;
+ sizes = (int *) xmalloc(n * sizeof(int), "size list");
+ sizend = sizes + n;
+ sp = sizes; /* get the actual sizes */
+ if (size_list == NULL || *size_list == PATH_SEP)
+ get_sizes(default_size_list, &sp);
+ if (size_list != NULL) get_sizes(size_list, &sp);
+
+ /* bubble sort the sizes */
+ sp1 = sizend - 1; /* extent of this pass */
+ do {
+ sp2 = NULL;
+ for (sp = sizes; sp < sp1; ++sp)
+ if (*sp > sp[1]) {
+ int i = *sp;
+ *sp = sp[1];
+ sp[1] = i;
+ sp2 = sp;
+ }
+ }
+ while ((sp1 = sp2) != NULL);
+}
+
+/* eric */
+static FILE *
+formatted_open(path, font, gforpk, mag, name, first_try, tail)
+ _Xconst char *path;
+ _Xconst char *font;
+ _Xconst char *gforpk;
+ int mag;
+ char **name;
+ Boolean first_try;
+ _Xconst char *tail;
+{
+ _Xconst char *p = path;
+ char nm[FILENAMESIZE];
+ char *n = nm;
+ char c;
+ Boolean f_used = False;
+ Boolean p_used = False;
+ FILE *f;
+
+
+#ifdef SEARCH_SUBDIRECTORIES
+ if (next_subdir != NULL && next_subdir->index == p) {
+ int len = index(p, '*') - p;
+
+ bcopy(p, n, len);
+ p += len;
+ n += len;
+ Strcpy(n, next_subdir->name);
+ n += strlen(n);
+ ++p;
+ if (*p == '*') ++p;
+ if (*p != '/') *n++ = '/';
+ }
+#endif
+ for (;;) {
+ c = *p++;
+ if (c==PATH_SEP || c=='\0') {
+ if (f_used) break;
+ p = tail;
+ continue;
+ }
+ if (c=='%') {
+ c = *p++;
+ switch (c) {
+ case 'f':
+ f_used = True;
+ Strcpy(n, font);
+ break;
+ case 'p':
+ p_used = True;
+ Strcpy(n, gforpk);
+ break;
+ case 'd':
+ Sprintf(n, "%d", mag);
+ break;
+ default:
+ *n++ = c;
+ *n = '\0';
+ }
+ n += strlen(n);
+ }
+ else *n++ = c;
+ }
+ if (!p_used && !first_try) return NULL;
+ *n = '\0';
+ if (debug & DBG_OPEN) Printf("Trying font file %s\n", nm);
+
+
+ f = xfopen(nm);
+ if (f != NULL) {
+ *name = xmalloc((unsigned) (n - nm + 1), "font file name");
+ Strcpy(*name, nm);
+ }
+ return f;
+}
+
+/*
+ * Try a given size
+ */
+
+static FILE *
+try_size(font, pxlmag, name, x_font_path, x_default_font_path)
+ _Xconst char *font;
+ int pxlmag;
+ char **name;
+ _Xconst char *x_font_path;
+ _Xconst char *x_default_font_path;
+{
+ _Xconst char *p = x_font_path;
+ FILE *f;
+ int pkmag = (pxlmag + 2) / 5;
+
+#ifdef __MSDOS__
+ char *sfont, *dotptr;
+#endif
+
+ /*
+ * loop over paths
+ */
+#ifdef SEARCH_SUBDIRECTORIES
+ next_subdir = subdir_head;
+#endif
+ for (;;) {
+ if (*p == PATH_SEP || *p == '\0') {
+ if (x_default_font_path != NULL &&
+ (f = try_size(font, pxlmag, name, x_default_font_path,
+ (_Xconst char *) NULL)) != NULL)
+ return f;
+ if (*p == '\0') break;
+ }
+ else {
+
+
+
+#define FIRST_TRY True
+#ifdef USE_PK
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+#if defined(__MSDOS__) && !defined(FONTSUB)
+
+ /* I prefer this method because it'll execute a lot */
+ /* faster than looking up the font substitute file */
+
+ /* simply convert all the amXXXX font to cmXXXX */
+ dotptr = strchr (font,'a');
+ if (dotptr != (char *)NULL) {
+ *dotptr = 'c';
+ }
+#endif
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+ if ((f = formatted_open(p, font, "pk", pkmag, name, FIRST_TRY,DEFAULT_TAIL)) != NULL)
+ return f;
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+#if defined(__MSDOS__) && defined(FONTSUB)
+ /* look for the substitute font from file */
+ if (fontsubfile != (FILE *) NULL) {
+ if ((sfont = (char *)subfont((FILE *)fontsubfile,(char *)font)) != (char *)NULL) {
+
+ /* try open font file again */
+ if ((f = formatted_open(p, (_Xconst char *)sfont, "pk", pkmag, name, FIRST_TRY,DEFAULT_TAIL)) != NULL)
+ return f;
+ }
+ }
+#endif
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+#undef FIRST_TRY
+#define FIRST_TRY False
+#endif
+
+
+#ifdef USE_GF
+ if ((f = formatted_open(p, font, "gf", pkmag, name, FIRST_TRY,DEFAULT_TAIL)) != NULL)
+ return f;
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+#if defined( __MSDOS__) && defined(FONTSUB)
+
+ if (fontsubfile != (FILE *) NULL) {
+ /* look for the substitute font from file */
+ if ((sfont = (char *)subfont((FILE *)fontsubfile,font)) != (char *)NULL) {
+
+ /* try open font file again */
+ if ((f = formatted_open(p, sfont, "gf", pkmag, name, FIRST_TRY,DEFAULT_TAIL)) != NULL)
+ return f;
+ }
+ }
+#endif
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+
+#undef FIRST_TRY
+#define FIRST_TRY False
+#endif
+#ifdef USE_PXL
+ if ((f = formatted_open(p, font, "pxl", pxlmag, name, FIRST_TRY,DEFAULT_TAIL)) != NULL)
+ return f;
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+#if defined( __MSDOS__) && defined(FONTSUB)
+
+ if (fontsubfile != (FILE *) NULL) {
+ /* look for the substitute font from file */
+ if ((sfont = (char *)subfont((FILE *)fontsubfile,font)) != (char *)NULL) {
+ /* try open font file again */
+ if ((f = formatted_open(p, sfont, "pxl", pkmag, name, FIRST_TRY,DEFAULT_TAIL)) != NULL)
+ return f;
+ }
+ }
+#endif
+
+/* ---------------------------- MSDOS (Eric Ho) ----------------------------*/
+#endif
+
+#ifdef SEARCH_SUBDIRECTORIES
+ if (next_subdir != NULL && next_subdir->index == p) {
+ next_subdir = next_subdir->next;
+ if (next_subdir != NULL && next_subdir->index == p)
+ continue;
+ }
+#endif
+ p = index(p, PATH_SEP);
+ if (p == NULL) break;
+ }
+ ++p;
+ }
+ return NULL;
+}
+
+/*
+ * Try a virtual font
+ */
+
+static FILE *
+try_vf(font, name, x_vf_path, x_default_vf_path)
+ _Xconst char *font;
+ char **name;
+ _Xconst char *x_vf_path;
+ _Xconst char *x_default_vf_path;
+{
+ _Xconst char *p = x_vf_path;
+ FILE *f;
+
+ /*
+ * loop over paths
+ */
+ for (;;) {
+ if (*p == PATH_SEP || *p == '\0') {
+ if (x_default_vf_path != NULL &&
+ (f = try_vf(font, name, x_default_vf_path,
+ (_Xconst char *) NULL)) != NULL)
+ return f;
+ if (*p == '\0') break;
+ }
+ else {
+ if ((f = formatted_open(p, font, "vf", 0, name, True,
+ DEFAULT_VF_TAIL)) != NULL)
+ return f;
+ p = index(p, PATH_SEP);
+ if (p == NULL) break;
+ }
+ ++p;
+ }
+ return NULL;
+}
+
+#ifdef MAKEPKCMD
+#undef MAKEPK
+#define MAKEPK
+#endif
+
+#ifdef MAKEPK
+#ifndef MAKEPKCMD
+#define MAKEPKCMD "MakeTeXPK"
+#endif
+
+#define NOBUILD 29999
+#endif
+
+/*
+ * Try a given font name
+ */
+
+#ifndef MAKEPK
+#define PRE_FONT_OPEN(font, fmag, mag_ret, name, ignore) \
+ pre_font_open(font, fmag, mag_ret, name)
+#else
+#define PRE_FONT_OPEN pre_font_open
+#endif
+
+static FILE *
+PRE_FONT_OPEN(font, fmag, mag_ret, name, magstepval)
+ _Xconst char *font;
+ float fmag;
+ int *mag_ret;
+ char **name;
+#ifdef MAKEPK
+ int magstepval;
+#endif
+{
+ FILE *f;
+ int *p1, *p2;
+ int mag = 5 * fmag + 0.5;
+ int tmag;
+#ifndef VMS
+ _Xconst char *path_to_use;
+ _Xconst char *vf_path_to_use;
+#endif
+#ifdef MAKEPK
+ char mkpk[80];
+#endif
+
+ /*
+ * Loop over sizes. Try actual size first, then closest sizes.
+ If the pathname is absolutely or explicitly relative, don't
+ use the usual paths to search for it; just look for it in the
+ directory specified.
+ */
+
+#ifndef VMS
+ path_to_use = (_Xconst char *) NULL;
+ if (*font == '/') path_to_use = "/";
+ else if (*font == '.' && (*(font + 1) == '/'
+ || (*(font + 1) == '.' && *(font + 2) == '/')))
+ path_to_use = ".";
+ vf_path_to_use = path_to_use;
+ if (path_to_use == NULL) {
+ path_to_use = font_path;
+ vf_path_to_use = vf_path;
+ }
+#else /* VMS */
+#define path_to_use font_path
+#define vf_path_to_use vf_path
+#endif /* VMS */
+
+ if ((f = try_size(font, *mag_ret = mag, name, path_to_use,
+ default_font_path)) != NULL)
+ return f;
+
+ /* Try at one away from the size we just tried, to account
+ for rounding error. */
+ tmag = mag + (mag < 5 * fmag ? 1 : -1);
+ if ((f = try_size(font, tmag, name, path_to_use, default_font_path))
+ != NULL) {
+ *mag_ret = tmag;
+ return f;
+ }
+
+ /* Try a virtual font. */
+ if ((f = try_vf(font, name, vf_path_to_use, default_vf_path)) != NULL)
+ return f;
+
+#ifdef MAKEPK
+ /* Try to create the font. */
+ if (magstepval != NOBUILD) {
+ char str[24];
+ int dpi = (mag + 2) / 5;
+
+ if (magstepval == NOMAGSTP)
+ Sprintf(str, "%d+%d/%d", dpi / pixels_per_inch,
+ dpi % pixels_per_inch, pixels_per_inch);
+ else if (magstepval < 0)
+ Sprintf(str, "magstep\\(-%d%s\\)", (-magstepval) / 2,
+ magstepval % 2 ? ".5" :"");
+ else
+ Sprintf(str, "magstep\\(%d%s\\)", magstepval / 2,
+ magstepval % 2 ? ".5" :"");
+
+ Sprintf(mkpk, "%s %s %d %d %s", MAKEPKCMD, font, dpi,
+ pixels_per_inch, str);
+ Printf("- %s\n", mkpk);
+ if (system(mkpk) == 0
+ && (f = try_size(font, mag, name, path_to_use,
+ default_font_path))
+ != NULL)
+ return f;
+ }
+#endif
+
+ /* Now try at all the sizes. */
+ for (p2 = sizes; p2 < sizend; ++p2) if (*p2 >= mag) break;
+ p1 = p2;
+ for (;;) {
+ /* find another magnification */
+ if (p1 <= sizes)
+ if (p2 >= sizend) return NULL;
+ else tmag = *p2++;
+ else if (p2 >= sizend || (long) mag * mag <= (long) p1[-1] * *p2)
+ tmag = *--p1;
+ else tmag = *p2++;
+ if ((f = try_size(font, *mag_ret = tmag, name, path_to_use,
+ default_font_path)) != NULL)
+ return f;
+ }
+}
+
+/* ARGSUSED */
+FILE *
+font_open(font, font_ret, mag, mag_ret, magstepval, name)
+ _Xconst char *font;
+ char **font_ret;
+ WIDEARG(float, double) mag;
+ int *mag_ret;
+ int magstepval;
+ char **name;
+{
+ FILE *f;
+ int actual_pt, low_pt, high_pt, trial_pt;
+ char fn[50], *fnend;
+
+ f = PRE_FONT_OPEN(font, mag, mag_ret, name, magstepval);
+ if (f != NULL) {
+ *font_ret = NULL;
+ return f;
+ }
+ Strcpy(fn, font);
+ fnend = fn + strlen(fn);
+ while (fnend > fn && fnend[-1] >= '0' && fnend[-1] <= '9') --fnend;
+ actual_pt = low_pt = high_pt = atoi(fnend);
+ if (actual_pt) {
+ low_pt = actual_pt - 1;
+ high_pt = actual_pt + 1;
+ for (;;) {
+ if (2 * low_pt >= actual_pt &&
+ (low_pt * high_pt > actual_pt * actual_pt ||
+ high_pt > actual_pt + 5))
+ trial_pt = low_pt--;
+ else if (high_pt > actual_pt + 5) break;
+ else trial_pt = high_pt++;
+ Sprintf(fnend, "%d", trial_pt);
+ f = PRE_FONT_OPEN(fn, mag * actual_pt / trial_pt, mag_ret,
+ name, NOBUILD);
+ if (f != NULL) {
+ *font_ret = strcpy(xmalloc((unsigned) strlen(fn) + 1,
+ "name of font used"), fn);
+ return f;
+ }
+ }
+ }
+ if (alt_font != NULL) {
+ f = PRE_FONT_OPEN(alt_font, mag, mag_ret, name, NOBUILD);
+ if (f != NULL)
+ *font_ret = strcpy(xmalloc((unsigned) strlen(alt_font) + 1,
+ "name of font used"), alt_font);
+ }
+ return f;
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/fontfmts.c b/systems/msdos/dviware/xdvi-dos/src/fontfmts.c
new file mode 100644
index 0000000000..69a0963d09
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/fontfmts.c
@@ -0,0 +1,21 @@
+#include "xdvi.h"
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#endif
+
+/***
+ *** Font reading routines are read into this file.
+ ***/
+
+#ifdef USE_PK
+#include "pk.c"
+#endif
+
+#ifdef USE_GF
+#include "gf.c"
+#endif
+
+#ifdef USE_PXL
+#include "pxl.c"
+#endif
diff --git a/systems/msdos/dviware/xdvi-dos/src/fontsub.c b/systems/msdos/dviware/xdvi-dos/src/fontsub.c
new file mode 100644
index 0000000000..0ad76638d6
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/fontsub.c
@@ -0,0 +1,62 @@
+/* ------------------------------ For MsDos -------------------------------*/
+
+/*
+
+ These routines are written for opening and searching the font
+ substitute file pointed to by the environmental variable "TEXFONTSUB"
+
+ 10/OCT/1992 Eric Ho 9041477@SSCVAX.MCMASTER.CA
+
+*/
+
+#ifdef FONTSUB
+
+#include <stdio.h>
+#include <stdlib.h>
+
+FILE *openfontsubfile (void);
+char *subfont (FILE *,char *);
+
+
+char *subfont (fptr,font)
+FILE *fptr;
+char *font;
+{
+ char ofont[30], /* original font */
+ sfont[30]; /* font to be substitute */
+
+ rewind (fptr);
+ while (!feof (fptr)) {
+ fscanf (fptr,"%s -> %s",ofont,sfont);
+ if (strcmp (ofont,font) == 0) {
+/* fprintf (stderr,"Replacing %s with %s\n",font,sfont); */
+ return (sfont);
+ }
+ }
+ return (NULL);
+}
+
+
+
+FILE *openfontsubfile (void)
+{
+ FILE *fptr;
+ char fontsfname[64],
+ *sptr; /* font substitue file name */
+
+ if ((sptr = (char *) getenv ("TEXFONTSUB")) != (char *) NULL) {
+ (void) strcpy (fontsfname,sptr);
+ if ((fptr = fopen (fontsfname,"r")) != (FILE *) NULL) {
+ return ((FILE *) fptr);
+ } else {
+ fprintf (stderr,"\n\nFont substitute file not found!\n");
+ fprintf (stderr,"Check environmental variable TEXFONTSUB!\n\n");
+ return ((FILE *) NULL);
+ }
+ } else {
+ fprintf (stderr,"\n\nCheck environmental variable TEXFONTSUB!\n\n");
+ return ((FILE *) NULL);
+ }
+}
+
+#endif
diff --git a/systems/msdos/dviware/xdvi-dos/src/gf.c b/systems/msdos/dviware/xdvi-dos/src/gf.c
new file mode 100644
index 0000000000..cc6b9423fe
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/gf.c
@@ -0,0 +1,294 @@
+/***
+ *** GF font reading routines.
+ *** Public routines are read_GF_index and read_GF_char.
+ ***/
+
+#define PAINT_0 0
+#define PAINT1 64
+#define PAINT2 65
+#define PAINT3 66
+#define BOC 67
+#define BOC1 68
+#define EOC 69
+#define SKIP0 70
+#define SKIP1 71
+#define SKIP2 72
+#define SKIP3 73
+#define NEW_ROW_0 74
+#define NEW_ROW_MAX 238
+#define XXX1 239
+#define XXX2 240
+#define XXX3 241
+#define XXX4 242
+#define YYY 243
+#define NO_OP 244
+#define CHAR_LOC 245
+#define CHAR_LOC0 246
+#define PRE 247
+#define POST 248
+#define POST_POST 249
+
+#define GF_ID_BYTE 131
+#define TRAILER 223 /* Trailing bytes at end of file */
+
+static FILE *GF_file;
+
+static void
+expect(ch)
+ ubyte ch;
+{
+ ubyte ch1 = one(GF_file);
+
+ if (ch1 != ch)
+ oops("Bad GF file: %d expected, %d received.", ch, ch1);
+}
+
+static void
+too_many_bits(ch)
+ ubyte ch;
+{
+ oops("Too many bits found when loading character %d", ch);
+}
+
+/*
+ * Public routines
+ */
+
+
+static void
+read_GF_char(fontp, ch)
+ register struct font *fontp;
+ ubyte ch;
+{
+ register struct glyph *g;
+ ubyte cmnd;
+ int min_m, max_m, min_n, max_n;
+ BMUNIT *cp, *basep, *maxp;
+ int bytes_wide;
+ Boolean paint_switch;
+#define White False
+#define Black True
+ Boolean new_row;
+ int count;
+ int word_weight;
+
+ g = &fontp->glyph[ch];
+ GF_file = fontp->file;
+
+ if(debug & DBG_PK)
+ Printf("Loading gf char %d", ch);
+
+ for (;;) {
+ switch (cmnd = one(GF_file)) {
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ Fseek(GF_file, (long) num(GF_file,
+ WIDEARG(,(int)) cmnd - XXX1 + 1), 1);
+ continue;
+ case YYY:
+ (void) four(GF_file);
+ continue;
+ case BOC:
+ (void) four(GF_file); /* skip character code */
+ (void) four(GF_file); /* skip pointer to prev char */
+ min_m = sfour(GF_file);
+ max_m = sfour(GF_file);
+ g->x = -min_m;
+ min_n = sfour(GF_file);
+ g->y = max_n = sfour(GF_file);
+ g->bitmap.w = max_m - min_m + 1;
+ g->bitmap.h = max_n - min_n + 1;
+ break;
+ case BOC1:
+ (void) one(GF_file); /* skip character code */
+ g->bitmap.w = one(GF_file); /* max_m - min_m */
+ g->x = g->bitmap.w - one(GF_file); /* ditto - max_m */
+ ++g->bitmap.w;
+ g->bitmap.h = one(GF_file) + 1;
+ g->y = one(GF_file);
+ break;
+ default:
+ oops("Bad BOC code: %d", cmnd);
+ }
+ break;
+ }
+ paint_switch = White;
+
+ if (debug & DBG_PK)
+ Printf(", size=%dx%d, dvi_adv=%d\n", g->bitmap.w, g->bitmap.h,
+ g->dvi_adv);
+
+ alloc_bitmap(&g->bitmap);
+ cp = basep = (BMUNIT *) g->bitmap.bits;
+/*
+ * Read character data into *basep
+ */
+ bytes_wide = ROUNDUP(g->bitmap.w, BITS_PER_BMUNIT) * BYTES_PER_BMUNIT;
+ maxp = ADD(basep, g->bitmap.h * bytes_wide);
+ bzero(g->bitmap.bits, g->bitmap.h * bytes_wide);
+ new_row = False;
+ word_weight = BITS_PER_BMUNIT;
+ for (;;) {
+ count = -1;
+ cmnd = one(GF_file);
+ if (cmnd < 64) count = cmnd;
+ else if (cmnd >= NEW_ROW_0 && cmnd <= NEW_ROW_MAX) {
+ count = cmnd - NEW_ROW_0;
+ paint_switch = White; /* it'll be complemented later */
+ new_row = True;
+ }
+ else switch (cmnd) {
+ case PAINT1:
+ case PAINT2:
+ case PAINT3:
+ count = num(GF_file, WIDEARG(,(int)) cmnd - PAINT1 + 1);
+ break;
+ case EOC:
+ if (cp >= ADD(basep, bytes_wide)) too_many_bits(ch);
+ return;
+ case SKIP1:
+ case SKIP2:
+ case SKIP3:
+ *((char **) &basep) +=
+ num(GF_file, WIDEARG(,(int)) cmnd - SKIP0) * bytes_wide;
+ case SKIP0:
+ new_row = True;
+ paint_switch = White;
+ break;
+ case XXX1:
+ case XXX2:
+ case XXX3:
+ case XXX4:
+ Fseek(GF_file, (long) num(GF_file,
+ WIDEARG(,(int)) cmnd - XXX1 + 1), 1);
+ break;
+ case YYY:
+ (void) four(GF_file);
+ break;
+ case NO_OP:
+ break;
+ default:
+ oops("Bad command in GF file: %d", cmnd);
+ } /* end switch */
+ if (new_row) {
+ *((char **) &basep) += bytes_wide;
+ if (basep >= maxp || cp >= basep) too_many_bits(ch);
+ cp = basep;
+ word_weight = BITS_PER_BMUNIT;
+ new_row = False;
+ }
+ if (count >= 0) {
+ while (count)
+ if (count <= word_weight) {
+#ifndef MSBITFIRST
+ if (paint_switch)
+ *cp |= bit_masks[count] <<
+ (BITS_PER_BMUNIT - word_weight);
+#endif
+ word_weight -= count;
+#ifdef MSBITFIRST
+ if (paint_switch)
+ *cp |= bit_masks[count] << word_weight;
+#endif
+ break;
+ }
+ else {
+ if (paint_switch)
+#ifndef MSBITFIRST
+ *cp |= bit_masks[word_weight] <<
+ (BITS_PER_BMUNIT - word_weight);
+#else
+ *cp |= bit_masks[word_weight];
+#endif
+ cp++;
+ count -= word_weight;
+ word_weight = BITS_PER_BMUNIT;
+ }
+ paint_switch = 1 - paint_switch;
+ }
+ } /* end for */
+}
+
+
+void
+read_GF_index(fontp)
+ register struct font *fontp;
+{
+ int hppp, vppp;
+ ubyte ch, cmnd;
+ register struct glyph *g;
+
+ fontp->read_char = read_GF_char;
+ GF_file = fontp->file;
+ if (debug & DBG_PK)
+ Printf("Reading GF pixel file %s\n", fontp->filename);
+/*
+ * Find postamble.
+ */
+ Fseek(GF_file, (long) -4, 2);
+ while (four(GF_file) !=
+ ((long) TRAILER << 24 | TRAILER << 16 | TRAILER << 8 | TRAILER))
+ Fseek(GF_file, (long) -5, 1);
+ Fseek(GF_file, (long) -5, 1);
+ for (;;) {
+ ch = one(GF_file);
+ if (ch != TRAILER) break;
+ Fseek(GF_file, (long) -2, 1);
+ }
+ if (ch != GF_ID_BYTE) oops("Bad end of font file %s", fontp->fontname);
+ Fseek(GF_file, (long) -6, 1);
+ expect(POST_POST);
+ Fseek(GF_file, sfour(GF_file), 0); /* move to postamble */
+/*
+ * Read postamble.
+ */
+ expect(POST);
+ (void) four(GF_file); /* pointer to last eoc + 1 */
+ (void) four(GF_file); /* skip design size */
+ (void) four(GF_file); /* skip checksum */
+ hppp = sfour(GF_file);
+ vppp = sfour(GF_file);
+ if (hppp != vppp && (debug & DBG_PK))
+ Printf("Font has non-square aspect ratio %d:%d\n", vppp, hppp);
+ (void) four(GF_file); /* skip min_m */
+ (void) four(GF_file); /* skip max_m */
+ (void) four(GF_file); /* skip min_n */
+ (void) four(GF_file); /* skip max_n */
+/*
+ * Prepare glyph array.
+ */
+ fontp->glyph = (struct glyph *) xmalloc(256 * sizeof(struct glyph),
+ "glyph array");
+ bzero((char *) fontp->glyph, 256 * sizeof(struct glyph));
+/*
+ * Read glyph directory.
+ */
+ while ((cmnd = one(GF_file)) != POST_POST) {
+ int addr;
+
+ ch = one(GF_file); /* character code */
+ g = &fontp->glyph[ch];
+ switch (cmnd) {
+ case CHAR_LOC:
+ /* g->pxl_adv = sfour(GF_file); */
+ (void) four(GF_file);
+ (void) four(GF_file); /* skip dy */
+ break;
+ case CHAR_LOC0:
+ /* g->pxl_adv = one(GF_file) << 16; */
+ (void) one(GF_file);
+ break;
+ default:
+ oops("Non-char_loc command found in GF preamble: %d",
+ cmnd);
+ }
+ g->dvi_adv = fontp->dimconv * sfour(GF_file);
+ addr = four(GF_file);
+ if (addr != -1) g->addr = addr;
+ if (debug & DBG_PK)
+ Printf("Read GF glyph for character %d; dy = %d, addr = %d\n",
+ ch, g->dvi_adv, addr);
+ }
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/makefile b/systems/msdos/dviware/xdvi-dos/src/makefile
new file mode 100644
index 0000000000..6c817e2869
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/makefile
@@ -0,0 +1,36 @@
+
+# Makefile for dvi previewer (MSDOS version under dv/x).
+# eric ho
+
+
+# -DFONTSUB for running using font substitute file
+#
+DEFS= -DUSE_PK -DNOTOOL -DBMLONG -DGREY -DFONTSUB
+
+#DEFS= -DUSE_PK -DNOTOOL -DBMLONG -DGREY
+
+
+CFLAGS=-O2 -finline-functions -m486 -fexpensive-optimizations -Wall $(DEFS)
+LIBS= -lxt -lxmu -lxext -lxaw -lx -lsys -lm
+SRCS=xdvi.c dvi_init.c dvi_draw.c fontfmts.c vf.c util.c font_open.c tpic.c fontsub.c
+OBJS=xdvi.o dvi_init.o dvi_draw.o fontfmts.o vf.o util.o font_open.o tpic.o fontsub.o
+CC=gcc
+
+.c.o:
+ $(CC) -c $(CFLAGS) $*.c
+
+xdvi: $(OBJS)
+ $(CC) -o xdvi *.o $(LIBS)
+ strip +strip-all xdvi
+ aout2exe xdvi
+
+xdvi.o: xdvi.h patchlevel.h xdvi_curs.h xdvi_mask.h
+dvi_init.o: xdvi.h dvi.h
+dvi_draw.o: xdvi.h dvi.h
+tpic.o: xdvi.h
+fontfmts.o: xdvi.h pk.c gf.c pxl.c
+util.o: xdvi.h
+
+font_open.o: font_open.c xdvi.h
+ $(CC) -c $(CFLAGS) font_open.c
+
diff --git a/systems/msdos/dviware/xdvi-dos/src/makefile.bak b/systems/msdos/dviware/xdvi-dos/src/makefile.bak
new file mode 100644
index 0000000000..135ee67d22
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/makefile.bak
@@ -0,0 +1,36 @@
+
+# Makefile for dvi previewer (MSDOS version under dv/x).
+# eric ho
+
+
+# -DFONTSUB for running using font substitute file
+#
+#DEFS= -DUSE_PK -DNOTOOL -DBMLONG -DGREY -DFONTSUB
+
+DEFS= -DUSE_PK -DNOTOOL -DBMLONG -DGREY
+
+
+CFLAGS=-O2 -finline-functions -m486 -fexpensive-optimizations -Wall $(DEFS)
+LIBS= -lxt -lxmu -lxext -lxaw -lx -lsys -lm
+SRCS=xdvi.c dvi_init.c dvi_draw.c fontfmts.c vf.c util.c font_open.c tpic.c fontsub.c
+OBJS=xdvi.o dvi_init.o dvi_draw.o fontfmts.o vf.o util.o font_open.o tpic.o fontsub.o
+CC=gcc
+
+.c.o:
+ $(CC) -c $(CFLAGS) $*.c
+
+xdvi: $(OBJS)
+ $(CC) -o xdvi *.o $(LIBS)
+ strip +strip-all xdvi
+ aout2exe xdvi
+
+xdvi.o: xdvi.h patchlevel.h xdvi_curs.h xdvi_mask.h
+dvi_init.o: xdvi.h dvi.h
+dvi_draw.o: xdvi.h dvi.h
+tpic.o: xdvi.h
+fontfmts.o: xdvi.h pk.c gf.c pxl.c
+util.o: xdvi.h
+
+font_open.o: font_open.c xdvi.h
+ $(CC) -c $(CFLAGS) font_open.c
+
diff --git a/systems/msdos/dviware/xdvi-dos/src/maketexp b/systems/msdos/dviware/xdvi-dos/src/maketexp
new file mode 100644
index 0000000000..5c63ed3fb9
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/maketexp
@@ -0,0 +1,141 @@
+#!/bin/sh
+#
+# This script file makes a new TeX PK font, because one wasn't
+# found. Parameters are:
+#
+# name dpi bdpi magnification [mode [subdir]]
+#
+# `name' is the name of the font, such as `cmr10'. `dpi' is
+# the resolution the font is needed at. `bdpi' is the base
+# resolution, useful for figuring out the mode to make the font
+# in. `magnification' is a string to pass to MF as the
+# magnification. `mode', if supplied, is the mode to use.
+#
+# Note that this file must execute Metafont, and then gftopk,
+# and place the result in the correct location for the PostScript
+# driver to find it subsequently. If this doesn't work, it will
+# be evident because MF will be invoked over and over again.
+#
+# Of course, it needs to be set up for your site.
+#
+TEXDIR=/usr/lib/tex
+LOCALDIR=/LocalLibrary/Fonts/TeXFonts
+DESTDIR=$LOCALDIR/pk
+#
+# TEMPDIR needs to be unique for each process because of the possibility
+# of simultaneous processes running this script.
+#
+if test "$TMPDIR" = ""
+then
+ TEMPDIR=/tmp/mtpk.$$
+else
+ TEMPDIR=$TMPDIR/mtpk.$$
+fi
+NAME=$1
+DPI=$2
+BDPI=$3
+MAG=$4
+MODE=$5
+
+umask 0
+
+if test "$MODE" = ""
+then
+ if test $BDPI = 300
+ then
+ MODE=imagen
+ elif test $BDPI = 200
+ then
+ MODE=FAX
+ elif test $BDPI = 360
+ then
+ MODE=nextII
+ elif test $BDPI = 400
+ then
+ MODE=nexthi
+ elif test $BDPI = 100
+ then
+ MODE=nextscreen
+ elif test $BDPI = 635
+ then
+ MODE=linolo
+ elif test $BDPI = 1270
+ then
+ MODE=linohi
+ elif test $BDPI = 2540
+ then
+ MODE=linosuper
+ else
+ echo "I don't know the mode for $BDPI"
+ echo "Have your system admin update MakeTeXPK"
+ exit 1
+ fi
+fi
+
+# Something like the following is useful at some sites.
+# DESTDIR=/usr/local/lib/tex/fonts/pk.$MODE
+GFNAME=$NAME.$DPI'gf'
+PKNAME=$NAME.$DPI'pk'
+
+# Clean up on normal or abnormal exit
+trap "cd /; /bin/rm -rf $TEMPDIR $DESTDIR/pktmp.$$" 0 1 2 15
+
+
+if test ! -d $DESTDIR
+then
+ mkdir $DESTDIR
+fi
+
+if test "$6" != ""
+then
+ DESTDIR=$DESTDIR"$6"
+ if test ! -d $DESTDIR
+ then
+ mkdir $DESTDIR
+ fi
+fi
+
+mkdir $TEMPDIR
+cd $TEMPDIR
+
+if test -r $DESTDIR/$PKNAME
+then
+ echo "$DESTDIR/$PKNAME already exists!"
+ exit 0
+fi
+
+# check also in the standard place
+
+if test "$6" = ""
+then
+ if test -r $TEXDIR/fonts/pk/$PKNAME
+ then
+ echo $TEXDIR/fonts/pk/$PKNAME already exists!
+ exit 0
+ fi
+else
+ if test -r $TEXDIR/fonts/pk/$6"$PKNAME"
+ then
+ echo $TEXDIR/fonts/pk/$6"$PKNAME" already exists!
+ exit 0
+ fi
+fi
+
+echo "mf \"\\mode:=$MODE; mag:=$MAG; scrollmode; input $NAME\" < /dev/null"
+mf "\mode:=$MODE; mag:=$MAG; scrollmode; input $NAME" < /dev/null
+if test ! -r $GFNAME
+then
+ echo "Metafont failed for some reason on $GFNAME"
+ exit 1
+fi
+
+gftopk -v ./$GFNAME ./$PKNAME
+
+# Install the PK file carefully, since others may be doing the same
+# as us simultaneously.
+
+mv $PKNAME $DESTDIR/pktmp.$$
+cd $DESTDIR
+mv pktmp.$$ $PKNAME
+
+exit 0
diff --git a/systems/msdos/dviware/xdvi-dos/src/patchlev.h b/systems/msdos/dviware/xdvi-dos/src/patchlev.h
new file mode 100644
index 0000000000..0eee8898e5
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/patchlev.h
@@ -0,0 +1 @@
+#define PATCHLEVEL 16
diff --git a/systems/msdos/dviware/xdvi-dos/src/pk.c b/systems/msdos/dviware/xdvi-dos/src/pk.c
new file mode 100644
index 0000000000..969245fdd1
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/pk.c
@@ -0,0 +1,324 @@
+/***
+ *** PK font reading routines.
+ *** Public routines are read_PK_index and read_PK_char.
+ ***/
+
+#define PK_ID 89
+#define PK_CMD_START 240
+#define PK_X1 240
+#define PK_X2 241
+#define PK_X3 242
+#define PK_X4 243
+#define PK_Y 244
+#define PK_POST 245
+#define PK_NOOP 246
+#define PK_PRE 247
+
+static int PK_flag_byte;
+static unsigned PK_input_byte;
+static int PK_bitpos;
+static int PK_dyn_f;
+static int PK_repeat_count;
+
+static int
+PK_get_nyb(fp)
+ register FILE *fp;
+{
+ unsigned temp;
+ if (PK_bitpos < 0) {
+ PK_input_byte = one(fp);
+ PK_bitpos = 4;
+ }
+ temp = PK_input_byte >> PK_bitpos;
+ PK_bitpos -= 4;
+ return (temp & 0xf);
+}
+
+
+static int
+PK_packed_num(fp)
+ register FILE *fp;
+{
+ int i,j;
+
+ if ((i = PK_get_nyb(fp)) == 0) {
+ do {
+ j = PK_get_nyb(fp);
+ ++i;
+ }
+ while (j == 0);
+ while (i > 0) {
+ j = (j << 4) | PK_get_nyb(fp);
+ --i;
+ }
+ return (j - 15 + ((13 - PK_dyn_f) << 4) + PK_dyn_f);
+ }
+ else {
+ if (i <= PK_dyn_f) return i;
+ if (i < 14)
+ return (((i - PK_dyn_f - 1) << 4) + PK_get_nyb(fp)
+ + PK_dyn_f + 1);
+ if (i == 14) PK_repeat_count = PK_packed_num(fp);
+ else PK_repeat_count = 1;
+ return PK_packed_num(fp);
+ }
+}
+
+
+static void
+PK_skip_specials(fontp)
+ register struct font *fontp;
+{
+ int i,j;
+ register FILE *fp = fontp->file;
+
+ do {
+ PK_flag_byte = one(fp);
+ if (PK_flag_byte >= PK_CMD_START) {
+ switch (PK_flag_byte) {
+ case PK_X1 :
+ case PK_X2 :
+ case PK_X3 :
+ case PK_X4 :
+ i = 0;
+ for (j = PK_CMD_START; j <= PK_flag_byte; ++j)
+ i = (i << 8) | one(fp);
+ while (i--) (void) one(fp);
+ break;
+ case PK_Y :
+ (void) four(fp);
+ case PK_POST :
+ case PK_NOOP :
+ break;
+ default :
+ oops("Unexpected %d in PK file %s", PK_flag_byte,
+ fontp->filename);
+ break;
+ }
+ }
+ }
+ while (PK_flag_byte != PK_POST && PK_flag_byte >= PK_CMD_START);
+}
+
+/*
+ * Public routines
+ */
+
+static void
+read_PK_char(fontp, ch)
+ register struct font *fontp;
+ ubyte ch;
+{
+ int i, j;
+ int n;
+ int row_bit_pos;
+ Boolean paint_switch;
+ BMUNIT *cp;
+ register struct glyph *g;
+ register FILE *fp = fontp->file;
+ long fpwidth;
+ BMUNIT word;
+ int word_weight, bytes_wide;
+ int rows_left, h_bit, count;
+
+ g = &fontp->glyph[ch];
+ PK_flag_byte = g->x2;
+ PK_dyn_f = PK_flag_byte >> 4;
+ paint_switch = ((PK_flag_byte & 8) != 0);
+ PK_flag_byte &= 0x7;
+ if (PK_flag_byte == 7) n = 4;
+ else if (PK_flag_byte > 3) n = 2;
+ else n = 1;
+
+ if (debug & DBG_PK) Printf("loading pk char %d, char type %d ", ch, n);
+
+ /*
+ * now read rest of character preamble
+ */
+ if (n != 4) fpwidth = num(fp, 3);
+ else {
+ fpwidth = sfour(fp);
+ (void) four(fp); /* horizontal escapement */
+ }
+ (void) num(fp, n); /* vertical escapement */
+ {
+ unsigned long w, h;
+
+ w = num(fp, n);
+ h = num(fp, n);
+ if (w > 0x7fff || h > 0x7fff)
+ oops("Character %d too large in file %s", ch, fontp->fontname);
+ g->bitmap.w = w;
+ g->bitmap.h = h;
+ }
+ g->x = snum(fp, n);
+ g->y = snum(fp, n);
+
+ g->dvi_adv = fontp->dimconv * fpwidth;
+
+ if (debug & DBG_PK) {
+ if (g->bitmap.w != 0)
+ Printf(", size=%dx%d, dvi_adv=%ld", g->bitmap.w, g->bitmap.h,
+ g->dvi_adv);
+ Putchar('\n');
+ }
+
+ alloc_bitmap(&g->bitmap);
+ cp = (BMUNIT *) g->bitmap.bits;
+
+ /*
+ * read character data into *cp
+ */
+ bytes_wide = ROUNDUP(g->bitmap.w, BITS_PER_BMUNIT) * BYTES_PER_BMUNIT;
+ PK_bitpos = -1;
+ if (PK_dyn_f == 14) { /* get raster by bits */
+ bzero(g->bitmap.bits, g->bitmap.h * bytes_wide);
+ for (i = 0; i < g->bitmap.h; i++) { /* get all rows */
+ cp = ADD(g->bitmap.bits, i * bytes_wide);
+#ifndef MSBITFIRST
+ row_bit_pos = -1;
+#else
+ row_bit_pos = BITS_PER_BMUNIT;
+#endif
+ for (j = 0; j < g->bitmap.w; j++) { /* get one row */
+ if (--PK_bitpos < 0) {
+ word = one(fp);
+ PK_bitpos = 7;
+ }
+#ifndef MSBITFIRST
+ if (++row_bit_pos >= BITS_PER_BMUNIT) {
+ cp++;
+ row_bit_pos = 0;
+ }
+#else
+ if (--row_bit_pos < 0) {
+ cp++;
+ row_bit_pos = BITS_PER_BMUNIT - 1;
+ }
+#endif
+ if (word & (1 << PK_bitpos)) *cp |= 1 << row_bit_pos;
+ }
+ }
+ }
+ else { /* get packed raster */
+ rows_left = g->bitmap.h;
+ h_bit = g->bitmap.w;
+ PK_repeat_count = 0;
+ word_weight = BITS_PER_BMUNIT;
+ word = 0;
+ while (rows_left > 0) {
+ count = PK_packed_num(fp);
+ while (count > 0) {
+ if (count < word_weight && count < h_bit) {
+#ifndef MSBITFIRST
+ if (paint_switch)
+ word |= bit_masks[count] <<
+ (BITS_PER_BMUNIT - word_weight);
+#endif
+ h_bit -= count;
+ word_weight -= count;
+#ifdef MSBITFIRST
+ if (paint_switch)
+ word |= bit_masks[count] << word_weight;
+#endif
+ count = 0;
+ }
+ else if (count >= h_bit && h_bit <= word_weight) {
+ if (paint_switch)
+ word |= bit_masks[h_bit] <<
+#ifndef MSBITFIRST
+ (BITS_PER_BMUNIT - word_weight);
+#else
+ (word_weight - h_bit);
+#endif
+ *cp++ = word;
+ /* "output" row(s) */
+ for (i = PK_repeat_count * bytes_wide /
+ BYTES_PER_BMUNIT; i > 0; --i) {
+ *cp = *SUB(cp, bytes_wide);
+ ++cp;
+ }
+ rows_left -= PK_repeat_count + 1;
+ PK_repeat_count = 0;
+ word = 0;
+ word_weight = BITS_PER_BMUNIT;
+ count -= h_bit;
+ h_bit = g->bitmap.w;
+ }
+ else {
+ if (paint_switch)
+#ifndef MSBITFIRST
+ word |= bit_masks[word_weight] <<
+ (BITS_PER_BMUNIT - word_weight);
+#else
+ word |= bit_masks[word_weight];
+#endif
+ *cp++ = word;
+ word = 0;
+ count -= word_weight;
+ h_bit -= word_weight;
+ word_weight = BITS_PER_BMUNIT;
+ }
+ }
+ paint_switch = 1 - paint_switch;
+ }
+ if (cp != ((BMUNIT *) (g->bitmap.bits + bytes_wide * g->bitmap.h)))
+ oops("Wrong number of bits stored: char. %d, font %s", ch,
+ fontp->fontname);
+ if (rows_left != 0 || h_bit != g->bitmap.w)
+ oops("Bad pk file (%s), too many bits", fontp->fontname);
+ }
+}
+
+void
+read_PK_index(fontp)
+ register struct font *fontp;
+{
+ int hppp, vppp;
+
+ fontp->read_char = read_PK_char;
+ if (debug & DBG_PK)
+ Printf("Reading PK pixel file %s\n", fontp->filename);
+
+ Fseek(fontp->file, (long) one(fontp->file), 1); /* skip comment */
+
+ (void) four(fontp->file); /* skip design size */
+ (void) four(fontp->file); /* skip checksum */
+ hppp = sfour(fontp->file);
+ vppp = sfour(fontp->file);
+ if (hppp != vppp && (debug & DBG_PK))
+ Printf("Font has non-square aspect ratio %d:%d\n", vppp, hppp);
+ /*
+ * Prepare glyph array.
+ */
+ fontp->glyph = (struct glyph *) xmalloc(256 * sizeof(struct glyph),
+ "glyph array");
+ bzero((char *) fontp->glyph, 256 * sizeof(struct glyph));
+ /*
+ * Read glyph directory (really a whole pass over the file).
+ */
+ for (;;) {
+ int bytes_left, flag_low_bits;
+ unsigned int ch;
+
+ PK_skip_specials(fontp);
+ if (PK_flag_byte == PK_POST) break;
+ flag_low_bits = PK_flag_byte & 0x7;
+ if (flag_low_bits == 7) {
+ bytes_left = four(fontp->file);
+ ch = four(fontp->file);
+ } else if (flag_low_bits > 3) {
+ bytes_left = ((flag_low_bits - 4) << 16) + two(fontp->file);
+ ch = one(fontp->file);
+ } else {
+ bytes_left = (flag_low_bits << 8) + one(fontp->file);
+ ch = one(fontp->file);
+ }
+ fontp->glyph[ch].addr = ftell(fontp->file);
+ fontp->glyph[ch].x2 = PK_flag_byte;
+ Fseek(fontp->file, (long) bytes_left, 1);
+ if (debug & DBG_PK)
+ Printf("Scanning pk char %u, at %ld.\n", ch,
+ fontp->glyph[ch].addr);
+ }
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/pxl.c b/systems/msdos/dviware/xdvi-dos/src/pxl.c
new file mode 100644
index 0000000000..1841aa614a
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/pxl.c
@@ -0,0 +1,166 @@
+/***
+ *** PXL font reading routines.
+ *** Public routines are read_PXL_index and read_PXL_char.
+ ***/
+
+#ifndef MSBITFIRST
+static unsigned char _reverse_byte[0x100] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+#endif /* MSBITFIRST */
+
+static void
+read_PXL_char(fontp, ch)
+ register struct font *fontp;
+ ubyte ch;
+{
+ register struct bitmap *bitmap;
+ register BMUNIT *ptr;
+ register FILE *fp = fontp->file;
+ register int i, j;
+#ifndef BMLONG
+ register int padding_length;
+#endif
+
+ bitmap = &fontp->glyph[ch].bitmap;
+ /* in file, bitmap rows are multiples of 32 bits wide */
+ alloc_bitmap(bitmap);
+ ptr = (BMUNIT *) bitmap->bits;
+#ifndef BMLONG
+ padding_length = 3 - (bitmap->bytes_wide + 3) % 4;
+#endif
+ for (i = bitmap->h; i > 0; --i) {
+ for (j = bitmap->bytes_wide; j > 0; j -= BYTES_PER_BMUNIT) {
+#ifndef MSBITFIRST
+ *ptr = _reverse_byte[one(fp)];
+#if BYTES_PER_BMUNIT > 1
+ *ptr |= (BMUNIT) _reverse_byte[one(fp)] << 8;
+#endif
+#ifdef BMLONG
+ *ptr |= (BMUNIT) _reverse_byte[one(fp)] << 16;
+ *ptr |= (BMUNIT) _reverse_byte[one(fp)] << 24;
+#endif
+#else /* MSBITFIRST */
+ *ptr = 0;
+#ifdef BMLONG
+ *ptr |= (BMUNIT) one(fp) << 24;
+ *ptr |= (BMUNIT) one(fp) << 16;
+#endif
+#if BYTES_PER_BMUNIT > 1
+ *ptr |= (BMUNIT) one(fp) << 8;
+#endif
+ *ptr |= (BMUNIT) one(fp);
+#endif /* MSBITFIRST */
+ ++ptr;
+ }
+#ifndef BMLONG
+ for (j = padding_length; j > 0; --j) (void) one(fp);
+#endif
+ }
+}
+
+void
+read_PXL_index(fontp)
+ register struct font *fontp;
+{
+ register FILE *fp = fontp->file;
+ register struct glyph *g;
+ long font_dir_ptr;
+ long trailer_ptr;
+
+ if (debug & DBG_PK)
+ Printf("Reading PXL file %s\n", fontp->filename);
+ fontp->read_char = read_PXL_char;
+ /* seek to trailer info */
+ Fseek(fp, (long) -4, 2);
+ while (four(fp) != 1001)
+ Fseek(fp, (long) -5, 1);
+ Fseek(fp, (long) -5 * 4, 1);
+ trailer_ptr = ftell(fp);
+ (void) four(fp); /* checksum */
+ (void) four(fp); /* magnify */
+ (void) four(fp); /* design size */
+ font_dir_ptr = sfour(fp) * 4;
+ (void) four(fp); /* pxl id word */
+ /* seek to font directory */
+ Fseek(fp, font_dir_ptr, 0);
+ maxchar = (trailer_ptr - font_dir_ptr) / 16 - 1;
+ fontp->glyph = (struct glyph *)
+ xmalloc((maxchar + 1) * sizeof(struct glyph), "glyph array");
+ for (g = fontp->glyph; g <= fontp->glyph + maxchar; ++g) {
+ g->bitmap.bits = NULL;
+ g->bitmap2.bits = NULL;
+#ifdef GREY
+ g->pixmap2 = NULL;
+#endif
+ g->bitmap.w = two(fp);
+ g->bitmap.h = two(fp);
+ g->x = stwo(fp);
+ g->y = stwo(fp);
+ g->addr = four(fp) * 4;
+ /*
+ ** The TFM-width word is kind of funny in the units
+ ** it is expressed in. It works this way:
+ **
+ ** If a glyph has width 'w' in a font with design-size
+ ** 'd' (both in same units), the TFM-width word is
+ **
+ ** t = (w/d) * 2^20
+ **
+ ** Therefore, in order to find the glyph width in
+ ** DVI units (1 / 2^16 points), we take the design-size
+ ** 'd' (in DVI's), the magnification 'm' of the PXL file
+ ** and the TFM-width word 't' to the width (in DVI's)
+ ** as follows:
+ **
+ ** dmt
+ ** w = -----
+ ** 2^20
+ **
+ ** But the magnification of the PXL file is just the
+ ** scaled size 's' over the design size, so the final
+ ** expression for the width is
+ **
+ ** st
+ ** w = ----
+ ** 2^20
+ **
+ */
+
+ g->dvi_adv = fontp->dimconv * four(fp);
+ if (debug & DBG_PK)
+ Printf("size=%dx%d, dvi_adv=%d\n", g->bitmap.w, g->bitmap.h,
+ g->dvi_adv);
+ }
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/tpic.c b/systems/msdos/dviware/xdvi-dos/src/tpic.c
new file mode 100644
index 0000000000..f6eb82da8c
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/tpic.c
@@ -0,0 +1,434 @@
+/*
+ * Support drawing routines for TeXsun and TeX
+ *
+ * Copyright, (C) 1987, 1988 Tim Morgan, UC Irvine
+ *
+ * At the time these routines are called, the values of hh and vv should
+ * have been updated to the upper left corner of the graph (the position
+ * the \special appears at in the dvi file). Then the coordinates in the
+ * graphics commands are in terms of a virtual page with axes oriented the
+ * same as the Imagen and the SUN normally have:
+ *
+ * 0,0
+ * +-----------> +x
+ * |
+ * |
+ * |
+ * \ /
+ * +y
+ *
+ * Angles are measured in the conventional way, from +x towards +y.
+ * Unfortunately, that reverses the meaning of "counterclockwise"
+ * from what it's normally thought of.
+ *
+ * A lot of floating point arithmetic has been converted to integer
+ * arithmetic for speed. In some places, this is kind-of kludgy, but
+ * it's worth it.
+ */
+
+#include <math.h>
+#include <ctype.h>
+
+#include "xdvi.h"
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#endif
+
+#define MAXPOINTS 300 /* Max points in a path */
+#define TWOPI (double) (3.14159265359*2.0)
+#define MAX_PEN_SIZE 7 /* Max pixels of pen width */
+
+
+static int xx[MAXPOINTS], yy[MAXPOINTS]; /* Path in milli-inches */
+static int path_len = 0; /* # points in current path */
+static int pen_size = 1; /* Pixel width of lines drawn */
+
+static Boolean whiten = False;
+static Boolean shade = False;
+static Boolean blacken = False;
+
+/* Unfortunately, these values also appear in dvisun.c */
+#define xRESOLUTION (pixels_per_inch/shrink_factor)
+#define yRESOLUTION (pixels_per_inch/shrink_factor)
+
+
+/*
+ * Issue warning messages
+ */
+static void
+Warning(fmt, msg)
+ char *fmt, *msg;
+{
+ Fprintf(stderr, fmt, msg);
+ (void) fputc('\n', stderr);
+}
+
+
+/*
+ * Set the size of the virtual pen used to draw in milli-inches
+ */
+/* ARGSUSED */
+static void
+set_pen_size(cp)
+ char *cp;
+{
+ int ps;
+
+ if (sscanf(cp, " %d ", &ps) != 1) {
+ Warning("illegal .ps command format: %s", cp);
+ return;
+ }
+ pen_size = (ps * (xRESOLUTION + yRESOLUTION) + 1000) / 2000;
+ if (pen_size < 1) pen_size = 1;
+ else if (pen_size > MAX_PEN_SIZE) pen_size = MAX_PEN_SIZE;
+}
+
+
+/*
+ * Print the line defined by previous path commands
+ */
+static void
+flush_path()
+{
+ register int i;
+ int last_min_x, last_max_x, last_min_y, last_max_y;
+
+ last_min_x = 30000;
+ last_min_y = 30000;
+ last_max_x = -30000;
+ last_max_y = -30000;
+ for (i = 1; i < path_len; i++) {
+ if (xx[i] > last_max_x) last_max_x = xx[i];
+ if (xx[i] < last_min_x) last_min_x = xx[i];
+ if (yy[i] > last_max_y) last_max_y = yy[i];
+ if (yy[i] < last_min_y) last_min_y = yy[i];
+ line_btw(xx[i], yy[i], xx[i+1], yy[i+1]);
+ }
+ if (xx[path_len] > last_max_x) last_max_x = xx[path_len];
+ if (xx[path_len] < last_min_x) last_min_x = xx[path_len];
+ if (yy[path_len] > last_max_y) last_max_y = yy[path_len];
+ if (yy[path_len] < last_min_y) last_min_y = yy[path_len];
+ path_len = 0;
+ do_attribute_path(last_min_x, last_max_x, last_min_y, last_max_y);
+}
+
+
+/*
+ * Print a dashed line along the previously defined path, with
+ * the dashes/inch defined.
+ */
+
+static void
+flush_dashed(cp, dotted)
+ char *cp;
+ int dotted;
+{
+ int i;
+ int numdots;
+ int lx0, ly0, lx1, ly1;
+ int cx0, cy0, cx1, cy1;
+ float inchesperdash;
+ double d, spacesize, a, b, dx, dy, milliperdash;
+
+ if (sscanf(cp, " %f ", &inchesperdash) != 1) {
+ Warning("illegal format for dotted/dashed line: %s", cp);
+ return;
+ }
+ if (path_len <= 1 || inchesperdash <= 0.0) {
+ Warning("illegal conditions for dotted/dashed line", "");
+ return;
+ }
+ milliperdash = inchesperdash * 1000.0;
+ lx0 = xx[1]; ly0 = yy[1];
+ lx1 = xx[2]; ly1 = yy[2];
+ dx = lx1 - lx0;
+ dy = ly1 - ly0;
+ if (dotted) {
+ numdots = sqrt(dx*dx + dy*dy) / milliperdash + 0.5;
+ if (numdots == 0) numdots = 1;
+ for (i = 0; i <= numdots; i++) {
+ a = (float) i / (float) numdots;
+ cx0 = lx0 + a * dx + 0.5;
+ cy0 = ly0 + a * dy + 0.5;
+ dot_at(cx0, cy0);
+ }
+ }
+ else {
+ d = sqrt(dx*dx + dy*dy);
+ numdots = d / (2.0 * milliperdash) + 1.0;
+ if (numdots <= 1)
+ line_btw(lx0, ly0, lx1, ly1);
+ else {
+ spacesize = (d - numdots * milliperdash) / (numdots - 1);
+ for (i = 0; i < numdots - 1; i++) {
+ a = i * (milliperdash + spacesize) / d;
+ b = a + milliperdash / d;
+ cx0 = lx0 + a * dx + 0.5;
+ cy0 = ly0 + a * dy + 0.5;
+ cx1 = lx0 + b * dx + 0.5;
+ cy1 = ly0 + b * dy + 0.5;
+ line_btw(cx0, cy0, cx1, cy1);
+ b += spacesize / d;
+ }
+ cx0 = lx0 + b * dx + 0.5;
+ cy0 = ly0 + b * dy + 0.5;
+ line_btw(cx0, cy0, lx1, ly1);
+ }
+ }
+ path_len = 0;
+}
+
+
+/*
+ * Add a point to the current path
+ */
+static void
+add_path(cp)
+ char *cp;
+{
+ int pathx, pathy;
+
+ if (++path_len >= MAXPOINTS) oops("Too many points");
+ if (sscanf(cp, " %d %d ", &pathx, &pathy) != 2)
+ oops("Malformed path command");
+ xx[path_len] = pathx;
+ yy[path_len] = pathy;
+}
+
+
+/*
+ * Draw to a floating point position
+ */
+static void
+im_fdraw(x, y)
+ double x,y;
+{
+ if (++path_len >= MAXPOINTS) oops("Too many arc points");
+ xx[path_len] = x + 0.5;
+ yy[path_len] = y + 0.5;
+}
+
+
+/*
+ * Draw an ellipse with the indicated center and radices.
+ */
+static void
+draw_ellipse(xc, yc, xr, yr)
+ int xc, yc, xr, yr;
+{
+ double angle, theta;
+ int n;
+ int px0, py0, px1, py1;
+
+ angle = (xr + yr) / 2.0;
+ theta = sqrt(1.0 / angle);
+ n = TWOPI / theta + 0.5;
+ if (n < 12) n = 12;
+ else if (n > 80) n = 80;
+ n /= 2;
+ theta = TWOPI / n;
+
+ angle = 0.0;
+ px0 = xc + xr; /* cos(0) = 1 */
+ py0 = yc; /* sin(0) = 0 */
+ while ((angle += theta) <= TWOPI) {
+ px1 = xc + xr*cos(angle) + 0.5;
+ py1 = yc + yr*sin(angle) + 0.5;
+ line_btw(px0, py0, px1, py1);
+ px0 = px1;
+ py0 = py1;
+ }
+ line_btw(px0, py0, xc + xr, yc);
+}
+
+/*
+ * Draw an arc
+ */
+static void
+arc(cp, invis)
+ char *cp;
+ Boolean invis;
+{
+ int xc, yc, xrad, yrad, n;
+ float start_angle, end_angle, angle, theta, r;
+ double xradius, yradius, xcenter, ycenter;
+
+ if (sscanf(cp, " %d %d %d %d %f %f ", &xc, &yc, &xrad, &yrad,
+ &start_angle, &end_angle) != 6) {
+ Warning("illegal arc specification: %s", cp);
+ return;
+ }
+
+ if (invis) return;
+
+ /* We have a specialized fast way to draw closed circles/ellipses */
+ if (start_angle <= 0.0 && end_angle >= 6.282) {
+ draw_ellipse(xc, yc, xrad, yrad);
+ return;
+ }
+ xcenter = xc;
+ ycenter = yc;
+ xradius = xrad;
+ yradius = yrad;
+ r = (xradius + yradius) / 2.0;
+ theta = sqrt(1.0 / r);
+ n = 0.3 * TWOPI / theta + 0.5;
+ if (n < 12) n = 12;
+ else if (n > 80) n = 80;
+ n /= 2;
+ theta = TWOPI / n;
+ flush_path();
+ im_fdraw(xcenter + xradius * cos(start_angle),
+ ycenter + yradius * sin(start_angle));
+ angle = start_angle + theta;
+ if (end_angle < angle) end_angle += TWOPI;
+ while (angle < end_angle) {
+ im_fdraw(xcenter + xradius * cos(angle),
+ ycenter + yradius * sin(angle));
+ angle += theta;
+ }
+ im_fdraw(xcenter + xradius * cos(end_angle),
+ ycenter + yradius * sin(end_angle));
+ flush_path();
+}
+
+
+/*
+ * APPROXIMATE integer distance between two points
+ */
+#define dist(x0, y0, x1, y1) (abs(x0-x1)+abs(y0-y1))
+
+
+/*
+ * Draw a spline along the previously defined path
+ */
+static void
+flush_spline()
+{
+ int xp, yp;
+ int N;
+ int lastx, lasty;
+ int t1, t2, t3;
+ int steps;
+ int j;
+ register int i, w;
+
+#ifdef lint
+ lastx = lasty = -1;
+#endif
+ N = path_len + 1;
+ xx[0] = xx[1];
+ yy[0] = yy[1];
+ xx[N] = xx[N-1];
+ yy[N] = yy[N-1];
+ for (i = 0; i < N - 1; i++) { /* interval */
+ steps = (dist(xx[i], yy[i], xx[i+1], yy[i+1]) +
+ dist(xx[i+1], yy[i+1], xx[i+2], yy[i+2])) / 80;
+ for (j = 0; j < steps; j++) { /* points within */
+ w = (j * 1000 + 500) / steps;
+ t1 = w * w / 20;
+ w -= 500;
+ t2 = (750000 - w * w) / 10;
+ w -= 500;
+ t3 = w * w / 20;
+ xp = (t1*xx[i+2] + t2*xx[i+1] + t3*xx[i] + 50000) / 100000;
+ yp = (t1*yy[i+2] + t2*yy[i+1] + t3*yy[i] + 50000) / 100000;
+ if (i != 0 || j != 0) line_btw(lastx, lasty, xp, yp);
+ lastx = xp;
+ lasty = yp;
+ }
+ }
+ path_len = 0;
+}
+
+
+/*
+ * Shade the last box, circle, or ellipse
+ */
+static void
+shade_last()
+{
+ blacken = whiten = False;
+ shade = True;
+}
+
+
+/*
+ * Make the last box, circle, or ellipse, white inside (shade with white)
+ */
+static void
+whiten_last()
+{
+ whiten = True;
+ blacken = shade = False;
+}
+
+
+/*
+ * Make last box, etc, black inside
+ */
+static void
+blacken_last()
+{
+ blacken = True;
+ whiten = shade = False;
+}
+
+
+/*
+ * The following copyright message applies to the rest of this file. --PV
+ */
+
+/*
+ * This program is Copyright (C) 1987 by the Board of Trustees of the
+ * University of Illinois, and by the author Dirk Grunwald.
+ *
+ * This program may be freely copied, as long as this copyright
+ * message remaines affixed. It may not be sold, although it may
+ * be distributed with other software which is sold. If the
+ * software is distributed, the source code must be made available.
+ *
+ * No warranty, expressed or implied, is given with this software.
+ * It is presented in the hope that it will prove useful.
+ *
+ * Hacked in ignorance and desperation by jonah@db.toronto.edu
+ */
+
+/*
+ * The code to handle the \specials generated by tpic was modified
+ * by Dirk Grunwald using the code Tim Morgan at Univ. of Calif, Irvine
+ * wrote for TeXsun.
+ */
+
+#define COMLEN 4
+
+void
+applicationDoSpecial(cp)
+ char *cp;
+{
+ char command[COMLEN], *orig_cp;
+ register int len;
+
+ orig_cp = cp;
+ while (isspace(*cp)) ++cp;
+ len = 0;
+ while (!isspace(*cp) && *cp && len < COMLEN-1) command[len++] = *cp++;
+ command[len] = '\0';
+ if (strcmp(command, "pn") == 0) set_pen_size(cp);
+ else if (strcmp(command, "fp") == 0) flush_path();
+ else if (strcmp(command, "da") == 0) flush_dashed(cp, 0);
+ else if (strcmp(command, "dt") == 0) flush_dashed(cp, 1);
+ else if (strcmp(command, "pa") == 0) add_path(cp);
+ else if (strcmp(command, "ar") == 0) arc(cp, False);
+ else if (strcmp(command, "ia") == 0) arc(cp, True);
+ else if (strcmp(command, "sp") == 0) flush_spline();
+ else if (strcmp(command, "sh") == 0) shade_last();
+ else if (strcmp(command, "wh") == 0) whiten_last();
+ else if (strcmp(command, "bk") == 0) blacken_last();
+ /* throw away the path -- jansteen */
+ else if (strcmp(command, "ip") == 0) path_len = 0;
+ else if (!hush_spec_now)
+ Fprintf(stderr, "%s: special \"%s\" not implemented\n", prog,
+ orig_cp);
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/util.c b/systems/msdos/dviware/xdvi-dos/src/util.c
new file mode 100644
index 0000000000..f1013d4d97
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/util.c
@@ -0,0 +1,216 @@
+/*
+ * DVI previewer for X.
+ *
+ * Eric Cooper, CMU, September 1985.
+ *
+ * Code derived from dvi-imagen.c.
+ *
+ * Modification history:
+ * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS.
+ * 7/1988 Modified for X.11 --Mark Eichin, MIT
+ * 12/1988 Added 'R' option, toolkit, magnifying glass
+ * --Paul Vojta, UC Berkeley.
+ * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto
+ * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ.
+ * 3/1990 Added VMS support --Scott Allendorf, U of Iowa
+ * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem
+ * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen
+ * and Lee Hetherington, MIT
+ *
+ * Compilation options:
+ * SYSV compile for System V
+ * VMS compile for VMS
+ * X10 compile for X10
+ * NOTOOL compile without toolkit (X11 only)
+ * BUTTONS compile with buttons on the side of the window (needs toolkit)
+ * MSBITFIRST store bitmaps internally with most significant bit first
+ * BMSHORT store bitmaps in shorts instead of bytes
+ * BMLONG store bitmaps in longs instead of bytes
+ * ALTFONT default for -altfont option
+ * A4 use European size paper
+ * TEXXET support reflection dvi codes (right-to-left typesetting)
+ */
+
+#include "xdvi.h"
+#include <errno.h>
+int errno;
+
+#ifdef VMS
+#include <rmsdef.h>
+#endif /* VMS */
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#else
+char *malloc();
+#endif
+#if defined(macII) && !defined(__STDC__) /* stdlib.h doesn't define these */
+char *malloc();
+#endif /* macII */
+
+#if NeedVarargsPrototypes /* this is for oops */
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#ifdef DOPRNT /* define this if vfprintf gives you trouble */
+#define vfprintf(stream, message, args) _doprnt(message, args, stream)
+#endif
+
+/*
+ * General utility routines.
+ */
+
+/*
+ * Print error message and quit.
+ */
+
+#if NeedVarargsPrototypes
+NORETURN void
+oops(_Xconst char *message, ...)
+#else
+/* VARARGS */
+NORETURN void
+oops(va_alist)
+ va_dcl
+#endif
+{
+#if !NeedVarargsPrototypes
+ _Xconst char *message;
+#endif
+ va_list args;
+
+ Fprintf(stderr, "%s: ", prog);
+#if NeedVarargsPrototypes
+ va_start(args, message);
+#else
+ va_start(args);
+ message = va_arg(args, _Xconst char *);
+#endif
+ (void) vfprintf(stderr, message, args);
+ va_end(args);
+ Putc('\n', stderr);
+ exit(1);
+}
+
+/*
+ * Either allocate storage or fail with explanation.
+ */
+
+char *
+xmalloc(size, why)
+ unsigned size;
+ _Xconst char *why;
+{
+ char *mem = malloc(size);
+
+ if (mem == NULL)
+ oops("! Cannot allocate %u bytes for %s.\n", size, why);
+ return mem;
+}
+
+/*
+ * Allocate bitmap for given font and character
+ */
+
+void
+alloc_bitmap(bitmap)
+ register struct bitmap *bitmap;
+{
+ register unsigned int size;
+
+ /* width must be multiple of 16 bits for raster_op */
+ bitmap->bytes_wide = ROUNDUP(bitmap->w, BITS_PER_BMUNIT) *
+ BYTES_PER_BMUNIT;
+ size = bitmap->bytes_wide * bitmap->h;
+ bitmap->bits = xmalloc(size != 0 ? size : 1, "character bitmap");
+}
+
+
+/*
+ * Close the pixel file for the least recently used font.
+ */
+
+static void
+close_a_file()
+{
+ register struct font *fontp;
+ unsigned short oldest = ~0;
+ struct font *f = NULL;
+
+ for (fontp = font_head; fontp != NULL; fontp = fontp->next)
+ if (fontp->file != NULL && fontp->timestamp <= oldest) {
+ f = fontp;
+ oldest = fontp->timestamp;
+ }
+ if (f == NULL)
+ oops("Can't find an open pixel file to close");
+ Fclose(f->file);
+ f->file = NULL;
+ ++n_files_left;
+}
+
+/*
+ * Open a file in the given mode.
+ */
+
+FILE *
+xfopen(filename)
+ _Xconst char *filename;
+{
+ FILE *f;
+
+ if (n_files_left == 0) close_a_file();
+ f = fopen(filename, OPEN_MODE);
+
+#ifndef VMS
+/* ericho if (f == NULL && (errno == EMFILE || errno == ENFILE)) */
+ if (f == NULL && (errno == EMFILE))
+#else /* VMS */
+ if (f == NULL && errno == EVMSERR && vaxc$errno == RMS$_ACC)
+#endif /* VMS */
+
+ {
+ n_files_left = 0;
+ close_a_file();
+ f = fopen(filename, OPEN_MODE);
+ }
+ return f;
+}
+
+
+/*
+ *
+ * Read size bytes from the FILE fp, constructing them into a
+ * signed/unsigned integer.
+ *
+ */
+
+unsigned long
+num(fp, size)
+ register FILE *fp;
+ register int size;
+{
+ register long x = 0;
+
+ while (size--) x = (x << 8) | one(fp);
+ return x;
+}
+
+long
+snum(fp, size)
+ register FILE *fp;
+ register int size;
+{
+ register long x;
+
+#ifdef __STDC__
+ x = (signed char) getc(fp);
+#else
+ x = (unsigned char) getc(fp);
+ if (x & 0x80) x -= 0x100;
+#endif
+ while (--size) x = (x << 8) | one(fp);
+ return x;
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/vf.c b/systems/msdos/dviware/xdvi-dos/src/vf.c
new file mode 100644
index 0000000000..4560a5f966
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/vf.c
@@ -0,0 +1,123 @@
+#include "xdvi.h"
+#include "dvi.h"
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#endif
+
+/***
+ *** VF font reading routines.
+ *** Public routine is read_index---because virtual characters are presumed
+ *** to be short, we read the whole virtual font in at once, instead of
+ *** faulting in characters as needed.
+ ***/
+
+#define LONG_CHAR 242
+
+/*
+ * These are parameters which determine whether macros are combined for
+ * storage allocation purposes. Small macros ( <= VF_PARM_1 bytes) are
+ * combined into chunks of size VF_PARM_2.
+ */
+
+#ifndef VF_PARM_1
+#define VF_PARM_1 20
+#endif
+#ifndef VF_PARM_2
+#define VF_PARM_2 256
+#endif
+
+/*
+ * The main routine
+ */
+
+void
+read_VF_index(fontp)
+ register struct font *fontp;
+{
+ FILE *VF_file = fontp->file;
+ ubyte cmnd;
+ ubyte *avail, *availend; /* available space for macros */
+
+ fontp->read_char = NULL;
+ fontp->flags |= FONT_VIRTUAL;
+ fontp->set_char_p = set_vf_char;
+ if (debug & DBG_PK)
+ Printf("Reading VF pixel file %s\n", fontp->filename);
+/*
+ * Read preamble.
+ */
+ Fseek(VF_file, (long) one(VF_file), 1); /* skip comment */
+ (void) four(VF_file); /* skip checksum */
+ (void) four(VF_file); /* skip design size */
+/*
+ * Read the fonts.
+ */
+ fontp->vf_chain = NULL;
+ fontp->first_font = NULL;
+ while ((cmnd = one(VF_file)) >= FNTDEF1 && cmnd <= FNTDEF4) {
+ define_font(VF_file, cmnd, fontp, &fontp->vf_chain);
+ if (fontp->first_font == NULL)
+ fontp->first_font = fontp->vf_chain->fontp;
+ }
+/*
+ * Prepare macro array.
+ */
+ fontp->macro = (struct macro *) xmalloc(256 * sizeof(struct macro),
+ "macro array");
+ bzero((char *) fontp->macro, 256 * sizeof(struct macro));
+/*
+ * Read macros.
+ */
+ avail = availend = NULL;
+ for (; cmnd <= LONG_CHAR; cmnd = one(VF_file)) {
+ register struct macro *m;
+ int len;
+ unsigned long cc;
+ long width;
+
+ if (cmnd == LONG_CHAR) { /* long form packet */
+ len = four(VF_file);
+ cc = four(VF_file);
+ width = four(VF_file);
+ if (cc >= 256) {
+ Fprintf(stderr,
+ "Virtual character %lu in font %s ignored.\n",
+ cc, fontp->fontname);
+ Fseek(VF_file, (long) len, 1);
+ continue;
+ }
+ }
+ else { /* short form packet */
+ len = cmnd;
+ cc = one(VF_file);
+ width = num(VF_file, 3);
+ }
+ m = &fontp->macro[cc];
+ m->dvi_adv = width * fontp->dimconv;
+ if (len > 0) {
+ if (len <= availend - avail) {
+ m->pos = avail;
+ avail += len;
+ }
+ else {
+ m->free_me = True;
+ if (len <= VF_PARM_1) {
+ m->pos = avail = (ubyte *) xmalloc(VF_PARM_2,
+ "macro array");
+ availend = avail + VF_PARM_2;
+ avail += len;
+ }
+ else m->pos = (ubyte *) xmalloc((unsigned) len,
+ "macro array");
+ }
+ Fread((char *) m->pos, 1, len, VF_file);
+ m->end = m->pos + len;
+ }
+ if (debug & DBG_PK)
+ Printf("Read VF macro for character %lu; dy = %ld, length = %d\n",
+ cc, m->dvi_adv, len);
+ }
+ if (cmnd != POST)
+ oops("Wrong command byte found in VF macro list: %d", cmnd);
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/xdvi.c b/systems/msdos/dviware/xdvi-dos/src/xdvi.c
new file mode 100644
index 0000000000..1aaa216ace
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/xdvi.c
@@ -0,0 +1,3175 @@
+/*
+ * DVI previewer for X.
+ *
+ * Eric Cooper, CMU, September 1985.
+ *
+ * Code derived from dvi-imagen.c.
+ *
+ * Modification history:
+ * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS.
+ * 7/1988 Modified for X.11 --Mark Eichin, MIT
+ * 12/1988 Added 'R' option, toolkit, magnifying glass
+ * --Paul Vojta, UC Berkeley.
+ * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto
+ * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ.
+ * 3/1990 Added VMS support --Scott Allendorf, U of Iowa
+ * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem
+ * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen
+ * and Lee Hetherington, MIT
+ *
+ * Compilation options:
+ * SYSV compile for System V
+ * VMS compile for VMS
+ * X10 compile for X10
+ * NOTOOL compile without toolkit (X11 only)
+ * BUTTONS compile with buttons on the side of the window (needs toolkit)
+ * MSBITFIRST store bitmaps internally with most significant bit first
+ * BMSHORT store bitmaps in shorts instead of bytes
+ * BMLONG store bitmaps in longs instead of bytes
+ * ALTFONT default for -altfont option
+ * A4 use European size paper
+ * TEXXET support reflection dvi codes (right-to-left typesetting)
+ * GREY use grey levels to shrink fonts
+ */
+
+
+
+#ifndef ALTFONT
+#define ALTFONT "cmr10"
+#endif
+
+#ifndef A4
+#define DEFAULT_PAPER "us"
+#else
+#define DEFAULT_PAPER "a4"
+#endif
+
+#if !defined(X10) && !defined(NOTOOL)
+#define TOOLKIT
+#else
+#undef TOOLKIT
+#undef BUTTONS
+#endif
+
+#include <ctype.h>
+
+#define EXTERN
+#define INIT(x) =x
+#ifndef TOOLKIT
+#define NTINIT(x) =x
+#else
+#define NTINIT(x)
+#endif
+#include "xdvi.h"
+
+#include "patchlevel.h"
+static struct {_Xconst char a[33], b, c, d;}
+#ifndef X10
+ version = {"This is xdvi for X11, patchlevel ", '0' + PATCHLEVEL / 10,
+ '0' + PATCHLEVEL % 10, 0};
+#else
+ version = {"This is xdvi for X10, patchlevel ", '0' + PATCHLEVEL / 10,
+ '0' + PATCHLEVEL % 10, 0};
+#endif
+
+#ifndef X_NOT_STDC_ENV
+#include <stdlib.h>
+#endif
+
+
+/*------------------------------- MSDOS (Eric Ho) --------------------------*/
+#if defined(__MSDOS__) && defined (FONTSUB)
+
+extern FILE *openfontsubfile (void);
+FILE *fontsubfile; /* make this global to minize interference to */
+ /* the orginial source */
+#endif
+/*------------------------------- MSDOS (Eric Ho) --------------------------*/
+
+
+#ifndef X10
+/* Xlib and Xutil are already included */
+#include <X11/cursorfont.h>
+#include <X11/keysym.h>
+#include "xdvi.icon"
+#endif /* X10 */
+
+#ifdef TOOLKIT
+#undef Boolean
+#include <X11/Intrinsic.h>
+#ifdef OLD_X11_TOOLKIT
+#include <X11/Atoms.h>
+#else /* not OLD_X11_TOOLKIT */
+#include <X11/Xatom.h>
+#include <X11/StringDefs.h>
+#endif /* not OLD_X11_TOOLKIT */
+#include <X11/Shell.h> /* needed for def. of XtNiconX */
+#ifndef XtSpecificationRelease
+#define XtSpecificationRelease 0
+#endif
+#if XtSpecificationRelease >= 4
+#include <X11/Xaw/Viewport.h>
+#ifdef BUTTONS
+#include <X11/Xaw/Command.h>
+#endif
+#else /* XtSpecificationRelease < 4 */
+#define XtPointer caddr_t
+#include <X11/Viewport.h>
+#ifdef BUTTONS
+#include <X11/Command.h>
+#endif
+#endif /* XtSpecificationRelease */
+#else /* !TOOLKIT */
+#define XtNumber(arr) (sizeof(arr)/sizeof(arr[0]))
+typedef int Position;
+typedef unsigned int Dimension;
+#ifndef X10
+typedef unsigned long Pixel;
+#define XtPending() XPending(DISP)
+#else
+#define XtPending XPending
+#define XMoveResizeWindow XConfigureWindow
+#endif
+#endif /* TOOLKIT */
+
+#ifdef HAS_SIGIO
+#include <fcntl.h>
+#include <signal.h>
+#endif
+
+#ifndef X10
+#ifndef GREY
+static Display *DISP;
+static Screen *SCRN;
+#endif
+#define DPY DISP,
+static Cursor redraw_cursor, ready_cursor;
+
+#ifdef VMS
+/*
+ * Magnifying glass cursor
+ *
+ * Developed by Tom Sawyer, April 1990
+ * Contibuted by Hunter Goatley, January 1991
+ *
+ */
+
+#define mag_glass_width 16
+#define mag_glass_height 16
+#define mag_glass_x_hot 6
+#define mag_glass_y_hot 6
+static char mag_glass_bits[] = {
+ 0xf8, 0x03, 0x0c, 0x06, 0xe2, 0x09, 0x13, 0x1a, 0x01, 0x14, 0x01, 0x14,
+ 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x03, 0x10, 0x02, 0x18, 0x0c, 0x34,
+ 0xf8, 0x6f, 0x00, 0xd8, 0x00, 0xb0, 0x00, 0xe0
+};
+#include <decw$cursor.h> /* Include the DECWindows cursor symbols */
+static int DECWCursorFont; /* Space for the DECWindows cursor font */
+static Pixmap MagnifyPixmap; /* Pixmap to hold our special mag-glass */
+#endif /* VMS */
+
+#define SetCursor(x) XDefineCursor(DISP, WINDOW(mane), x)
+#define ClearPage(wr) XClearWindow(DISP, WINDOW(wr));
+#define ClearArea(win, x, y, w, h) XClearArea(DISP, win, x, y, w, h, False)
+#define DarkenArea(win, x, y, w, h) \
+ XFillRectangle(DISP, win, ruleGC, x, y, w, h)
+#define CopyArea(win, x, y, w, h, x2, y2) \
+ XCopyArea(DISP, win, win, DefaultGCOfScreen(SCRN), \
+ x, y, w, h, x2, y2)
+#define Flush() XFlush(DISP)
+#ifndef X11HEIGHT
+#define X11HEIGHT 8 /* Height of server default font */
+#endif
+#else /* X10 */
+#define DPY
+#define GC int
+#define SetCursor(x)
+#define ClearPage(wr) XClear(WINDOW(wr));
+#define ClearArea(win, x, y, w, h) XPixSet(win, x, y, w, h, backpix)
+#define DarkenArea(win, x, y, w, h) XPixSet(win, x, y, w, h, foreGC)
+#define CopyArea(win, x, y, w, h, x2, y2) \
+ XMoveArea(win, x, y, x2, y2, w, h, GXcopy);
+#define XBell(a,b) XFeep(b/10-1)
+#define Flush() XFlush()
+#define ConnectionNumber(DISP) (_XlibCurrentDisplay->fd)
+#ifndef X10FONT
+#define X10FONT "helv10b" /* Font for X10 error messages */
+#define X10HEIGHT 10
+#endif
+#endif /* X10 */
+
+#define MAGBORD 1 /* border size for magnifier */
+
+/*
+ * Command line flags.
+ */
+
+static Dimension bwidth = 2;
+
+#ifdef TOOLKIT
+
+#define RESOURCE(x) resource.x
+
+static struct _resource {
+ char *debug_arg;
+ int _shrink_factor;
+ int density;
+#ifdef GREY
+ float gamma;
+#endif
+ int pixels_per_inch;
+ char *sidemargin;
+ char *topmargin;
+ char *xoffset;
+ char *yoffset;
+ _Xconst char *paper;
+ char *alt_font;
+ Boolean list_fonts;
+ Boolean reverse;
+ Boolean hush_spec;
+ Boolean hush_chars;
+ Pixel fore_Pixel;
+ char *fore_color;
+ Pixel back_Pixel;
+ char *back_color;
+ Pixel brdr_Pixel;
+ char *brdr_color;
+ Pixel hl_Pixel;
+ char *high_color;
+ Pixel cr_Pixel;
+ char *curs_color;
+ char *icon_geometry;
+ Boolean keep_flag;
+ char *copy_arg;
+ Boolean copy;
+ Boolean thorough;
+ Boolean version_flag;
+#ifdef BUTTONS
+ Boolean expert;
+#endif
+ int mg_size[5];
+#ifdef GREY
+ Boolean use_grey;
+#endif
+} resource;
+
+#else /* !TOOLKIT */
+
+#define RESOURCE(x) x
+static char *debug_arg;
+#ifdef GREY
+static float gamma = 1.0;
+#endif
+static char *sidemargin, *topmargin;
+static char *xoffset, *yoffset;
+static _Xconst char *paper = DEFAULT_PAPER;
+static Boolean reverse;
+static Boolean keep_flag = False;
+#ifndef X10
+static Pixel fore_Pixel, back_Pixel, brdr_Pixel, hl_Pixel, cr_Pixel;
+static char *icon_geometry;
+static Boolean copy = 2;
+static Boolean thorough;
+#endif /* X10 */
+static Boolean version_flag = False;
+static int mg_size[5] = {200, 350, 600, 900, 1200};
+
+#endif /* TOOLKIT */
+
+static char *curr_page;
+
+#ifndef TOOLKIT
+static char *fore_color;
+static char *back_color;
+static char *brdr_color;
+static char *high_color;
+static char *curs_color;
+#endif
+static GC foreGC, highGC;
+#ifndef X10
+static GC ruleGC;
+static GC foreGC2;
+#else /* X10 */
+#define ruleGC foreGC
+#endif /* X10 */
+
+static int pageno_correct = 1;
+static int bak_shrink;
+
+#define clip_w mane.width
+#define clip_h mane.height
+static Dimension window_w, window_h;
+#ifndef X10
+static Position main_x, main_y;
+static XImage *image;
+#else /* X10 */
+#define main_x 0
+#define main_y 0
+static int GXfunc;
+static int backpix, backmap, bdrmap;
+/*
+ * Cursor and mask for valid cursor
+ */
+#include "xdvi_curs.h"
+#include "xdvi_mask.h"
+#endif /* X10 */
+
+static Position mag_x, mag_y, new_mag_x, new_mag_y;
+static Boolean mag_moved = False;
+static int home_x, home_y;
+static int min_x, max_x, min_y, max_y;
+
+struct WindowRec mane = {(Window) 0, 3, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0};
+struct WindowRec alt = {(Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0};
+/* currwin is temporary storage except for within redraw() */
+struct WindowRec currwin = {(Window) 0, 3, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0};
+
+#ifdef TOOLKIT
+static Widget top_level, vport_widget, draw_widget, clip_widget;
+#ifdef BUTTONS
+static Widget form_widget, line_widget, right_widget;
+#endif
+static Widget x_bar, y_bar; /* horizontal and vertical scroll bars */
+
+static Arg vport_args[] = {
+#ifdef BUTTONS
+ {XtNborderWidth, (XtArgVal) 0},
+ {XtNtop, (XtArgVal) XtChainTop},
+ {XtNbottom, (XtArgVal) XtChainBottom},
+ {XtNleft, (XtArgVal) XtChainLeft},
+ {XtNright, (XtArgVal) XtChainRight},
+#endif
+ {XtNallowHoriz, (XtArgVal) True},
+ {XtNallowVert, (XtArgVal) True},
+};
+
+/* Note: Argument order in the following is important! */
+
+static Arg draw_args[] = {
+ {XtNwidth, (XtArgVal) 0},
+ {XtNheight, (XtArgVal) 0},
+ {XtNx, (XtArgVal) 0},
+ {XtNy, (XtArgVal) 0},
+ {XtNlabel, (XtArgVal) ""},
+};
+
+#ifdef BUTTONS
+static Arg form_args[] = {
+ {XtNdefaultDistance, (XtArgVal) 0},
+};
+#define XTRA_WID 79
+
+static Arg line_args[] = {
+ {XtNbackground, (XtArgVal) 0},
+ {XtNwidth, (XtArgVal) 1},
+ {XtNheight, (XtArgVal) 0},
+ {XtNfromHoriz, (XtArgVal) NULL},
+ {XtNborderWidth, (XtArgVal) 0},
+ {XtNtop, (XtArgVal) XtChainTop},
+ {XtNbottom, (XtArgVal) XtChainBottom},
+ {XtNleft, (XtArgVal) XtChainRight},
+ {XtNright, (XtArgVal) XtChainRight},
+};
+
+static Arg right_args[] = {
+ {XtNfromHoriz, (XtArgVal) NULL},
+ {XtNwidth, (XtArgVal) (XTRA_WID - 1)},
+ {XtNheight, (XtArgVal) 0},
+ {XtNborderWidth, (XtArgVal) 0},
+ {XtNtop, (XtArgVal) XtChainTop},
+ {XtNbottom, (XtArgVal) XtChainBottom},
+ {XtNleft, (XtArgVal) XtChainRight},
+ {XtNright, (XtArgVal) XtChainRight},
+};
+
+static struct {
+ _Xconst char *label;
+ _Xconst char *name;
+ int closure;
+ int y_pos;
+ }
+ command_table[] = {
+ {"Quit", "quit", 'q', 50},
+ {"Shrink1", "sh1", 1 << 8 | 's', 150},
+ {"Shrink2", "sh2", 2 << 8 | 's', 200},
+ {"Shrink3", "sh3", 3 << 8 | 's', 250},
+ {"Shrink4", "sh4", 4 << 8 | 's', 300},
+ {"Page-10", "prev10", 10 << 8 | 'p', 400},
+ {"Page-5", "prev5", 5 << 8 | 'p', 450},
+ {"Prev", "prev", 'p', 500},
+ {"Next", "next", 'n', 600},
+ {"Page+5", "next5", 5 << 8 | 'n', 650},
+ {"Page+10", "next10", 10 << 8 | 'n', 700},
+};
+
+static void handle_command();
+
+static XtCallbackRec command_call[] = {
+ {handle_command, NULL},
+ {NULL, NULL},
+};
+
+static Arg command_args[] = {
+ {XtNlabel, (XtArgVal) NULL},
+ {XtNx, (XtArgVal) 6},
+ {XtNy, (XtArgVal) 0},
+ {XtNwidth, (XtArgVal) 64},
+ {XtNheight, (XtArgVal) 30},
+ {XtNcallback, (XtArgVal) command_call},
+};
+
+
+
+static void
+create_buttons(h)
+ XtArgVal h;
+{
+ int i;
+
+ line_args[2].value = h;
+ line_args[3].value = (XtArgVal) vport_widget;
+ line_widget = XtCreateManagedWidget("line", widgetClass, form_widget,
+ line_args, XtNumber(line_args));
+ right_args[0].value = (XtArgVal) line_widget;
+ right_args[2].value = h;
+ right_widget = XtCreateManagedWidget("right", compositeWidgetClass,
+ form_widget, right_args, XtNumber(right_args));
+
+ command_args[2].value = (XtArgVal) vport_widget;
+ for (i = 0; i < XtNumber(command_table); ++i) {
+ command_args[0].value = (XtArgVal) command_table[i].label;
+ command_args[2].value = (XtArgVal) command_table[i].y_pos;
+ command_call[0].closure = (caddr_t) command_table[i].closure;
+ (void) XtCreateManagedWidget(command_table[i].name,
+ commandWidgetClass, right_widget,
+ command_args, XtNumber(command_args));
+ }
+}
+#endif /* BUTTONS */
+
+#ifdef NOQUERY
+#define drawWidgetClass widgetClass
+#else
+
+/* ARGSUSED */
+static XtGeometryResult
+QueryGeometry(w, constraints, reply)
+ Widget w;
+ XtWidgetGeometry *constraints, *reply;
+{
+ reply->request_mode = CWWidth | CWHeight;
+ reply->width = page_w;
+ reply->height = page_h;
+ return XtGeometryAlmost;
+}
+
+#include <X11/IntrinsicP.h>
+#include <X11/CoreP.h>
+
+ /* if the following gives you trouble, just compile with -DNOQUERY */
+static WidgetClassRec drawingWidgetClass = {
+ {
+ /* superclass */ &widgetClassRec,
+ /* class_name */ "Draw",
+ /* widget_size */ sizeof(WidgetRec),
+ /* class_initialize */ NULL,
+ /* class_part_initialize*/ NULL,
+ /* class_inited */ FALSE,
+ /* initialize */ NULL,
+ /* initialize_hook */ NULL,
+ /* realize */ XtInheritRealize,
+ /* actions */ NULL,
+ /* num_actions */ 0,
+ /* resources */ NULL,
+ /* num_resources */ 0,
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ FALSE,
+ /* compress_exposure */ TRUE,
+ /* compress_enterleave*/ FALSE,
+ /* visible_interest */ FALSE,
+ /* destroy */ NULL,
+ /* resize */ XtInheritResize,
+ /* expose */ XtInheritExpose,
+ /* set_values */ NULL,
+ /* set_values_hook */ NULL,
+ /* set_values_almost */ XtInheritSetValuesAlmost,
+ /* get_values_hook */ NULL,
+ /* accept_focus */ XtInheritAcceptFocus,
+ /* version */ XtVersion,
+ /* callback_offsets */ NULL,
+ /* tm_table */ XtInheritTranslations,
+ /* query_geometry */ QueryGeometry,
+ /* display_accelerator */ XtInheritDisplayAccelerator,
+ /* extension */ NULL
+ }
+};
+
+#define drawWidgetClass &drawingWidgetClass
+
+#endif /* NOQUERY */
+
+#else /* !TOOLKIT */
+#define BAR_WID 12 /* width of darkened area */
+#define BAR_THICK 15 /* gross amount removed */
+
+static Window top_level;
+static Window x_bar, y_bar;
+static int x_bgn, x_end, y_bgn, y_end; /* scrollbar positions */
+#endif /* TOOLKIT */
+
+/*
+ * Mechanism to keep track of the magnifier window. The problems are,
+ * (a) if the button is released while the window is being drawn, this
+ * could cause an X error if we continue drawing in it after it is
+ * destroyed, and
+ * (b) creating and destroying the window too quickly confuses the window
+ * manager, which is avoided by waiting for an expose event before
+ * destroying it.
+ */
+static short alt_stat; /* 1 = wait for expose, */
+ /* -1 = destroy upon expose */
+static Boolean alt_canit; /* stop drawing this window */
+
+/*
+ * Data for buffered events.
+ */
+
+static Boolean canit = False,
+ has_arg = False;
+static VOLATILE short event_counter = 0;
+static VOLATILE short event_freq = 70;
+static int number = 0,
+ sign = 1;
+static jmp_buf canit_env;
+
+static void can_exposures(), read_events(), keystroke();
+
+#ifdef lint
+#ifndef X10
+char xdvi_bits[288];
+#ifdef TOOLKIT
+WidgetClass viewportWidgetClass, widgetClass;
+WidgetClassRec widgetClassRec;
+#ifdef BUTTONS
+WidgetClass formWidgetClass, compositeWidgetClass, commandWidgetClass;
+#endif /* BUTTONS */
+#endif /* TOOLKIT */
+#else /* X10 */
+short xdvi_bits[15], xdvi_mask_bits[15];
+Display *_XlibCurrentDisplay;
+#endif /* X10 */
+#endif /* lint */
+
+#ifdef GREY
+static void
+init_pix(warn)
+ Boolean warn;
+{
+ static int shrink_allocated_for = 0;
+ static Boolean colors_allocated = False;
+ int i;
+
+ if (!colors_allocated)
+ {
+ Pixel plane_masks[4];
+ Pixel pixel;
+ XColor color, fc, bc;
+ XGCValues values;
+ int i;
+
+ if (RESOURCE(gamma) == 0.0) RESOURCE(gamma) = 1.0;
+
+ if (!RESOURCE(copy))
+ /* allocate 4 color planes for 16 colors (for GXor drawing) */
+ if (!XAllocColorCells(DISP, DefaultColormapOfScreen(SCRN),
+ False, plane_masks, 4, &pixel, 1))
+ RESOURCE(copy) = warn = True;
+
+ /* get foreground and background RGB values for interpolating */
+ fc.pixel = RESOURCE(fore_Pixel);
+ XQueryColor(DISP, DefaultColormapOfScreen(SCRN), &fc);
+ bc.pixel = RESOURCE(back_Pixel);
+ XQueryColor(DISP, DefaultColormapOfScreen(SCRN), &bc);
+
+ for (i = 0; i < 16; ++i) {
+ double pow();
+ double frac = RESOURCE(gamma) > 0 ?
+ pow((double) i / 15, 1 / RESOURCE(gamma))
+ : 1 - pow((double) (15 - i) / 15, -RESOURCE(gamma));
+
+ color.red = frac * ((double) fc.red - bc.red) + bc.red;
+ color.green = frac * ((double) fc.green - bc.green) + bc.green;
+ color.blue = frac * ((double) fc.blue - bc.blue) + bc.blue;
+
+ color.pixel = pixel;
+ color.flags = DoRed | DoGreen | DoBlue;
+
+ if (!RESOURCE(copy)) {
+ if (i & 1) color.pixel |= plane_masks[0];
+ if (i & 2) color.pixel |= plane_masks[1];
+ if (i & 4) color.pixel |= plane_masks[2];
+ if (i & 8) color.pixel |= plane_masks[3];
+ XStoreColor(DISP, DefaultColormapOfScreen(SCRN), &color);
+ palette[i] = color.pixel;
+ }
+ else {
+ if (!XAllocColor(DISP, DefaultColormapOfScreen(SCRN),
+ &color))
+ palette[i] = (i * 100 >= density * 15)
+ ? RESOURCE(fore_Pixel) : RESOURCE(back_Pixel);
+ else
+ palette[i] = color.pixel;
+ }
+ }
+
+ /* Make sure fore_ and back_Pixel are a part of the palette */
+ RESOURCE(fore_Pixel) = palette[15];
+ RESOURCE(back_Pixel) = palette[0];
+
+#define MakeGC(fcn, fg, bg) (values.function = fcn, values.foreground=fg,\
+ values.background=bg,\
+ XCreateGC(DISP, RootWindowOfScreen(SCRN),\
+ GCFunction|GCForeground|GCBackground, &values))
+
+ foreGC = ruleGC = MakeGC(RESOURCE(copy) ? GXcopy : GXor,
+ RESOURCE(fore_Pixel), RESOURCE(back_Pixel));
+
+ colors_allocated = True;
+ if (RESOURCE(copy) && warn)
+ Puts("Note: overstrike characters may be incorrect.");
+ }
+#undef MakeGC
+
+ if (mane.shrinkfactor == 1) return;
+
+ if (shrink_allocated_for < mane.shrinkfactor) {
+ if (pixeltbl != NULL) free((char *) pixeltbl);
+ pixeltbl = (Pixel *) xmalloc((unsigned)
+ (mane.shrinkfactor * mane.shrinkfactor + 1) * sizeof(Pixel),
+ "pixel table");
+ shrink_allocated_for = mane.shrinkfactor;
+ }
+
+ for (i = 0; i <= mane.shrinkfactor * mane.shrinkfactor; ++i)
+ pixeltbl[i] =
+ palette[(i * 30 + mane.shrinkfactor * mane.shrinkfactor)
+ / (2 * mane.shrinkfactor * mane.shrinkfactor)];
+}
+#endif /* GREY */
+
+#ifdef sun
+extern char *sprintf();
+#endif
+
+#ifndef atof /* on the Next it's a macro */
+extern double atof();
+#endif
+
+/********************************
+ * tpic routines *
+ *******************************/
+
+/* Things we need from spec_draw, unfortunately */
+
+/* (ignored for now)
+extern int pen_size, blacken, whiten, shade;
+*/
+
+#define toint(x) ((int) ((x) + 0.5))
+#define xconv(x) (toint(specialConv*(x))/shrink_factor + PXL_H)
+#define yconv(y) (toint(specialConv*(y))/shrink_factor + PXL_V)
+
+/*
+ * Draw a line from (fx,fy) to (tx,ty).
+ * Right now, we ignore pen_size.
+ */
+void
+line_btw(fx, fy, tx, ty)
+int fx, fy, tx, ty;
+{
+ register int fcx = xconv(fx),
+ tcx = xconv(tx),
+ fcy = yconv(fy),
+ tcy = yconv(ty);
+
+ if ((fcx < max_x || tcx < max_x) && (fcx >= min_x || tcx >= min_x) &&
+ (fcy < max_y || tcy < max_y) && (fcy >= min_y || tcy >= min_y))
+#ifndef X10
+ XDrawLine(DISP, WINDOW(currwin), ruleGC,
+ fcx - currwin.base_x, fcy - currwin.base_y,
+ tcx - currwin.base_x, tcy - currwin.base_y);
+#else
+ XLine(WINDOW(currwin),
+ fcx - currwin.base_x, fcy - currwin.base_y,
+ tcx - currwin.base_x, tcy - currwin.base_y,
+ 1, 1, ruleGC, GXcopy, AllPlanes);
+#endif
+}
+
+/*
+ * Draw a dot at (x,y)
+ */
+void
+dot_at(x, y)
+ int x, y;
+{
+ register int cx = xconv(x),
+ cy = yconv(y);
+
+ if (cx < max_x && cx >= min_x && cy < max_y && cy >= min_y)
+#ifndef X10
+ XDrawPoint(DISP, WINDOW(currwin), ruleGC,
+ cx - currwin.base_x, cy - currwin.base_y);
+#else
+ XPixSet(WINDOW(currwin), cx - currwin.base_x, cy - currwin.base_y,
+ 1, 1, ruleGC);
+#endif
+}
+
+/*
+ * Apply the requested attributes to the last path (box) drawn.
+ * Attributes are reset.
+ * (Not currently implemented.)
+ */
+ /* ARGSUSED */
+void
+do_attribute_path(last_min_x, last_max_x, last_min_y, last_max_y)
+int last_min_x, last_max_x, last_min_y, last_max_y;
+{
+}
+
+/*
+ * Put a rectangle on the screen. hl determines the GC.
+ */
+
+void
+put_rectangle(x, y, w, h, hl)
+ int x, y, w, h;
+ WIDEARG(Boolean, int) hl;
+{
+ if (x < max_x && x + w >= min_x && y < max_y && y + h >= min_y) {
+ if (--event_counter == 0) read_events(False);
+#ifndef X10
+ XFillRectangle(DISP, WINDOW(currwin), hl ? highGC : ruleGC,
+ x - currwin.base_x, y - currwin.base_y,
+ w ? w : 1, h ? h : 1);
+#else
+ XPixSet(WINDOW(currwin), x - currwin.base_x, y - currwin.base_y,
+ w ? w : 1, h ? h : 1, hl ? highGC : ruleGC);
+#endif
+ }
+}
+
+void
+put_bitmap(bitmap, x, y)
+ register struct bitmap *bitmap;
+ register int x, y;
+{
+
+ if (debug & DBG_BITMAP)
+ Printf("X(%d,%d)\n", x - currwin.base_x, y - currwin.base_y);
+ if (x < max_x && x + bitmap->w >= min_x &&
+ y < max_y && y + bitmap->h >= min_y) {
+ if (--event_counter == 0) read_events(False);
+#ifndef X10
+ image->width = bitmap->w;
+ image->height = bitmap->h;
+ image->data = bitmap->bits;
+ image->bytes_per_line = bitmap->bytes_wide;
+ XPutImage(DISP, WINDOW(currwin), foreGC, image,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ bitmap->w, bitmap->h);
+ if (foreGC2)
+ XPutImage(DISP, WINDOW(currwin), foreGC2, image,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ bitmap->w, bitmap->h);
+#else
+ XBitmapBitsPut(WINDOW(currwin),
+ x - currwin.base_x, y - currwin.base_y,
+ bitmap->w, bitmap->h, bitmap->bits,
+ foreGC, backpix, NULL, GXfunc, AllPlanes);
+#endif
+ }
+}
+
+#ifdef GREY
+void
+put_image(img, x, y)
+ register XImage *img;
+ register int x, y;
+{
+ if (x < max_x && x + img->width >= min_x &&
+ y < max_y && y + img->height >= min_y) {
+
+ if (--event_counter == 0) read_events (False);
+
+ XPutImage(DISP, WINDOW(currwin), foreGC, img,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ img->width, img->height);
+
+ if (foreGC2)
+ XPutImage(DISP, WINDOW(currwin), foreGC2, img,
+ 0, 0,
+ x - currwin.base_x, y - currwin.base_y,
+ img->width, img->height);
+ }
+}
+#endif /* GREY */
+
+/*
+ * Event-handling routines
+ */
+
+static void
+expose(windowrec, x, y, w, h)
+ register struct WindowRec *windowrec;
+ int x, y, w, h;
+{
+ if (windowrec->min_x > x) windowrec->min_x = x;
+ if (windowrec->max_x < x + w)
+ windowrec->max_x = x + w;
+ if (windowrec->min_y > y) windowrec->min_y = y;
+ if (windowrec->max_y < y + h)
+ windowrec->max_y = y + h;
+}
+
+static void
+clearexpose(windowrec, x, y, w, h)
+ struct WindowRec *windowrec;
+ int x, y, w, h;
+{
+ ClearArea(WINDOW(*windowrec), x, y, w, h);
+ expose(windowrec, x, y, w, h);
+}
+
+static void
+scrollwindow(windowrec, x0, y0)
+ register struct WindowRec *windowrec;
+ int x0, y0;
+{
+ int x, y;
+ int x2 = 0, y2 = 0;
+ int ww, hh;
+
+ x = x0 - windowrec->base_x;
+ y = y0 - windowrec->base_y;
+ ww = windowrec->width - x;
+ hh = windowrec->height - y;
+ windowrec->base_x = x0;
+ windowrec->base_y = y0;
+ if (currwin.win == windowrec->win) {
+ currwin.base_x = x0;
+ currwin.base_y = y0;
+ }
+ windowrec->min_x -= x;
+ if (windowrec->min_x < 0) windowrec->min_x = 0;
+ windowrec->max_x -= x;
+ if (windowrec->max_x > windowrec->width)
+ windowrec->max_x = windowrec->width;
+ windowrec->min_y -= y;
+ if (windowrec->min_y < 0) windowrec->min_y = 0;
+ windowrec->max_y -= y;
+ if (windowrec->max_y > windowrec->height)
+ windowrec->max_y = windowrec->height;
+ if (x < 0) {
+ x2 = -x;
+ x = 0;
+ ww = windowrec->width - x2;
+ }
+ if (y < 0) {
+ y2 = -y;
+ y = 0;
+ hh = windowrec->height - y2;
+ }
+ if (ww <= 0 || hh <= 0) {
+ ClearPage(*windowrec);
+ windowrec->min_x = windowrec->min_y = 0;
+ windowrec->max_x = windowrec->width;
+ windowrec->max_y = windowrec->height;
+ }
+ else {
+ CopyArea(WINDOW(*windowrec), x, y, ww, hh, x2, y2);
+ if (x > 0) clearexpose(windowrec, ww, 0, x, windowrec->height);
+ if (x2 > 0) clearexpose(windowrec, 0, 0, x2, windowrec->height);
+ if (y > 0) clearexpose(windowrec, 0, hh, windowrec->width, y);
+ if (y2 > 0) clearexpose(windowrec, 0, 0, windowrec->width, y2);
+ }
+}
+
+#ifdef TOOLKIT
+/*
+ * routines for X11 toolkit
+ */
+
+static Arg arg_wh[] = {
+ {XtNwidth, (XtArgVal) &window_w},
+ {XtNheight, (XtArgVal) &window_h},
+};
+
+static Position window_x, window_y;
+static Arg arg_xy[] = {
+ {XtNx, (XtArgVal) &window_x},
+ {XtNy, (XtArgVal) &window_y},
+};
+
+#define get_xy() XtGetValues(draw_widget, arg_xy, XtNumber(arg_xy))
+
+#define mane_base_x 0
+#define mane_base_y 0
+
+static void
+home(scrl)
+ Boolean scrl;
+{
+ if (!scrl) XUnmapWindow(DISP, WINDOW(mane));
+ get_xy();
+ if (x_bar != NULL) {
+ register int coord = (page_w - clip_w) / 2;
+ if (coord > home_x / mane.shrinkfactor)
+ coord = home_x / mane.shrinkfactor;
+ XtCallCallbacks(x_bar, XtNscrollProc,
+ (XtPointer) (window_x + coord));
+ }
+ if (y_bar != NULL) {
+ register int coord = (page_h - clip_h) / 2;
+ if (coord > home_y / mane.shrinkfactor)
+ coord = home_y / mane.shrinkfactor;
+ XtCallCallbacks(y_bar, XtNscrollProc,
+ (XtPointer) (window_y + coord));
+ }
+ if (!scrl) {
+ XMapWindow(DISP, WINDOW(mane));
+ /* Wait for the server to catch up---this eliminates flicker. */
+ XSync(DISP, False);
+ }
+}
+
+static Boolean resized = False;
+
+static void
+get_geom()
+{
+ static Dimension new_clip_w, new_clip_h;
+ static Arg arg_wh_clip[] = {
+ {XtNwidth, (XtArgVal) &new_clip_w},
+ {XtNheight, (XtArgVal) &new_clip_h},
+ };
+ register int old_clip_w;
+
+ XtGetValues(vport_widget, arg_wh, XtNumber(arg_wh));
+ XtGetValues(clip_widget, arg_wh_clip, XtNumber(arg_wh_clip));
+ /* Note: widgets may be destroyed but not forgotten */
+ x_bar = page_w <= new_clip_w ? NULL
+ : XtNameToWidget(vport_widget, "horizontal");
+ y_bar = page_h <= new_clip_h ? NULL
+ : XtNameToWidget(vport_widget, "vertical");
+ old_clip_w = clip_w;
+ /* we need to do this because */
+ /* sizeof(Dimension) != sizeof(int) */
+ clip_w = new_clip_w;
+ clip_h = new_clip_h;
+ if (old_clip_w == 0) home(False);
+ resized = False;
+}
+
+static void
+center(x, y)
+ int x, y;
+{
+/* We use the clip widget here because it gives a more exact value. */
+ x -= clip_w/2;
+ y -= clip_h/2;
+ if (x_bar) XtCallCallbacks(x_bar, XtNscrollProc, (XtPointer) x);
+ if (y_bar) XtCallCallbacks(y_bar, XtNscrollProc, (XtPointer) y);
+ XWarpPointer(DISP, None, None, 0, 0, 0, 0, -x, -y);
+}
+
+/*
+ * callback routines
+ */
+
+/* The following callback routine should never be called. */
+ /*ARGSUSED*/
+static void
+handle_key(widget, junk, event, cont)
+ Widget widget;
+ XtPointer junk;
+ XEvent *event;
+ Boolean *cont; /* unused */
+{
+ XBell(DISP, 20);
+}
+
+ /*ARGSUSED*/
+static void
+handle_resize(widget, junk, event, cont)
+ Widget widget;
+ XtPointer junk;
+ XEvent *event;
+ Boolean *cont; /* unused */
+{
+ resized = True;
+}
+
+#ifdef BUTTONS
+ /*ARGSUSED*/
+static void
+handle_command(widget, client_data, call_data)
+ Widget widget;
+ XtPointer client_data;
+ XtPointer call_data;
+{
+ int int_client_data = (int) client_data; /* Apollo cc bug */
+
+ keystroke((int_client_data) & 0xff, (int_client_data) >> 8,
+ ((int_client_data) >> 8) != 0, (XEvent *) NULL);
+}
+#endif /* BUTTONS */
+
+#else /* !TOOLKIT */
+
+/*
+ * brute force scrollbar routines
+ */
+
+static void
+paint_x_bar()
+{
+ register int new_x_bgn = mane.base_x * clip_w / page_w;
+ register int new_x_end = (mane.base_x + clip_w) * clip_w / page_w;
+
+ if (new_x_bgn >= x_end || x_bgn >= new_x_end) { /* no overlap */
+ ClearArea(x_bar, x_bgn, 1, x_end - x_bgn, BAR_WID);
+ DarkenArea(x_bar, new_x_bgn, 1, new_x_end - new_x_bgn, BAR_WID);
+ }
+ else { /* this stuff avoids flicker */
+ if (x_bgn < new_x_bgn)
+ ClearArea(x_bar, x_bgn, 1, new_x_bgn - x_bgn, BAR_WID);
+ else
+ DarkenArea(x_bar, new_x_bgn, 1, x_bgn - new_x_bgn, BAR_WID);
+ if (new_x_end < x_end)
+ ClearArea(x_bar, new_x_end, 1, x_end - new_x_end, BAR_WID);
+ else
+ DarkenArea(x_bar, x_end, 1, new_x_end - x_end, BAR_WID);
+ }
+ x_bgn = new_x_bgn;
+ x_end = new_x_end;
+}
+
+static void
+paint_y_bar()
+{
+ register int new_y_bgn = mane.base_y * clip_h / page_h;
+ register int new_y_end = (mane.base_y + clip_h) * clip_h / page_h;
+
+ if (new_y_bgn >= y_end || y_bgn >= new_y_end) { /* no overlap */
+ ClearArea(y_bar, 1, y_bgn, BAR_WID, y_end - y_bgn);
+ DarkenArea(y_bar, 1, new_y_bgn, BAR_WID, new_y_end - new_y_bgn);
+ }
+ else { /* this stuff avoids flicker */
+ if (y_bgn < new_y_bgn)
+ ClearArea(y_bar, 1, y_bgn, BAR_WID, new_y_bgn - y_bgn);
+ else
+ DarkenArea(y_bar, 1, new_y_bgn, BAR_WID, y_bgn - new_y_bgn);
+ if (new_y_end < y_end)
+ ClearArea(y_bar, 1, new_y_end, BAR_WID, y_end - new_y_end);
+ else
+ DarkenArea(y_bar, 1, y_end, BAR_WID, new_y_end - y_end);
+ }
+ y_bgn = new_y_bgn;
+ y_end = new_y_end;
+}
+
+static void
+scrollmane(x, y)
+ int x, y;
+{
+ register int old_base_x = mane.base_x;
+ register int old_base_y = mane.base_y;
+ if (x > page_w - clip_w) x = page_w - clip_w;
+ if (x < 0) x = 0;
+ if (y > page_h - clip_h) y = page_h - clip_h;
+ if (y < 0) y = 0;
+ scrollwindow(&mane, x, y);
+ if (old_base_x != mane.base_x && x_bar) paint_x_bar();
+ if (old_base_y != mane.base_y && y_bar) paint_y_bar();
+}
+
+static void
+reconfig()
+{
+ int x_thick = 0;
+ int y_thick = 0;
+#ifdef X10
+ int old_clip_w = clip_w;
+ int old_clip_h = clip_h;
+ int old_x_thick = x_thick;
+ int old_y_thick = y_thick;
+#endif
+
+ /* determine existence of scrollbars */
+ if (window_w < page_w) x_thick = BAR_THICK;
+ if (window_h - x_thick < page_h) y_thick = BAR_THICK;
+ clip_w = window_w - y_thick;
+ if (clip_w < page_w) x_thick = BAR_THICK;
+ clip_h = window_h - x_thick;
+
+ /* process drawing (clip) window */
+ if (mane.win == NULL) { /* initial creation */
+#ifndef X10
+ mane.win = XCreateSimpleWindow(DISP, top_level, y_thick, x_thick,
+ (unsigned int) clip_w, (unsigned int) clip_h, 0,
+ brdr_Pixel, back_Pixel);
+ XSelectInput(DPY WINDOW(mane), ExposureMask |
+ ButtonPressMask | ButtonMotionMask | ButtonReleaseMask);
+#else
+ mane.win = XCreateWindow(top_level, y_thick, x_thick,
+ clip_w, clip_h, 0, bdrmap, backmap);
+ XSelectInput(WINDOW(mane), ExposeRegion | ExposeCopy |
+ ButtonPressed | ButtonReleased |
+ LeftDownMotion | MiddleDownMotion | RightDownMotion);
+#endif
+ XMapWindow(DPY WINDOW(mane));
+ }
+ else
+#ifdef X10
+ if (clip_w != old_clip_w || clip_h != old_clip_h ||
+ x_thick != old_x_thick || y_thick != old_y_thick) {
+#endif
+ XMoveResizeWindow(DPY WINDOW(mane),
+ y_thick, x_thick, clip_w, clip_h);
+#ifdef X10
+ XSync(False);
+ }
+#endif
+
+ /* process scroll bars */
+ if (x_thick) {
+ if (x_bar) {
+ XMoveResizeWindow(DPY x_bar,
+ y_thick - 1, -1, clip_w, BAR_THICK - 1);
+ paint_x_bar();
+ }
+ else {
+#ifndef X10
+ x_bar = XCreateSimpleWindow(DISP, top_level, y_thick - 1, -1,
+ (unsigned int) clip_w, BAR_THICK - 1, 1,
+ brdr_Pixel, back_Pixel);
+ XSelectInput(DISP, x_bar,
+ ExposureMask | ButtonPressMask | Button2MotionMask);
+#else
+ x_bar = XCreateWindow(top_level,
+ y_thick - 1, -1, clip_w, BAR_THICK - 1, 1,
+ bdrmap, backmap);
+ XSelectInput(x_bar,
+ ExposeRegion | ButtonPressed | MiddleDownMotion);
+#endif
+ XMapWindow(DPY x_bar);
+ }
+ x_bgn = mane.base_x * clip_w / page_w;
+ x_end = (mane.base_x + clip_w) * clip_w / page_w;
+ }
+ else
+ if (x_bar) {
+ XDestroyWindow(DPY x_bar);
+ x_bar = NULL;
+ }
+
+ if (y_thick) {
+ if (y_bar) {
+ XMoveResizeWindow(DPY y_bar,
+ -1, x_thick - 1, BAR_THICK - 1, clip_h);
+ paint_y_bar();
+ }
+ else {
+#ifndef X10
+ y_bar = XCreateSimpleWindow(DISP, top_level, -1, x_thick - 1,
+ BAR_THICK - 1, (unsigned int) clip_h, 1,
+ brdr_Pixel, back_Pixel);
+ XSelectInput(DISP, y_bar,
+ ExposureMask | ButtonPressMask | Button2MotionMask);
+#else
+ y_bar = XCreateWindow(top_level,
+ -1, x_thick - 1, BAR_THICK - 1, clip_h, 1,
+ bdrmap, backmap);
+ XSelectInput(y_bar,
+ ExposeRegion | ButtonPressed | MiddleDownMotion);
+#endif
+ XMapWindow(DPY y_bar);
+ }
+ y_bgn = mane.base_y * clip_h / page_h;
+ y_end = (mane.base_y + clip_h) * clip_h / page_h;
+ }
+ else
+ if (y_bar) {
+ XDestroyWindow(DPY y_bar);
+ y_bar = NULL;
+ }
+}
+
+static void
+home(scrl)
+ Boolean scrl;
+{
+ int x = 0, y = 0;
+
+ if (page_w > clip_w) {
+ x = (page_w - clip_w) / 2;
+ if (x > home_x / mane.shrinkfactor)
+ x = home_x / mane.shrinkfactor;
+ }
+ if (page_h > clip_h) {
+ y = (page_h - clip_h) / 2;
+ if (y > home_y / mane.shrinkfactor)
+ y = home_y / mane.shrinkfactor;
+ }
+ if (scrl)
+ scrollmane(x, y);
+ else {
+ mane.base_x = x;
+ mane.base_y = y;
+ if (currwin.win == mane.win) {
+ currwin.base_x = x;
+ currwin.base_y = y;
+ }
+ if (x_bar) paint_x_bar();
+ if (y_bar) paint_y_bar();
+ }
+}
+
+#define get_xy()
+#define window_x 0
+#define window_y 0
+#define mane_base_x mane.base_x
+#define mane_base_y mane.base_y
+#endif /* TOOLKIT */
+
+static void
+compute_mag_pos(xp, yp)
+ int *xp, *yp;
+{
+ register int t;
+
+ t = mag_x + main_x - alt.width/2;
+#ifndef X10
+ if (t > WidthOfScreen(SCRN) - alt.width - 2*MAGBORD)
+ t = WidthOfScreen(SCRN) - alt.width - 2*MAGBORD;
+#else
+ if (t > (int) window_w - alt.width - 2*MAGBORD)
+ t = window_w - alt.width - 2*MAGBORD;
+#endif
+ if (t < 0) t = 0;
+ *xp = t;
+ t = mag_y + main_y - alt.height/2;
+#ifndef X10
+ if (t > HeightOfScreen(SCRN) - alt.height - 2*MAGBORD)
+ t = HeightOfScreen(SCRN) - alt.height - 2*MAGBORD;
+#else
+ if (t > (int) window_h - alt.height - 2*MAGBORD)
+ t = window_h - alt.height - 2*MAGBORD;
+#endif
+ if (t < 0) t = 0;
+ *yp = t;
+}
+
+#ifdef TOOLKIT
+ /*ARGSUSED*/
+static void
+handle_button(widget, junk, ev, cont)
+ Widget widget;
+ XtPointer junk;
+ XEvent *ev;
+#define event (&(ev->xbutton))
+ Boolean *cont; /* unused */
+#else /* !TOOLKIT */
+static void
+handle_button(event)
+ XButtonEvent *event;
+#endif /* TOOLKIT */
+{
+ int x, y;
+#ifndef X10
+ int w = RESOURCE(mg_size[event->button - 1]);
+ XSetWindowAttributes attr;
+#else
+ int w = RESOURCE(mg_size[2 - (event->detail & ValueMask)]);
+#endif
+
+ if (alt.win != (Window) 0 || mane.shrinkfactor == 1 || w <= 0)
+ XBell(DISP, 20);
+ else {
+ mag_x = event->x;
+ mag_y = event->y;
+ alt.width = alt.height = w;
+#ifndef X10
+ main_x = event->x_root - mag_x;
+ main_y = event->y_root - mag_y;
+#endif
+ compute_mag_pos(&x, &y);
+ alt.base_x = (event->x + mane_base_x) * mane.shrinkfactor -
+ alt.width/2;
+ alt.base_y = (event->y + mane_base_y) * mane.shrinkfactor -
+ alt.height/2;
+#ifndef X10
+ attr.save_under = True;
+ attr.border_pixel = RESOURCE(brdr_Pixel);
+ attr.background_pixel = RESOURCE(back_Pixel);
+ attr.override_redirect = True;
+ alt.win = XCreateWindow(DISP, RootWindowOfScreen(SCRN),
+ x, y, alt.width, alt.height, MAGBORD,
+ 0, /* depth from parent */
+ InputOutput, CopyFromParent,
+ CWSaveUnder | CWBorderPixel | CWBackPixel |
+ CWOverrideRedirect, &attr);
+ XSelectInput(DISP, WINDOW(alt), ExposureMask);
+#else
+ alt.win = XCreateWindow(WINDOW(mane),
+ x, y, alt.width, alt.height, MAGBORD,
+ bdrmap, backmap);
+ XSelectInput(WINDOW(alt), ExposeRegion);
+#endif
+ XMapWindow(DPY WINDOW(alt));
+ alt_stat = 1; /* waiting for exposure */
+ }
+}
+
+#ifdef TOOLKIT
+#undef event
+
+ /*ARGSUSED*/
+static void
+handle_motion(widget, junk, ev, cont)
+ Widget widget;
+ XtPointer junk;
+ XEvent *ev;
+#define event (&(ev->xmotion))
+ Boolean *cont; /* unused */
+{
+ new_mag_x = event->x;
+ main_x = event->x_root - new_mag_x;
+ new_mag_y = event->y;
+ main_y = event->y_root - new_mag_y;
+ mag_moved = (new_mag_x != mag_x || new_mag_y != mag_y);
+}
+
+#undef event
+#endif /* TOOLKIT */
+
+static void
+movemag(x, y)
+ int x, y;
+{
+ int xx, yy;
+
+ mag_x = x;
+ mag_y = y;
+ if (mag_x == new_mag_x && mag_y == new_mag_y) mag_moved = False;
+ compute_mag_pos(&xx, &yy);
+ XMoveWindow(DPY WINDOW(alt), xx, yy);
+ scrollwindow(&alt, (x + mane_base_x) * mane.shrinkfactor - alt.width/2,
+ (y + mane_base_y) * mane.shrinkfactor - alt.height/2);
+}
+
+#ifdef TOOLKIT
+ /*ARGSUSED*/
+static void
+handle_release(widget, junk, ev, cont)
+ Widget widget;
+ XtPointer junk;
+ XEvent *ev;
+#define event (&(ev->xbutton))
+ Boolean *cont; /* unused */
+#else /* !TOOLKIT */
+static void
+handle_release()
+#endif /* TOOLKIT */
+{
+ if (alt.win)
+ if (alt_stat) alt_stat = -1; /* destroy upon expose */
+ else {
+ XDestroyWindow(DPY WINDOW(alt));
+ if (currwin.win == alt.win) alt_canit = True;
+ alt.win = (Window) 0;
+ mag_moved = False;
+ can_exposures(&alt);
+ }
+}
+
+#ifdef TOOLKIT
+#undef event
+
+ /*ARGSUSED*/
+static void
+handle_exp(widget, closure, ev, cont)
+ Widget widget;
+ XtPointer closure;
+ register XEvent *ev;
+#define event (&(ev->xexpose))
+ Boolean *cont; /* unused */
+{
+ struct WindowRec *windowrec = (struct WindowRec *) closure;
+
+ if (windowrec == &alt)
+ if (alt_stat < 0) { /* destroy upon exposure */
+ alt_stat = 0;
+ handle_release(widget, (caddr_t) NULL, ev, (Boolean *) NULL);
+ return;
+ }
+ else
+ alt_stat = 0;
+ expose(windowrec, event->x, event->y, event->width, event->height);
+}
+
+#undef event
+#endif /* TOOLKIT */
+
+/* |||
+ * Currently the event handler does not coordinate XCopyArea requests
+ * with GraphicsExpose events. This can lead to problems if the window
+ * is partially obscured and one, for example, drags a scrollbar.
+ */
+
+#ifndef X10
+#define XKEY(ev) (ev).xkey
+#ifndef TOOLKIT
+#define XANY(ev) (ev).xany
+#define XCONFIG(ev) (ev).xconfigure
+#define XEXPOSE(ev) (ev).xexpose
+#define XMOTION(ev) (ev).xmotion
+#define XBUTTON(ev) (ev).xbutton
+#define ISEXPOSE(ev) ((ev).type == Expose)
+#endif /* TOOLKIT */
+#else /* X10 */
+#define XANY(ev) (ev)
+#define XCONFIG(ev) (*((XExposeEvent *) &(ev)))
+#define XEXPOSE(ev) (*((XExposeEvent *) &(ev)))
+#define XMOTION(ev) (*((XMouseMovedEvent *) &(ev)))
+#define XBUTTON(ev) (*((XButtonEvent *) &(ev)))
+#define XKEY(ev) (*((XKeyEvent *) &(ev)))
+#define ConfigureNotify ExposeWindow
+#define Expose ExposeRegion
+#define ISEXPOSE(ev) ((ev).type == ExposeWindow || (ev).type == ExposeRegion)
+#define MotionNotify MouseMoved
+#define ButtonPress ButtonPressed
+#define ButtonRelease ButtonReleased
+#define KeyPress KeyPressed
+#endif /* X10 */
+
+static void
+keystroke(ch, number0, arg0, eventp)
+ char ch;
+ int number0;
+ Boolean arg0;
+ XEvent *eventp;
+{
+ int next_page;
+#ifdef TOOLKIT
+ Window ww;
+#endif
+
+ next_page = current_page;
+ switch (ch) {
+ case 'q':
+ case '\003': /* control-C */
+ case '\004': /* control-D */
+#ifdef VMS
+ case '\032': /* control-Z */
+#endif
+ exit(0);
+ case 'n':
+ case 'f':
+ case ' ':
+ case '\r':
+ case '\n':
+ /* scroll forward; i.e. go to relative page */
+ next_page = current_page + (arg0 ? number0 : 1);
+ break;
+ case 'p':
+ case 'b':
+ case '\b':
+ case '\177': /* Del */
+ /* scroll backward */
+ next_page = current_page - (arg0 ? number0 : 1);
+ break;
+ case 'g':
+ /* go to absolute page */
+ next_page = (arg0 ? number0 - pageno_correct :
+ total_pages - 1);
+ break;
+ case 'P': /* declare current page */
+ pageno_correct = arg0 * number0 - current_page;
+ return;
+ case 'k': /* toggle keep-position flag */
+ RESOURCE(keep_flag) = (arg0 ? number0 : !RESOURCE(keep_flag));
+ return;
+ case '\f':
+ /* redisplay current page */
+ break;
+ case '^':
+ home(True);
+ return;
+#ifdef TOOLKIT
+ case 'l':
+ if (!x_bar) goto bad;
+ XtCallCallbacks(x_bar, XtNscrollProc,
+ (XtPointer) (-2 * (int) clip_w / 3));
+ return;
+ case 'r':
+ if (!x_bar) goto bad;
+ XtCallCallbacks(x_bar, XtNscrollProc,
+ (XtPointer) (2 * (int) clip_w / 3));
+ return;
+ case 'u':
+ if (!y_bar) goto bad;
+ XtCallCallbacks(y_bar, XtNscrollProc,
+ (XtPointer) (-2 * (int) clip_h / 3));
+ return;
+ case 'd':
+ if (!y_bar) goto bad;
+ XtCallCallbacks(y_bar, XtNscrollProc,
+ (XtPointer) (2 * (int) clip_h / 3));
+ return;
+ case 'c':
+ center(eventp->xkey.x, eventp->xkey.y);
+ return;
+ case 'M':
+ XTranslateCoordinates(DISP, eventp->xkey.window,
+ WINDOW(mane), eventp->xkey.x, eventp->xkey.y,
+ &home_x, &home_y, &ww); /* throw away last argument */
+ home_x *= mane.shrinkfactor;
+ home_y *= mane.shrinkfactor;
+ return;
+#ifdef BUTTONS
+ case 'x':
+ if (arg0 && resource.expert == (number0 != 0)) return;
+ if (resource.expert) { /* create buttons */
+ XtResizeWidget(vport_widget, window_w -= XTRA_WID, window_h,
+ 0);
+ create_buttons((XtArgVal) window_h);
+ resource.expert = False;
+ }
+ else { /* destroy buttons */
+ XtResizeWidget(vport_widget, window_w += XTRA_WID, window_h,
+ 0);
+ XtDestroyWidget(right_widget);
+ XtDestroyWidget(line_widget);
+ resource.expert = True;
+ }
+ return;
+#endif /* BUTTONS */
+#else /* !TOOLKIT */
+ case 'l':
+ if (mane.base_x <= 0) goto bad;
+ scrollmane(mane.base_x - 2 * clip_w / 3, mane.base_y);
+ return;
+ case 'r':
+ if (mane.base_x >= page_w - clip_w) goto bad;
+ scrollmane(mane.base_x + 2 * clip_w / 3, mane.base_y);
+ return;
+ case 'u':
+ if (mane.base_y <= 0) goto bad;
+ scrollmane(mane.base_x, mane.base_y - 2 * clip_h / 3);
+ return;
+ case 'd':
+ if (mane.base_y >= page_h - clip_h) goto bad;
+ scrollmane(mane.base_x, mane.base_y + 2 * clip_h / 3);
+ return;
+ case 'c': /* unchecked scrollmane() */
+ scrollwindow(&mane, mane.base_x + XKEY(*eventp).x - clip_w/2,
+ mane.base_y + XKEY(*eventp).y - clip_h/2);
+ if (x_bar) paint_x_bar();
+ if (y_bar) paint_y_bar();
+#ifndef X10
+ XWarpPointer(DISP, None, None, 0, 0, 0, 0,
+ clip_w/2 - XKEY(*eventp).x, clip_h/2 - XKEY(*eventp).y);
+#else
+ XWarpMouse(WINDOW(mane), clip_w/2, clip_h/2, GXcopy);
+#endif
+ return;
+ case 'M':
+ home_x = (XKEY(*eventp).x - (y_bar ? BAR_THICK : 0)
+ + mane.base_x) * mane.shrinkfactor;
+ home_y = (XKEY(*eventp).y - (x_bar ? BAR_THICK : 0)
+ + mane.base_y) * mane.shrinkfactor;
+ return;
+#endif /* TOOLKIT */
+
+#ifndef X10
+ case '\020': /* Control P */
+ Printf("Unit = %d, bitord = %d, byteord = %d\n",
+ BitmapUnit(DISP), BitmapBitOrder(DISP),
+ ImageByteOrder(DISP));
+ return;
+#endif
+ case 's':
+ if (!arg0) {
+ int temp;
+ number0 = ROUNDUP(unshrunk_page_w, window_w - 2);
+ temp = ROUNDUP(unshrunk_page_h, window_h - 2);
+ if (number0 < temp) number0 = temp;
+ }
+ if (number0 <= 0) goto bad;
+ if (number0 == mane.shrinkfactor) return;
+ mane.shrinkfactor = number0;
+ init_page();
+ if (number0 != 1 && number0 != bak_shrink) {
+ bak_shrink = number0;
+#ifdef GREY
+ if (use_grey) init_pix(False);
+#endif
+ reset_fonts();
+ }
+#ifdef TOOLKIT
+ draw_args[0].value = (XtArgVal) page_w;
+ draw_args[1].value = (XtArgVal) page_h;
+ XtSetValues(draw_widget, draw_args, (Cardinal) 2);
+ get_geom();
+ home(False);
+#else /* TOOLKIT */
+ reconfig();
+ home(False);
+#endif /* TOOLKIT */
+ break;
+ case 'S':
+ if (!arg0) goto bad;
+ if (number0 < 0) goto bad;
+ if (number0 == density) return;
+ density = number0;
+ reset_fonts();
+ if (mane.shrinkfactor == 1) return;
+ break;
+#ifdef GREY
+ case 'G':
+ use_grey = (arg0 ? number0 : !use_grey);
+ if (use_grey) init_pix(False);
+ reset_fonts();
+ break;
+#endif
+ case 'R':
+ /* reread DVI file */
+ --dvi_time; /* then it will notice a change */
+ break;
+ default:
+ goto bad;
+ }
+ if (0 <= next_page && next_page < total_pages) {
+ if (current_page != next_page) {
+ current_page = next_page;
+ hush_spec_now = hush_spec;
+ if (!RESOURCE(keep_flag)) home(False);
+ }
+ canit = True;
+ Flush();
+ return; /* don't use longjmp here: it might be called from
+ * within the toolkit, and we don't want to longjmp out
+ * of Xt routines. */
+ }
+ bad: XBell(DISP, 10);
+}
+
+
+#ifndef X10
+#define TRSIZE 100
+#endif /* X10 */
+
+static void
+read_events(wait)
+ Boolean wait;
+{
+ char ch;
+ Boolean arg0;
+ int number0;
+ XEvent event;
+#ifndef X10
+ char trbuf[TRSIZE];
+#endif
+ char *string;
+ int nbytes;
+
+ alt_canit = False;
+ for (;;) {
+ ch = '\0';
+ event_counter = event_freq;
+ /*
+ * The above line clears the flag indicating that an event is
+ * pending. So if an event comes in right now, the flag will be
+ * set again needlessly, but we just end up making an extra call.
+ * Also, watch out, if we destroy the magnifying glass while
+ * writing it.
+ */
+ if (!XtPending() && (!wait || canit || mane.min_x < MAXDIM ||
+ alt.min_x < MAXDIM || mag_moved))
+ if (!wait && (canit || alt_canit)) longjmp(canit_env, 1);
+ else return;
+#ifdef TOOLKIT
+ XtNextEvent(&event);
+ if (resized) get_geom();
+ if (event.xany.window == WINDOW(alt) &&
+ event.type == Expose) {
+ handle_exp((Widget) NULL, (XtPointer) &alt, &event,
+ (Boolean *) NULL);
+ continue;
+ }
+ if (event.type != KeyPress) {
+ XtDispatchEvent(&event);
+ continue;
+ }
+ string = trbuf;
+ nbytes = XLookupString(&event.xkey, string, TRSIZE, NULL, NULL);
+ if (nbytes > 1) ch = '?';
+ if (nbytes != 0) ch = *string;
+#else /* !TOOLKIT */
+
+ XNextEvent(DPY &event);
+ if (XANY(event).window == WINDOW(mane) ||
+ XANY(event).window == WINDOW(alt)) {
+
+ struct WindowRec *wr = &mane;
+
+ if (XANY(event).window == WINDOW(alt)) {
+ wr = &alt;
+ /* check in case we already destroyed the window */
+ if (alt_stat < 0) { /* destroy upon exposure */
+ alt_stat = 0;
+ handle_release();
+ continue;
+ }
+ else
+ alt_stat = 0;
+ }
+ switch (event.type) {
+#ifndef X10
+ case GraphicsExpose:
+#else
+ case ExposeWindow:
+#endif
+ case Expose:
+#ifdef X10
+ if (XEXPOSE(event).detail & ExposeCopy)
+ ClearArea(event.window,
+ XEXPOSE(event).x, XEXPOSE(event).y,
+ XEXPOSE(event).width, XEXPOSE(event).height);
+#endif
+ expose(wr, XEXPOSE(event).x, XEXPOSE(event).y,
+ XEXPOSE(event).width, XEXPOSE(event).height);
+#ifdef X10
+ case ExposeCopy: /* throw away junk event */
+#endif
+ break;
+
+ case MotionNotify:
+#ifdef X10
+ case LeftDownMotion:
+ case MiddleDownMotion:
+ case RightDownMotion:
+#endif
+ new_mag_x = XMOTION(event).x;
+ new_mag_y = XMOTION(event).y;
+ mag_moved = (new_mag_x != mag_x || new_mag_y != mag_y);
+ break;
+
+ case ButtonPress:
+ handle_button(&XBUTTON(event));
+ break;
+
+ case ButtonRelease:
+ handle_release();
+ break;
+ } /* end switch */
+ } /* end if window == {mane,alt}.win */
+
+ else if (XANY(event).window == x_bar) {
+ if (ISEXPOSE(event))
+ DarkenArea(x_bar, x_bgn, 1, x_end - x_bgn, BAR_WID);
+ else if (event.type == MotionNotify)
+ scrollmane(XMOTION(event).x * page_w / clip_w,
+ mane.base_y);
+#ifndef X10
+ else switch (XBUTTON(event).button)
+#else
+ else if (event.type == ButtonPress)
+ switch (3 - (XBUTTON(event).detail & ValueMask))
+#endif
+ {
+ case 1:
+ scrollmane(mane.base_x + XBUTTON(event).x, mane.base_y);
+ break;
+ case 2:
+ scrollmane(XBUTTON(event).x * page_w / clip_w,
+ mane.base_y);
+ break;
+ case 3:
+ scrollmane(mane.base_x - XBUTTON(event).x, mane.base_y);
+ }
+ }
+
+ else if (XANY(event).window == y_bar) {
+ if (ISEXPOSE(event))
+ DarkenArea(y_bar, 1, y_bgn, BAR_WID, y_end - y_bgn);
+ else if (event.type == MotionNotify)
+ scrollmane(mane.base_x,
+ XMOTION(event).y * page_h / clip_h);
+#ifndef X10
+ else switch (XBUTTON(event).button)
+#else
+ else if (event.type == ButtonPress)
+ switch (3 - (XBUTTON(event).detail & ValueMask))
+#endif
+ {
+ case 1:
+ scrollmane(mane.base_x, mane.base_y + XBUTTON(event).y);
+ break;
+ case 2:
+ scrollmane(mane.base_x,
+ XBUTTON(event).y * page_h / clip_h);
+ break;
+ case 3:
+ scrollmane(mane.base_x, mane.base_y - XBUTTON(event).y);
+ }
+ }
+
+ else if (XANY(event).window == top_level)
+ switch (event.type) {
+ case ConfigureNotify:
+ if (XANY(event).window == top_level &&
+ (XCONFIG(event).width != window_w ||
+ XCONFIG(event).height != window_h)) {
+ register Window old_mane_win = mane.win;
+
+ window_w = XCONFIG(event).width;
+ window_h = XCONFIG(event).height;
+ reconfig();
+ if (old_mane_win == NULL) home(False);
+ }
+ break;
+
+#ifndef X10
+ case MapNotify: /* if running w/o WM */
+ if (mane.win == NULL) {
+ reconfig();
+ home(False);
+ }
+ break;
+#endif
+
+ case KeyPress:
+#ifndef X10
+ string = trbuf;
+ nbytes = XLookupString(&event.xkey, string, TRSIZE, NULL,
+ NULL);
+#else
+ string = XLookupMapping(&event, &nbytes);
+#endif
+ if (nbytes > 1) ch = '?';
+ if (nbytes != 0) ch = *string;
+ break;
+ }
+#endif /* TOOLKIT */
+ if (ch == '\0') continue;
+ if (ch >= '0' && ch <= '9') {
+ has_arg = True;
+ number = number * 10 + sign * (ch - '0');
+ continue;
+ }
+ else if (ch == '-') {
+ has_arg = True;
+ sign = -1;
+ number = 0;
+ continue;
+ }
+ number0 = number;
+ number = 0;
+ sign = 1;
+ arg0 = has_arg;
+ has_arg = False;
+ keystroke(ch, number0, arg0, &event);
+ }
+}
+
+static void
+redraw(windowrec)
+ struct WindowRec *windowrec;
+{
+ char *errtext;
+#ifdef X10
+ static FontInfo *font = 0;
+#endif
+
+ currwin = *windowrec;
+ min_x = currwin.min_x + currwin.base_x;
+ min_y = currwin.min_y + currwin.base_y;
+ max_x = currwin.max_x + currwin.base_x;
+ max_y = currwin.max_y + currwin.base_y;
+ can_exposures(windowrec);
+
+ if (debug & DBG_EVENT)
+ Printf("Redraw %d x %d at (%d, %d) (base=%d,%d)\n", max_x - min_x,
+ max_y - min_y, min_x, min_y, currwin.base_x, currwin.base_y);
+ SetCursor(redraw_cursor);
+ Flush();
+ if (errtext = (char *) setjmp(dvi_env)) {
+ ClearPage(mane);
+#ifndef X10
+ get_xy();
+ XDrawString(DISP, WINDOW(mane), foreGC,
+ 5 - window_x, 5 + X11HEIGHT - window_y,
+ errtext, strlen(errtext));
+#else
+ if (!font) font = XOpenFont(X10FONT);
+ XTextMask(WINDOW(mane), 5, 5 + X10HEIGHT, errtext, strlen(errtext),
+ font->id, foreGC);
+#endif
+ if (dvi_file) {
+ Fclose(dvi_file);
+ dvi_file = NULL;
+ }
+ }
+ else {
+ draw_page();
+ hush_spec_now = True;
+ }
+}
+
+void
+redraw_page()
+{
+ if (debug & DBG_EVENT) Fputs("Redraw page: ", stdout);
+ get_xy();
+ ClearPage(mane);
+ mane.min_x = -window_x;
+ mane.max_x = -window_x + clip_w;
+ mane.min_y = -window_y;
+ mane.max_y = -window_y + clip_h;
+ redraw(&mane);
+}
+
+/*
+ * Interrupt system for receiving events. The program sets a flag
+ * whenever an event comes in, so that at the proper time (i.e., when
+ * reading a new dvi item), we can check incoming events to see if we
+ * still want to go on printing this page. This way, one can stop
+ * displaying a page if it is about to be erased anyway. We try to read
+ * as many events as possible before doing anything and base the next
+ * action on all events read.
+ * Note that the Xlib and Xt routines are not reentrant, so the most we
+ * can do is set a flag in the interrupt routine and check it later.
+ * Also, sometimes the interrupts are not generated (some systems only
+ * guarantee that SIGIO is generated for terminal files, and on the system
+ * I use, the interrupts are not generated if I use "(xdvi foo &)" instead
+ * of "xdvi foo"). Therefore, there is also a mechanism to check the
+ * event queue every 70 drawing operations or so. This mechanism is
+ * disabled if it turns out that the interrupts do work.
+ * For a fuller discussion of some of the above, see xlife in
+ * comp.sources.x.
+ */
+
+static void
+can_exposures(windowrec)
+ struct WindowRec *windowrec;
+{
+ windowrec->min_x = windowrec->min_y = MAXDIM;
+ windowrec->max_x = windowrec->max_y = 0;
+}
+
+static void
+handle_intr() {
+ event_counter = 1;
+ event_freq = -1; /* forget Plan B */
+}
+
+#ifdef HAS_SIGIO
+static void
+enable_intr() {
+ int socket = ConnectionNumber(DISP);
+ if (!isatty(0)) {
+ Puts("trying...");
+ if (dup2(socket, 0) == -1) perror(prog);
+ socket = 0;
+ }
+ (void) signal(SIGIO, handle_intr);
+ (void) fcntl(socket, F_SETOWN, getpid());
+ (void) fcntl(socket, F_SETFL, fcntl(socket, F_GETFL, 0) | FASYNC);
+}
+#endif /* HAS_SIGIO */
+
+static void
+do_pages()
+{
+ if (debug & DBG_BATCH) {
+#ifdef TOOLKIT
+ while (mane.min_x == MAXDIM) read_events(True);
+#else /* !TOOLKIT */
+ while (mane.min_x == MAXDIM)
+ if (setjmp(canit_env)) break;
+ else read_events(True);
+#endif /* TOOLKIT */
+ for (current_page = 0; current_page < total_pages; ++current_page)
+ redraw_page();
+ }
+ else { /* normal operation */
+#ifdef HAS_SIGIO
+ enable_intr();
+#endif
+#ifdef __convex__
+ /* convex C turns off optimization for the entire function
+ if setjmp return value is discarded.*/
+ if (setjmp(canit_env)) /*optimize me*/;
+#else
+ (void) setjmp(canit_env);
+#endif
+ for (;;) {
+ if (mane.win) SetCursor(ready_cursor);
+ read_events(True);
+ if (canit) {
+ canit = False;
+ can_exposures(&mane);
+ can_exposures(&alt);
+ redraw_page();
+ }
+ else if (mag_moved) {
+ if (alt.win == (Window) 0) mag_moved = False;
+ else if (abs(new_mag_x - mag_x) >
+ 2 * abs(new_mag_y - mag_y))
+ movemag(new_mag_x, mag_y);
+ else if (abs(new_mag_y - mag_y) >
+ 2 * abs(new_mag_x - mag_x))
+ movemag(mag_x, new_mag_y);
+ else movemag(new_mag_x, new_mag_y);
+ }
+ else if (alt.min_x < MAXDIM) redraw(&alt);
+ else if (mane.min_x < MAXDIM) redraw(&mane);
+ Flush();
+ }
+ }
+}
+
+static NORETURN void
+usage() {
+#ifndef X10
+#ifndef VMS
+#ifdef BUTTONS
+ Fputs("\
+Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-rv]\n\
+ [-expert] [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
+ [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\n\
+ [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
+ [-hushspecials] [-hushchars] [-hush] [-nogrey] [-gamma <g>] \
+[-version]\n\
+ [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
+[-cr <color>]\n\
+ [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
+ [-iconic] [-display <host:display>] [-copy] [-thorough] dvi_file\n\n\n\
+ Adapted to DV/X using DJGPP by Eric Ho\n\
+ 9041477@SSCVAX.MCMASTER.CA\n\n",
+ stderr);
+#else /* !BUTTONS */
+ Fputs("\
+Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l] [-rv]\n\
+ [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
+ [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\n\
+ [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
+ [-hushspecials] [-hushchars] [-hush] [-nogrey] [-gamma <g>] [-version]\n\
+ [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] [-cr <color>]\n\
+ [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
+ [-iconic] [-display <host:display>] [-copy] [-thorough] dvi_file\n\n\n\
+ Adapted to DV/X using DJGPP by Eric Ho\n\
+ 9041477@SSCVAX.MCMASTER.CA\n\n",
+ stderr);
+#endif /* BUTTONS */
+#else /* VMS */
+ Fputs("\
+Usage: xdvi [+[<page>]] [-s <shrink>] [-density <%>] [-p <pixels>] [-l] [-rv]\n\
+ [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
+ [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\
+\n", stderr);
+ Fputs("\
+ [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
+ [-hushspecials] [-hushchars] [-hush] [-nogrey] [-gamma <g>] \
+[-version]\n\
+ [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
+[-cr <color>]\n\
+ [-bw <width>] [-geometry <geometry>] [-icongeometry <geometry>]\n\
+ [-iconic] [-display <host::display>] [-copy] [-thorough] dvi_file\n",
+ stderr);
+#endif /* VMS */
+#else /* X10 */
+ Fputs("\
+Usage: xdvi [+[<page>]] [-s <shrink>] [-S <density>] [-p <pixels>] [-l]\n\
+ [-paper <papertype>] [-mgs[n] <size>] [-altfont <font>]\n\
+ [-margins <dimen>] [-sidemargin <dimen>] [-topmargin <dimen>]\n\
+ [-offsets <dimen>] [-xoffset <dimen>] [-yoffset <dimen>] [-keep]\n\
+ [-hushspecials] [-hushchars] [-hush] [-version]\n\
+ [-fg <color>] [-bg <color>] [-hl <color>] [-bd <color>] \
+[-cr <color>]\n\
+ [-bw <width>] [-geometry <geometry> | =<geometry>]\n\
+ [-display <host:display> | <host:display>] dvi_file\n", stderr);
+#endif /* X10 */
+ exit(1);
+}
+
+static int
+atopix(arg)
+ _Xconst char *arg;
+{
+ int len = strlen(arg);
+
+ return (len > 2 && arg[len - 2] == 'c' && arg[len - 1] == 'm' ?
+ 1.0 / 2.54 : 1.0) * atof(arg) * pixels_per_inch + 0.5;
+}
+
+/**
+ ** Main programs start here.
+ **/
+
+#ifdef TOOLKIT
+
+static XrmOptionDescRec options[] = {
+{"-d", ".debugLevel", XrmoptionSepArg, (caddr_t) NULL},
+{"-s", ".shrinkFactor", XrmoptionSepArg, (caddr_t) NULL},
+#ifndef VMS
+{"-S", ".densityPercent", XrmoptionSepArg, (caddr_t) NULL},
+#endif
+{"-density", ".densityPercent", XrmoptionSepArg, (caddr_t) NULL},
+#ifdef GREY
+{"-gamma", ".gamma", XrmoptionSepArg, (caddr_t) NULL},
+#endif
+{"-p", ".pixelsPerInch", XrmoptionSepArg, (caddr_t) NULL},
+{"-margins", ".Margin", XrmoptionSepArg, (caddr_t) NULL},
+{"-sidemargin", ".sideMargin", XrmoptionSepArg, (caddr_t) NULL},
+{"-topmargin", ".topMargin", XrmoptionSepArg, (caddr_t) NULL},
+{"-offsets", ".Offset", XrmoptionSepArg, (caddr_t) NULL},
+{"-xoffset", ".xOffset", XrmoptionSepArg, (caddr_t) NULL},
+{"-yoffset", ".yOffset", XrmoptionSepArg, (caddr_t) NULL},
+{"-paper", ".paper", XrmoptionSepArg, (caddr_t) NULL},
+{"-altfont", ".altFont", XrmoptionSepArg, (caddr_t) NULL},
+{"-l", ".listFonts", XrmoptionNoArg, (caddr_t) "on"},
+{"+l", ".listFonts", XrmoptionNoArg, (caddr_t) "off"},
+{"-hushspecials", ".hushSpecials", XrmoptionNoArg, (caddr_t) "on"},
+{"+hushspecials", ".hushSpecials", XrmoptionNoArg, (caddr_t) "off"},
+{"-hushchars", ".hushLostChars", XrmoptionNoArg, (caddr_t) "on"},
+{"+hushchars", ".hushLostChars", XrmoptionNoArg, (caddr_t) "off"},
+{"-hush", ".Hush", XrmoptionNoArg, (caddr_t) "on"},
+{"+hush", ".Hush", XrmoptionNoArg, (caddr_t) "off"},
+{"-fg", ".foreground", XrmoptionSepArg, (caddr_t) NULL},
+{"-foreground", ".foreground", XrmoptionSepArg, (caddr_t) NULL},
+{"-bg", ".background", XrmoptionSepArg, (caddr_t) NULL},
+{"-background", ".background", XrmoptionSepArg, (caddr_t) NULL},
+{"-hl", ".highlight", XrmoptionSepArg, (caddr_t) NULL},
+{"-cr", ".cursorColor", XrmoptionSepArg, (caddr_t) NULL},
+{"-icongeometry",".iconGeometry",XrmoptionSepArg, (caddr_t) NULL},
+{"-keep", ".keepPosition",XrmoptionNoArg, (caddr_t) "on"},
+{"+keep", ".keepPosition",XrmoptionNoArg, (caddr_t) "off"},
+{"-copy", ".copy", XrmoptionNoArg, (caddr_t) "on"},
+{"+copy", ".copy", XrmoptionNoArg, (caddr_t) "off"},
+{"-thorough", ".thorough", XrmoptionNoArg, (caddr_t) "on"},
+{"+thorough", ".thorough", XrmoptionNoArg, (caddr_t) "off"},
+{"-version", ".version", XrmoptionNoArg, (caddr_t) "on"},
+{"+version", ".version", XrmoptionNoArg, (caddr_t) "off"},
+#ifdef BUTTONS
+{"-expert", ".expert", XrmoptionNoArg, (caddr_t) "on"},
+{"+expert", ".expert", XrmoptionNoArg, (caddr_t) "off"},
+#endif
+{"-mgs", ".magnifierSize1",XrmoptionSepArg, (caddr_t) NULL},
+{"-mgs1", ".magnifierSize1",XrmoptionSepArg, (caddr_t) NULL},
+{"-mgs2", ".magnifierSize2",XrmoptionSepArg, (caddr_t) NULL},
+{"-mgs3", ".magnifierSize3",XrmoptionSepArg, (caddr_t) NULL},
+{"-mgs4", ".magnifierSize4",XrmoptionSepArg, (caddr_t) NULL},
+{"-mgs5", ".magnifierSize5",XrmoptionSepArg, (caddr_t) NULL},
+#ifdef GREY
+{"-nogrey", ".grey", XrmoptionNoArg, (caddr_t) "off"},
+{"+nogrey", ".grey", XrmoptionNoArg, (caddr_t) "on"},
+#endif
+};
+
+#define offset(field) XtOffsetOf(struct _resource, field)
+
+static int basedpi = BDPI; /* default value for -p option */
+
+static XtResource application_resources[] = {
+{"debugLevel", "DebugLevel", XtRString, sizeof(char *),
+ offset(debug_arg), XtRString, (caddr_t) NULL},
+{"shrinkFactor", "ShrinkFactor", XtRInt, sizeof(int),
+ offset(_shrink_factor), XtRString, "3"},
+{"densityPercent", "DensityPercent", XtRInt, sizeof(int),
+ offset(density), XtRString, "40"},
+#ifdef GREY
+{"gamma", "Gamma", XtRFloat, sizeof(float),
+ offset(gamma), XtRString, "1"},
+#endif
+{"pixelsPerInch", "PixelsPerInch", XtRInt, sizeof(int),
+ offset(pixels_per_inch), XtRInt, (caddr_t) &basedpi},
+{"sideMargin", "Margin", XtRString, sizeof(char *),
+ offset(sidemargin), XtRString, (caddr_t) NULL},
+{"topMargin", "Margin", XtRString, sizeof(char *),
+ offset(topmargin), XtRString, (caddr_t) NULL},
+{"xOffset", "Offset", XtRString, sizeof(char *),
+ offset(xoffset), XtRString, (caddr_t) NULL},
+{"yOffset", "Offset", XtRString, sizeof(char *),
+ offset(yoffset), XtRString, (caddr_t) NULL},
+{"paper", "Paper", XtRString, sizeof(char *),
+ offset(paper), XtRString, (caddr_t) DEFAULT_PAPER},
+{"altFont", "AltFont", XtRString, sizeof(char *),
+ offset(alt_font), XtRString, (caddr_t) ALTFONT},
+{"listFonts", "ListFonts", XtRBoolean, sizeof(Boolean),
+ offset(list_fonts), XtRString, "false"},
+{"reverseVideo", "ReverseVideo", XtRBoolean, sizeof(Boolean),
+ offset(reverse), XtRString, "false"},
+{"hushSpecials", "Hush", XtRBoolean, sizeof(Boolean),
+ offset(hush_spec), XtRString, "false"},
+{"hushLostChars", "Hush", XtRBoolean, sizeof(Boolean),
+ offset(hush_chars), XtRString, "false"},
+{"foreground", "Foreground", XtRPixel, sizeof(Pixel),
+ offset(fore_Pixel), XtRPixel, (caddr_t) &resource.fore_Pixel},
+{"foreground", "Foreground", XtRString, sizeof(char *),
+ offset(fore_color), XtRString, (caddr_t) NULL},
+{"background", "Background", XtRPixel, sizeof(Pixel),
+ offset(back_Pixel), XtRPixel, (caddr_t) &resource.back_Pixel},
+{"background", "Background", XtRString, sizeof(char *),
+ offset(back_color), XtRString, (caddr_t) NULL},
+{"borderColor", "BorderColor", XtRPixel, sizeof(Pixel),
+ offset(brdr_Pixel), XtRPixel, (caddr_t) &resource.brdr_Pixel},
+{"borderColor", "BorderColor", XtRString, sizeof(char *),
+ offset(brdr_color), XtRString, (caddr_t) NULL},
+{"highlight", "Highlight", XtRPixel, sizeof(Pixel),
+ offset(hl_Pixel), XtRPixel, (caddr_t) &resource.hl_Pixel},
+{"highlight", "Highlight", XtRString, sizeof(char *),
+ offset(high_color), XtRString, (caddr_t) NULL},
+{"cursorColor", "CursorColor", XtRPixel, sizeof(Pixel),
+ offset(cr_Pixel), XtRPixel, (caddr_t) &resource.cr_Pixel},
+{"cursorColor", "CursorColor", XtRString, sizeof(char *),
+ offset(curs_color), XtRString, (caddr_t) NULL},
+{"iconGeometry", "IconGeometry", XtRString, sizeof(char *),
+ offset(icon_geometry), XtRString, (caddr_t) NULL},
+{"keepPosition", "KeepPosition", XtRBoolean, sizeof(Boolean),
+ offset(keep_flag), XtRString, "false"},
+{"copy", "Copy", XtRString, sizeof(char *),
+ offset(copy_arg), XtRString, (caddr_t) NULL},
+{"copy", "Copy", XtRBoolean, sizeof(Boolean),
+ offset(copy), XtRString, "false"},
+{"thorough", "Thorough", XtRBoolean, sizeof(Boolean),
+ offset(thorough), XtRString, "false"},
+{"version", "Version", XtRBoolean, sizeof(Boolean),
+ offset(version_flag), XtRString, "false"},
+#ifdef BUTTONS
+{"expert", "Expert", XtRBoolean, sizeof(Boolean),
+ offset(expert), XtRString, "false"},
+#endif
+{"magnifierSize1", "MagnifierSize", XtRInt, sizeof(int),
+ offset(mg_size[0]), XtRString, "200"},
+{"magnifierSize2", "MagnifierSize", XtRInt, sizeof(int),
+ offset(mg_size[1]), XtRString, "350"},
+{"magnifierSize3", "MagnifierSize", XtRInt, sizeof(int),
+ offset(mg_size[2]), XtRString, "600"},
+{"magnifierSize4", "MagnifierSize", XtRInt, sizeof(int),
+ offset(mg_size[3]), XtRString, "900"},
+{"magnifierSize5", "MagnifierSize", XtRInt, sizeof(int),
+ offset(mg_size[4]), XtRString, "1200"},
+#ifdef GREY
+{"grey", "Grey", XtRBoolean, sizeof (Boolean),
+ offset(use_grey), XtRString, "true"},
+#endif
+};
+#undef offset
+
+static Arg temp_args1[] = {
+ {XtNiconX, (XtArgVal) 0},
+ {XtNiconY, (XtArgVal) 0},
+};
+
+static Arg temp_args2 = {XtNborderWidth, (XtArgVal) &bwidth};
+
+static Pixmap icon_pm;
+
+static Arg temp_args3[] = {
+ {XtNiconPixmap, (XtArgVal) &icon_pm},
+};
+
+static Arg temp_args4[] = {
+ {XtNtitle, (XtArgVal) 0},
+ {XtNinput, (XtArgVal) True},
+};
+
+static Arg set_wh_args[] = {
+ {XtNwidth, (XtArgVal) 0},
+ {XtNheight, (XtArgVal) 0},
+};
+#else /* !TOOLKIT */
+
+static char *display;
+static char *geometry;
+static char *margins;
+static char *offsets;
+static Boolean hush;
+
+#ifndef X10
+static Boolean iconic = False;
+
+static Pixel
+string_to_pixel(strp) /* adapted from the toolkit */
+ char **strp;
+{
+ char *str = *strp;
+ Status status;
+ XColor color, junk;
+
+ if (*str == '#') { /* an rgb definition */
+ status = XParseColor(DISP, DefaultColormapOfScreen(SCRN),
+ str, &color);
+ if (status != 0)
+ status = XAllocColor(DISP, DefaultColormapOfScreen(SCRN),
+ &color);
+ }
+ else /* a name */
+ status = XAllocNamedColor(DISP, DefaultColormapOfScreen(SCRN),
+ str, &color, &junk);
+ if (status == 0) {
+ Fprintf(stderr, "Cannot allocate colormap entry for \"%s\"\n", str);
+ *strp = NULL;
+ return (Pixel) 0;
+ }
+ return color.pixel;
+}
+#endif /* X10 */
+
+static struct option {
+ _Xconst char *name;
+ _Xconst char *resource;
+ enum {FalseArg, TrueArg, StickyArg, SepArg} argclass;
+ enum {BooleanArg, StringArg, NumberArg, FloatArg} argtype;
+ int classcount;
+ caddr_t address;
+} options[] = {
+ /* the display option MUST be first */
+{"-display", NULL, SepArg, StringArg, 1, (caddr_t) &display},
+{"-d", "debugLevel", SepArg, StringArg, 1, (caddr_t) &debug_arg},
+{"+", NULL, StickyArg, StringArg, 1,(caddr_t) &curr_page},
+{"-s", "shrinkFactor", SepArg, NumberArg, 1, (caddr_t) &shrink_factor},
+{"-S", NULL, SepArg, NumberArg, 2, (caddr_t) &density},
+{"-density", "densityPercent", SepArg, NumberArg, 1, (caddr_t) &density},
+#ifdef GREY
+{"-gamma", "gamma", SepArg, FloatArg, 1, (caddr_t) &gamma},
+#endif
+{"-p", "pixelsPerInch", SepArg, NumberArg, 1, (caddr_t) &pixels_per_inch},
+{"-margins", "Margin", SepArg, StringArg, 3, (caddr_t) &margins},
+{"-sidemargin", "sideMargin", SepArg, StringArg, 1, (caddr_t) &sidemargin},
+{"-topmargin", "topMargin", SepArg, StringArg, 1, (caddr_t) &topmargin},
+{"-offsets", "Offset", SepArg, StringArg, 3, (caddr_t) &offsets},
+{"-xoffset", "xOffset", SepArg, StringArg, 1, (caddr_t) &xoffset},
+{"-yoffset", "yOffset", SepArg, StringArg, 1, (caddr_t) &yoffset},
+{"-paper", "paper", SepArg, StringArg, 1, (caddr_t) &paper},
+{"-altfont", "altFont", SepArg, StringArg, 1, (caddr_t) &alt_font},
+{"-l", NULL, TrueArg, BooleanArg, 2, (caddr_t) &list_fonts},
+{"+l", "listFonts", FalseArg, BooleanArg, 1,(caddr_t) &list_fonts},
+{"-rv", NULL, TrueArg, BooleanArg, 2, (caddr_t) &reverse},
+{"+rv", "reverseVideo", FalseArg, BooleanArg, 1,(caddr_t) &reverse},
+{"-hush", NULL, TrueArg, BooleanArg, 6, (caddr_t) &hush},
+{"+hush", "Hush", FalseArg, BooleanArg, 5,(caddr_t) &hush},
+{"-hushspecials", NULL, TrueArg, BooleanArg, 2, (caddr_t) &hush_spec},
+{"+hushspecials", "hushSpecials", FalseArg, BooleanArg, 1,(caddr_t) &hush_spec},
+{"-hushchars", NULL, TrueArg, BooleanArg, 2, (caddr_t) &hush_chars},
+{"+hushchars", "hushLostChars", FalseArg, BooleanArg, 1,(caddr_t) &hush_chars},
+{"-bw", NULL, SepArg, NumberArg, 2, (caddr_t) &bwidth},
+{"-borderwidth", "borderWidth", SepArg, NumberArg, 1, (caddr_t) &bwidth},
+{"-fg", NULL, SepArg, StringArg, 2, (caddr_t) &fore_color},
+{"-foreground", "foreground", SepArg, StringArg, 1, (caddr_t) &fore_color},
+{"-bg", NULL, SepArg, StringArg, 2, (caddr_t) &back_color},
+{"-background", "background", SepArg, StringArg, 1, (caddr_t) &back_color},
+{"-bd", NULL, SepArg, StringArg, 2, (caddr_t) &brdr_color},
+{"-bordercolor","borderColor", SepArg, StringArg, 1, (caddr_t) &brdr_color},
+{"-hl", "highlight", SepArg, StringArg, 1, (caddr_t) &high_color},
+{"-cr", "cursorColor", SepArg, StringArg, 1, (caddr_t) &curs_color},
+#ifdef X10
+{"=", NULL, StickyArg, StringArg, 2,(caddr_t) &geometry},
+#endif
+{"-geometry", "geometry", SepArg, StringArg, 1, (caddr_t) &geometry},
+#ifndef X10
+{"-icongeometry","iconGeometry",StickyArg, StringArg, 1,(caddr_t) &icon_geometry},
+{"-iconic", NULL, TrueArg, BooleanArg, 2, (caddr_t) &iconic},
+{"+iconic", "iconic", FalseArg, BooleanArg, 1,(caddr_t) &iconic},
+{"-keep", NULL, TrueArg, BooleanArg, 2, (caddr_t) &keep_flag},
+{"+keep", "keepPosition", FalseArg, BooleanArg, 1,(caddr_t) &keep_flag},
+{"-copy", NULL, TrueArg, BooleanArg, 2, (caddr_t) &copy},
+{"+copy", "copy", FalseArg, BooleanArg, 1,(caddr_t) &copy},
+{"-thorough", NULL, TrueArg, BooleanArg, 2, (caddr_t) &thorough},
+{"+thorough", "thorough", FalseArg, BooleanArg, 1,(caddr_t) &thorough},
+{"-version", NULL, TrueArg, BooleanArg, 2, (caddr_t)&version_flag},
+{"+version", "version", FalseArg, BooleanArg, 1,(caddr_t)&version_flag},
+#endif /* X10 */
+{"-mgs", NULL, SepArg, NumberArg, 2, (caddr_t) &mg_size[0]},
+{"-mgs1", "magnifierSize1",SepArg, NumberArg, 1, (caddr_t) &mg_size[0]},
+{"-mgs2", "magnifierSize2",SepArg, NumberArg, 1, (caddr_t) &mg_size[1]},
+{"-mgs3", "magnifierSize3",SepArg, NumberArg, 1, (caddr_t) &mg_size[2]},
+#ifndef X10
+{"-mgs4", "magnifierSize4",SepArg, NumberArg, 1, (caddr_t) &mg_size[3]},
+{"-mgs5", "magnifierSize5",SepArg, NumberArg, 1, (caddr_t) &mg_size[4]},
+#endif
+#ifdef GREY
+{"-nogrey", NULL, FalseArg, BooleanArg, 2,(caddr_t) &use_grey},
+{"+nogrey", "grey", TrueArg, BooleanArg, 1, (caddr_t) &use_grey},
+#endif
+};
+
+/*
+ * Process the option table. This is not guaranteed for all possible
+ * option tables, but at least it works for this one.
+ */
+
+static void
+parse_options(argc, argv)
+ int argc;
+ char **argv;
+{
+ char **arg;
+ char **argvend = argv + argc;
+ char *optstring;
+ caddr_t addr;
+ struct option *opt, *lastopt, *candidate;
+ int len1, len2, matchlen;
+
+ /*
+ * Step 1. Process command line options.
+ */
+ for (arg = argv + 1; arg < argvend; ++arg) {
+ len1 = strlen(*arg);
+ candidate = NULL;
+ matchlen = 0;
+ for (opt = options; opt < options + XtNumber(options); ++opt) {
+ len2 = strlen(opt->name);
+ if (opt->argclass == StickyArg) {
+ if (matchlen <= len2 && !strncmp(*arg, opt->name, len2)) {
+ candidate = opt;
+ matchlen = len2;
+ }
+ }
+ else if (len1 <= len2 && matchlen <= len1 &&
+ !strncmp(*arg, opt->name, len1)) {
+ if (len1 == len2) {
+ candidate = opt;
+ break;
+ }
+ if (matchlen < len1) candidate = opt;
+ else if (candidate && candidate->argclass != StickyArg)
+ candidate = NULL;
+ matchlen = len1;
+ }
+ }
+ if (candidate == NULL) {
+#ifdef X10
+ if (**arg == '-') usage();
+ if (index(*arg, ':') != NULL) { /* display */
+ --arg;
+ candidate = options;
+ }
+ else if (dvi_name) usage();
+#else
+ if (**arg == '-' || dvi_name) usage();
+#endif
+ else {
+ dvi_name = *arg;
+ continue;
+ }
+ }
+ /* flag it for subsequent processing */
+ candidate->resource = (char *) candidate;
+ /* store the value */
+ addr = candidate->address;
+ switch (candidate->argclass) {
+ case FalseArg: *((Boolean *) addr) = False; continue;
+ case TrueArg: *((Boolean *) addr) = True; continue;
+ case StickyArg: optstring = *arg + strlen(candidate->name);
+ break;
+ case SepArg:
+ ++arg;
+ if (arg >= argvend) usage();
+ optstring = *arg;
+ break;
+ }
+ switch (candidate->argtype) {
+ case StringArg: *((char **) addr) = optstring; break;
+ case NumberArg: *((int *) addr) = atoi(optstring); break;
+ case FloatArg: *((float *) addr) = atof(optstring); break;
+ default: ;
+ }
+ }
+ /*
+ * Step 2. Propagate classes for command line arguments. Backwards.
+ */
+ for (opt = options + XtNumber(options) - 1; opt >= options; --opt)
+ if (opt->resource == (char *) opt) {
+ addr = opt->address;
+ lastopt = opt + opt->classcount;
+ for (candidate = opt; candidate < lastopt; ++candidate) {
+ if (candidate->resource != NULL) {
+ switch (opt->argtype) {
+ case BooleanArg:
+ *((Boolean *) candidate->address) =
+ *((Boolean *) addr);
+ break;
+ case StringArg:
+ *((char **) candidate->address) =
+ *((char **) addr);
+ break;
+ case NumberArg:
+ *((int *) candidate->address) = *((int *) addr);
+ break;
+ case FloatArg:
+ *((float *) candidate->address) =
+ *((float *) addr);
+ break;
+ }
+ candidate->resource = NULL;
+ }
+ }
+ }
+
+#ifndef X10
+ if ((DISP = XOpenDisplay(display)) == NULL)
+ oops("Can't open display");
+ SCRN = DefaultScreenOfDisplay(DISP);
+#else
+ if (XOpenDisplay(display) == NULL)
+ oops("Can't open display");
+#endif
+ /*
+ * Step 3. Handle resources (including classes).
+ */
+ for (opt = options; opt < options + XtNumber(options); ++opt)
+ if (opt->resource &&
+#ifndef X10
+ ((optstring = XGetDefault(DISP, prog, opt->resource)) ||
+ (optstring = XGetDefault(DISP, "XDvi", opt->resource))))
+#else
+ (optstring = XGetDefault(DPY prog, opt->resource)))
+#endif
+ {
+ lastopt = opt + opt->classcount;
+ for (candidate = opt; candidate < lastopt; ++candidate)
+ if (candidate->resource != NULL) switch (opt->argtype) {
+ case BooleanArg:
+ *((Boolean *) candidate->address) =
+ (strcmp(optstring, "on") == 0);
+ break;
+ case StringArg:
+ *((char **) candidate->address) = optstring;
+ break;
+ case NumberArg:
+ *((int *) candidate->address) = atoi(optstring);
+ break;
+ case FloatArg:
+ *((float *) candidate->address) =
+ atof(optstring);
+ }
+ }
+}
+
+#endif /* TOOLKIT */
+
+static _Xconst char *paper_types[] = {
+ "us", "8.5x11",
+ "usr", "11x8.5",
+ "legal", "8.5x14",
+ "foolscap", "13.5x17.0", /* ??? */
+
+ /* ISO `A' formats, Portrait */
+ "a1", "59.4x84.0cm",
+ "a2", "42.0x59.4cm",
+ "a3", "29.7x42.0cm",
+ "a4", "21.0x29.7cm",
+ "a5", "14.85x21.0cm",
+ "a6", "10.5x14.85cm",
+ "a7", "7.42x10.5cm",
+
+ /* ISO `A' formats, Landscape */
+ "a1r", "84.0x59.4cm",
+ "a2r", "59.4x42.0cm",
+ "a3r", "42.0x29.7cm",
+ "a4r", "29.7x21.0cm",
+ "a5r", "21.0x14.85cm",
+ "a6r", "14.85x10.5cm",
+ "a7r", "10.5x7.42cm",
+
+ /* ISO `B' formats, Portrait */
+ "b1", "70.6x100.0cm",
+ "b2", "50.0x70.6cm",
+ "b3", "35.3x50.0cm",
+ "b4", "25.0x35.3cm",
+ "b5", "17.6x25.0cm",
+ "b6", "13.5x17.6cm",
+ "b7", "8.8x13.5cm",
+
+ /* ISO `B' formats, Landscape */
+ "b1r", "100.0x70.6cm",
+ "b2r", "70.6x50.0cm",
+ "b3r", "50.0x35.3cm",
+ "b4r", "35.3x25.0cm",
+ "b5r", "25.0x17.6cm",
+ "b6r", "17.6x13.5cm",
+ "b7r", "13.5x8.8cm",
+
+ /* ISO `C' formats, Portrait */
+ "c1", "64.8x91.6cm",
+ "c2", "45.8x64.8cm",
+ "c3", "32.4x45.8cm",
+ "c4", "22.9x32.4cm",
+ "c5", "16.2x22.9cm",
+ "c6", "11.46x16.2cm",
+ "c7", "8.1x11.46cm",
+
+ /* ISO `C' formats, Landscape */
+ "c1r", "91.6x64.8cm",
+ "c2r", "64.8x45.8cm",
+ "c3r", "45.8x32.4cm",
+ "c4r", "32.4x22.9cm",
+ "c5r", "22.9x16.2cm",
+ "c6r", "16.2x11.46cm",
+ "c7r", "11.46x8.1cm",
+};
+
+static Boolean
+set_paper_type() {
+ _Xconst char *arg, *arg1;
+ char temp[21];
+ _Xconst char **p;
+ char *q;
+
+ if (strlen(RESOURCE(paper)) > sizeof(temp) - 1) return False;
+ arg = RESOURCE(paper);
+ q = temp;
+ for (;;) { /* convert to lower case */
+ char c = *arg++;
+ if (c >= 'A' && c <= 'Z') c ^= ('a' ^ 'A');
+ *q++ = c;
+ if (c == '\0') break;
+ }
+ arg = temp;
+ /* perform substitutions */
+ for (p = paper_types; p < paper_types + XtNumber(paper_types); p += 2)
+ if (strcmp(temp, *p) == 0) {
+ arg = p[1];
+ break;
+ }
+ arg1 = index(arg, 'x');
+ if (arg1 == NULL) return False;
+ unshrunk_paper_w = atopix(arg);
+ unshrunk_paper_h = atopix(arg1 + 1);
+ return (unshrunk_paper_w != 0 && unshrunk_paper_h != 0);
+}
+
+/*
+ * main program
+ */
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+
+
+#ifndef TOOLKIT
+#ifndef X10
+ XSizeHints size_hints;
+ XWMHints wmhints;
+#else
+ OpaqueFrame frame;
+ char def[32];
+ int mouspix;
+ Color cdef;
+ int x_thick, y_thick;
+#endif
+#endif /* TOOLKIT */
+ int screen_w, screen_h;
+
+#ifndef VMS
+ prog = rindex(*argv, '/');
+#else
+ prog = rindex(*argv, ']');
+#endif
+ if (prog != NULL) ++prog; else prog = *argv;
+
+#ifdef VMS
+ if (index(prog, '.') != NULL) *index(prog, '.') = '\0';
+#endif
+
+#ifdef TOOLKIT
+ top_level = XtInitialize(prog, "XDvi", options, XtNumber(options),
+ &argc, argv);
+ while (--argc > 0) {
+ if (*(*++argv) == '+')
+ if (curr_page != NULL) usage();
+ else curr_page = *argv + 1;
+ else if (dvi_name != NULL) usage();
+ else dvi_name = *argv;
+ }
+
+ XtGetApplicationResources(top_level, (XtPointer) &resource,
+ application_resources, XtNumber(application_resources), NULL, 0);
+ DISP = XtDisplay(top_level);
+ SCRN = XtScreen(top_level);
+ shrink_factor = resource._shrink_factor;
+ density = resource.density;
+ pixels_per_inch = resource.pixels_per_inch;
+ alt_font = resource.alt_font;
+ list_fonts = resource.list_fonts;
+ hush_spec = resource.hush_spec;
+ hush_chars = resource.hush_chars;
+#ifdef GREY
+ use_grey = resource.use_grey;
+#endif
+
+#else /* !TOOLKIT */
+
+ parse_options(argc, argv);
+#ifndef X10
+ if (fore_color) fore_Pixel = string_to_pixel(&fore_color);
+ if (back_color) back_Pixel = string_to_pixel(&back_color);
+ if (brdr_color) brdr_Pixel = string_to_pixel(&brdr_color);
+ if (high_color) hl_Pixel = string_to_pixel(&high_color);
+ if (curs_color) cr_Pixel = string_to_pixel(&curs_color);
+#endif
+
+#endif /* TOOLKIT */
+
+
+ if (shrink_factor <= 0 || density <= 0 || pixels_per_inch <= 0 ||
+ dvi_name == NULL) usage();
+
+/* ----------------------------- MSDOS (Eric Ho) ----------------------------*/
+#if defined(__MSDOS__) && defined(FONTSUB)
+
+ /* Open the font substitute file */
+ fontsubfile = openfontsubfile ();
+
+#endif
+/* ----------------------------- MSDOS (Eric Ho) ----------------------------*/
+
+ if (shrink_factor != 1) bak_shrink = shrink_factor;
+ mane.shrinkfactor = shrink_factor;
+ if (RESOURCE(debug_arg) != NULL)
+ debug = isdigit(*RESOURCE(debug_arg)) ? atoi(RESOURCE(debug_arg))
+ : DBG_ALL;
+ if (RESOURCE(sidemargin)) home_x = atopix(RESOURCE(sidemargin));
+ if (RESOURCE(topmargin)) home_y = atopix(RESOURCE(topmargin));
+ offset_x = RESOURCE(xoffset) ? atopix(RESOURCE(xoffset))
+ : pixels_per_inch;
+ offset_y = RESOURCE(yoffset) ? atopix(RESOURCE(yoffset))
+ : pixels_per_inch;
+ if (!set_paper_type()) oops("Don't recognize paper type %s",
+ RESOURCE(paper));
+
+ init_font_open();
+ open_dvi_file();
+
+
+
+ if (curr_page) {
+ current_page = (*curr_page ? atoi(curr_page) : total_pages) - 1;
+ if (current_page < 0 || current_page >= total_pages) usage();
+ }
+ if (RESOURCE(version_flag)) Puts((_Xconst char *) &version);
+
+#ifndef X10
+
+ /*
+ * X11 colors
+ */
+
+ if (RESOURCE(reverse)) {
+ if (!RESOURCE(fore_color))
+ RESOURCE(fore_Pixel) = WhitePixelOfScreen(SCRN);
+ if (!RESOURCE(back_color))
+ RESOURCE(back_Pixel) = BlackPixelOfScreen(SCRN);
+ /* Set them nonzero */
+ RESOURCE(fore_color) = RESOURCE(back_color) = (char *) &version;
+ } else {
+ if (!RESOURCE(fore_color))
+ RESOURCE(fore_Pixel) = BlackPixelOfScreen(SCRN);
+ if (!RESOURCE(back_color))
+ RESOURCE(back_Pixel) = WhitePixelOfScreen(SCRN);
+ }
+
+#ifdef GREY
+ if (DefaultDepthOfScreen(SCRN) == 1)
+ use_grey = False;
+#endif
+
+#ifdef TOOLKIT
+ if (resource.copy_arg)
+#else
+ if (copy == 2)
+#endif
+#ifdef GREY
+ RESOURCE(copy) = (!RESOURCE(thorough) && !use_grey
+ && DefaultDepthOfScreen(SCRN) > 1);
+#else
+ RESOURCE(copy) = (!RESOURCE(thorough)
+ && DefaultDepthOfScreen(SCRN) > 1);
+#endif
+
+#ifdef GREY
+ if (use_grey)
+ init_pix(True);
+ else
+#endif
+ {
+ XGCValues values;
+ Pixel set_bits = (Pixel)
+ (RESOURCE(fore_Pixel) & ~RESOURCE(back_Pixel));
+ Pixel clr_bits = (Pixel)
+ (RESOURCE(back_Pixel) & ~RESOURCE(fore_Pixel));
+
+#define MakeGC(fcn, fg, bg) (values.function = fcn, values.foreground=fg,\
+ values.background=bg,\
+ XCreateGC(DISP, RootWindowOfScreen(SCRN),\
+ GCFunction|GCForeground|GCBackground, &values))
+
+ if (RESOURCE(copy) || (set_bits && clr_bits))
+ ruleGC = MakeGC(GXcopy,
+ RESOURCE(fore_Pixel), RESOURCE(back_Pixel));
+ if (RESOURCE(copy)) foreGC = ruleGC;
+ else if (!RESOURCE(thorough) && ruleGC) {
+ foreGC = ruleGC;
+ Puts("Note: overstrike characters may be incorrect.");
+ }
+ else {
+ if (set_bits) foreGC = MakeGC(GXor, set_bits, 0);
+ if (clr_bits)
+ *(foreGC ? &foreGC2 : &foreGC) =
+ MakeGC(GXandInverted, clr_bits, 0);
+ if (!ruleGC) ruleGC = foreGC;
+ }
+ }
+
+ {
+ XGCValues values;
+
+ highGC = ruleGC;
+ if (RESOURCE(high_color))
+ highGC = MakeGC(GXcopy,
+ RESOURCE(hl_Pixel), RESOURCE(back_Pixel));
+ }
+
+ if (!RESOURCE(brdr_color)) RESOURCE(brdr_Pixel) = RESOURCE(fore_Pixel);
+
+#ifndef VMS
+ ready_cursor = XCreateFontCursor(DISP, XC_cross);
+ redraw_cursor = XCreateFontCursor(DISP, XC_watch);
+#else
+ DECWCursorFont = XLoadFont(DISP, "DECW$CURSOR");
+ XSetFont(DISP, foreGC, DECWCursorFont);
+ redraw_cursor = XCreateGlyphCursor(DISP, DECWCursorFont, DECWCursorFont,
+ decw$c_wait_cursor, decw$c_wait_cursor + 1,
+ &RESOURCE(fore_color), &RESOURCE(back_color));
+ MagnifyPixmap = XCreateBitmapFromData (DISP, RootWindowOfScreen(SCRN),
+ mag_glass_bits, mag_glass_width, mag_glass_height);
+ ready_cursor = XCreatePixmapCursor(DISP, MagnifyPixmap, MagnifyPixmap,
+ &RESOURCE(back_color), &RESOURCE(fore_color),
+ mag_glass_x_hot, mag_glass_y_hot);
+#endif /* VMS */
+
+ if (!RESOURCE(curs_color))
+ RESOURCE(cr_Pixel) = RESOURCE(high_color) ? RESOURCE(hl_Pixel)
+ : RESOURCE(fore_Pixel);
+ {
+ XColor bg_Color, cr_Color;
+
+ bg_Color.pixel = RESOURCE(back_Pixel);
+ XQueryColor(DISP, DefaultColormapOfScreen(SCRN), &bg_Color);
+ cr_Color.pixel = RESOURCE(cr_Pixel);
+ XQueryColor(DISP, DefaultColormapOfScreen(SCRN), &cr_Color);
+ XRecolorCursor(DISP, ready_cursor, &cr_Color, &bg_Color);
+ XRecolorCursor(DISP, redraw_cursor, &cr_Color, &bg_Color);
+ }
+
+#ifdef TOOLKIT
+
+ /*
+ * X11 windows (toolkit)
+ */
+
+ /* The following code is lifted from Xterm */
+ if (resource.icon_geometry != NULL) {
+ int scr, junk;
+
+ for(scr = 0; /* yyuucchh */
+ SCRN != ScreenOfDisplay(DISP, scr);
+ scr++);
+
+ XGeometry(DISP, scr, resource.icon_geometry, "", 0, 0, 0, 0, 0,
+ (int *) &temp_args1[0].value,
+ (int *) &temp_args1[1].value, &junk, &junk);
+ XtSetValues(top_level, temp_args1, XtNumber(temp_args1));
+ }
+ /* Set icon pixmap */
+ XtGetValues(top_level, temp_args3, XtNumber(temp_args3));
+ if (icon_pm == (Pixmap) 0) {
+ temp_args3[0].value = (XtArgVal) (XCreateBitmapFromData(DISP,
+ RootWindowOfScreen(SCRN),
+ xdvi_bits, xdvi_width, xdvi_height));
+ XtSetValues(top_level, temp_args3, XtNumber(temp_args3));
+ }
+ temp_args4[0].value = (XtArgVal) dvi_name;
+ XtSetValues(top_level, temp_args4, XtNumber(temp_args4));
+
+#ifdef BUTTONS
+ form_widget = XtCreateManagedWidget("form", formWidgetClass,
+ top_level, form_args, XtNumber(form_args));
+
+ line_args[0].value = (XtArgVal) resource.high_color
+ ? resource.hl_Pixel : resource.fore_Pixel;
+#else /* !BUTTONS */
+#define form_widget top_level /* for calls to XtAddEventHandler */
+#endif /* BUTTONS */
+ vport_widget = XtCreateManagedWidget("vport", viewportWidgetClass,
+ form_widget, vport_args, XtNumber(vport_args));
+ clip_widget = XtNameToWidget(vport_widget, "clip");
+ draw_args[0].value = (XtArgVal) page_w;
+ draw_args[1].value = (XtArgVal) page_h;
+ draw_widget = XtCreateManagedWidget("drawing", drawWidgetClass,
+ vport_widget, draw_args, XtNumber(draw_args));
+ { /* set default window size */
+#ifdef BUTTONS
+ int xtra_wid = resource.expert ? 0 : XTRA_WID;
+#else
+#define xtra_wid 0
+#endif
+ XtWidgetGeometry constraints;
+ XtWidgetGeometry reply;
+
+ XtGetValues(top_level, &temp_args2, 1); /* get border width */
+ screen_w = WidthOfScreen(SCRN) - 2 * bwidth - xtra_wid;
+ screen_h = HeightOfScreen(SCRN) - 2 * bwidth;
+ constraints.request_mode = reply.request_mode = 0;
+ constraints.width = page_w;
+ if (page_w > screen_w) {
+ constraints.request_mode = CWWidth;
+ constraints.width = screen_w;
+ }
+ constraints.height = page_h;
+ if (page_h > screen_h) {
+ constraints.request_mode = CWHeight;
+ constraints.height = screen_h;
+ }
+ if (constraints.request_mode != 0
+ && constraints.request_mode != (CWWidth | CWHeight))
+ (void) XtQueryGeometry(vport_widget, &constraints, &reply);
+ if (!(reply.request_mode & CWWidth))
+ reply.width = constraints.width;
+ set_wh_args[0].value = (XtArgVal) ((reply.width < screen_w
+ ? reply.width : screen_w) + xtra_wid);
+ if (!(reply.request_mode & CWHeight))
+ reply.height = constraints.height;
+ set_wh_args[1].value = (XtArgVal) (reply.height < screen_h
+ ? reply.height : screen_h);
+ XtSetValues(top_level, set_wh_args, XtNumber(set_wh_args));
+#ifdef BUTTONS
+ set_wh_args[0].value -= xtra_wid;
+ XtSetValues(vport_widget, set_wh_args, XtNumber(set_wh_args));
+ if (!resource.expert) create_buttons(set_wh_args[1].value);
+#endif /* BUTTONS */
+ }
+ if (resource.fore_color) {
+ static Arg fore_args = {XtNforeground, (XtArgVal) 0};
+
+ fore_args.value = resource.fore_Pixel;
+ XtSetValues(draw_widget, &fore_args, 1);
+ }
+ if (resource.back_color) {
+ static Arg back_args = {XtNbackground, (XtArgVal) 0};
+
+ back_args.value = resource.back_Pixel;
+ XtSetValues(draw_widget, &back_args, 1);
+ XtSetValues(clip_widget, &back_args, 1);
+ }
+ XtAddEventHandler(form_widget, KeyPressMask, False, handle_key,
+ (caddr_t) NULL);
+ XtAddEventHandler(vport_widget, StructureNotifyMask, False,
+ handle_resize, (caddr_t) NULL);
+ XtAddEventHandler(draw_widget, ExposureMask, False, handle_exp,
+ (caddr_t) &mane);
+ XtAddEventHandler(draw_widget, ButtonPressMask, False, handle_button,
+ (caddr_t) NULL);
+ XtAddEventHandler(draw_widget, ButtonMotionMask, False, handle_motion,
+ (caddr_t) NULL);
+ XtAddEventHandler(draw_widget, ButtonReleaseMask, False, handle_release,
+ (caddr_t) NULL);
+ XtRealizeWidget(top_level);
+
+ currwin.win = mane.win = XtWindow(draw_widget);
+
+#else /* !TOOLKIT */
+
+ /*
+ * X11 windows (non toolkit)
+ */
+
+ screen_w = WidthOfScreen(SCRN) - 2*bwidth;
+ screen_h = HeightOfScreen(SCRN) - 2*bwidth;
+ size_hints.flags = PMinSize;
+ size_hints.min_width = size_hints.min_height = 50;
+ size_hints.x = size_hints.y = 0;
+ if (geometry != NULL) {
+ int flag = XParseGeometry(geometry, &size_hints.x, &size_hints.y,
+ &window_w, &window_h);
+
+ if (flag & (XValue | YValue))
+ size_hints.flags |= USPosition;
+ if (flag & (WidthValue | HeightValue))
+ size_hints.flags |= USSize;
+ if (flag & XNegative) size_hints.x += screen_w - window_w;
+ if (flag & YNegative) size_hints.y += screen_h - window_h;
+ }
+ if (!(size_hints.flags & USSize)) {
+ int x_thick = 0;
+ int y_thick = 0;
+ if (screen_w < page_w) x_thick = BAR_THICK;
+ if (screen_h < page_h + x_thick) y_thick = BAR_THICK;
+ window_w = page_w + y_thick;
+ if (window_w > screen_w) {
+ x_thick = BAR_THICK;
+ window_w = screen_w;
+ }
+ window_h = page_h + x_thick;
+ if (window_h > screen_h) window_h = screen_h;
+ size_hints.flags |= PSize;
+ }
+ size_hints.width = window_w;
+ size_hints.height = window_h;
+ top_level = XCreateSimpleWindow(DISP, RootWindowOfScreen(SCRN),
+ size_hints.x, size_hints.y, window_w, window_h, bwidth,
+ brdr_Pixel, back_Pixel);
+ XSetStandardProperties(DISP, top_level, dvi_name, prog, NULL,
+ argv, argc, &size_hints);
+
+ wmhints.flags = InputHint | StateHint | IconPixmapHint;
+ wmhints.input = True; /* window manager must direct input */
+ wmhints.initial_state = iconic ? IconicState : NormalState;
+ wmhints.icon_pixmap = XCreateBitmapFromData(DISP,
+ RootWindowOfScreen(SCRN),
+ xdvi_bits, xdvi_width, xdvi_height);
+ if (icon_geometry != NULL) {
+ int junk;
+
+ wmhints.flags |= IconPositionHint;
+ XGeometry(DISP, DefaultScreen(DISP), icon_geometry, "",
+ 0, 0, 0, 0, 0, &wmhints.icon_x, &wmhints.icon_y, &junk, &junk);
+ }
+ XSetWMHints(DISP, top_level, &wmhints);
+
+ XSelectInput(DISP, top_level, KeyPressMask | StructureNotifyMask);
+ XMapWindow(DISP, top_level);
+ Flush();
+
+#endif /* TOOLKIT */
+
+ XRebindKeysym(DISP, XK_Home, NULL, 0, (_Xconst ubyte *) "^", 1);
+ XRebindKeysym(DISP, XK_Left, NULL, 0, (_Xconst ubyte *) "l", 1);
+ XRebindKeysym(DISP, XK_Up, NULL, 0, (_Xconst ubyte *) "u", 1);
+ XRebindKeysym(DISP, XK_Right, NULL, 0, (_Xconst ubyte *) "r", 1);
+ XRebindKeysym(DISP, XK_Down, NULL, 0, (_Xconst ubyte *) "d", 1);
+ XRebindKeysym(DISP, XK_Prior, NULL, 0, (_Xconst ubyte *) "b", 1);
+ XRebindKeysym(DISP, XK_Next, NULL, 0, (_Xconst ubyte *) "f", 1);
+
+ image = XCreateImage(DISP, DefaultVisualOfScreen(SCRN), 1, XYBitmap, 0,
+ (char *)NULL, 0, 0, BITS_PER_BMUNIT, 0);
+ image->bitmap_unit = BITS_PER_BMUNIT;
+#ifndef MSBITFIRST
+ image->bitmap_bit_order = LSBFirst;
+#else
+ image->bitmap_bit_order = MSBFirst;
+#endif
+ {
+ short endian = MSBFirst << 8 | LSBFirst;
+ image->byte_order = *((char *) &endian);
+ }
+
+#else /* X10 */
+
+ /*
+ * X10 colors
+ */
+
+ if (reverse) {
+ foreGC = WhitePixel;
+ highGC = WhitePixel;
+ backpix = BlackPixel;
+ backmap = BlackPixmap;
+ bdrmap = WhitePixmap;
+ mouspix = WhitePixel;
+ GXfunc = GXor;
+ } else {
+ foreGC = BlackPixel;
+ highGC = BlackPixel;
+ backpix = WhitePixel;
+ backmap = WhitePixmap;
+ bdrmap = BlackPixmap;
+ mouspix = BlackPixel;
+ GXfunc = GXand;
+ }
+ if (DisplayCells() > 2) {
+ if (fore_color && XParseColor(fore_color, &cdef) &&
+ XGetHardwareColor(&cdef))
+ foreGC = cdef.pixel;
+ if (back_color && XParseColor(back_color, &cdef) &&
+ XGetHardwareColor(&cdef)) {
+ backpix = cdef.pixel;
+ backmap = XMakeTile(backpix);
+ }
+ if (brdr_color && XParseColor(brdr_color, &cdef) &&
+ XGetHardwareColor(&cdef))
+ bdrmap = XMakeTile(cdef.pixel);
+ if (high_color && XParseColor(high_color, &cdef) &&
+ XGetHardwareColor(&cdef))
+ highGC = cdef.pixel;
+ if (curs_color && XParseColor(curs_color, &cdef) &&
+ XGetHardwareColor(&cdef))
+ mouspix = cdef.pixel;
+ }
+
+ /*
+ * X10 windows
+ */
+
+ frame.bdrwidth = bwidth;
+ screen_w = DisplayWidth() - 2*bwidth;
+ screen_h = DisplayHeight() - 2*bwidth;
+ x_thick = y_thick = 0;
+ if (screen_w < page_w) x_thick = BAR_THICK;
+ if (screen_h < page_h + x_thick) y_thick = BAR_THICK;
+ frame.width = page_w + y_thick;
+ if (frame.width > screen_w) {
+ x_thick = BAR_THICK;
+ frame.width = screen_w;
+ }
+ frame.height = page_h + x_thick;
+ if (frame.height > screen_h) frame.height = screen_h;
+ frame.border = bdrmap;
+ frame.background = backmap;
+ frame.x = 0;
+ frame.y = 0;
+ Sprintf(def, "=%dx%d+0+0", frame.width, frame.height);
+ top_level = XCreate("DVI Previewer", prog, geometry, def,
+ &frame, 50, 50);
+ XSelectInput(top_level, ExposeWindow | KeyPressed);
+ XMapWindow(top_level);
+ XDefineCursor(top_level,
+ XCreateCursor(xdvi_width, xdvi_height, xdvi_bits, xdvi_mask_bits,
+ xdvi_x_hot, xdvi_y_hot, mouspix, backpix, GXcopy));
+#endif /* X10 */
+
+ do_pages();
+/* ----------------------------- MSDOS (Eric Ho) ----------------------------*/
+#if defined(__MSDOS__) && defined(FONTSUB)
+
+ if (fontsubfile != (FILE *) NULL) {
+ /* close the font substitute file */
+ fclose (fontsubfile);
+ }
+
+#endif
+/* ----------------------------- MSDOS (Eric Ho) ----------------------------*/
+ return 0; /* do_pages() returns if DBG_BATCH is specified */
+}
diff --git a/systems/msdos/dviware/xdvi-dos/src/xdvi.h b/systems/msdos/dviware/xdvi-dos/src/xdvi.h
new file mode 100644
index 0000000000..2c0da4def9
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/xdvi.h
@@ -0,0 +1,509 @@
+/*
+ * Written by Eric C. Cooper, CMU
+ */
+
+/********************************
+ * The C environment *
+ *******************************/
+
+#ifndef X10
+#include <X11/Xlib.h> /* include Xfuncs.h, if available */
+#include <X11/Xutil.h> /* needed for XDestroyImage */
+#include <X11/Xos.h> /* same as below */
+#else /* X10 */
+#include <X/Xlib.h> /* get type of Window */
+#include <sys/types.h> /* for sites without X11 */
+#ifdef SYSV
+#include <string.h>
+#define index strchr
+#define rindex strrchr
+#include <fcntl.h>
+#else /* SYSV */
+#include <strings.h>
+#endif /* SYSV */
+#include <sys/file.h>
+#endif /* X10 */
+
+#ifndef XlibSpecificationRelease
+#define XlibSpecificationRelease 0
+#endif
+
+#if XlibSpecificationRelease >= 5
+#include <X11/Xfuncs.h>
+#endif
+
+#ifdef VMS
+#include <string.h>
+#define index strchr
+#define rindex strrchr
+#define bzero(a, b) (void) memset ((void *) (a), 0, (size_t) (b))
+#define bcopy(a, b, c) (void) memmove ((void *) (b), (void *) (a), (size_t) (c))
+#endif
+
+#include <stdio.h>
+#include <setjmp.h>
+
+#ifndef OPEN_MODE
+#ifndef VMS
+#define OPEN_MODE "rb"
+#else /* VMS */
+#define OPEN_MODE "r", "ctx=stm"
+#endif /* VMS */
+#endif /* OPEN_MODE */
+
+#ifndef SYSV
+#ifndef VMS
+#define HAS_SIGIO /* has SIGIO on _sockets_ */
+#endif
+#endif
+
+#ifndef NeedFunctionPrototypes
+#ifdef __STDC__
+#define NeedFunctionPrototypes 1
+#else /* STDC */
+#define NeedFunctionPrototypes 0
+#endif /* STDC */
+#endif /* NeedFunctionPrototypes */
+
+#ifndef NeedWidePrototypes
+#define NeedWidePrototypes NeedFunctionPrototypes
+#endif
+
+#if NeedWidePrototypes
+#define WIDEARG(a, b) b
+#else
+#define WIDEARG(a, b) a
+#endif
+
+#ifndef NeedVarargsPrototypes
+#define NeedVarargsPrototypes NeedFunctionPrototypes
+#endif
+
+#ifndef _XFUNCPROTOBEGIN
+#define _XFUNCPROTOBEGIN
+#define _XFUNCPROTOEND
+#endif
+
+#ifndef _Xconst
+#ifdef __STDC__
+#define _Xconst const
+#else /* STDC */
+#define _Xconst
+#endif /* STDC */
+#endif /* _Xconst */
+
+#ifndef VOLATILE
+#if defined(__STDC__) || (defined(__stdc__) && defined(__convex__))
+#define VOLATILE volatile
+#else
+#define VOLATILE /* nothing */
+#endif
+#endif
+
+#ifndef NORETURN
+#ifdef __GNUC__
+#define NORETURN volatile
+#else
+#define NORETURN /* nothing */
+#endif
+#endif
+
+#define Printf (void) printf
+#define Puts (void) puts
+#define Fprintf (void) fprintf
+#define Sprintf (void) sprintf
+#define Fseek (void) fseek
+#define Fread (void) fread
+#define Fputs (void) fputs
+#define Putc (void) putc
+#define Putchar (void) putchar
+#define Fclose (void) fclose
+#define Strcpy (void) strcpy
+
+/********************************
+ * Types and data *
+ *******************************/
+
+#ifndef EXTERN
+#define EXTERN extern
+#define INIT(x)
+#define NTINIT(x)
+#endif
+
+typedef unsigned char ubyte;
+#define Boolean char
+#define True 1
+#define False 0
+
+#define MAXDIM 32767
+
+/*
+ * pixel_conv is currently used only for converting absolute positions
+ * to pixel values; although normally it should be
+ * ((int) ((x) / shrink_factor + (1 << 15) >> 16)),
+ * the rounding is achieved instead by moving the constant 1 << 15 to
+ * PAGE_OFFSET in dvi_draw.c.
+ */
+#define pixel_conv(x) ((int) ((x) / shrink_factor >> 16))
+#define pixel_round(x) ((int) ROUNDUP(x, shrink_factor << 16))
+#define spell_conv0(n, f) ((long) (n * f))
+#define spell_conv(n) spell_conv0(n, dimconv)
+
+#ifdef X10
+#undef MSBITFIRST
+#undef BMLONG
+#define BMSHORT
+#endif
+
+#ifdef BMLONG
+#define BMUNIT unsigned long
+#define BITS_PER_BMUNIT 32
+#define BYTES_PER_BMUNIT 4
+#else /* BMLONG */
+#ifdef BMSHORT
+#define BMUNIT unsigned short
+#define BITS_PER_BMUNIT 16
+#define BYTES_PER_BMUNIT 2
+#else /* BMSHORT */
+#define BMUNIT unsigned char
+#define BITS_PER_BMUNIT 8
+#define BYTES_PER_BMUNIT 1
+#endif /* BMSHORT */
+#endif /* BMLONG */
+
+#define ADD(a, b) ((BMUNIT *) (((char *) a) + b))
+#define SUB(a, b) ((BMUNIT *) (((char *) a) - b))
+
+extern BMUNIT bit_masks[BITS_PER_BMUNIT + 1];
+
+struct frame {
+ struct framedata {
+ long dvi_h, dvi_v, w, x, y, z;
+ int pxl_v;
+ } data;
+ struct frame *next, *prev;
+};
+
+#if NeedFunctionPrototypes
+#ifndef TEXXET
+typedef long (*set_char_proc)(WIDEARG(ubyte, int));
+#else /* TEXXET */
+typedef void (*set_char_proc)(WIDEARG(ubyte, int), WIDEARG(ubyte, int));
+#endif /* TEXXET */
+#else /* NeedFunctionPrototypes */
+#ifndef TEXXET
+typedef long (*set_char_proc)();
+#else /* TEXXET */
+typedef void (*set_char_proc)();
+#endif /* TEXXET */
+#endif /* NeedFunctionPrototypes */
+
+struct drawinf { /* this information is saved when using virtual fonts */
+ struct framedata data;
+ struct font *fontp;
+ set_char_proc set_char_p;
+ struct tn *tn_head;
+ ubyte *pos, *end;
+ struct font *virtual;
+#ifdef TEXXET
+ int dir;
+#endif
+};
+
+EXTERN struct drawinf currinf;
+
+/* entries below with the characters 'dvi' in them are actually stored in
+ scaled pixel units */
+
+#define DVI_H currinf.data.dvi_h
+#define PXL_H pixel_conv(currinf.data.dvi_h)
+#define DVI_V currinf.data.dvi_v
+#define PXL_V currinf.data.pxl_v
+#define WW currinf.data.w
+#define XX currinf.data.x
+#define YY currinf.data.y
+#define ZZ currinf.data.z
+#define ROUNDUP(x,y) (((x)+(y)-1)/(y))
+
+EXTERN int current_page;
+EXTERN int total_pages;
+EXTERN double dimconv;
+EXTERN int n_files_left INIT(32767); /* for LRU closing of fonts */
+EXTERN time_t dvi_time; /* last mod. time for dvi file */
+EXTERN int page_w, page_h;
+
+/*
+ * Table of page offsets in DVI file, indexed by page number - 1.
+ * Initialized in prepare_pages().
+ */
+EXTERN long *page_offset;
+
+/*
+ * Mechanism for reducing repeated warning about specials, lost characters, etc.
+ */
+EXTERN Boolean hush_spec NTINIT(False);
+EXTERN Boolean hush_spec_now;
+EXTERN Boolean hush_chars NTINIT(False);
+
+
+/*
+ * Bitmap structure for raster ops.
+ */
+struct bitmap {
+ short w, h; /* width and height in pixels */
+ short bytes_wide; /* scan-line width in bytes */
+ char *bits; /* pointer to the bits */
+};
+
+/*
+ * Per-character information.
+ * There is one of these for each character in a font (raster fonts only).
+ * All fields are filled in at font definition time,
+ * except for the bitmap, which is "faulted in"
+ * when the character is first referenced.
+ */
+struct glyph {
+ long addr; /* address of bitmap in font file */
+ long dvi_adv; /* DVI units to move reference point */
+ short x, y; /* x and y offset in pixels */
+ struct bitmap bitmap; /* bitmap for character */
+ short x2, y2; /* x and y offset in pixels (shrunken bitmap) */
+#ifdef GREY
+ XImage *image2;
+ char *pixmap2;
+#endif
+ struct bitmap bitmap2; /* shrunken bitmap for character */
+};
+
+/*
+ * Per character information for virtual fonts
+ */
+struct macro {
+ ubyte *pos; /* address of first byte of macro */
+ ubyte *end; /* address of last+1 byte */
+ long dvi_adv; /* DVI units to move reference point */
+ Boolean free_me; /* if free(pos) should be called when */
+ /* freeing space */
+};
+
+/*
+ * The layout of a font information block.
+ * There is one of these for every loaded font or magnification thereof.
+ * Duplicates are eliminated: this is necessary because of possible recursion
+ * in virtual fonts.
+ *
+ * Also note the strange units. The design size is in 1/2^20 point
+ * units (also called micro-points), and the individual character widths
+ * are in the TFM file in 1/2^20 ems units, i.e., relative to the design size.
+ *
+ * We then change the sizes to SPELL units (unshrunk pixel / 2^16).
+ */
+
+#define NOMAGSTP (-29999)
+
+#if NeedFunctionPrototypes
+typedef void (*read_char_proc)(struct font *, WIDEARG(ubyte, int));
+#else
+typedef void (*read_char_proc)();
+#endif
+
+struct font {
+ struct font *next; /* link to next font info block */
+ char *fontname; /* name of font */
+ float fsize; /* size information (dots per inch) */
+ int magstepval; /* magstep number * two, or NOMAGSTP */
+ FILE *file; /* open font file or NULL */
+ char *filename; /* name of font file */
+ unsigned short timestamp; /* for LRU management of fonts */
+ ubyte flags; /* flags byte (see values below) */
+ ubyte maxchar; /* largest character code */
+ double dimconv; /* size conversion factor */
+ set_char_proc set_char_p; /* proc used to set char */
+ /* these fields are used by (loaded) raster fonts */
+ read_char_proc read_char; /* function to read bitmap */
+ struct glyph *glyph;
+ /* these fields are used by (loaded) virtual fonts */
+ struct tn *vf_chain; /* list of fonts used by this vf */
+ struct font *first_font; /* first font defined */
+ struct macro *macro;
+ /* I suppose the above could be put into a union, but we */
+ /* wouldn't save all that much space. */
+};
+
+#define FONT_IN_USE 1 /* used for housekeeping */
+#define FONT_LOADED 2 /* if font file has been read */
+#define FONT_VIRTUAL 4 /* if font is virtual */
+
+struct tn {
+ struct tn *next; /* link to next TeXnumber info block */
+ int TeXnumber; /* font number (in DVI file) */
+ struct font *fontp; /* pointer to the rest of the info */
+};
+
+EXTERN struct font *font_head INIT(NULL);
+EXTERN struct tn *tn_head INIT(NULL);
+EXTERN ubyte maxchar;
+EXTERN unsigned short current_timestamp INIT(0);
+
+/*
+ * Command line flags.
+ */
+
+EXTERN int debug INIT(0);
+
+#define DBG_BITMAP 0x1
+#define DBG_DVI 0x2
+#define DBG_PK 0x4
+#define DBG_BATCH 0x8
+#define DBG_EVENT 0x10
+#define DBG_OPEN 0x20
+#define DBG_ALL (DBG_BITMAP|DBG_DVI|DBG_PK|DBG_EVENT|DBG_OPEN)
+
+EXTERN Boolean list_fonts NTINIT(False);
+
+#ifndef BDPI
+#define BDPI 300
+#endif
+
+EXTERN int pixels_per_inch NTINIT(BDPI);
+EXTERN int offset_x, offset_y;
+EXTERN int unshrunk_paper_w, unshrunk_paper_h;
+EXTERN int unshrunk_page_w, unshrunk_page_h;
+EXTERN int density NTINIT(40);
+EXTERN double specialConv;
+
+EXTERN char *dvi_name INIT(NULL);
+EXTERN FILE *dvi_file; /* user's file */
+EXTERN _Xconst char *alt_font NTINIT(ALTFONT);
+EXTERN char *prog;
+
+struct WindowRec {
+ Window win;
+ int shrinkfactor;
+ int base_x, base_y;
+ int width, height;
+ int min_x, max_x, min_y, max_y; /* for pending expose events */
+};
+
+extern struct WindowRec mane, alt, currwin;
+
+#define WINDOW(wr) ((Window) (wr).win)
+#define shrink_factor currwin.shrinkfactor
+
+EXTERN jmp_buf dvi_env; /* mechanism to communicate dvi file errors */
+
+#ifdef GREY
+#ifndef X10
+EXTERN Display *DISP;
+EXTERN Screen *SCRN;
+EXTERN unsigned long palette[17];
+EXTERN unsigned long *pixeltbl;
+EXTERN Boolean use_grey NTINIT(True);
+#else /* Sorry - GREY works only with X11 */
+#undef GREY
+#endif /* X10 */
+#endif /* GREY */
+
+/********************************
+ * Procedures *
+ *******************************/
+
+_XFUNCPROTOBEGIN
+#if NeedFunctionPrototypes
+
+extern void line_btw(int, int, int, int);
+extern void dot_at(int, int);
+extern void do_attribute_path(int, int, int, int);
+extern void put_bitmap(struct bitmap *, int, int);
+#ifdef GREY
+extern void put_image(XImage *, int, int);
+#endif
+extern void put_rectangle(int, int, int, int, WIDEARG(Boolean, int));
+extern void redraw_page(void);
+#if NeedVarargsPrototypes
+extern NORETURN void oops(_Xconst char *, ...);
+#else
+extern NORETURN void oops();
+#endif
+extern char *xmalloc(unsigned, _Xconst char *);
+extern void alloc_bitmap(struct bitmap *);
+extern FILE *xfopen(_Xconst char *);
+extern unsigned long num(FILE *, int);
+extern long snum(FILE *, int);
+extern void reset_fonts(void);
+extern void realloc_font(struct font *, WIDEARG(ubyte, int));
+extern void realloc_virtual_font(struct font *, WIDEARG(ubyte, int));
+extern void load_font(struct font *);
+extern void define_font(FILE *, WIDEARG(ubyte, unsigned int), struct font *,
+ struct tn **);
+extern void init_page(void);
+extern void open_dvi_file(void);
+extern Boolean check_dvi_file(void);
+#ifndef TEXXET
+extern long set_char(WIDEARG(ubyte, int));
+extern long set_vf_char(WIDEARG(ubyte, int));
+#else
+extern void set_char(WIDEARG(ubyte, int), WIDEARG(ubyte, int));
+extern void set_vf_char(WIDEARG(ubyte, int), WIDEARG(ubyte, int));
+#endif
+extern void draw_page(void);
+extern void init_font_open(void);
+extern FILE *font_open(_Xconst char *, char **,
+ WIDEARG(float, double), int *, int, char **);
+extern void applicationDoSpecial(char *);
+extern void read_PK_index(struct font *);
+extern void read_GF_index(struct font *);
+extern void read_PXL_index(struct font *);
+extern void read_VF_index(struct font *);
+
+#else /* ! NeedFunctionPrototypes */
+
+extern void line_btw();
+extern void dot_at();
+extern void do_attribute_path();
+extern void put_bitmap();
+#ifdef GREY
+extern void put_image();
+#endif
+extern void put_rectangle();
+extern void redraw_page();
+extern NORETURN void oops();
+extern char *xmalloc();
+extern void alloc_bitmap();
+extern FILE *xfopen();
+extern unsigned long num();
+extern long snum();
+extern void reset_fonts();
+extern void realloc_font();
+extern void realloc_virtual_font();
+extern void load_font();
+extern void define_font();
+extern void init_page();
+extern void open_dvi_file();
+extern Boolean check_dvi_file();
+#ifndef TEXXET
+extern long set_char();
+extern long set_vf_char();
+#else
+extern void set_char();
+extern void set_vf_char();
+#endif
+extern void draw_page();
+extern void init_font_open();
+extern FILE *font_open();
+extern void applicationDoSpecial();
+extern void read_PK_index();
+extern void read_GF_index();
+extern void read_PXL_index();
+extern void read_VF_index();
+
+#endif /* NeedFunctionPrototypes */
+
+#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)
+
+_XFUNCPROTOEND
diff --git a/systems/msdos/dviware/xdvi-dos/src/xdvi.ico b/systems/msdos/dviware/xdvi-dos/src/xdvi.ico
new file mode 100644
index 0000000000..e98aeff206
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/xdvi.ico
@@ -0,0 +1,27 @@
+#define xdvi_width 48
+#define xdvi_height 48
+static char xdvi_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x22, 0x00, 0x00, 0x01, 0x00, 0x00, 0xa2, 0xe0, 0x44, 0x38, 0x95, 0x13,
+ 0x9e, 0x17, 0x45, 0x45, 0x55, 0xf4, 0x82, 0xf0, 0x28, 0x3d, 0xd5, 0x13,
+ 0x82, 0x10, 0x28, 0x05, 0x55, 0x10, 0x82, 0xe0, 0x10, 0x39, 0x8a, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x1f, 0x00,
+ 0x79, 0x18, 0x18, 0x13, 0x16, 0x00, 0x69, 0x10, 0x18, 0x0e, 0x16, 0x00,
+ 0xcf, 0x20, 0x1c, 0x0e, 0xd6, 0x00, 0xe9, 0xc3, 0x7b, 0x84, 0x3f, 0x01,
+ 0x09, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x70, 0xcc,
+ 0x08, 0x00, 0x00, 0x00, 0x30, 0x52, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x52,
+ 0x0a, 0xc0, 0xff, 0x03, 0x30, 0x4c, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0xc0, 0xff, 0x03, 0x10, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf0, 0x17,
+ 0x0b, 0x0c, 0x3c, 0xc0, 0x93, 0x20, 0x0c, 0x0e, 0x43, 0x20, 0x96, 0x40,
+ 0x0c, 0x8e, 0x81, 0x10, 0x96, 0xbe, 0x0a, 0x8d, 0x81, 0x19, 0x90, 0x82,
+ 0x8a, 0x8c, 0x81, 0x0d, 0x90, 0x42, 0x48, 0x8c, 0x81, 0xed, 0x91, 0x3e,
+ 0x6a, 0x0c, 0xc3, 0x1d, 0x96, 0x12, 0x38, 0x0c, 0xbc, 0x0d, 0x1c, 0x02,
+ 0xf8, 0x3f, 0x80, 0x0d, 0x1c, 0x3e, 0x0b, 0x0c, 0x80, 0x0c, 0x1c, 0x00,
+ 0x0b, 0x0c, 0xc3, 0x18, 0x1c, 0x00, 0x0a, 0x0c, 0x63, 0x10, 0x16, 0x00,
+ 0x89, 0x3f, 0x1e, 0xe0, 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x1f, 0xae, 0x0f, 0x00, 0x80, 0x84, 0x0a, 0xae,
+ 0x87, 0x64, 0x86, 0x84, 0x08, 0x42, 0x42, 0x45, 0xe2, 0x1c, 0x07, 0x42};
diff --git a/systems/msdos/dviware/xdvi-dos/src/xdvi_cur.h b/systems/msdos/dviware/xdvi-dos/src/xdvi_cur.h
new file mode 100644
index 0000000000..a4083669b9
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/xdvi_cur.h
@@ -0,0 +1,9 @@
+#define xdvi_width 15
+#define xdvi_height 15
+#define xdvi_x_hot 7
+#define xdvi_y_hot 7
+static short xdvi_bits[] = {
+ 0x0080, 0x01c0, 0x03e0, 0x06b0,
+ 0x0c98, 0x188c, 0x3086, 0x7fff,
+ 0x3086, 0x188c, 0x0c98, 0x06b0,
+ 0x03e0, 0x01c0, 0x0080};
diff --git a/systems/msdos/dviware/xdvi-dos/src/xdvi_mas.h b/systems/msdos/dviware/xdvi-dos/src/xdvi_mas.h
new file mode 100644
index 0000000000..ab2f850b12
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/src/xdvi_mas.h
@@ -0,0 +1,7 @@
+#define xdvi_mask_width 15
+#define xdvi_mask_height 15
+static short xdvi_mask_bits[] = {
+ 0x01c0, 0x03e0, 0x07f0, 0x0ff8,
+ 0x1ffc, 0x3ffe, 0x7fff, 0x7fff,
+ 0x7fff, 0x3ffe, 0x1ffc, 0x0ff8,
+ 0x07f0, 0x03e0, 0x01c0};
diff --git a/systems/msdos/dviware/xdvi-dos/texfonts.sub b/systems/msdos/dviware/xdvi-dos/texfonts.sub
new file mode 100644
index 0000000000..6d1a09caed
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/texfonts.sub
@@ -0,0 +1,74 @@
+amb10 -> cmb10
+ambsy10 -> cmbsy10
+ambx10 -> cmbx10
+ambx12 -> cmbx12
+ambx5 -> cmbx5
+ambx6 -> cmbx6
+ambx7 -> cmbx7
+ambx8 -> cmbx8
+ambx9 -> cmbx9
+ambxsl10 -> cmbxsl10
+ambxti10 -> cmbxti10
+amcsc10 -> cmcsc10
+amdunh10 -> cmdunh10
+amex10 -> cmex10
+amff10 -> cmff10
+amfib8 -> cmfib8
+aminch -> cminch
+amitt10 -> cmitt10
+ammi10 -> cmmi10
+ammi12 -> cmmi12
+ammi5 -> cmmi5
+ammi6 -> cmmi6
+ammi7 -> cmmi7
+ammi8 -> cmmi8
+ammi9 -> cmmi9
+ammib10 -> cmmib10
+amr10 -> cmr10
+amr12 -> cmr12
+amr17 -> cmr17
+amr5 -> cmr5
+amr6 -> cmr6
+amr7 -> cmr7
+amr8 -> cmr8
+amr9 -> cmr9
+amsl10 -> cmsl10
+amsl12 -> cmsl12
+amsl8 -> cmsl8
+amsl9 -> cmsl9
+amsltt10 -> cmsltt10
+amss10 -> cmss10
+amss12 -> cmss12
+amss17 -> cmss17
+amss8 -> cmss8
+amss9 -> cmss9
+amssbx10 -> cmssbx10
+amssdc10 -> cmssdc10
+amssi10 -> cmssi10
+amssi12 -> cmssi12
+amssi17 -> cmssi17
+amssi8 -> cmssi8
+amssi9 -> cmssi9
+amssq8 -> cmssq8
+amssqi8 -> cmssqi8
+amsy10 -> cmsy10
+amsy5 -> cmsy5
+amsy6 -> cmsy6
+amsy7 -> cmsy7
+amsy8 -> cmsy8
+amsy9 -> cmsy9
+amtcsc10 -> cmtcsc10
+amtex10 -> cmtex10
+amtex8 -> cmtex8
+amtex9 -> cmtex9
+amti10 -> cmti10
+amti12 -> cmti12
+amti7 -> cmti7
+amti8 -> cmti8
+amti9 -> cmti9
+amtt10 -> cmtt10
+amtt12 -> cmtt12
+amtt8 -> cmtt8
+amtt9 -> cmtt9
+amu10 -> cmu10
+amvtt10 -> cmvtt10
diff --git a/systems/msdos/dviware/xdvi-dos/xdvi.man b/systems/msdos/dviware/xdvi-dos/xdvi.man
new file mode 100644
index 0000000000..a60ddbdc09
--- /dev/null
+++ b/systems/msdos/dviware/xdvi-dos/xdvi.man
@@ -0,0 +1,396 @@
+
+
+
+XDVI(SIPB) MISC. REFERENCE MANUAL PAGES XDVI(SIPB)
+
+
+
+NAME
+ xdvi - DVI Previewer for the X Window System
+
+SYNOPSIS
+ xdvi [+[page]] [-s shrink] [-S density] [-p pixels]
+ [-altfont font] [-l] [-rv] [-fg color] [-bg color] [-hl
+ color] [-bd color] [-cr color] [-thorough] [-margins inches]
+ [-sidemargin inches] [-topmargin inches] [-mgs[n] size]
+ [-geometry geometry | =geometry] [%geometry] [-display
+ display] file
+
+DESCRIPTION
+ Xdvi is a program which runs under the X window system. It
+ is used to preview DVI files, such as are produced by TeX.
+
+ This program has the capability of showing the file shrunken
+ by various (integer) factors, and also has a ``magnifying
+ glass'' which allows one to see a small part of the unshrunk
+ image momentarily.
+
+ Also, before displaying any page or part thereof, it checks
+ to see if the dvi file has changed since the last time it
+ was displayed. If this is the case, then xdvi will reini-
+ tialize itself for the new dvi file. For this reason, ex-
+ posing parts of the xdvi window while TeX is running should
+ be avoided. This feature allows you to preview many ver-
+ sions of the same file while running xdvi only once.
+
+OPTIONS
+ In addition to specifying the .dvi file (with or without the
+ .dvi), Xdvi supports the following command line options. If
+ the option begins with a `+' instead of a `-', the option is
+ restored to its default value. By default, these options
+ can be set via the resource names given in parentheses in
+ the description of each option.
+
+ +page
+ Specifies the first page to show. If + is given
+ without a number, the last page is assumed; the first
+ page is the default.
+
+ -s shrink
+ (.shrinkFactor) Defines the initial shrink factor. The
+ default value is 3.
+
+ -S density
+ (.densityPercent) Determines the density used when
+ shrinking bitmaps for fonts. A higher value produces a
+ lighter font. The default value is 40.
+
+ -p pixels
+ (.pixelsPerInch) Defines the size of the fonts to use,
+
+
+
+X Version 11 Last change: 8 May 1989 1
+
+
+
+
+
+
+XDVI(SIPB) MISC. REFERENCE MANUAL PAGES XDVI(SIPB)
+
+
+
+ in pixels per inch. The default value is 300.
+
+ -altfont font
+ (.altFont) Declares a default font to use when the font
+ in the dvi file cannot be found. This is useful, for
+ example, with PostScript <tm> fonts.
+
+ -l (.listFonts) Causes the names of the fonts used to be
+ listed.
+
+ -rv (.reverseVideo) Causes the page to be displayed with
+ white characters on a black background, instead of vice
+ versa.
+
+ -bw width
+ (.borderWidth) Specifies the width of the border of the
+ window.
+
+ -borderwidth width
+ Same as -bw, above.
+
+ -fg color
+ (.foreground) Determines the color of the text (fore-
+ ground).
+
+ -foreground color
+ Same as -fg, above.
+
+ -bg color
+ (.background) Determines the color of the background.
+
+ -background color
+ Same as -bg, above.
+
+ -hl color
+ (.highlight) Determines the color of the page border.
+
+ -bd color
+ (.borderColor) Determines the color of the window bord-
+ er.
+
+ -cr color
+ (.cursorColor) Determines the color of the cursor. The
+ default is the foreground color.
+
+ -thorough
+ (.thorough) Xdvi will usually try to ensure that over-
+ strike characters (e.g. \notin) are printed correctly.
+ On monochrome displays, this is always possible with
+ one logical operation, either and or or. On color
+ displays, however, this may take two operations, one to
+ set the appropriate bits and one to clear other bits.
+
+
+
+X Version 11 Last change: 8 May 1989 2
+
+
+
+
+
+
+XDVI(SIPB) MISC. REFERENCE MANUAL PAGES XDVI(SIPB)
+
+
+
+ If this is the case, then by default xdvi will instead
+ use the copy operation, which does not handle over-
+ striking correctly. The ``thorough'' option chooses
+ the slower but more correct choice.
+
+ -margins inches
+ (.margins) Specifies the size of both the top margin
+ and side margin. This can be a decimal number, e.g.,
+ 1.5. It determines the ``home'' position of the page
+ within the window as follows. If the entire page fits
+ in the window, then the margin settings are ignored.
+ If, even after removing the margins from the left,
+ right, top, and bottom, the page still cannot fit in
+ the window, then the page is put in the window such
+ that the top and left margins are hidden, and presum-
+ ably the upper left-hand corner of the text on the page
+ will be in the upper left-hand corner of the window.
+ Otherwise, the text is centered in the window. See
+ also `H' under the KEYSTROKES section.
+
+ -sidemargin inches
+ (.sideMargin) Specifies the side margin (see above).
+
+ -topmargin inches
+ (.topMargin) Specifies the top and bottom margins (see
+ above).
+
+ -mgs[n] size
+ (.magnifierSize[n]) Specifies the size of the window to
+ be used for the ``magnifying glass'' for Button n. See
+ the MOUSE ACTIONS section. Defaults are 200, 350, 600,
+ 900, and 1200.
+
+ -mgs size
+ Same as -mgs1, above.
+
+ =geometry
+ (*geometry) Specifies the initial geometry of the win-
+ dow.
+
+ -geometry geometry
+ Same as above.
+
+ #geometry
+ (.iconGeometry) Specifies the initial position for the
+ icon.
+
+ -display host:display
+ Specifies the host and screen to be used for displaying
+ the dvi file. This is normally obtained from the en-
+ vironment variable ``DISPLAY.''
+
+
+
+
+X Version 11 Last change: 8 May 1989 3
+
+
+
+
+
+
+XDVI(SIPB) MISC. REFERENCE MANUAL PAGES XDVI(SIPB)
+
+
+
+KEYSTROKES
+ Xdvi recognizes the following keystrokes when typed in its
+ window. Each may optionally be preceded by a (positive or
+ negative) number, whose interpretation will depend on the
+ particular keystroke.
+
+ q Quits the program. Control-C and control-D will do
+ this, too.
+
+ n Moves to the next page (or to the nth next page if a
+ number is given). Synonyms are `f', Space, Return, and
+ Line Feed.
+
+ p Moves to the previous page (or back n pages). Synonyms
+ are `b', control-H, and Delete.
+
+ g Moves to the page with the given number. Initially,
+ the first page is assumed to be page number 1, but this
+ can be changed with the `P' keystroke, below. If no
+ page number is given, then it goes to the last page.
+
+ P ``This is page number n.'' This can be used to make
+ the `g' keystroke refer to actual page numbers instead
+ of absolute page numbers.
+
+ Control-L
+ Redisplays the current page.
+
+ ^ Move to the ``home'' position of the page. This is
+ normally the upper left-hand corner of the page,
+ depending on the margins as described in the -margins
+ option, above.
+
+ u Moves up a window-full.
+
+ d Moves down a window-full.
+
+ l Moves left a window-full.
+
+ r Moves right a window-full.
+
+ c Moves the page so that the point currently beneath the
+ cursor is moved to the middle of the window. It also
+ (gasp!) warps the cursor to the same place.
+
+ M Sets the margins so that the point currently under the
+ cursor is the upper left-hand corner of the text in the
+ page.
+
+ s Changes the shrink factor to the given number. If no
+ number is given, the smallest factor that makes the en-
+ tire page fit in the window will be used. (Margins are
+
+
+
+X Version 11 Last change: 8 May 1989 4
+
+
+
+
+
+
+XDVI(SIPB) MISC. REFERENCE MANUAL PAGES XDVI(SIPB)
+
+
+
+ ignored in this computation.)
+
+ S Sets the density factor to be used when shrinking bit-
+ maps. This should be a number between 0 and 100;
+ higher numbers produce lighter characters.
+
+ R Forces the dvi file to be reread. This allows you to
+ preview many versions of the same file while running
+ xdvi only once.
+
+MOUSE ACTIONS
+ If the shrink factor is set to any number other than one,
+ then clicking any mouse button will pop up a ``magnifying
+ glass'' which shows the unshrunk image in the vicinity of
+ the mouse click. This subwindow disappears when the mouse
+ button is released. Different mouse buttons produce dif-
+ ferent sized windows, as indicated by the -mgs option,
+ above.
+
+ Also, the scrollbars (if present) behave in the standard
+ way: pushing Button 2 in a scrollbar moves the top or left
+ edge of the scrollbar to that point; pushing Button 1 moves
+ the image up or right by an amount equal to the distance
+ from the button press to the upper left-hand corner of the
+ window; pushing Button 3 moves the image down or left by the
+ same amount.
+
+ENVIRONMENT
+ Uses the environment variable ``DISPLAY'' to specify which
+ bit map display terminal to use.
+
+ The environment variable ``TEXPKS'' determines the path(s)
+ searched for fonts in the following manner. The string con-
+ sists of one or more strings separated by colons. In each
+ such string, the substring ``%f'' is changed to the font
+ name; ``%d'' is changed to the magnification; and ``%p'' is
+ changed to the font family (``gf'', ``pk'', or ``pxl''). If
+ no ``%f'' appears in the string, then the string
+ ``/%f.%d%p'' is added on the end. For example, if the
+ string is ``/usr/local/tex/fonts'' and the font is cmr10 at
+ 300dpi, then it searches for
+ /usr/local/tex/fonts/cmr10.300gf,
+ /usr/local/tex/fonts/cmr10.300pk, and
+ /usr/local/tex/fonts/cmr10.1500pxl, in that order. If the
+ first character of the ``TEXPKS'' variable is a colon, then
+ the system default paths are tried first.
+
+FILES
+ /usr/local/lib/tex/fonts/pk Font pixel files.
+
+SEE ALSO
+ X(1).
+
+
+
+X Version 11 Last change: 8 May 1989 5
+
+
+
+
+
+
+XDVI(SIPB) MISC. REFERENCE MANUAL PAGES XDVI(SIPB)
+
+
+
+AUTHORS
+ Eric Cooper, CMU, did a version for direct output to a QVSS.
+ Modified for X by Bob Scheifler, MIT Laboratory for Computer
+ Science. Modified for X11 by Mark Eichin, MIT SIPB. Addi-
+ tional enhancements by many others.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+X Version 11 Last change: 8 May 1989 6
+
+
+
diff --git a/systems/msdos/e4t/e4t-deu.html b/systems/msdos/e4t/e4t-deu.html
new file mode 100644
index 0000000000..7f87a72050
--- /dev/null
+++ b/systems/msdos/e4t/e4t-deu.html
@@ -0,0 +1,118 @@
+<HTML>
+<TITLE><B>Informationen zu Eddi4TeX</B></TITLE>
+<CENTER><H1><B><A NAME=back>Eddi4TeX 2.01</A></B></H1></CENTER>
+<HR>
+Diesen Text gibt es auch auf <A HREF=e4t-eng.html>Englisch</A>.<P>
+
+<PRE></PRE><P>
+
+Eddi4TeX ist gleichzeitig Editor und Oberfl&auml;che f&uuml;r die Arbeit mit
+TeX. Die folgende Zusammenfassung gibt einen groben &Uuml;berblick &uuml;ber
+das Paket, sie kann jedoch nicht den Test durch Sie ersetzen. Weiter unten
+gibt es <A HREF=#information>Informationen zu dem Paket</A> und <A
+HREF=#obtain>wie Sie eine Kopie erhalten k&ouml;nnen</A>. Au&szlig;erdem eine Auflistung
+der <A HREF=#newstuff>&Auml;nderungen in der neuen Version</A>, falls Sie
+Eddi4TeX schon kennen sollten. Am Ende dieses Textes sind dann noch einige <A
+HREF=#legal>Informationen zur rechtlichen Seite</A>, etwas zu <A
+HREF=#person>meiner Person</A> und eine <A
+HREF=#contact>Kontaktadresse</A>.<P>
+
+<PRE></PRE><P>
+
+<A NAME=information><B>Informationen zum Paket</B></A>
+(<A HREF=#back>zum Anfang</A>)<P>
+<UL>
+<LI> Systemvoraussetungen: DOS oder OS/2, komplette TeX-Installation
+<LI> mehrere Textfenster, jeweils >64kB, volle Mausunterst&uuml;tzung
+<LI> Flie&szlig;text durch selbst&auml;ndigen Umbruch, mehrfaches
+Zur&uuml;cknehmen und Wiederherstellen von Text&auml;nderungen
+<LI> Bearbeiten von Bl&ouml;cken, Spalten und Falten
+<LI> farbliche Syntaxhervorhebung, blinkende Klammern, Klammernkontrolle
+<LI> Analyse von log-Dateien auf Fehler und Warnungen, Sprung zu fehlerhaften
+Stellen im Text
+<LI> Online Hilfe zum Programm und zu TeX (Einbindung von texinfo-hlp-Dateien
+m&ouml;glich)
+<LI> Makrosystem mit 40 Befehlen und 30 vordefinierten Variablen
+<LI> Suchen, Ersetzen, GREP-Syntax
+<LI> Manipulation des kompletten Men&uuml;baumes und der Statuszeile
+<LI> Aufruf beliebiger externer Programme
+<LI> unter OS/2: Start von Programmen in eigenen Sitzungen, Makros warten auf
+das jeweilige Programmende
+<LI> Erstellung eigener hlp-Dateien
+<LI> Handbuch als 70 seitige dvi-Datei
+</UL>
+
+<PRE></PRE><P>
+
+<A NAME=obtain><B>Bestandteile des Paketes</B></A>
+(<A HREF=#back>zum Anfang</A>)<P>
+Das Paket besteht aus drei einzelnen Teilen, Sie ben&ouml;tigen nicht alle
+Teile. Aktivieren Sie die "Speicherfunktion" in Ihrem Web-Browser und
+w&auml;hlen Sie die gew&uuml;nschten Teile:<P>
+
+<UL>
+<LI><A HREF=e4t201p.exe><CODE>E4T201P.EXE </CODE></A> enth&auml;lt das
+Programm f&uuml;r DOS und OS/2
+<LI><A HREF=e4t201d.exe><CODE>E4T201D.EXE </CODE></A> das deutsche Handbuch,
+die Makrosammlung und hlp-Dateien
+<LI><A HREF=e4t201e.exe><CODE>E4T201E.EXE </CODE></A> das englische Handbuch,
+die Makrosammlung und hlp-Dateien<P>
+Auch das alte Archiv <CODE>E4T200D.EXE </CODE> kann mit den 2.01-Programmen
+benutzt werden. Die Datei <CODE>DIFF201D.TXT </CODE> aus dem Archiv
+<CODE>E4T201P.EXE </CODE> gibt alle hierf&uuml;r notwendigen Informationen.<P>
+<LI><A HREF=e4tinfod.txt><CODE>E4TINFOD.TXT </CODE></A> sollten in Zukunft
+Fehler bekannt werden, so gibt dieser deutsche Text dar&uuml;ber
+Informationen (&uuml;ble Fehler werden sofort zu einer neuen Version
+f&uuml;hren)
+</UL>
+
+<PRE></PRE><P>
+
+<A NAME=newstuff><B>Neuigkeiten in Version 2.00/2.01?</B></A>
+(<A HREF=#back>zum Anfang</A>)<P>
+<UL>
+<LI> mehrfaches Zur&uuml;cknehmen und Wiederherstellen von
+Text&auml;nderungen
+<LI> Falten
+<LI> Men&uuml;baum und Statuszeile frei konfigurierbar
+<LI> verbessertes Makrosystem ("zeigende" Makrovariablen)
+<LI> Verarbeitungsgeschwindigkeit der Makros erh&ouml;ht
+<LI> GREP Suchen und Ersetzen
+<LI> Kosmetik an hunderten von Stellen
+</UL>
+
+<PRE></PRE><P>
+
+<A NAME=legal><B>Rechtliche Hinweise</B></A>
+(<A HREF=#back>zum Anfang</A>)<P>
+Eddi4TeX ist Shareware und mu&szlig; nach einer Testzeit von 30 Tagen
+registriert werden. Die nicht registrierte Version unterliegt keinen
+Einschr&auml;nkungen, Eddi4TeX ist <B>keine</B> "Crippleware".<P>
+
+<PRE></PRE><P>
+
+<A NAME=person><B>Der Mensch hinter "Ulrich Jahnz"</B></A>
+(<A HREF=#back>zum Anfang</A>)<P>
+Ich bin 1969 geboren und beende zur Zeit mein Studium der Biotechnologie an
+der Technischen Universit&auml;t Braunschweig, Deutschland. Mein
+Interessenschwerpunkt liegt auf dem Gebiet der Mikrobiologie und Genetik,
+sollten Sie mir eine Doktorarbeit anbieten wollen, setzen Sie sich doch bitte
+mit mir in Verbindung.<P>
+
+<PRE></PRE><P>
+
+<A NAME=contact><B>Kontaktadresse</B></A>
+(<A HREF=#back>zum Anfang</A>)<P>
+Sollten Sie Fragen oder Vorschl&auml;ge zu Eddi4TeX haben, setzen Sie sich
+mit mir in Verbindung.<P>
+<DL>
+<DD>Ulrich Jahnz
+<DD>Mittelweg 37
+<DD>38106 Braunschweig
+<DD>Deutschland
+<DD><A HREF="mailto:100667.1252@compuserve.com">100667.1252@compuserve.com</A>
+</DL>
+
+<PRE></PRE><P>
+
+(Ende der Datei)
diff --git a/systems/msdos/e4t/e4t-eng.html b/systems/msdos/e4t/e4t-eng.html
new file mode 100644
index 0000000000..fe3e59bf93
--- /dev/null
+++ b/systems/msdos/e4t/e4t-eng.html
@@ -0,0 +1,109 @@
+<HTML>
+<TITLE><B>Information on Eddi4TeX</B></TITLE>
+<CENTER><H1><B><A NAME=back>Eddi4TeX 2.01</A></B></H1></CENTER>
+<HR>
+This text is available in <A HREF=e4t-deu.html>German</A>, also.<P>
+
+<PRE></PRE><P>
+
+Eddi4TeX is an editor and shell designed for the work with TeX. The following
+summary gives a rough idea of the capabilities of the package, feel free to
+test and judge yourself. See below for <A HREF=#information>information on
+the package</A>, <A HREF=#obtain>how to obtain it</A> and for a <A
+HREF=#newstuff>list of new features</A>, if you know Eddi4TeX already. At the
+end of this document you find some <A HREF=#legal>legal information</A>, some
+<A HREF=#person>data on my person</A> and a <A HREF=#contact>contact
+address</A>.<P>
+
+<PRE></PRE><P>
+
+<A NAME=information><B>Information on the package</B></A>
+(<A HREF=#back>back to top</A>)<P>
+<UL>
+<LI> system requirements: DOS or OS/2, working TeX-Installation
+<LI> multiple text windows, each >64kB in size, full mouse support
+<LI> floattext by auto wrapping, multi-level undo and redo
+<LI> working on blocks, columns and folds
+<LI> syntax highlighting, blinking brackets, check of brackets
+<LI> analyzing log-files for errors and warnings, jump to faulty parts
+<LI> online help on program and TeX (works with texinfo-hlp-files)
+<LI> macro-system with 40 commands and 30 predefined variables
+<LI> searching, replacing, GREP-syntax
+<LI> customizing of whole menu tree and status line
+<LI> runs any external programs
+<LI> under OS/2: runs programs in their own sessions, macros may wait on
+ the end a program
+<LI> writing new help files
+<LI> handbook supplied as dvi-file
+</UL>
+
+<PRE></PRE><P>
+
+<A NAME=obtain><B>How to obtain the package?</B></A>
+(<A HREF=#back>back to top</A>)<P>
+The package consists of three different parts, you may not need all of them.
+Switch to "Load to disk" and click on the ones you desire:<P>
+
+<UL>
+<LI><A HREF=e4t201p.exe><CODE>E4T201P.EXE </CODE></A> contains the programs
+for DOS and OS/2
+<LI><A HREF=e4t201d.exe><CODE>E4T201D.EXE </CODE></A> for German handbook,
+demo macro collection, resource and help files
+<LI><A HREF=e4t201e.exe><CODE>E4T201E.EXE </CODE></A> for English handbook,
+demo macro collection, resource and help files<P>
+You can also use the old archive <CODE>E4T200E.EXE </CODE> with the
+2.01-programs. The file <CODE>DIFF201E.TXT </CODE> from the archive
+<CODE>E4T201P.EXE </CODE> provides all necessary information.<P>
+<LI><A HREF=e4tinfoe.txt><CODE>E4TINFOE.TXT </CODE></A> if any bugs should
+arise this English file will describe them and give information on work
+arounds (serious bugs will be fixed a.s.a.p. in a new version)
+</UL>
+
+<PRE></PRE><P>
+
+<A NAME=newstuff><B>What's new in version 2.00/2.01?</B></A>
+(<A HREF=#back>back to top</A>)<P>
+<UL>
+<LI> multi-level undo and redo for all actions
+<LI> folding
+<LI> menu tree and status line free configurable
+<LI> enhanced macro system (commands, "pointing" variables)
+<LI> speed of macro system increased
+<LI> GREP searching and replacing
+<LI> fine tuning on some hundred features not worth mentioning
+</UL>
+
+<PRE></PRE><P>
+
+<A NAME=legal><B>Legal information</B></A>
+(<A HREF=#back>back to top</A>)<P>
+Eddi4TeX is shareware and must be registered after a test period of 30 days.
+All functions are provided in non registered versions, Eddi4TeX does
+<B>not</B> come as crippleware.<P>
+
+<PRE></PRE><P>
+
+<A NAME=person><B>The person behind "Ulrich Jahnz"</B></A>
+(<A HREF=#back>back to top</A>)<P>
+I was born in 1969 and right now I am finishing my studies in biotechnology
+at the Technical University of Braunschweig, Germany. My main interest is in
+microbiology and genetics, if you should know someone to offer me a PhD,
+please contact me.<P>
+
+<PRE></PRE><P>
+
+<A NAME=contact><B>How to contact me?</B></A>
+(<A HREF=#back>back to top</A>)<P>
+If you have any questions or suggestions on Eddi4TeX feel free to contact
+me.<P>
+<DL>
+<DD>Ulrich Jahnz
+<DD>Mittelweg 37
+<DD>38106 Braunschweig
+<DD>Germany
+<DD><A HREF="mailto:100667.1252@compuserve.com">100667.1252@compuserve.com</A>
+</DL>
+
+<PRE></PRE><P>
+
+(end of file)
diff --git a/systems/msdos/e4t/e4tinfod.txt b/systems/msdos/e4t/e4tinfod.txt
new file mode 100644
index 0000000000..52a3737578
--- /dev/null
+++ b/systems/msdos/e4t/e4tinfod.txt
@@ -0,0 +1,11 @@
+
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ Eddi4TeX - Hinweise in letzter Minute
+
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
++ bis jetzt wurden in der Version 2.01 keine Fehler gefunden
+
+
+<ENDE DER DATEI>
diff --git a/systems/msdos/e4t/e4tinfoe.txt b/systems/msdos/e4t/e4tinfoe.txt
new file mode 100644
index 0000000000..14becd3fa1
--- /dev/null
+++ b/systems/msdos/e4t/e4tinfoe.txt
@@ -0,0 +1,11 @@
+
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ Eddi4TeX - last minute hints
+
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
++ so far no bugs are known from version 2.01
+
+
+<END OF FILE>
diff --git a/systems/msdos/e4t/e4tmihlp.txt b/systems/msdos/e4t/e4tmihlp.txt
new file mode 100644
index 0000000000..5b2d8de335
--- /dev/null
+++ b/systems/msdos/e4t/e4tmihlp.txt
@@ -0,0 +1,11 @@
+Hilfe-Stellung zum Programm MakeIndex fr die Eddi4TeX-Oberfl„che.
+
+Enth„lt die Datei `makeindx.hlp' sowie verschiedene Demos, um Fehler
+mit MakeIndex zu erzeugen.
+
+Getestet mit den Versionen 1.1 (Freeware) und 2.01 (Shareware) von Eddi4TeX.
+
+Version 1.0, 22. Oktober 1997
+
+Andreas Mller
+e12p@uni-bremen.de
diff --git a/systems/msdos/e4t/liesmich.e4t b/systems/msdos/e4t/liesmich.e4t
new file mode 100644
index 0000000000..4c02a7c0b3
--- /dev/null
+++ b/systems/msdos/e4t/liesmich.e4t
@@ -0,0 +1,71 @@
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ Programmveroeffentlichung 'Eddi4TeX Version 2.01'
+
+ Eddi4TeX - Editor und Oberflaeche fuer DOS und OS/2
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Aufgrund zwei schwerer Fehler in Version 2.00 habe ich mich
+entschlossen, ein neues Paket zu veroeffentlichen. Ich bitte,
+eventuelle Scherereien, die hierdurch entstanden sind, zu
+entschuldigen.
+
+
+STICHWORTE:
+
+Fliesstext, Maus, Texte >64kB, mehrfaches Zuruecknehmen und
+Wiederherstellen, Falten, Syntax Highlighting, Block- und
+Spaltenoperationen, Makrosystem, LOG-Analyse, Online-Hilfe, Shell
+fuer Programme, anpassbarer Menuebaum, OS/2-Unterstuetzung, Handbuch
+als DVI-Datei, ...
+
+
+BEI PROBLEMEN:
+
+- sollten Sie Probleme bei der Installation oder mit dem Programm
+ haben, dann schreiben Sie bitte KEINE oeffentlichen Mails in die
+ diversen Listen oder Newsgroups sondern nehmen erst per E-Mail
+ Kontakt mit mir auf
+
+
+VERFUEGBARKEIT:
+
+- das Programm sollte bei ftp.dante.de und anderen CTAN Archiven
+ (ftp.shsu.edu und ftp.tex.ac.uk) in /pub/tex/systems/msdos/e4t
+ verfuegbar sein
+
+ E4T201P.EXE Programme
+ E4T201D.EXE deutsche Datendateien
+ E4T201E.EXE englische Dateiendateien
+
+ Um Ihre Downloadzeiten gering zu halten, koennen Sie auch das
+ alte Archiv E4T200D.EXE mit den 2.01-Programmen benutzen. Die
+ Datei DIFF201D.TXT aus dem Archiv E4T201P.EXE beinhaltet alle
+ hierfr notwendigen Informationen.
+
+- wollen Sie sich Ihre Kopie des Programmes "erklicken", fuettern Sie
+ ihren Web-Browser mit
+
+ ftp://ftp.dante.de/pub/tex/systems/msdos/e4t/e4t-deu.html
+
+ (ftp.shsu.edu oder ftp.tex.ac.uk sind auch als Host moeglich)
+
+
+HINWEIS:
+
+Eddi4TeX ist Shareware und muss nach einer Testzeit von 30 Tagen
+registriert werden. Das Programm unterliegt in der unregistrierten
+Form keinen Einschraenkungen, ist also keine "Crippleware".
+
+
+
+ Ulrich Jahnz
+ Mittelweg 37
+ 38106 BRAUNSCHWEIG
+ Germany
+ 100667.1252@compuserve.com
+
+
+
diff --git a/systems/msdos/e4t/readme.e4t b/systems/msdos/e4t/readme.e4t
new file mode 100644
index 0000000000..ff68ef1bc5
--- /dev/null
+++ b/systems/msdos/e4t/readme.e4t
@@ -0,0 +1,64 @@
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ Programpublication 'Eddi4TeX Version 2.01'
+
+ Eddi4TeX - Editor and Shell for DOS and OS/2
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Due to two serious bugs in version 2.00 I have decided to release a
+new version of Eddi4TeX. I am sorry for any inconviniences you may
+have had.
+
+
+KEYWORDS:
+
+floattext, mouse, texts >64kB, multiple undo and redo, folding,
+syntax highlighting, blocks and columns manipulation, macrosystem,
+LOG-analyzer, online help, shell for programs, customizable menu
+tree, OS/2-support, handbook as DVI-file, ...
+
+
+PROBLEMS:
+
+- if you should have any problems installing or using the program
+ please do NOT write public mails in any newsgroups, but try to
+ contact me via e-mail personally first
+
+
+AVAILABILITY:
+
+- the program should be available from ftp.dante.de and
+ related CTAN archives (ftp.shsu.edu and ftp.tex.ac.uk)
+ in /pub/tex/systems/msdos/e4t
+
+ E4T201P.EXE programs
+ E4T201D.EXE German data files
+ E4T201E.EXE English data files
+
+ To keep your downloads low you can also use the old archive
+ E4T200E.EXE with the 2.01-programs. DIFF201E.TXT from archive
+ E4T201P.EXE provides all necessary information.
+
+- ftp://ftp.dante.de/pub/tex/systems/msdos/e4t/e4t-eng.html
+ (or ftp.shsu.edu and ftp.tex.ac.uk as host instead) if you prefer
+ to get your copy of the package by mouse clicking
+
+
+HINT:
+
+Eddi4TeX is shareware and has to be registered after a testing period
+of 30 days. The unregistered version provides all functions, Eddi4TeX
+dos NOT come as "crippleware".
+
+
+
+ Ulrich Jahnz
+ Mittelweg 37
+ 38106 BRAUNSCHWEIG
+ Germany
+ 100667.1252@compuserve.com
+
+
+
diff --git a/systems/msdos/easytex/readme.txt b/systems/msdos/easytex/readme.txt
new file mode 100644
index 0000000000..9ad6779753
--- /dev/null
+++ b/systems/msdos/easytex/readme.txt
@@ -0,0 +1,322 @@
+
+ EasyTeX Version 3.2 21.3.1993
+ <<<<<<<<<<<<<<<<<<< <<<<<<<<<
+
+ Dieses Dokument befa"3t sich mit folgenden Themen:
+
+ 1. Lizenz-Vereinbarung
+ 2. Installation von EasyTeX
+ 3. Konfiguration von EasyTeX
+ 4. Kleine Einf"uhrung
+ 5. MAKEHelp
+ 6. dvips
+ 7. Neue Features
+ 8. Fragen und Antworten
+ 9. Bekannte Fehler
+ 10. Bestellschein
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ Willkommen zu EasyTeX, der interaktiven Benutzeroberfl"ache f"ur emTeX.
+ Ich freue mich, da"3 Sie sich f"ur dieses Projekt interessieren.
+
+ EasyTeX ist speziell f"ur die TeX-Implementierung emTeX konzipiert. F"ur
+ ein komplettes System brauchen Sie also sowohl die Dateien, die in
+ Kapitel 2 aufgelistet sind als auch das emTeX-Paket.
+
+ Die neueste Version von EasyTeX liegt aus dem SoftServer der Uni Stuttgart
+ zu beziehen "uber INTERNET (anonymous ftp) rusinfo.rus.uni-stuttgart.de
+ [129.69.1.12] im Directory '/soft/tex/machines/pc/easytex'
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 1. Lizenz-Vereinbarung
+ <<<<<<<<<<<<<<<<<<<<<<
+
+ EasyTeX ist SHAREWARE. Sie d"urfen und sollen EasyTeX benutzen und auch
+ an Freunde und Bekannte weitergeben. Es gibt keine Registrierung, ich
+ m"ochte nur eine kommerzielle Nutzung ausschlie"3en.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ich habe das Programm mit gr"o"3tm"oglicher Sorgfalt in Bezug auf Daten-
+ sicherheit entwickelt. Trotzdem kann ich keinerlei Haftung f"ur Sch"aden
+ irgendwelcher Art "ubernehmen, die direkt oder indirekt durch die Be-
+ nutzung dieses Programms entstehen.
+
+ Eine kommerzielle Nutzung ist im Rahmen dieser Lizenz-Vereinbarung
+ ausgeschlossen. Wenn Sie beabsichtigen, EasyTeX kommerziell zu nutzen,
+ setzen Sie sich bitte mit dem Autor in Verbindung.
+
+ EasyTeX wurde entwickelt von:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Michael Schollmeyer
+ Ludwigsburger Str. 132
+ D-70435 Stuttgart
+
+ Falls Sie die neueste Version von EasyTeX erhalten wollen, dann f"ullen
+ Sie den Bestellschein am Ende dieser Datei aus und schicken ihn wie dort
+ angegeben an mich.
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 2. Installation von EasyTeX
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ Vor der Installation von EasyTeX sollten Sie emTeX installieren.
+
+ EasyTeX besteht aus den Dateien
+
+ et.com, et.ovl, et.ini, et.hlp, rdel.exe
+
+ Kopieren Sie diese Dateien einfach von der Installationsdiskette in
+ das Verzeichnis, in dem auch emTeX installiert ist ("ublicherweise
+ 'c:\emtex').
+
+ Danach k"onnen Sie EasyTeX starten, indem Sie
+
+ C:\EMTEX>et<RETURN>
+
+ in der DOS-Kommandozeile eingeben.
+
+ Au"3erdem sind auf der Installationsdiskette folgende Dateien enthalten:
+
+ readme.txt - Lesen Sie gerade
+ etsrc.zip - Source Code von EasyTeX in gepackter Form
+ help.zip - OnLine-Hilfe
+ * help.txt (Source Code f"ur die OnLine-Help-Datenbank)
+ * latexhlp.txt ( -"- )
+ * makehelp.exe (OnLine-Help-Compiler (siehe Kapitel 5))
+ qref.tex - Quick-Referenz-Blatt
+
+ Diese Dateien sind zum Betrieb von EasyTeX nicht unbedingt erforderlich.
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 3. Konfiguration von EasyTeX
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ Die Konfiguration von EasyTeX geschieht aus dem Programm heraus. Starten
+ Sie deshalb zuerst EasyTeX und machen Sie sich mit den grundlegenden
+ Bedienungselementen vertraut (siehe auch Kapitel 4).
+
+ F"ur einen korrekten Ablauf von EasyTeX m"ussen Sie noch die folgende Ein-
+ stellungen durchf"uhren:
+
+ þ Sie m"ussen die Environment-Variable 'TMP' einstellen. F"ugen Sie dazu
+ die Zeile
+
+ set TMP=x:\dir
+
+ in die Datei 'autoexec.bat' ein. Hierbei gibt 'x:\dir' das Verzeichnis
+ an, in das tempor"are Dateien abgelegt werden sollen. Dies geschieht am
+ besten auf der RAM-Disk.
+
+ Sie k"onnen diese Einstellung aber auch von EasyTeX aus, im Men"u-
+ punkt 'Options/Environment' durchf"uhren.
+
+ þ Sie m"ussen die Environment-Variable 'PATH' um diejenigen Verzeichnisse
+ erweitern, in denen die ausf"uhrbaren Dateien von emTeX liegen. Das
+ k"onnen Sie ebenfalls "uber die Datei 'autoexec.bat' machen. Aller-
+ dings ist es vorteilhafter, den neuen Pfad von EasyTeX aus einzu-
+ stellen, da dann die Pfadanweisung in der Datei 'autoexec.bat' nicht
+ so lang und un"ubersichtlich wird. Normalerweise m"ussen Sie dazu die
+ Variable 'PATH' um den Eintrag 'c:\emtex' erweitern.
+
+ þ Bei 'Options/Driver' m"ussen Sie zumindest das Feld 'lib path'
+ ausf"ullen und die gew"unschten Aufl"osungen angeben. Bei 'lib path'
+ m"ussen die von Ihnen verwendeten Zeichensatzbibliotheken eingetragen
+ werden. Geben Sie hier
+
+ x:\dir
+
+ ein, wobei 'x:\dir' f"ur das Verzeichnis steht, in dem Ihre Zeichen-
+ satzbibliotheken liegen.
+
+ Zeichensatzbibliotheken sind Dateien mit der Endung '.fli'. "Ublicher-
+ weise liegen sie im Verzeichnis 'c:\emtex\texfonts'. Dr"ucken Sie,
+ nachdem Sie das Verzeichnis f"ur die Zeichensatzbibliotheken richtig
+ eingegeben haben die Taste 'f4', um alle Dateien aus diesem Verzeich-
+ nis in die Liste zu "ubernehmen.
+
+ Falls Sie mit dvidrv 1.4r (emTeX) oder sp"ater arbeiten, gilt f"ur diese
+ Option ein andere Syntax.
+
+ þ Bei 'Device Resolution' und 'Font Resolution' m"ussen Sie die
+ Aufl"osung Ihres Druckers und der Zeichens"atze angeben. Falls Sie
+ einen Laserdrucker benutzen, ist die Aufl"osung 300x300, bei einem
+ Nadeldrucker 180x180, 360x180 oder 360x360.
+
+ Falls Sie sich unschl"ussig sind, welche Angaben Sie machen m"ussen,
+ Dr"ucken Sie einfach die Taste 'f1' w"ahrend das entsprechende Fenster
+ ge"offnet ist; Sie erhalten dann Hilfe zu den Optionen. F"ur weiter-
+ gehende Fragen k"onnen Sie auch in den Benutzerhandb"ucher 'dvidrv'
+ bzw. 'emTeX' nachschlagen (werden bei emTeX mitgeliefert).
+
+ Damit die "Anderungen bei der Einstellung der Variable 'TMP' wirksam
+ werden, m"ussen Sie EasyTeX verlassen und dann neu starten.
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 4. Kleine Einf"uhrung
+ <<<<<<<<<<<<<<<<<<<<<
+
+ EasyTeX ist in erster Linie ein Editor, d.h. ein Programm, mit dem Sie
+ Texte eingeben und ver"andern k"onnen. Weiterhin k"onnen Sie von EasyTeX
+ aus Programme aufrufen, die dann Ihren Text formatieren oder drucken.
+
+ EasyTeX besitzt eine Online-Hilfe, die Ihnen st"andig zur Verf"ugung steht
+ und die die meisten Funktionen erkl"art. Dr"ucken Sie die Funktionstaste
+ 'F1', um die Online-Hilfe zu starten. Es wird dann ein Fenster ge"offnet,
+ in dem Informationen dargestellt werden. Sie k"onnen mit den Cursor-Tasten
+ durch den Text scrollen. Wenn dabei eine Zeichenkette hervorgehoben
+ dargestellt wird, k"onnen Sie zu diesem Thema weitere Hilfe erhalten, indem
+ Sie die den Cursor auf diesem Begriff positionieren und die EINGABE-Taste
+ dr"ucken oder den Begriff mit der Maus anklicken.
+
+ Unter dem Thema 'Allgemein' k"onnen Sie allgemeine Informtionen "uber das
+ Arbeiten mit EasyTeX erhalten. Wenn Sie nicht viel Erfahrung mit Editoren
+ haben, empfehle ich Ihnen, die Referenzen auf der ersten Seite der
+ OnLine-Hilfe (im Topic 'Contents') zu lesen (aber nicht mehr die
+ Referenzen, die in diesen Referenzen enthalten sind; sonst werden sie nie
+ fertig). Sie bekommen dann einen guten "Uberblick "uber die M"oglichkeiten
+ von EasyTeX. Wenn Sie in 'Contents' das Fenster nach unten rollen, kommen
+ weitere Referenzen, die aber mei"3t mit Dialogboxen verbunden sind.
+
+ Hilfe zu LaTeX-Befehlen erhalten Sie, wenn Sie im Text den Befehl
+ markieren (mit einem Doppelklick mit der linken Maustaste) und dann die
+ Taste 'F1' dr"ucken.
+
+ Die Hilfe ist Situationsbezogen, wenn eine bestimmte Dialogbox ge"offnet
+ ist, kommt auch zu dieser Dialogbox Hilfe.
+
+ Drucken Sie sich auch die Datei 'qref.tex' von EasyTeX aus, dort sind die
+ wichtigsten Tastenbelegungen aufgef"uhrt.
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 5. MAKEHelp
+ <<<<<<<<<<<
+
+ Auf der Installationsdiskette ist ein Programm enthalten, mit dem Sie
+ Ihre eigene OnLine-Help-Datenbank erstellen k"onnen.
+
+ MAKEHelp ist ein ausf"uhrbares Programm. Wenn Sie es z.B. mit
+
+ makehelp help.txt latexhlp.txt et.hlp
+
+ aufrufen, liest es die Dateien 'help.txt' und 'latexhlp.txt' ein und
+ erstellt die Datei 'et.hlp', die von EasyTeX gelesen wird.
+
+ Die mitgelieferte Datein 'help.txt' und 'latexhlp.txt' stellen den
+ "Rahmen" dar, mit dem EasyTeX arbeitet. Sie k"onnen diese Datei erg"anzen,
+ allerdings sollten Sie keine Informationen aus diesen Dateien l"oschen.
+
+ Im Inhaltsverzeichnis der OnLine-Hilfe unter dem Stichwort 'MAKEhelp'
+ finden Sie mehr Informationen zu diesem Thema.
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 6. dvips
+ <<<<<<<<
+
+ Die mit Version 3.2 verwendete Map-File Technologie macht das Programm
+ convps aus fr"uheren Versionen von EasyTeX obsolet.
+
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 7. Neue Features
+ <<<<<<<<<<<<<<<<
+
+ Version 3.2 - map-file: neu
+ Version 3.1 - Aufruf und Optionen ge"andert, siehe OnLine: Programmstart.
+ 'Help/Last Topic': Neu.
+ 'Utilities/Print/High Quality': Neu.
+ 'Options/Pages/Use Page Options with PreView': Neu
+ 'Options/Tex/Default Drive': Auswahl 'none' hinzugef"ugt.
+
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 8. Fragen und Antworten
+ <<<<<<<<<<<<<<<<<<<<<<<
+
+ Hier sind einige Antworten auf h"aufig gestellte Fragen:
+
+ F: Wenn ich EasyTeX starte, kommt nur eine 2-zeilige Nachricht, sonst
+ passiert nichts.
+ A: Entweder Sie benutzen keinen 100% IBM-kompatiblen AT, oder Sie
+ benutzen keine EGA oder VGA Grafik-Karte. Das sind jedoch die
+ unabdingbaren Hardware-Voraussetzungen f"ur den EasyTeX-Betrieb.
+
+ F: Wenn ich ein Utility laufen lasse (z.B. TeX), wird nur kurz
+ 'file not found' angezeigt, dann bin ich wieder im Editor und
+ nichts ist passiert.
+ A: Wahrscheinlich ist die Environment-Variable 'PATH' nicht richtig
+ eingestellt. Diese Variable mu"3 nicht unbedingt so eingestellt
+ sein, wie es in Ihrer Datei 'autoexec.bat' spezifiziert wurde. Zum
+ einen k"onnen Sie diese Variable ja manuell "andern, zum anderen kann
+ sie von EasyTeX mit einer EasyTeX-spezifischen Angabe "uberschrieben
+ werden, wenn Sie das w"unschen. Sehen Sie deshalb unter dem Men"upnkt
+ 'Options/Environment' nach, ob der Pfad richtig eingestellt ist.
+
+ F: Wenn ich ein Programm starten m"ochte, kommt "ofter die Fehlermeldung
+ 'Not enough core'.
+ A: Das sollte eigentlich nicht mehr passieren. Starten Sie EasyTeX neu.
+
+ F: Ich kann im 'Utilities'-Menu keine Befehle ausw"ahlen.
+ A: Die Befehle im 'Utilities'-Menu stehen nur zur Verf"ugung, wenn die
+ aktuelle Datei in der Dateiliste ist, Sie m"ussen Sie also mit
+ 'File/Add' laden, nicht mit 'File/Visit'.
+
+ F: Ich habe laufend Dateien mit den Namen 'et34567.tmp' auf meiner
+ Festplatte, die ich gar nicht erzeugt habe.
+ A: EasyTeX erzeugt tempor"are Auslagerungs-Dateien mit diesen Namen. Wenn
+ Sie Ihren Rechner ausschalten (oder er abst"urzt), ohne da"3 Sie EasyTeX
+ verlassen, werden diese Dateien nicht mehr gel"oscht. Wenn EasyTeX
+ nicht l"auft, k"onnen Sie diese Dateien ohne Bedenken l"oschen.
+
+ Zu diesem Thema siehe auch: OnLine-Hilfe, Stichwort 'virtuelle Dateien'
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 9. Bekannte Fehler
+ <<<<<<<<<<<<<<<<<<
+
+ þ Wenn Sie eine Datei laden, in der Zeilen enthalten sind, die eine
+ maximale Zeilenl"ange von 250 Zeichen "uberschreiten, so werden diese
+ Zeilen von EasyTeX abgeschnitten.
+
+ þ Es gibt Probleme mit den Beta-Releases von emTeX, einige Optionen
+ (z.B. 'lib path' und 'page selection' ) m"ussen manuell eingestellt
+ werden.
+
+ þ Die Funktionen 'Edit/Undo' und 'Edit/Redo' sind noch in der Entwicklung
+ (keine Garantie!).
+
+ Falls Sie REPRODUZIERBARE Fehler im Programm entdecken, schreiben Sie
+ mir, jeder 1000. Einsender gewinnt ein Wochenende auf den
+ Langehans'schen Inseln f"ur 2 Personen.
+ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+ 10. Bestellschein
+ <<<<<<<<<<<<<<<<<
+
+ Bevor Sie dieses Formular ausf"ullen, schalten Sie in den 'Overtype'-Mode
+ ------------------------------------------------------------------------
+ Bitte schicken Sie mir die neueste Version von EasyTeX.
+
+ Meine Addresse:
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+
+ E-Mail: [ ]
+
+ Meine Version von EasyTeX ist:
+
+ Version [ . ] Release [94. ]
+
+ Wenn Sie EasyTeX starten und den Befehl 'Miscellaneous/View Output'
+ ausf"uhren, sehen Sie eine zweizeilige Nachricht, in der die
+ Versions- und die Releasenummer angezeigt werden.
+
+ Speichern Sie diese Datei auf einer Diskette ab, wenn Sie das Formular
+ ausgef"ullt haben, und schicken Sie diese Diskette inclusive eines
+ geeigneten, FRANKIERTEN, addressierten R"uckumschlags an mich. Statt dem
+ R"uckumschlag k"onnen Sie auch einen wiederverwertbaren Umschlag und einen
+ Adressaufkleber mit Ihrer Adresse schicken. Ersatzweise akzeptiere ich
+ auch 20.--DM in Bar/Scheck.
+ ------------------------------------------------------------------------
+ <end of file readme.txt>
diff --git a/systems/msdos/emtex-contrib/TeXtelmExtel/95_09_26.ver b/systems/msdos/emtex-contrib/TeXtelmExtel/95_09_26.ver
new file mode 100644
index 0000000000..1b784f6d59
--- /dev/null
+++ b/systems/msdos/emtex-contrib/TeXtelmExtel/95_09_26.ver
@@ -0,0 +1,2 @@
+TeXtelmExtel Betatest 1995.09.26
+We can spell now. \ No newline at end of file
diff --git a/systems/msdos/emtex-contrib/TeXtelmExtel/read1st.txt b/systems/msdos/emtex-contrib/TeXtelmExtel/read1st.txt
new file mode 100644
index 0000000000..1e25ccbfd3
--- /dev/null
+++ b/systems/msdos/emtex-contrib/TeXtelmExtel/read1st.txt
@@ -0,0 +1,106 @@
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+READ ME FIRST! TeXtelmExtel Betatest 1995.09.26
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now this release really took a long time...
+
+Sorry to all who have sent me interesting suggestions and to whom
+I said "Ok, no problemo!" and who do not find their ideas realized
+in this release. The new spellchecker took much longer than I thought
+and is still far from being perfect. But some other features might
+also be quite interesting: take a look at the improved "Match" command
+that will work now with e.g. \label and \ref, the "Complete Command"
+feature (which AUCTeX-users may have missed) or the support for the
+(not yet released) WTeX. Some things are now optional, and several
+bugs (like the messing-up of Unix-files) have been fixed.
+
+
+~~~~~~~~~~~~~~~~~~~~~
+What is TeXtelmExtel:
+~~~~~~~~~~~~~~~~~~~~~
+
+TeXtelmExtel is a Shell for emTeX or WTeX and related tools under
+Microsoft Windows.
+
+It includes a simple multiple-document editor. Besides the predefined
+standard tools, up to 10 userdefined tools can be set up. Its unique
+features are: built-in spellchecker, automatic OEM / ANSI character
+conversion, userdefinable point-and-click Templates, support for the
+Forward and Inverse Search mechanism of DVI Driver for Windows and
+for automatic Font generation.
+
+TeXtelmExtel is freeware.
+
+
+~~~~~~~~~~~~
+Legal Stuff:
+~~~~~~~~~~~~
+
+TeXtelmExtel is FREE. Ok, if you want to, send me something nice, a postcard
+of your home-town, your credit cards or anything else. But you need not do
+this. Just use TeXtelmExtel and report me any bug you have found in it. At the
+moment, the source-code is NOT available. You are NOT allowed to resell this
+program, any part of it or any changed version of any part of it for profit
+without my written permission. If you are a shareware-vendor or sysop of a
+bulletin board, you may only charge a small nominal fee (as usual) for storage
+media material or downloading time.
+
+There are NO WARRANTIES OF ANY KIND regarding this software. You can not make
+me responsible if this software does not fit your purposes, does not work
+properly, does not work at all, damages your Computer or any part of it, makes
+you depressive or whatever. There will definitely be bugs in this software and
+you may not always like them.
+
+
+~~~~~~~~~~~~~
+Distribution:
+~~~~~~~~~~~~~
+
+TeXtelmExtel is distributed in form of the following files:
+
+Filename: Filetype: Contents:
+~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~
+HELP_SRC.ZIP (binary) Sources for the .HLP file. Not
+ necessary unless you want to
+ modify the Help system.
+VBRUN300.ZIP (binary) VBRUN300.DLL.
+US_DICT.ZIP (binary) An us-english dictionary.
+TEXMEX.ZIP (binary) All other files.
+READ1ST.TXT (ascii) This file.
+WHATSNEW.TXT (ascii) Description of new features and
+ bugfixes.
+95_09_26.VER (ascii) Version information.
+
+
+~~~~~~~~~~~~~
+Installation:
+~~~~~~~~~~~~~
+
+(1) Unzip the file VBRUN300.ZIP and put VBRUN300.DLL into your
+ Windows\System directory.
+(2) Put HELP_SRC.ZIP, US_DICT.ZIP and TEXMEX.ZIP in your root directory.
+(2) Unzip the files with the -d option, i.e.: UNZIP TEXMEX.ZIP -d.
+(3) Start Windows and add the Icon of TeXtelmExtel (texmex.exe) to a
+ program group you want.
+(4) Start TeXtelmExtel and set all desired options from its "Options"
+ menu.
+(5) Read WHATSNEW.TXT.
+(6) Start TeXtelmExtel, open "Help|Index" and read the TeXtelmExtel docu.
+(7) Really read the TeXtelmExtel docu.
+
+In addition to that, you may use the Help sources (.RTF format) to
+modify the context-sensitive LaTeX Help.
+
+
+~~~~~
+WTeX:
+~~~~~
+
+WTeX is not yet released to the internet. The author - Hippocrates
+Sendoukas - will announce it on comp.text.tex, so please be a bit
+patient and don't write "when is it ready?" e-mails to him. Thanks!
+
+
+Happy TeXing,
+Andreas
+(e-mail: krebs@edvz.sbg.ac.at)
diff --git a/systems/msdos/emtex-contrib/TeXtelmExtel/whatsnew.txt b/systems/msdos/emtex-contrib/TeXtelmExtel/whatsnew.txt
new file mode 100644
index 0000000000..0b655114f5
--- /dev/null
+++ b/systems/msdos/emtex-contrib/TeXtelmExtel/whatsnew.txt
@@ -0,0 +1,53 @@
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+WHAT'S NEW? TeXtelmExtel Betatest 1995.09.26
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Bugfixes:
+
+(1) Under Windows NT, the ampersand & character in command
+ lines (for TeX format files) caused problems.
+(2) Small bug in Inverse Search removed.
+(3) TeXtelmExtel now recognizes Unix files (NewLine instead
+ of CarriageReturn + NewLine) and converts them instead
+ of producing ridiculously long editor lines.
+(4) DDE to open file now works even if TeXtelmExtel has to be
+ started (Problem with modal info-dialog). Info-dialog is
+ now "floating" and commands can be processed immediately.
+(5) TeXtelmExtel no longer crashes when a font for the editor
+ window is not present.
+(6) The "Insert | Sectioning Hierarchy" command erroneously
+ thought the \partition command means something like \part.
+(7) Some bugs in the Workplace function fixed.
+(8) TeXtelmExtel crashed when TeX was still running and
+ TeXtelmExtel terminated.
+
+New Features:
+
+(1) "Auto-Indent" and "Remember Column" options for editor
+ added.
+(2) "Toggle INS/OVR with [Ins]-Key" option for editor added.
+(3) OEM/ANSI Conversion is now optional.
+(4) Backup Files are now optional.
+(5) Foreground and background colors of selected text is
+ now user-defineable.
+(6) Support for Hippocrates Sendoukas' WTeX.
+(7) WTeX and DVIWIN can be closed when TeXtelmExtel exits.
+(8) Recent files now have a leading number from 1 to 4 in
+ the "File" menu to simplify opening via keyboard.
+(9) Built-in Spellchecker. Took a while ...
+(10) New "Complete Command" feature (Edit menu).
+(11) The Goto Line command now can recompute lines with
+ src specials.
+(12) "Edit|Match" will now work with \label, \ref, \pageref,
+ \cite and \bibitem, too.
+(13) Improved Help system now includes TeXtelmExtel's windows.
+(14) TeX soucecode can now be sent to a printer.
+(15) User-defined tools now have a "Filename only" option.
+(16) Improved context-sensitive Help now detects commands
+ when the cursor is placed anywhere in them.
+
+For more information about TeXtelmExtel's history, take a look
+at the Help-File.
+
+Happy TeXing,
+Andreas \ No newline at end of file
diff --git a/systems/msdos/emtex-contrib/bonus/emtex.tex b/systems/msdos/emtex-contrib/bonus/emtex.tex
new file mode 100644
index 0000000000..66b8d4572c
--- /dev/null
+++ b/systems/msdos/emtex-contrib/bonus/emtex.tex
@@ -0,0 +1,1476 @@
+\documentstyle[times,changebar]{csart}
+\driver{dvips}
+\font\mf=logo10
+\hyphenchar\mf=-1
+% Metafont from the METAFONT Documentation
+\def\METAFONT{{\mf METAFONT}}
+% BIBTeX from the BiBTeX Documentation
+\def\BIBTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
+ T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
+% SliTeX from the SliTeX Documentation
+\def\SLiTeX{S\kern-.065em L\kern-.18em\raise.32ex\hbox{i}\kern-.03em\TeX}
+% AMSTeX from the AMSTeX Files
+\def\AmSTeX{{$\cal A$\kern-.1667em\lower.5ex\hbox{$\cal M$}\kern-.125em
+ $\cal S$-\TeX}}
+% PiCTeX Documentation from the PiCTeX Files
+\def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC}
+\def\PiCTeX{\PiC\kern-.11em\TeX}
+%
+\def\PICTEX{\PiCTeX}
+\def\pictex{\PiCTeX}
+\def\AMSTeX{\AmSTeX}
+\def\AMSTEX{\AmSTeX}
+\def\amstex{\AmSTeX}
+\def\BibTeX{\BIBTeX}
+\def\bibtex{\BIBTeX}
+\def\SliTeX{\SLiTeX}
+\def\slitex{\SLiTeX}
+\def\Metafont{\METAFONT}
+\def\metafont{\METAFONT}
+\def\MF{\METAFONT}
+\def\latex{\LaTeX}
+% TeXsis from the TeXsis documentation
+\def\TeXsis{\TeX sis}
+\def\TeXcad{\TeX cad}
+\def\WEB{{\mf WEB}}
+\def\PS{{\sc PostScript}}
+
+\def\README{\verb|readme.eng| or \verb|readme.ger|}
+\begin{document}
+\title{em\TeX: TeX for OS/2, PC-DOS and MS-DOS}
+\author{Eberhard Mattes\\(shortened, and with additions by UK \TeX\
+Archive\\edited by Sebastian Rahtz)}
+\date{25-Sep-1990, with modifications of 06-Oct-1991\\additions
+8 April 92 \& 26 February 1993}
+\maketitle
+\tableofcontents
+\section{Preliminary remarks on the documentation}
+\cbstart
+This document is a typeset version of the machine readable files
+\README, prepared by the UK \TeX\ Archive. Changed sections are noted
+by changebars in the margin.
+\cbend
+
+In order to use \TeX\ or \LaTeX, familiarity with the `programming
+language' \TeX\ or \LaTeX, respectively, is required. Thus in general
+the reading of [1], [2], [5] or [7] is unavoidable. As a brief
+introduction for beginners the \LaTeX\ brief introduction of H. Partl
+(in German) may be used; it can be found on the disk after the
+installation of em\TeX\ (details below). It cannot be used as a
+substitute for [2] or [5], however. Experience shows that trying to
+save time by not reading the documentation fails. This is especially
+true with \TeX.
+
+
+
+\subsection{Book list}
+
+
+`Original works':
+
+\begin{itemize}
+\item[1.] Donald E. Knuth: The \TeX\ book
+
+ The standard work on \TeX\ and plain \TeX\ (in English).
+
+
+\item[2.] Leslie Lamport: \LaTeX: A Document Preparation System
+
+ The standard work for \LaTeX\ (in English).
+ Supplemented by \verb|\emtex\texinput\local.tex| and/or
+\verb|\emtex\doc\local.dvi|.
+
+
+\item[3.] Donald E. Knuth: The \METAFONT\ book
+
+ The standard work for \METAFONT\ (in English).
+
+
+\item[4.] Michael J. Wichura: The \PiCTeX\ Manual
+
+ Manual for \PiCTeX\ (in English).
+ Obtainable (cost: \$30) from the TeX User's Group:
+\cbstart
+ \begin{verse}
+ \TeX\ Users Group\\
+ P. O. Box 869,\\
+ Santa Barbara, CA 93102,\\
+ USA\\
+ telephone=805-899-4673\\
+ email=Internet: TUGboat@Math.AMS.org\\
+ \end{verse}
+\cbend
+\end{itemize}
+
+
+
+Further Books:
+
+\begin{itemize}
+\item[5.] Helmut Kopka: \LaTeX\ Eine Einf\"uhrung
+
+ A manual for \LaTeX\ in German.
+
+\item[6.] Norbert Schwarz: Eine Einf\"uhrung in \TeX
+\item[7.] Norbert Schwarz: Introduction to \TeX
+\end{itemize}
+
+
+
+
+
+\section{Introduction}
+
+
+em\TeX\ consists among others in the following:
+
+\begin{description}
+\item[ \TeX\ ] The well-known text system by Donald E. Knuth
+\item[ \LaTeX\ ] The well-known macro package for TeX by L. Lamport
+\item[ \METAFONT\ ] `font compiler' by Donald E. Knuth
+\item[ dvidrv ] Printer driver and Screen Previewer
+\item[ \TeXcad\ ] A program for drawing LaTeX picture environments
+\end{description}
+
+All programs but \TeXcad\ can be used under DOS as well as OS/2.
+\TeXcad\ can be used only under DOS or in DOS mode of OS/2.
+
+The dvidrv printer drivers support the following printers:
+
+\begin{verse}
+ HP LaserJet+, HP LaserJet II, HP LaserJet III\\
+ HP DeskJet, HP DeskJet+\\
+ Kyocera F-1010\\
+ NEC P6, P7, P2200\\
+ EPSON LQ, FX, and RX series\\
+ Panasonic KX-P1124\\
+ Apple Imagewriter\\
+ C.ITOH 8510A\\
+ Tandy DMP-130\\
+ \ldots and many more dot matrix printers\\
+\end{verse}
+
+
+
+em\TeX\ consists of several packages. Each single package is provided in the
+form of zip files, which have to be unpacked with the program pkunzip, which
+is also provided. Many packages are spread over several zip files, so that
+DSDD diskettes can be used. (But fonts are available only on HD diskettes.)
+The package DVIDRV, for example, is found in the files dvidrv1.zip,
+dvidrv2.zip, and dvidrv3.zip. On the other hand, the package \PICTEX\ is found
+in the single file pictex.zip.
+
+Details of the packages are given in Table \ref{packages}.
+
+\section{Diskettes}
+
+
+On delivery on HD diskettes (1.44 MB), the diskettes contain the
+following files:
+
+
+{\small
+\begin{description}
+\item[Diskette 1]\par
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+ pkz102.exe \> Compression program (self-unpacking program).\\
+ pkunzip.exe\> Unpacking program (from pkz102.exe).\\
+ delete.exe \> File deleting program.\\
+ remove.exe \> Package removing program.\\
+ readme.eng \> This file.\\
+ readme.ger \> German version of this file.\\
+ help.eng \> Frequently asked questions with answers (English).\\
+ help.ger \> Frequently asked questions with answers (German).\\
+ changes.eng \> Changes from older versions (English).\\
+ changes.ger \> Changes from older versions (German).\\
+ changes.pre \> Changes between the pre-releases of emTeX (German).\\
+ tex1.zip \> TEX package, Part 1/2.\\
+ tex2.zip \> TEX package, Part 2/2.\\
+ latex1.zip \> LATEX package, Part 1/2.\\
+\end{tabbing}
+\end{quote}
+
+
+\item[Diskette 2]\par
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+ latex2.zip \> LATEX package, Part 2/2.\\
+ texware.zip \> TEXWARE package.\\
+ web.zip \> WEB package.\\
+ btex1.zip \> BTEX package, Part 1/2.\\
+ btex2.zip \> BTEX package, Part 2/2.\\
+ bmf1.zip \> BMF package, Part 1/2.\\
+\end{tabbing}
+\end{quote}
+
+
+\item[Diskette 3]\par
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+ mfware1.zip \> MFWARE package, Part 1/2.\\
+ mfware2.zip \> MFWARE package, Part 2/2.\\
+ mf1.zip \> MF package, Part 1/3.\\
+ mf2.zip \> MF package, Part 2/3.\\
+ mf3.zip \> MF package, Part 3/3.\\
+ mfjob.zip \> MFJOB package\\
+\end{tabbing}
+\end{quote}
+
+
+\item[Diskette 4]\par
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+ gtex.zip \> GTEX package.\\
+ glatex.zip \> GLATEX package.\\
+ gbtex.zip \> GBTEX package.\\
+ gblatex.zip \> GBLATEX package.\\
+ texcad.zip \> TEXCAD package.\\
+ emsy.zip \> EMSY package.\\
+ pkedit.zip \> PKEDIT package.\\
+ misc\_mf.zip \> MISC\_MF package.\\
+ bibtex.zip \> BIBTEX package.\\
+ makeindx.zip \> MAKEINDX package.\\
+ pictex.zip \> PICTEX package.\\
+ dvidrvma.zip \> DVIDRVMA package.\\
+ lkurz.zip \> LKURZ package.\\
+\end{tabbing}
+\end{quote}
+
+
+\item[Diskette 5]\par
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+ dvidrv1.zip \> DVIDRV package, Part 1/3.\\
+ dvidrv2.zip \> DVIDRV package, Part 2/3.\\
+ bmf2.zip \> BMF, Part 2/2.\\
+ latexdoc.zip \> LATEXDOC package.\\
+ blatex.zip \> BLATEX package.\\
+ dvidrv3.zip \> DVIDRV package, Part 3/3.\\
+\end{tabbing}
+\end{quote}
+
+\end{description}
+}
+
+
+
+\begin{table}
+\caption{List of Packages}\label{packages}
+{
+\footnotesize
+
+\begin{tabular}{lp{2in}p{1in}p{1in}rr}\hline
+Package&Description&Requires&Optional&Files&Size\\
+\hline
+BIBTEX
+ & BibTeX (Bibliography database for \LaTeX)
+ & LATEX
+ & ---
+ & 11
+ & 323\\
+BLATEX
+ & \LaTeX\ for big\TeX\ (extra big \LaTeX)
+ & TEX, BTEX, LATeX
+ & ---
+ & 7
+ & 510\\
+BMF
+ & big\METAFONT\ (extra big \METAFONT)
+ & MF
+ & ---
+ & 11
+ & 1043\\
+BTEX
+ & big\TeX\ (extra big \TeX)
+ & TEX
+ & BLATEX
+ & 9
+ & 986\\
+DVIDRV
+ & Printer drivers and previewers (dvidrv)
+ & ---
+ & TEX
+ & 106
+ & 1491\\
+DVIDRVMA
+ & Manual for the dvidrv drivers
+ & DVIDRV, (EMSY)
+ & ---
+ & 29
+ & 511\\
+EMSY *)
+ & Special fonts of/for em
+ & MF, TEX
+ & LATEX
+ & 19
+ & 25\\
+GBLATEX
+ & \LaTeX\ for big\TeX\ (German hyphenation patterns)
+ & TEX, BTEX, GTEX, LATEX, BLATEX, GLATEX
+ & ---
+ & 7
+ & 541\\
+GBTEX
+ & big\TeX\ (German hyphenation patterns)
+ & TEX, BTEX, GTEX
+ & GBLATEX
+ & 5
+ & 316 \\
+GLATEX
+ & \LaTeX\ (German hyphenation) and brief \LaTeX\ intro.
+ & LATEX, GTEX
+ & ---
+ & 8
+ & 421 \\
+GTEX
+ & Files for typesetting German texts
+ & TEX
+ & GLATEX
+ & 12
+ & 279 \\
+LATEX
+ & \LaTeX\ (to be more exact: I\LaTeX)
+ & TEX
+ & DVIDRV
+ & 73
+ & 1074\\
+LATEXDOC *)
+ & doc files (documented sty files; obsolete)
+ & LATEX
+ & ---
+ & 26
+ & 324\\
+LKURZ *)\\
+ & Source text for the brief \LaTeX\ intro (German)
+ & LATEX
+ & ---
+ & 7
+ & 94\\
+MAKEINDX\\
+ & MakeIndx (to sort \LaTeX\ index)
+ & LATEX
+ & ---
+ & 5
+ & 120\\
+MF
+ & \METAFONT
+ & MFWARE
+ & ---
+ & 191
+ & 1868\\
+MFWARE
+ & Auxiliary programs for \METAFONT
+ & MF
+ & TEX, PKEDIT
+ & 44
+ & 759\\
+MISC\_MF *)
+ & Various font source texts
+ & METAFONT
+ & ---
+ & 5
+ & 134\\
+PICTEX
+ & \PiCTeX\ (graphic macros for \TeX)
+ & TEX
+ & BLATEX (required for \LaTeX)
+ & 5
+ & 147\\
+PKEDIT
+ & Font editor
+ & ---
+ & MFWARE
+ & 4
+ & 100\\
+TEX
+ & em\TeX\ (plain \TeX)
+ & ---
+ & DVIDRV
+ & 104
+ & 1110\\
+TEXCAD
+ & \TeXcad\ (drawing program for \LaTeX\ picture environment)
+ & ---
+ & ---
+ & 18
+ & 244\\
+TEXWARE
+ & Auxiliary programs for \TeX
+ & TEX
+ & ---
+ & 11
+ & 439\\
+WEB *)
+ & The WEB programming system (TANGLE, WEAVE, \ldots)
+ & TEX
+ & ---
+ & 7
+ & 255\\
+\end{tabular}
+
+The packages with *) are usually not installed.
+}
+\end{table}
+
+
+
+
+
+
+
+\section{Directions for pkunzip}
+
+The program pkunzip is part of a program package from PKWARE. It is
+installed as follows on a disk (for example in the directory \verb|c:\pk|):
+
+
+{\footnotesize
+\begin{verbatim}
+ md c:\pk
+ a:pkz102 c:\pk
+\end{verbatim}
+}
+
+These lines mean the following:
+
+
+{\footnotesize
+\begin{verbatim}
+ md c:\pk Make the directory
+ a:pkz102 Load the self-unpacking program on drive a:
+ c:\pk Target directory
+\end{verbatim}
+}
+
+Please observe the license conditions at the end of manual.doc
+(contained in pkz102.exe)!
+
+The contents of a zip file (here dvidrvma.zip) can be displayed as follows:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip -vb a:dvidrvma
+\end{verbatim}
+}
+
+These lines have the following meaning:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip Call the unpacking program
+ -vb List the contents of a zip file (brief listing)
+ a:dvidrvma zip file
+\end{verbatim}
+}
+
+
+
+\section{Installation}
+
+
+\cbstart
+First read this file (a shortened version of \README, which
+you should also look at) in its entirety.
+\cbend
+Then you should read
+the license conditions at the end of manual.doc (contained in pkz
+102.exe) for pkzip/pkunzip. (And follow the conditions.)
+
+For the installation, the program pkunzip.exe should be copied onto the disk.
+A directory should be used that is in the path for executables (PATH). For
+OS/2 users: There is also an OS/2 version of pkzip/pkunzip, but this is not
+supplied with em\TeX.
+\cbstart
+If you do not have this, you have to use pkunzip in
+the DOS compatibility environment, or use the public domain {\tt
+ unzip} program.
+\cbend
+
+All of the following examples assume that em\TeX\ is to be installed
+on drive c: (You can however install em\TeX\ on another disk, if there
+is enough space.) In case an older version of em\TeX\ is already
+installed on the disk, this should first be removed. First the files
+you have modified should be saved (usually only batch and
+configuration files). Moreover, before removing em\TeX from the disk,
+the diskettes should be checked for readability, for example with
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip -t a:*
+\end{verbatim}
+}
+
+These lines have the following meaning:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip Call the unpacking program
+ -t Check the zip files
+ a:* All the zip files on drive a:
+\end{verbatim}
+}
+
+The removal of em\TeX\ is done with the program delete, which is
+supplied on the first diskette. This is done as follows (drive c:):
+
+
+{\footnotesize
+\begin{verbatim}
+ a:delete -sd c:\emtex\*.*
+\end{verbatim}
+}
+
+These lines have the following meaning:
+
+{\footnotesize
+\begin{verbatim}
+ a: Load the program from diskette (first diskette!)
+ delete Call the file deletion program
+ -s Also delete in subdirectories
+ -d Remove directories
+ c:\emtex\*.* Files to be removed
+\end{verbatim}
+}
+
+Since by this procedure all files in the directory \verb|\emtex| and in all
+subdirectories of this directory will be deleted, you should not use this
+directory for your own files!
+
+Now the individual packages can be installed. The following packages are
+usually installed (the packages in parentheses do not have to be installed):
+
+\begin{tabbing}
+ TEX:xxxx xxx\= TEX, DVIDRV, (PICTEX), (TEXWARE)\kill
+ \TeX: \> TEX, DVIDRV, (PICTEX), (TEXWARE)\\
+ \LaTeX: \> TEX, DVIDRV, LATEX, (BIBTEX), (TEXWARE), (MAKEINDX)\\
+ \METAFONT: \> MF, MFWARE, (PKEDIT), (TEX)\\
+\end{tabbing}
+
+For example, to install the package LATEX from drive a: onto disk c:, the
+following should be entered:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip -d -o a:latex? c:\
+\end{verbatim}
+}
+
+This line means the following:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip Call the unpacking program
+ -d Use directories stored in zip file
+ -o Overwrite existing files
+ a:latex? Unpack the package LATEX (latex1.zip, ...)
+ c:\ Target path
+\end{verbatim}
+}
+
+In this way the files will automatically be copied into the right
+directories. After installation you should read (or print and read) the
+following files:
+
+
+{\footnotesize
+\begin{verbatim}
+\emtex\doc\english\texware.doc (TEX package, English)
+\emtex\doc\german\texware.doc (TEX package, German)
+\emtex\doc\english\dvidrv.doc (DVIDRV package, English)
+\emtex\doc\german\dvidrv.doc (DVIDRV package; do not print out; see below!)
+\end{verbatim}
+}
+
+Moreover, the license conditions in the following files should be observed:
+
+
+{\footnotesize
+\begin{verbatim}
+\emtex\doc\makeindx.cpy (MAKEINDX package)
+\emtex\texinput\ghyphen.min (GTEX package)
+\emtex\texinput\ghyphen.max (GTEX package)
+\end{verbatim}
+}
+
+
+If you have installed the package DVIDRV and have followed the directions in
+the part `Installation of the printer driver and screen previewer' of this
+file, then you should install the package DVIDRVMA. This enables you to print
+out the `real' manual for the package DVIDRV (as opposed to dvidrv.doc), if
+you have available a suitable printer. After printing the manual you can
+again delete the files taken from DVIDRVMA (see below). If you cannot, or do
+not want to, print the dvidrv manual, then you have to content yourself with
+the indications in dvidrv.doc.
+
+After the installation of DVIDRV you can print out the other instructions (or
+look at them on the screen). Reading
+
+
+{\footnotesize
+\begin{verbatim}
+ \emtex\doc\english\emtex.dvi (TEX package)
+ \emtex\doc\local.dvi (LATEX package)
+\end{verbatim}
+}
+
+is especially recommended.
+
+In order to use \TeX\ or \METAFONT, various environment variables still have to
+be set; see the section `Environment Variables' further below in this file.
+
+If you want to use \LaTeX\ together with \PiCTeX, then big\TeX\ has to be used.
+This is a bigger (but slower) version of em\TeX. At present only a preliminary
+version is available.
+
+A brief introduction to \LaTeX\ in German is found in the package GLATEX.
+Among the files delivered is the macro package german.sty of H. Partl; if you
+want to typeset German or other non-English texts with \TeX\ or \LaTeX, you
+should read the corresponding instruction \verb|\emtex\doc\germdoc.dvi|.
+
+Since there are some files which you will not need, you should write a
+batch file to delete the ones not needed. In this way you can save some
+work in the next installation of em\TeX. For example, if you work under
+DOS, you will not need the OS/2 versions of \TeX\ and \METAFONT. It is also
+possible to extract single files from a zip file; see manual.doc in
+pkz102.exe. Example:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip -d a:pkedit c:\ emtex\pkedit.exe
+\end{verbatim}
+}
+
+This line means the following:
+
+
+{\footnotesize
+\begin{verbatim}
+ pkunzip Call the unpacking program
+ -d Use directories stored in zip file
+ a:pkedit Unpack the package PKEDIT
+ c:\ Target path
+ emtex\pkedit.exe File name (without leading backslash!)
+\end{verbatim}
+}
+
+
+You'll find some frequently asked questions with answers in the file
+help.eng (and help.ger) on the first diskette.
+
+
+
+\section{Removing a package}
+
+
+You can remove a package from the hard disk if the appropriate REM file is
+supplied --- these files appear in em\TeX\ sets made available after 2nd
+May 1990. To remove a package the program `remove', on the first disk, is
+needed. If, for example, you want to remove the DVIDRVMA package from the C:
+drive you would enter the following commands:
+
+
+{\footnotesize
+\begin{verbatim}
+ a:remove c:\emtex\remove\dvidrvma.rem c:\
+\end{verbatim}
+}
+
+where
+
+{\footnotesize
+\begin{verbatim}
+ a: load the program from the first disk
+ remove run the package removal program
+ c:\emtex\remove\dvidrvma.rem
+ the list of files comprising the package
+ c:\ remove the package from this disk
+\end{verbatim}
+}
+
+
+
+
+\section{Directories}
+
+
+The following directories are created during the installation (see also
+emtex.dvi, local.dvi, texware.doc, and mfware.doc):
+
+\begin{tabbing}
+xxxxxxemte\=xxxxx\kill
+\verb|\emtex|\\
+\> Programs, batch files, and configuration files.\\
+\\
+\verb|emtex\doc|\\
+\> Instructions and Manuals. The texts in this directory are available\\
+\> in only one language (English or German).\\
+\\
+\verb|emtex\doc\english|\\
+\> English Instructions and Manuals.\\
+\\
+\verb|emtex\doc\german|\\
+\> German Instructions and Manuals.\\
+\\
+\verb|emtex\doc\gr180|\\
+\> Graphic files for the dvidrv manual (180 DPI).\\
+\\
+\verb|emtex\doc\gr300|\\
+\> Graphic files for the dvidrv manual (300 DPI).\\
+\\
+\verb|emtex\doc\gr360|\\
+\> Graphic files for the dvidrv manual (360 DPI).\\
+\\
+\verb|emtex\texfmts|\\
+\> \TeX\ format files (macro packages in a fast-loading format;\\
+\> for example, plain and \LaTeX) and tex.poo.\\
+\\
+\verb|emtex\btexfmts|\\
+\> big\TeX\ format files (macro packages in a fast-loading format;\\
+\> for example, plain and \LaTeX) and tex.poo.\\
+\\
+\verb|emtex\tfm|\\
+\> tfm files (\TeX\ font metrics; font descriptions).\\
+\\
+\verb|emtex\texinput|\\
+\> Texts which will be read by \TeX\ (and \BibTeX).\\
+\\
+\verb|emtex\bibinput|\\
+\> Bibliography database for \BibTeX.\\
+\\
+\verb|emtex\mfinput|\\
+\> Texts which will be read by \METAFONT\ (and MFT).\\
+\\
+\verb|emtex\mfbases|\\
+\> \METAFONT\ base files (macro packages in a fast-loading format;\\
+\> for example plain and cm) and mf.poo.\\
+\\
+\verb|emtex\bmfbases|\\
+\> big\METAFONT\ base files (macro packages in a fast-loading format;\\
+\> for example plain and cm) and mf.poo.\\
+\\
+\verb|emtex\mfjob|\\
+\> mfj files (see MFjob).\\
+\\
+\verb|emtex\remove|\\
+\> Package contents listings used by the remove program.\\
+\end{tabbing}
+
+
+
+
+\section{Environment variables and config.sys}
+
+
+In this section it is assumed that \TeX\ has been installed on drive C:.
+
+You should set the environment variables for \TeX\ as follows:
+
+
+{\footnotesize
+\begin{verbatim}
+ set texinput=c:\emtex\texinput
+ set tfm=c:\emtex\tfm
+ set texfmt=c:\emtex\texfmts
+ set btexfmt=c:\emtex\btexfmts (only for bigTeX)
+ set textfm=c:\emtex\tfm
+ set bibinput=c:\emtex\bibinput
+\end{verbatim}
+}
+
+
+The environment variables for \METAFONT\ and MFjob are set as follows:
+
+
+{\footnotesize
+\begin{verbatim}
+ set mfinput=c:\emtex\mfinput
+ set mfbas=c:\emtex\mfbases
+ set bmfbas=c:\emtex\bmfbases (only for bigMETAFONT)
+ set mfjob=c:\emtex\mfjob
+\end{verbatim}
+}
+
+
+In addition, the directory \verb|c:\emtex| should be put in the search
+path, for example:
+
+
+{\footnotesize
+\begin{verbatim}
+ path c:\bin;c:\emtex
+\end{verbatim}
+}
+
+
+All of these lines should be put in the file autoexec.bat (file
+config.sys for OS/2). The file \verb|\emtex\set-tex.bat|
+(\verb|\emtex\set-tex.cmd| in OS/2) can be used as a model, or
+modified and called by autoexec.bat. If the computer complains about
+not enough environment space, you should consult your DOS manual
+concerning the SHELL command in the config.sys file and concerning the
+/E and /P options of the program COMMAND.COM.
+
+If you put all em\TeX\ directories on ONE drive and if the directories are
+organzied as recommended (and as stored in the zip files), it will be
+sufficient to set the environment variable EMTEXDRV (besides PATH):
+
+{\footnotesize
+\begin{verbatim}
+ set emtexdrv=c
+\end{verbatim}
+}
+
+This causes all programs (but dvidrv) to use the default directories on
+drive C:.
+
+The config.sys file should specify at least
+
+{\footnotesize
+\begin{verbatim}
+ FILES=20
+ BUFFERS=20
+\end{verbatim}
+}
+
+greater values are allowed.
+
+
+Under OS/2, the line
+
+{\footnotesize
+\begin{verbatim}
+ IOPL=YES
+\end{verbatim}
+}
+
+is required in config.sys for dviscr and pkedit.
+
+
+
+
+\section{Installation of the printer drivers and the screen previewers}
+
+\begin{enumerate}
+\item Install the DVIDRV package.
+
+\item Copy the fonts to the disk. For example, to install them on drive d: do
+ as follows:
+
+
+{\footnotesize
+\begin{verbatim}
+ md d:\texfonts
+ copy a:*.fli d:\texfonts
+\end{verbatim}
+}
+
+
+The last line has to be repeated for all suitable font diskettes. The
+fonts should if possible not be put into a directory under \verb|\emtex|, in
+order to simplify the installation of a new version of em\TeX\ (that is,
+without having to copy the fonts again to the disk).
+
+\item The following environment variables should be set:
+
+{\footnotesize
+\begin{verbatim}
+ dvidrvinput Search path for dvi files.
+ dvidrvfonts Search path for fli files.
+ dvidrvgraph Search path for graphic files.
+\end{verbatim}
+}
+
+
+ For example, this can be done by
+
+{\footnotesize
+\begin{verbatim}
+ set dvidrvinput=c:\mytex;c:\emtex\doc
+ set dvidrvfonts=d:\texfonts
+ set dvidrvgraph=c:\mytex;c:\emtex\doc\gr$r
+\end{verbatim}
+}
+
+
+The directory \verb|c:\emtex\doc| resp. \verb|c:\emtex\doc\gr$r| is
+used for printing the dvidrv manual. The value stored in DVIDRVFONTS
+will have the following appended to it by prtp6l.bat, for example (\$r
+will be replaced by the resolution):
+
+{\footnotesize
+\begin{verbatim}
+ \pixel.p6l\$rdpi
+\end{verbatim}
+}
+
+Therefore only a directory should be given, and this must not
+end with a \verb|\|. All these lines should be put in the
+file autoexec.bat (for OS/2 config.sys).
+\verb|\emtex\set-tex.bat| or \verb|\emtex\set-tex.cmd| can be
+used as models, or modified and called by autoexec.bat.
+Important: \$r and \$s must be written in small letters. If
+you don't want to set the environment variables (or if you
+cannot), you have to insert the desired directories into the
+configuration files (*.cnf) after renaming.
+
+
+\item To use dviscr under OS/2, you should insert the line
+
+{\footnotesize
+\begin{verbatim}
+ IOPL=YES
+\end{verbatim}
+}
+
+ into config.sys. If you don't need the OS/2 spooler, you should
+ disable it.
+
+\item Now the following batch files can be used:
+\begin{description}
+\item[v ] Screen previewer (dviscr).
+\item[vs ] Screen previewer (dviscrs).
+\item[prthplj ] Printer driver (dvihplj: HP LaserJet+).
+\item[prthplj /od ] Printer driver (dvihplj: HP DeskJet).
+\item[prthplj /ok ] Printer driver (dvihplj: Kyocera F-1010).
+\item[prtp6l ] Printer driver (dvidot p6l: P6 with 180 DPI).
+\item[prtp6m ] Printer driver (dvidot p6m: P6 with 360x180 DPI).
+\item[prtp6h ] Printer driver (dvidot p6h: P6 with 360 DPI).
+\item[prtfx ] Printer driver (dvidot fx: EPSON FX-80).
+\item[prtlql ] Printer driver (dvidot lql: EPSON LQ, 180 DPI).
+\item[prtlqm ] Printer driver (dvidot lqm: EPSON LQ, 360x180 DPI).
+\item[prtlqh ] Printer driver (dvidot lqh: EPSON LQ, 360 DPI).
+\item[ ] Note: not all LQ printers support 360 DPI.
+\item[prtitoh ] Printer driver (dvidot itoh: C.ITOH 8510A).
+\item[prtaiw ] Printer driver (dvidot aiw: Apple Imagewriter).
+\item[msplj ] Create graphic files (Parameters: lj.cnf)
+\item[mspp6l ] Create graphic files (Parameters: p6l.cnf)
+\item[mspp6m ] Create graphic files (Parameters: p6m.cnf)
+\item[mspp6h ] Create graphic files (Parameters: p6h.cnf)
+\item[mspfx ] Create graphic files (Parameters: fx.cnf)
+\item[mspito ] Create graphic files (Parameters: ito.cnf)
+\end{description}
+ If you have a version of DOS prior to 3.3, then you should change the
+ first line of these batch files from
+
+{\footnotesize
+\begin{verbatim}
+ @echo off
+\end{verbatim}
+}
+
+ to
+
+{\footnotesize
+\begin{verbatim}
+echo off
+\end{verbatim}
+}
+
+
+ The batch files v.cmd, v.bat and vs.bat use the configuration file
+ lj.cnf (LJ fonts). If another configuration file is to be used, then
+ these batch files have to be changed correspondingly. If you don't have
+ the correct font files for your printer, the drivers can reduce the
+ existing font files in certain cases (marked with * in the table below;
+ loss of quality!). Gray mode is recommended for dviscr. Example:
+ Use
+
+{\footnotesize
+\begin{verbatim}
+ @p6m.cnf /ox2
+\end{verbatim}
+}
+
+ instead of
+
+{\footnotesize
+\begin{verbatim}
+ @p6l_p6m.cnf
+\end{verbatim}
+}
+
+with dviscr. A table of configuration files is given in Table
+\ref{config}.
+
+\begin{table}
+\caption{Configuration files}\label{config}
+{\small
+\centerline{\begin{tabular}{llll}
+ File name & Resolution & Fonts & Font resolution\\
+\hline
+ lj.cnf & 300 & LJ & 300\\
+ p6l.cnf & 180 & P6L & 180\\
+ p6l\_p6m.cnf *& 180 & P6M & 360x180\\
+ p6l\_p6h.cnf *& 180 & P6H & 360\\
+ p6m.cnf & 360x180 & P6M & 360x180\\
+ p6m\_p6h.cnf *& 360x180 & P6H & 360\\
+ p6h.cnf & 360 & P6H & 360\\
+ fx.cnf & 240x216 & FX & 240x216\\
+ ito.cnf & 160x144 & ITO & 160x144\\
+\end{tabular}}
+}
+\end{table}
+
+\item Justify the margins. This procedure is described in dvidrv.doc
+ under /la\#. The /la\# and /ta\# options should be put in the respective
+ prt*.cmd/bat files.
+
+\item If you're using a NEC P7, EPSON FX-100 or another wide (13.6") printer,
+ you have to modify the batch files prt*.cmd resp. prt*.bat. Examples:
+ prtfx.bat/cmd:
+
+{\footnotesize
+\begin{verbatim}
+ old: dvidot fx80 @fx.cnf /po=prn %1 %2 %3 %4 %5 %6 %7 %8 %9
+ new: dvidot fx100 @fx.cnf /po=prn %1 %2 %3 %4 %5 %6 %7 %8 %9
+\end{verbatim}
+}
+
+
+ prtlql.bat/cmd:
+
+{\footnotesize
+\begin{verbatim}
+ old: dvidot lql @p6l.cnf /po=prn %1 %2 %3 %4 %5 %6 %7 %8 %9
+ new: dvidot lqwl @p6l.cnf /po=prn %1 %2 %3 %4 %5 %6 %7 %8 %9
+\end{verbatim}
+}
+
+
+ prtp6h.bat/cmd:
+
+{\footnotesize
+\begin{verbatim}
+ old: dvidot p6h @p6h.cnf /po=prn %1 %2 %3 %4 %5 %6 %7 %8 %9
+ new: dvidot p7h @p6h.cnf /po=prn %1 %2 %3 %4 %5 %6 %7 %8 %9
+\end{verbatim}
+}
+
+
+\item Print the dvidrv manual: Install the DVIDRVMA package and
+ follow the instructions in dvidrvma.doc.
+
+\item If you need (and have) the big fonts for \SliTeX, you have to change the
+ configuration file(s) to include the extra font library file.
+ Example (lj.cnf):
+
+{\footnotesize
+\begin{verbatim}
+ old: /pl=%DVIDRVFONTS%;lj_0;lj_h;lj_1;lj_2;lj_3;lj_4;lj_5a;lj_5b
+ new: /pl=%DVIDRVFONTS%;lj_0;lj_h;lj_1;lj_2;lj_3;lj_4;lj_5a;lj_5b;lj_sli
+\end{verbatim}
+}
+
+
+\end{enumerate}
+
+
+
+\section{Further sources of information}
+
+
+The following files contain further information (dvi files can be looked at on
+the screen with a screen previewer, or printed with a printer driver):
+
+{\small
+\begin{tabbing}
+emtexdocenglishtex\=ware.docxxxxxxxxxxxxxxx\=TEX package, English)\kill
+\verb|\emtex\doc\english\texware.doc| \>\>(TEX package, English)\\
+\verb|\emtex\doc\german\texware.doc| \>\>(TEX package, German)\\
+\>Calling \TeX\ and its associated programs.\\
+\\
+\verb|\emtex\doc\germdoc.dvi| \>\>(GTEX package, German, 4 pages)\\
+\>Instructions for german.sty.\\
+\\
+\verb|\emtex\doc\english\emtex.dvi| \>\>(TEX package, English, 8 pages)\\
+\verb|\emtex\doc\german\emtex.dvi| \>\>(TEX package, German, 12 pages)\\
+\>Instructions for em\TeX.\\
+\\
+\verb|\emtex\doc\latex.bug| \>\>(LATEX package, English)\\
+\>Changes and known mistakes in \LaTeX.\\
+\\
+\verb|\emtex\doc\local.gid| \>\>(LATEX package, English)\\
+\>Ultra brief instructions for \LaTeX.\\
+\\
+\verb|\emtex\doc\local.dvi| \>\>(LATEX package, English, 20 pages)\\
+\>Implementation specific instructions for \LaTeX.\\
+\\
+\verb|\emtex\doc\lkurz.dvi| \>\>(GLATEX package, German, 46 pages)\\
+\>Brief instructions for \LaTeX\ by H.Partl.\\
+\\
+\verb|\emtex\doc\english\mfware.doc| \>\>(MF package, English)\\
+\verb|\emtex\doc\german\mfware.doc| \>\>(MF package, German)\\
+\>Calling \METAFONT\ and its associated programs.\\
+\\
+\verb|\emtex\doc\english\mfjob.doc| \>\>(MFWARE package, English)\\
+\verb|\emtex\doc\german\mfjob.doc| \>\>(MFWARE package, German)\\
+\>Instructions for the MFjob program.\\
+\\
+\verb|\emtex\doc\english\dvidrvma.doc| \>\>(DVIDRVMA package, English)\\
+\verb|\emtex\doc\german\dvidrvma.doc| \>\>(DVIDRVMA package, German)\\
+\>Instructions for printing the dvidrv manual.\\
+\\
+\verb|\emtex\doc\english\dvidrv.dvi| \>\>(DVIDRVMA package, English, 45 pp.)\\
+\verb|\emtex\doc\german\dvidrv.dvi| \>\>(DVIDRVMA package, German, 58 pages)\\
+\>Manual for the dvidrv drivers.\\
+\\
+\verb|\emtex\doc\english\dvidrv.doc| \>\>(DVIDRV package, English)\\
+\verb|\emtex\doc\german\dvidrv.doc| \>\>(DVIDRV package, German)\\
+\>Instructions for the dvidrv drivers.\\
+\>Pay special attention to the end (changes with\\
+\>respect to earlier versions).\\
+\\
+\verb|\emtex\doc\english\fontlib.doc| \>\>(DVIDRV package, English)\\
+\verb|\emtex\doc\german\fontlib.doc| \>\>(DVIDRV package, German)\\
+\>Instructions for the fontlib program.\\
+\\
+\verb|\emtex\doc\english\makedot.doc| \>\>(DVIDRV package, English)\\
+\verb|\emtex\doc\german\makedot.doc| \>\>(DVIDRV package, German)\\
+\>Provisional instructions for makedot. This is a supplement\\
+\>to dvidot.doc.\\
+\\
+\verb|\emtex\doc\web.doc|\>\>(WEB package, German)\\
+\>Calling the programs of the WEB system.\\
+\\
+\verb|\emtex\doc\english\pkedit.doc| \>\>(PKEDIT package, English)\\
+\verb|\emtex\doc\german\pkedit.doc| \>\>(PKEDIT package, German)\\
+\>Instructions for the pkedit program.\\
+\\
+\verb|\emtex\doc\english\tcman.dvi| \>\>(TEXCAD package, English, 13 pages)\\
+\verb|\emtex\doc\german\tcman.dvi| \>\>(TEXCAD package, German, 14 pages)\\
+\>The \TeXcad\ manual.\\
+\\
+\verb|\emtex\texinput\webman.tex| \>\>(WEB package, English)\\
+\>Manual for the WEB system.\\
+\\
+\verb|\emtex\texinput\makeindx.tex| \>\>(MAKEINDX package, English)\\
+\>Instructions for MakeIndx.\\
+\\
+\verb|\emtex\doc\makeindx.doc| \>\>(MAKEINDX package, English)\\
+\>Detailed instructions for MakeIndx.\\
+\\
+\verb|\emtex\doc\english\texchk.doc| \>\>(TEXWARE package, English)\\
+\verb|\emtex\doc\german\texchk.doc| \>\>(TEXWARE package, German)\\
+\>Instructions for texchk.\\
+\end{tabbing}
+}
+
+
+\section{File names in the em\protect\TeX system}
+
+
+{\small
+\begin{tabbing}
+.auxxxx\=Auxiliary file created and used by \LaTeX\kill
+.aux\>Auxiliary file created and used by \LaTeX\\
+.bak\>Backup file (fontlib, pkedit)\\
+.bas\>Fast-loading file for \METAFONT\ (no, not BASIC)\\
+.bat\>Batch file (DOS)\\
+.bbl\>Output file of \BibTeX\\
+.bgi\>Video graphics driver (used by \TeXcad)\\
+.bib\>Bibliography database for \BibTeX\\
+.blg\>Transcript file (\BibTeX)\\
+.bst\>Bibliography style for \BibTeX\\
+.bug\>List of bugs\\
+.ch\>Change file (TANGLE, WEAVE and MFT)\\
+.chr\>Readable form of a pxl file (PXtoCH and CHtoPX)\\
+.cmd\>Batch file (OS/2)\\
+.cnf\>Configuration file for dvidrv\\
+.dlg\>Transcript file (dvidrv)\\
+.doc\>Instructions (straight text) or commented sty file\\
+.dot\>Parameter file for dvidot\\
+.dvi\>Device independent output of \TeX\\
+.err\>Error messages and warnings (dvidrv)\\
+.exe\>Executable program\\
+.fli\>Font library file (dvidrv)\\
+.fmt\>Fast-loading file for \TeX\\
+.gf\>Font file created by \METAFONT\ (usually.\#gf)\\
+.gft\>Default extension for the output of GFtype\\
+.glo\>\LaTeX\ auxiliary file for \verb|glossary|\\
+.idx\>Index entries (created by \LaTeX)\\
+.ilg\>MakeIndx transcript file\\
+.ind\>Index entries (created by MakeIndx)\\
+.lof\>\LaTeX\ auxiliary file for \verb|\listoffigures|\\
+.log\>Transcript file (\TeX\ and \METAFONT)\\
+.lot\>\LaTeX\ auxiliary file for \verb|\listoftables|\\
+.mac\>\TeXcad\ macro file\\
+.mf\>Source text for a font\\
+.mfj\>Job file for MFjob\\
+.mft\>Style file for MFT\\
+.msp\>Graphic file\\
+.opt\>\TeXcad\ parameters\\
+.ovl\>Overlay\\
+.pas\>Pascal source file (TANGLE)\\
+.pcx\>Graphic file\\
+.pic\>Picture environment created by \TeXcad\\
+.pk\>Compressed font file\\
+.pkt\>Default extension for the output of PKtype\\
+.pl\>Readable form of a tfm file\\
+.poo\>String pool for INITEX or INIMF (pool file)\\
+.pxl\>Font file\\
+.rem\>Package contents listing for the remove program\\
+.sty\>Document style or document style option for \LaTeX\\
+.sub\>Font substitution file (dvidrv)\\
+.tcp\>\TeX\ code page (translation of code pages and special characters)\\
+.tex\>\TeX\ text\\
+.tfm\>Symbol widths and other properties of a font (font metrics)\\
+.toc\>Notes of \LaTeX\ for contents\\
+.ver\>List of program versions (\TeXcad)\\
+.vf\>Virtual font (dvidrv, VFtoVP, VPtoVF)\\
+.vpl\>Readable form of a vf file (VFtoVP and VPtoVF)\\
+.web\>WEB source text (TANGLE and WEAVE)\\
+.zip\>Archive file (collection of compressed files)\\
+\end{tabbing}
+}
+
+(No claim as to completeness.)
+
+
+
+\section{File list}
+\cbstart
+A complete list of files is given in \README
+\cbend
+
+\section{Fonts}
+
+\cbstart
+See \README\ for a discussion of font magnifications and names
+\cbend
+\section{License}
+
+
+emTeX may only be distributed in UNCHANGED and COMPLETE form (all zip
+files, readme.eng and readme.ger!), and only when this is done WITHOUT
+CHARGE. If you want to distribute only parts of emTeX or if you want
+to charge a small fee for handling etc., you have to contact the author.
+
+Please observe the license conditions for pkzip/pkunzip
+(see manual.doc in pkz102.exe)!
+
+Please observe the directions in {\footnotesize
+\verb|\emtex\texinput\ghyphen.min|} and
+{\footnotesize\verb|\emtex\texinput\ghyphen.max|}!
+
+Please observe the directions in {\footnotesize
+\verb|\emtex\doc\makeindx.cpy|} (see
+also
+{\footnotesize\verb|\emtex\doc\english\texware.doc|} and
+{\footnotesize\verb|\emtex\doc\german\texware.doc|})!
+
+TeXcad is Shareware. Please observe the directions in
+{\footnotesize\verb|\emtex\doc\english\tcman.dvi|}!
+
+No guarantee is made as to the proper functioning of the programs.
+No liability will be admitted for damage resulting from using the
+programs.
+
+Instead of a list: All the trademarks used in this document and all
+the other em\TeX\ documents are registered to whoever it is that owns them.
+
+
+\section{The author}
+
+
+Address:
+\begin{verse}
+ Eberhard Mattes\\
+ Teckstra\ss e 81\\
+ D-7141 M\"oglingen\\
+ Federal Republic of Germany
+\end{verse}
+
+
+Questions only by mail! No telephone calls please!
+Please inclose a self-addressed return package with postage if
+you expect a response.
+
+Electronic mail (subject to sudden change):
+
+
+{\footnotesize
+\begin{verbatim}
+ Internet: mattes@azu.informatik.uni-stuttgart.de
+\end{verbatim}
+}
+
+
+If you want support by telephone, obtain a commercial \TeX\ package.
+
+Frequently asked questions (and answers) will be found in help.eng and
+help.ger.
+
+
+
+\section{Reporting bugs}
+
+
+If you find a bug please tell the author so that it can be corrected. Please
+send the following information which is needed for the task:
+
+\begin{itemize}
+\item machine type (XT, AT, 386 etc.), CPU, BIOS, video card, printer
+ (manufacturer and model), operating system and version number
+ (note: SYSLEVEL command with OS/2). For instance:
+ AT compatible, 286, Award, Paradise VGA, DeskJet+, IBM PC-DOS 3.3 .
+
+\item the text of the autoexec.bat and config.sys in use when the error
+ occurred: if possible, with an explanation of the programs called and
+ drivers installed that are not part of the operating system.
+
+\item em\TeX\ version (date of issue)
+
+\item enough information for the error to be reproduced, if possible a disk
+ (5.25" or 3.5") containing the appropriate files (see also dvidrv.doc).
+
+\item the dvidrv log file, if the error is in a driver
+
+\item the part of the printed output which shows the error, if the error is in
+ a printer driver.
+\end{itemize}
+Please inclose a self-addressed return package with postage if
+you expect a response.
+
+
+\section{Changes from earlier versions (with regard to the installation)}
+\cbstart
+A full list of changes can be found in \README.
+\cbend
+
+
+\section{Betatest disk}
+\cbstart
+This disk contains new versions of some of the em\TeX\ packages. The
+tex386 package offers a conveniently large and fast \TeX\ (in the
+latest 3.141 version), and the new versions of the drivers with MFJOB
+provide dynamic creation of fonts.
+\begin{description}
+\item[Diskette 6]\par
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+tex386b8.zip \> em\TeX\ for 386 machines (large capacity, and fast) \\
+readme.tst \> notes on beta-test files. PLEASE READ THIS!\\
+drv14s.zip \> revised versions of dvi drivers\\
+mfjob11l\> MFJOB utility to accompany new drivers\\
+\end{tabbing}
+\end{quote}
+\end{description}
+
+\section{Bonus disks from the UK \protect\TeX\ Archive}\label{bonus}
+This distribution of the em\TeX\ package by the UK \TeX\ Archive has
+been enhanced by the addition of more packages which provide some
+commonly-requested facilities. These are {\em not} as well-tested,
+packaged and documented as em\TeX\ itself, but should be useful to
+many PC-based \TeX\ users. All These packages are supplied as .zip
+archives which are unpacked in exactly the same way as the em\TeX\
+ones. A {\tt .rem} file is supplied for use with the {\tt remove}
+utility.
+
+\begin{description}
+\item[bm2font] A program to convert eg .PCX or .GIF files to \TeX\ .pk fonts
+for inclusion in \TeX\ documents without any need for special drivers.
+\item[dvips] Tom Rokicki's dvips program, to translate .dvi files to
+ PostScript. This is a reliable, sophisticated package, also
+ available for Unix, VMS and VM/CMS systems. Full documentation is in
+ the plain \TeX\ document \verb|\dvips.tex|. There are two copies of
+ the program: \verb|dvips.exe| for normal DOS use, and
+ \verb|dvipswin| for those with Microsoft Windows. Configuration files
+ are placed in \verb|\emtex\ps| and they assume that the font library
+ files or .pk files are in \verb|\texfonts\pixel.lj|. Font metric
+ files are included for all the common \PS\ fonts.
+
+ The program source for dvips is in a separate package, {\em dvipssrc}.
+\item[morebin] A selection of useful ancillary programs. Documentation
+ is provided in the \verb|emtex\doc| hierarchy.
+\begin{description}
+\item[wp2latex] WordPerfect 5.0 to \LaTeX\ translator
+\item[dvi2tty] ASCII viewer for dvi files
+\item[dviselec] Write a subset of a dvi file to a new dvi file
+\item[dvidvi] Rearrange pages of a dvi file
+\item[dviconca] Join dvi files together
+\item[dvibook] Rearrange pages of a dvi file
+\item[lacheck] Syntax checker for \LaTeX\ documents
+\end{description}
+\item[newlatex] The version of em\TeX\ is slightly out of date with
+respect to \LaTeX. This package provides new copies of all the \LaTeX\
+source files for those who wish to be totally up to date. The files
+{\em overwrite} those in \verb|\emtex\texinput|. This does {\em not}
+update your format files --- the user has to run the {\tt fmt.bat}
+batch files in eg \verb|\emtex\texfmts|.
+
+The package includes the NFSS: as part of the development of a new
+\LaTeX\ for the 1990s, this is the New Font Selection Scheme, by Frank
+Mittelbach and Rainer Sch\"opf. It replaces all the font declaration
+mechanisms in \LaTeX\ with a much more flexible system. The files are
+installed in \verb|\emtex\base\nfss| which contains documentation etc.
+A new format file is placed in \verb|\emtex\texfmts| which is called
+by a new command `newlatex'; this is a version of \LaTeX\ with the
+NFSS installed.
+
+The newlatex package also includes the other Mittelbach/Sch\"opf
+packages ({\em multicol, array, theorem, ftnright,} and {\em verbatim})
+which provide important extensions to \LaTeX. The documentation for
+these is in the source directories under \verb|emtex\base| for each
+package --- you should run \LaTeX\ on the {\tt .drv} file and print
+the result. The pre-built style files themselves have been placed in
+\verb|emtex\texinput| ready for use.
+
+\item[psnfss] This package builds on the NFSS package by providing a
+complete drop-in system for using PostScript fonts with the NFSS,
+prepared by Sebastian Rahtz. This package is installed in
+\verb|\emtex\psnfss|, with new style files in \verb|\emtex\texinput|.
+Print the documentation file \verb|psnfss.eps| before you start
+looking at this.
+\item[seminar] A comprehensive \LaTeX\ style package by Timothy van
+ Zandt to produce overhead slides, performing all the same jobs as
+ \SLiTeX, but can be used with all normal \LaTeX\ styles.
+\end{description}
+
+The packages are arranged on disk as follows:
+\begin{description}
+\item[Diskette 7]
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+dvips \> dvi to postscript driver \\
+mfb1 \> betatest 386 version of \Metafont\\
+\end{tabbing}
+\end{quote}
+
+\item[Diskette 8]
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+newlatex \> March 1992 versions of \LaTeX\ files\\
+\> plus all Mittelbach/Schoepf packages (inc NFSS)\\
+psnfss \> PostScript addition for New Font Selection Scheme\\
+morebin \> extra programs for use with \TeX\\
+\end{tabbing}
+\end{quote}
+\item[Diskette 9]
+\begin{quote}
+\begin{tabbing}
+xxxxxxxxxxxxxxxxxx\=xxxxxxx\kill
+bm2font \> program to generate \TeX\ fonts from graphics files\\
+seminar\> macros by Timothy van Zandt to produce slides \\
+dvipssrc \> program source of dvips driver\\
+ps2pk12 \> program to generate \TeX\ pk files from Adobe Type1 fonts
+\end{tabbing}
+\end{quote}
+\end{description}
+\cbend
+\end{document}
diff --git a/systems/msdos/emtex-contrib/contrib/bj10e.dvidot b/systems/msdos/emtex-contrib/contrib/bj10e.dvidot
new file mode 100644
index 0000000000..a8a85da86a
--- /dev/null
+++ b/systems/msdos/emtex-contrib/contrib/bj10e.dvidot
@@ -0,0 +1,65 @@
+Date: Tue, 25 Feb 92 17:22:02 +0000
+From: SYSMGR@uk.ac.kcl.ph.ipg
+Subject: EmTeX (DVIDOT) driver for BJ10e
+
+I sent this to UKTEX July last, but judging from Andrew McLean's
+letter it hasn't found its way into the archive. Its short enough to
+bear repetition anyway: following is a DVIDOT driver revipe for a Cannon
+BJ10e.
+
+Notes:
+
+I have split the INIT1 and INIT2 lines in two to keep within 80 characters.
+To use, I think you'll have to re-join these into one rather long line,
+unless there is a continuation line mechanism that I didn't notice in
+the MAKEDOT doc. Also, you'll want your BJ10e in mode 2 (IBM emulation).
+The graphics sequences used are IBM ones, and presumably there is some
+IBM printer for which this recipe will also work.
+
+The font libraries you need are the P6H_*.FLI. I made mine myself using
+MFJOB; took a few days on a 386SX, and they occupy about 6Mb.
+
+ Nigel Arnot.
+
+*
+* BJ10e high resolution driver (derived from ibm4208m.dot )
+*
+COMMENT=360x360 driver for BJ10e
+ENV_NAME=BJ10E
+LOG_NAME=dvidot
+FONT_PATH=\emtex\pixel.p6h\$rdpi
+PAGE_WIDTH=8in
+PAGE_HEIGHT=11in
+FORM_LENGTH=
+RESOLUTION=360 360
+COLUMNS=2880
+ONE_LINE_FEED=
+BLANK_WIDTH=36
+METHOD=6 1
+MAX_WIDTH=2880
+PINS=7 0
+MAX_LF=255
+FF_METHOD=FF
+S_OPTION=SLOW
+*
+* INIT 1 resets to user defaults, may include economy mode SW1-2 ON
+INIT1=CAN ESC '[ 'K 1 0 4 DC2 ESC 'F ESC 'H ESC 'I 0 ESC 'T ESC 'X 1 80
+ESC "[@" 4 0 0 0 17 1 ESC '_ 0 ESC '- 0 ESC '[ '\ 4 0 0 0 0x68 0x01 ESC '3 48 C
+R
+*
+* whereas INIT 2 resets to factory, SW1-2 OFF.
+INIT2=CAN ESC '[ 'K 1 0 0 DC2 ESC 'F ESC 'H ESC 'I 0 ESC 'T ESC 'X 1 80
+ESC "[@" 4 0 0 0 17 1 ESC '_ 0 ESC '- 0 ESC '[ '\ 4 0 0 0 0x68 0x01 ESC '3 48 C
+R
+*
+* and after we are done go back to user defaults.
+EXIT=ESC '[ 'K 1 0 0
+*
+GRAPH_MODE=FS 'C 'B 4 4 LH+0
+GRAPH_END=
+LINE_FEED=FS 'C 'J 4 L+0
+FORM_FEED=FF
+POS_X=
+*
+* The end
+*
diff --git a/systems/msdos/emtex-contrib/contrib/diskette.bat b/systems/msdos/emtex-contrib/contrib/diskette.bat
new file mode 100644
index 0000000000..28a57feb1b
--- /dev/null
+++ b/systems/msdos/emtex-contrib/contrib/diskette.bat
@@ -0,0 +1,526 @@
+@echo off
+rem ==========================================================================
+rem DISKETTE.BAT orDISKETTE.CMD (Roger de Reus, reus@mic.dtu.dk) 27-Jun-1995
+rem ==========================================================================
+rem Copy emTeX distribution to diskettes according to E. Mattes' DISKETTE.DOC.
+rem for emTeX distribution 25-Jun-95
+rem Type DISKETTE or see under :Usage below for usage.
+rem Save as DISKETTE.BAT for DOS usage.
+rem Save as DISKETTE.CMD for OS/2 usage.
+rem
+rem adapted for emTeX Update 21-Jun-1996 and *.fli files
+rem by Peter Seitz (e-mail: seitz@bzs.tu-graz.ac.at)
+rem last change: 17-Jul-1996
+
+if %1.==. goto Usage
+
+rem Initialisation
+set Drive=a:
+set Size=3
+set Disk=nodefault
+
+:Start
+if %1==a: set Drive=a:
+if %1==a: goto Next
+if %1==A: set Drive=a:
+if %1==A: goto Next
+if %1==b: set Drive=b:
+if %1==b: goto Next
+if %1==B: set Drive=b:
+if %1==B: goto Next
+if %1==35 set Size=3
+if %1==35 goto Next
+if %1==525 set Size=5
+if %1==525 goto Next
+if %1==all set Disk=all
+if %1==ALL set Disk=all
+if %Disk%==all goto Disk%Size%_1
+if %1==alltex set Disk=alltex
+if %1==ALLTEX set Disk=alltex
+if %Disk%==alltex goto Disk%Size%_1
+if %1==allfli set Disk=allfli
+if %1==ALLFLI set Disk=allfli
+if %Size%==5 if %Disk%==allfli goto Disk%Size%_11
+if %Size%==3 if %Disk%==allfli goto Disk%Size%_9
+if %1==1 set Disk=1
+if %1==2 set Disk=2
+if %1==3 set Disk=3
+if %1==4 set Disk=4
+if %1==5 set Disk=5
+if %1==6 set Disk=6
+if %1==7 set Disk=7
+if %1==8 set Disk=8
+if %1==9 set Disk=9
+if %1==10 set Disk=10
+if %1==11 set Disk=11
+if %1==12 set Disk=12
+if %1==13 set Disk=13
+if %1==14 set Disk=14
+if %1==14 if %Size%==3 goto Error2
+if %1==15 set Disk=15
+if %1==15 if %Size%==3 goto Error2
+if %1==16 set Disk=16
+if %1==16 if %Size%==3 goto Error2
+if %Disk%==nodefault goto Error
+goto Disk%Size%_%Disk%
+
+:Next
+shift
+if %1.==. goto Done
+goto Start
+
+rem 3.5 inch diskettes
+:Disk3_1
+echo:
+echo Insert emTeX 3.5 inch diskette 1 and hit ENTER.
+pause > nul
+echo Copying: readme.eng readme.ger readme.bet install.eng install.ger
+echo Copying: quick.eng quick.ger help.eng help.ger changes.eng changes.ger
+echo Copying: diskette.doc unz512.exe unz512x3.exe first.zip emxrsx.zip
+echo Copying: mfjob12c.zip
+label %Drive%emtex 1-8
+copy readme.eng %Drive% > nul
+copy readme.ger %Drive% > nul
+copy readme.bet %Drive% > nul
+copy install.eng %Drive% > nul
+copy install.ger %Drive% > nul
+copy quick.eng %Drive% > nul
+copy quick.ger %Drive% > nul
+copy help.eng %Drive% > nul
+copy help.ger %Drive% > nul
+copy changes.eng %Drive% > nul
+copy changes.ger %Drive% > nul
+copy diskette.doc %Drive% > nul
+copy unz512.exe %Drive% > nul
+copy unz512x3.exe %Drive% > nul
+copy first.zip %Drive% > nul
+copy emxrsx.zip %Drive% > nul
+copy mfjob12c.zip %Drive% > nul
+copy dvisp10b.zip %Drive% > nul
+if %Disk%==all goto Disk3_2
+if %Disk%==alltex goto Disk3_2
+goto Next
+
+:Disk3_2
+echo:
+echo Insert emTeX 3.5 inch diskette 2 and hit ENTER.
+pause > nul
+echo Copying: dvid16f1.zip bibtex4b.zip
+label %Drive%emtex 2-8
+copy dvid16f1.zip %Drive% > nul
+copy bibtex4b.zip %Drive% > nul
+if %Disk%==all goto Disk3_3
+if %Disk%==alltex goto Disk3_3
+goto Next
+
+:Disk3_3
+echo:
+echo Insert emTeX 3.5 inch diskette 3 and hit ENTER.
+pause > nul
+echo Copying: makeindx.zip latex209.zip german.zip dvid16f2.zip
+label %Drive%emtex 3-8
+copy makeindx.zip %Drive% > nul
+copy latex209.zip %Drive% > nul
+copy german.zip %Drive% > nul
+copy dvid16f2.zip %Drive% > nul
+if %Disk%==all goto Disk3_4
+if %Disk%==alltex goto Disk3_4
+goto Next
+
+:Disk3_4
+echo:
+echo Insert emTeX 3.5 inch diskette 4 and hit ENTER.
+pause > nul
+echo Copying: tex4b.zip pkedit.zip pictex.zip web.zip
+label %Drive%emtex 4-8
+copy tex4b.zip %Drive% > nul
+copy pkedit.zip %Drive% > nul
+copy pictex.zip %Drive% > nul
+copy web.zip %Drive% > nul
+if %Disk%==all goto Disk3_5
+if %Disk%==alltex goto Disk3_5
+goto Next
+
+:Disk3_5
+echo:
+echo Insert emTeX 3.5 inch diskette 5 and hit ENTER.
+pause > nul
+echo Copying: mf4b.zip fontcm.zip fontltx.zip
+label %Drive%emtex 5-8
+copy mf4b.zip %Drive% > nul
+copy fontcm.zip %Drive% > nul
+copy fontltx.zip %Drive% > nul
+if %Disk%==all goto Disk3_6
+if %Disk%==alltex goto Disk3_6
+goto Next
+
+:Disk3_6
+echo:
+echo Insert emTeX 3.5 inch diskette 6 and hit ENTER.
+pause > nul
+echo Copying: l2input.zip fontdc.zip
+label %Drive%emtex 6-8
+copy l2input.zip %Drive% > nul
+copy fontdc.zip %Drive% > nul
+if %Disk%==all goto Disk3_7
+if %Disk%==alltex goto Disk3_7
+goto Next
+
+:Disk3_7
+echo:
+echo Insert emTeX 3.5 inch diskette 7 and hit ENTER.
+pause > nul
+echo Copying: lkurz.zip l2kurz.zip texware.zip mfware.zip fontemsy.zip
+echo Copying: fontams.zip texcad.zip
+label %Drive%emtex 7-8
+copy lkurz.zip %Drive% > nul
+copy l2kurz.zip %Drive% > nul
+copy texware.zip %Drive% > nul
+copy mfware.zip %Drive% > nul
+copy fontemsy.zip %Drive% > nul
+copy fontams.zip %Drive% > nul
+copy texcad.zip %Drive% > nul
+if %Disk%==all goto Disk3_8
+if %Disk%==alltex goto Disk3_8
+goto Next
+
+:Disk3_8
+echo:
+echo Insert emTeX 3.5 inch diskette 8 and hit ENTER.
+pause > nul
+echo Copying: l2base.zip srcmkidx.zip srctcad.zip l2tools.zip
+label %Drive%emtex 7-8
+copy l2base.zip %Drive% > nul
+copy srcmkidx.zip %Drive% > nul
+copy srctcad.zip %Drive% > nul
+copy l2tools.zip %Drive% > nul
+if %Disk%==all goto Disk3_9
+goto Next
+
+
+rem 3.5 inch diskettes library files
+
+
+:Disk3_9
+echo:
+echo Insert emTeX 3.5 inch diskette 9 (1) and hit ENTER.
+pause > nul
+echo Copying: ljh_base.fli
+label %Drive%texfli 1-5
+copy ljh_base.fli %Drive% > nul
+if %Disk%==all goto Disk3_10
+if %Disk%==allfli goto Disk3_10
+goto Next
+
+:Disk3_10
+echo:
+echo Insert emTeX 3.5 inch diskette 10 (2) and hit ENTER.
+pause > nul
+echo Copying: bj_base.fli sty_base.fli
+label %Drive%texfli 2-5
+copy bj_base.fli %Drive% > nul
+copy sty_base.fli %Drive% > nul
+if %Disk%==all goto Disk3_11
+if %Disk%==allfli goto Disk3_11
+goto Next
+
+:Disk3_11
+echo:
+echo Insert emTeX 3.5 inch diskette 11 (3) and hit ENTER.
+pause > nul
+echo Copying: dj_base.fli fax_base.fli fx_base.fli
+label %Drive%texfli 3-5
+copy dj_base.fli %Drive% > nul
+copy fax_base.fli %Drive% > nul
+copy fx_base.fli %Drive% > nul
+if %Disk%==all goto Disk3_12
+if %Disk%==allfli goto Disk3_12
+goto Next
+
+:Disk3_12
+echo:
+echo Insert emTeX 3.5 inch diskette 12 (4) and hit ENTER.
+pause > nul
+echo Copying: ito_base.fli p6h_base.lfi p6l_base.fli
+label %Drive%texfli 4-5
+copy ito_base.fli %Drive% > nul
+copy p6h_base.fli %Drive% > nul
+copy p6l_base.fli %Drive% > nul
+if %Disk%==all goto Disk3_13
+if %Disk%==allfli goto Disk3_13
+goto Next
+
+:Disk3_13
+echo:
+echo Insert emTeX 3.5 inch diskette 13 (5) and hit ENTER.
+pause > nul
+echo Copying: lj_base.fli p6m_base.fli qj_base.fli
+label %Drive%texfli 5-5
+copy lj_base.fli %Drive% > nul
+copy p6m_base.fli %Drive% > nul
+copy qj_base.fli %Drive% > nul
+goto Next
+
+
+rem 5.25 inch diskettes, high density (1200 KByte):
+
+:Disk5_1
+echo:
+echo Insert emTeX 5.25 inch diskette 1 and hit ENTER.
+pause > nul
+echo Copying: readme.eng readme.ger readme.bet install.eng install.ger
+echo Copying: quick.eng quick.ger help.eng help.ger changes.eng changes.ger
+echo Copying: diskette.doc unz512.exe unz512x3.exe first.zip emxrsx.zip
+echo Copying: mfjob12c.zip
+label %Drive%emtex 1-10
+copy readme.eng %Drive% > nul
+copy readme.ger %Drive% > nul
+copy readme.bet %Drive% > nul
+copy install.eng %Drive% > nul
+copy install.ger %Drive% > nul
+copy quick.eng %Drive% > nul
+copy quick.ger %Drive% > nul
+copy help.eng %Drive% > nul
+copy help.ger %Drive% > nul
+copy changes.eng %Drive% > nul
+copy changes.ger %Drive% > nul
+copy diskette.doc %Drive% > nul
+copy unz512.exe %Drive% > nul
+copy unz512x3.exe %Drive% > nul
+copy first.zip %Drive% > nul
+copy emxrsx.zip %Drive% > nul
+copy mfjob12c.zip %Drive% > nul
+if %Disk%==all goto Disk5_2
+if %Disk%==alltex goto Disk5_2
+goto Next
+
+:Disk5_2
+echo:
+echo Insert emTeX 5.25 inch diskette 2 and hit ENTER.
+pause > nul
+echo Copying: dvid16f1.zip pictex.zip
+label %Drive%emtex 2-10
+copy dvid16f1.zip %Drive% > nul
+copy pictex.zip %Drive% > nul
+if %Disk%==all goto Disk5_3
+if %Disk%==alltex goto Disk5_3
+goto Next
+
+:Disk5_3
+echo:
+echo Insert emTeX 5.25 inch diskette 3 and hit ENTER.
+pause > nul
+echo Copying: dvid16f2.zip german.zip l2kurz.zip dvisp10b.zip srctcad.zip
+label %Drive%emtex 3-10
+copy dvid16f2.zip %Drive% > nul
+copy german.zip %Drive% > nul
+copy l2kurz.zip %Drive% > nul
+copy dvisp10b.zip %Drive% > nul
+copy srctcad.zip %Drive% > nul
+if %Disk%==all goto Disk5_4
+if %Disk%==alltex goto Disk5_4
+goto Next
+
+:Disk5_4
+echo:
+echo Insert emTeX 5.25 inch diskette 4 and hit ENTER.
+pause > nul
+echo Copying: tex4b.zip srcmkidx.zip
+label %Drive%emtex 4-10
+copy tex4b.zip %Drive% > nul
+copy srcmkidx.zip %Drive% > nul
+if %Disk%==all goto Disk5_5
+if %Disk%==alltex goto Disk5_5
+goto Next
+
+:Disk5_5
+echo:
+echo Insert emTeX 5.25 inch diskette 5 and hit ENTER.
+pause > nul
+echo Copying: mf4b.zip lkurz.zip web.zip
+label %Drive%emtex 5-10
+copy mf4b.zip %Drive% > nul
+copy lkurz.zip %Drive% > nul
+copy web.zip %Drive% > nul
+if %Disk%==all goto Disk5_6
+if %Disk%==alltex goto Disk5_6
+goto Next
+
+:Disk5_6
+echo:
+echo Insert emTeX 5.25 inch diskette 6 and hit ENTER.
+pause > nul
+echo Copying: l2input.zip fontcm.zip fontltx.zip
+label %Drive%emtex 6-10
+copy l2input.zip %Drive% > nul
+copy fontcm.zip %Drive% > nul
+copy fontltx.zip %Drive% > nul
+if %Disk%==all goto Disk5_7
+if %Disk%==alltex goto Disk5_7
+goto Next
+
+:Disk5_7
+echo:
+echo Insert emTeX 5.25 inch diskette 7 and hit ENTER.
+pause > nul
+echo Copying: texcad.zip makeindx.zip bibtex4b.zip l2tools.zip latex209.zip
+label %Drive%emtex 7-10
+copy texcad.zip %Drive% > nul
+copy makeindx.zip %Drive% > nul
+copy bibtex4b.zip %Drive% > nul
+copy l2tools.zip %Drive% > nul
+copy latex209.zip %Drive% > nul
+if %Disk%==all goto Disk5_8
+if %Disk%==alltex goto Disk5_8
+goto Next
+
+:Disk5_8
+echo:
+echo Insert emTeX 5.25 inch diskette 8 and hit ENTER.
+pause > nul
+echo Copying: l2base.zip texware.zip
+label %Drive%emtex 8-10
+copy l2base.zip %Drive% > nul
+copy texware.zip %Drive% > nul
+if %Disk%==all goto Disk5_9
+if %Disk%==alltex goto Disk5_9
+goto Next
+
+
+:Disk5_9
+echo:
+echo Insert emTeX 5.25 inch diskette 9 and hit ENTER.
+pause > nul
+echo Copying: fontdc.zip pkedit.zip fontemsy.zip
+label %Drive%emtex 9-10
+copy fontdc.zip %Drive% > nul
+copy pkedit.zip %Drive% > nul
+copy fontemsy.zip %Drive% > nul
+if %Disk%==all goto Disk5_10
+if %Disk%==alltex goto Disk5_10
+goto Next
+
+
+:Disk5_10
+echo:
+echo Insert emTeX 5.25 inch diskette 10 and hit ENTER.
+pause > nul
+echo Copying: fontams.zip mfware.zip
+label %Drive%emtex 10-10
+copy fontams.zip %Drive% > nul
+copy mfware.zip %Drive% > nul
+if %Disk%==all goto Disk5_11
+goto Next
+
+
+rem 5.25 inch diskettes, high density (1200 KByte) library files:
+
+:Disk5_11
+echo:
+echo Insert emTeX 5.25 inch diskette 11 (1) and hit ENTER.
+pause > nul
+echo Copying: ljh_base.fli as ljh_base.zip
+label %Drive%texfli 1-6
+pkzip -ex ljh_base ljh_base.fli > nul
+copy ljh_base.zip %Drive% > nul
+del ljh_base.zip > nul
+if %Disk%==all goto Disk5_12
+if %Disk%==allfli goto Disk5_12
+goto Next
+
+:Disk5_12
+echo:
+echo Insert emTeX 5.25 inch diskette 12 (2) and hit ENTER.
+pause > nul
+echo Copying: bj_base.fli fx_base.fli
+label %Drive%texfli 2-6
+copy bj_base.fli %Drive% > nul
+copy fx_base.fli %Drive% > nul
+if %Disk%==all goto Disk5_13
+if %Disk%==allfli goto Disk5_13
+goto Next
+
+:Disk5_13
+echo:
+echo Insert emTeX 5.25 inch diskette 13 (3) and hit ENTER.
+pause > nul
+echo Copying: p6m_base.fli sty_base.fli
+label %Drive%texfli 3-6
+copy p6m_base.fli %Drive% > nul
+copy sty_base.fli %Drive% > nul
+if %Disk%==all goto Disk5_14
+if %Disk%==allfli goto Disk5_14
+goto Next
+
+:Disk5_14
+echo:
+echo Insert emTeX 5.25 inch diskette 14 (4) and hit ENTER.
+pause > nul
+echo Copying: ito_base.fli sp6_base.fli
+label %Drive%texfli 4-6
+copy ito_base.fli %Drive% > nul
+copy p6h_base.fli %Drive% > nul
+if %Disk%==all goto Disk5_15
+if %Disk%==allfli goto Disk5_15
+goto Next
+
+:Disk5_15
+echo:
+echo Insert emTeX 5.25 inch diskette 15 (5) and hit ENTER.
+pause > nul
+echo Copying: dj_base.fli lj_base.fli
+label %Drive%texfli 5-6
+copy dj_base.fli %Drive% > nul
+copy lj_base.fli %Drive% > nul
+if %Disk%==all goto Disk5_16
+if %Disk%==allfli goto Disk5_16
+goto Next
+
+:Disk5_16
+echo:
+echo Insert emTeX 5.25 inch diskette 16 (6) and hit ENTER.
+pause > nul
+echo Copying: fax_base.fli p6l_base.fli qj_base.fli
+label %Drive%texfli 6-6
+copy fax_base.fli %Drive% > nul
+copy p6l_base.fli %Drive% > nul
+copy qj_base.fli %Drive% > nul
+goto Next
+
+
+:Usage
+echo:
+echo DISKETTE: copy files from emTeX distribution to diskette.
+echo:
+echo Usage: DISKETTE [Drive:] [Size] [all alltex allfli 1 2 .. 16]
+echo in which
+echo [Drive:] is a: or b: (default a:)
+echo [Size] is 35 or 525 (default 3.5 inch diskettes)
+echo [all] all diskettes including fli files
+echo [alltex] the whole emtex distribution (all tex-diskettes)
+echo [allfli] all fontlib files (no default)
+echo [1 2 ... 16] is all or one or more diskette numbers (no default)
+echo:
+echo Required: maximum 8 (3.5 inch) or 10 (5.25 inch) formatted diskettes for emTeX
+echo maximum 5 (3.5 inch) or 6 (5.25 inch) formatted diskettes for *.fli
+goto End
+
+:Error
+echo:
+echo DISKETTE: unrecognized input (%1), I quit.
+goto End
+
+:Error2
+echo:
+echo DISKETTE: invalid 3.5 inch diskette number (%1), I quit.
+goto End
+
+:Done
+echo:
+echo DISKETTE: All work done.
+
+:End
+set Drive=
+set Size=
+set Disk=
+rem _TheEnd_
diff --git a/systems/msdos/emtex-contrib/cyrtug/README b/systems/msdos/emtex-contrib/cyrtug/README
new file mode 100644
index 0000000000..30bab3f240
--- /dev/null
+++ b/systems/msdos/emtex-contrib/cyrtug/README
@@ -0,0 +1,9 @@
+These files, which were submitted to CTAN by Michel Goossens of CERN,
+constitute the CyrTUG distribution for emTeX.
+
+Fonts for use with this distribution may be found at
+ fonts/cyrillic/lh
+
+Robin Fairbairns
+
+For the CTAN team
diff --git a/systems/msdos/emtex-contrib/dpinnn/README b/systems/msdos/emtex-contrib/dpinnn/README
new file mode 100644
index 0000000000..266a51ff1b
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dpinnn/README
@@ -0,0 +1,96 @@
+ README
+ ======
+
+
+This is just a set of configuration files to make emTeX look for PK fonts
+in DPInnn directories instead of the traditional nnnDPI.
+You might have several reasons to want this behaviour:
+
+* It is what the TDS standard propose.
+* First character of a directory name in a CD-ROM must be a letter.
+* It will be easier to share your PK fonts with other TeX installations
+(for example, teTeX).
+
+Installation:
+
+1) Uncompress DPINNN.ZIP in the directory where you installed emTeX,
+(by default, your root directory), i.e:
+
+CD \
+UNZIP A:DPINNN (or whatever)
+
+This overwrites many .cnf files in directory emtex\data, the files
+emtex\bin\fli_base.{bat,cmd} and the file emtex\mfjob\modes.mfj.
+Warning!: If you modified any of these files, make a backup copy
+first and change the newer files accordingly.
+
+DPINNN.ZIP also contains the following files:
+
+emtex\doc\english\patches
+emtex\doc\german\patches
+emtex\data\dvips\patches
+texfonts\dpinnn.bas
+
+
+2) You must go now to \texfonts\pixel.xxx (whatever you use) and rename every
+directory from nnnDPI to DPInnn. You can do it by several methods:
+
+a) (Recommended) If you have MS-DOG 6.x (and therefore MOVE command and
+QBASIC) do the following:
+
+CD \TEXFONTS\PIXEL.LJ (or whatever)
+QBASIC /run ..\dpinnn
+
+This will automatically rename all your directories in PIXEL.LJ (or whatever).
+
+b) If you have QBASIC, but not MOVE command, go to your nearest SimTel
+mirror and download GNU file utilities (see GNUish directory).
+'mv' command may be used instead of 'MOVE', you only have to change
+dpinnn.bas before running it (change MOVE by MV)
+
+c) None of the above: Do it by hand, get at least mv utility.
+
+
+Don't forget to repeat point 2) for every family of fonts you use
+(for example, LJH...).
+
+
+3) To be consistent, you may want to change the docs accordingly.
+Get the 'patch' program (for example, from GNUISH of SimTel)
+go to emtex\doc\english (or german) and type
+
+patch < patches
+
+This will change fontlib.doc, dvidrv.doc, mfjob.doc and help.{eng,ger}
+
+Note: I suppose the following files should also be updated:
+
+emtex\book\english\dvidrv.inf
+emtex\book\english\mfjob.inf
+emtex\book\german\dvidrv.inf
+emtex\book\german\mfjob.inf
+
+
+4) If you use Guido Sawade's DVIPS, you should also patch the
+configuration files. The following should work with the latest version (2.5)
+and maybe with older ones. Go to emtex\data\dvips and write:
+
+patch < patches
+
+This will patch config.ps, ljh.cfg and dj.cfg
+
+
+Final note:
+==========
+
+Consider this as free software (no warranty, use at your own risk, etc).
+I decided to include here complete configuration files because patches were
+as long as the original files in most cases.
+
+If you find something is wrong or is missing, please tell me, my email
+address is at the end. After a reasonably period of testing (several weeks,
+or several months) without complains or bug reports, I will suggest Eberhard
+Mattes to incorporate this changes to emTeX.
+
+
+Santiago Vila <sanvila@unex.es>
diff --git a/systems/msdos/emtex-contrib/dvimfj/doc/dvimfj.doc b/systems/msdos/emtex-contrib/dvimfj/doc/dvimfj.doc
new file mode 100644
index 0000000000..46c8a3e8e1
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dvimfj/doc/dvimfj.doc
@@ -0,0 +1,24 @@
+DVIMFJ by Bill Moore (public domain)
+
+ Dvimfj is a program to generate fonts using a .dvi file
+as input. This should greatly simplify the task of generating
+only the fonts needed.
+
+Usage: dvimfj dvifile [magstep] [nomfj]
+
+ If the magstep is greater than 30, the scale will be
+magstep/1000. Otherwise the scale will be 1.2^magstep.
+If "nomfj" is specified, MFjob will not be invoked.
+
+This program is derived from DISDVI in Marcel Mol's DVI2TTY
+package. Thank you, Marcel.
+
+Marcel J.E. Mol
+Delft University of Technology
+The Netherlands
+UUCP: marcel@duteca.UUCP
+
+Bill Moore
+Louisiana Tech University
+Ruston, LA, USA
+bmoore@engr.latech.edu
diff --git a/systems/msdos/emtex-contrib/dvimfj/dvimfj.cfg b/systems/msdos/emtex-contrib/dvimfj/dvimfj.cfg
new file mode 100644
index 0000000000..4cd87ba002
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dvimfj/dvimfj.cfg
@@ -0,0 +1,36 @@
+\emtex\mfjob.exe
+input[\emtex\mfjob\modes];
+
+*mode m
+
+*base cm
+
+ manfnt
+ lasy*
+ cm*
+ lcm*
+ msam*
+ msbm*
+ wncy*
+
+*base plain
+
+ emsy*
+ line*
+ lcir*
+ logo*
+ eu*
+
+*mode fx
+
+ blackfx
+ slantfx
+ grayfx
+
+*mode lj
+
+ blacklj
+ slantlj
+ graylj
+
+*end
diff --git a/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/c.bat b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/c.bat
new file mode 100644
index 0000000000..5412f75d73
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/c.bat
@@ -0,0 +1,13 @@
+del c.err
+pc /s/ms/w/dMSDOS dvimfj
+if errorlevel 1 goto end
+pcl /p- /i [4K,20K,0] dvimfj
+if errorlevel 1 goto end
+if exist c.err goto end
+lzexe dvimfj
+del dvimfj.mix
+del dvimfj.old
+fit /m
+ccopy dvimfj.exe .. /d
+cd ..
+:end \ No newline at end of file
diff --git a/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/commands.h b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/commands.h
new file mode 100644
index 0000000000..8b3d598183
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/commands.h
@@ -0,0 +1,67 @@
+/* DVI COMMANDS */
+#define SETC_000 0 /* typeset character 0 and move right */
+#define SETC_127 127 /* typeset character 127 and move right */
+#define SET1 128 /* typeset a character and move right */
+#define SET2 129 /* ??? */
+#define SET3 130 /* ??? */
+#define SET4 131 /* ??? */
+#define SET_RULE 132 /* typeset a rule and move right */
+#define PUT1 133 /* typeset a character */
+#define PUT2 134 /* ??? */
+#define PUT3 135 /* ??? */
+#define PUT4 136 /* ??? */
+#define PUT_RULE 137 /* typeset a rule */
+#define NOP 138 /* no operation */
+#define BOP 139 /* beginning of page */
+#define EOP 140 /* ending of page */
+#define PUSH 141 /* save the current positions */
+#define POP 142 /* restore previous positions */
+#define RIGHT1 143 /* move right */
+#define RIGHT2 144 /* ??? */
+#define RIGHT3 145 /* ??? */
+#define RIGHT4 146 /* ??? */
+#define W0 147 /* move right by |w| */
+#define W1 148 /* move right and set |w| */
+#define W2 149 /* ??? */
+#define W3 150 /* ??? */
+#define W4 151 /* ??? */
+#define X0 152 /* move right by |x| */
+#define X1 153 /* move right and set |x| */
+#define X2 154 /* ??? */
+#define X3 155 /* ??? */
+#define X4 156 /* ??? */
+#define DOWN1 157 /* move down */
+#define DOWN2 158 /* ??? */
+#define DOWN3 159 /* ??? */
+#define DOWN4 160 /* ??? */
+#define Y0 161 /* move down by |y| */
+#define Y1 162 /* move down and set |y| */
+#define Y2 163 /* ??? */
+#define Y3 164 /* ??? */
+#define Y4 165 /* ??? */
+#define Z0 166 /* move down by |z| */
+#define Z1 167 /* move down and set |z| */
+#define Z2 168 /* ??? */
+#define Z3 169 /* ??? */
+#define Z4 170 /* ??? */
+#define FONT_00 171 /* set current font to 0 */
+#define FONT_63 234 /* set current font to 0 */
+#define FNT1 235 /* set current font */
+#define FNT2 236 /* Same as FNT1, except that arg is 2 bytes */
+#define FNT3 237 /* Same as FNT1, except that arg is 3 bytes */
+#define FNT4 238 /* Same as FNT1, except that arg is 4 bytes */
+#define XXX1 239 /* extension to \.DVI primitives */
+#define XXX2 240 /* Like XXX1, but 0<=k<65536 */
+#define XXX3 241 /* Like XXX1, but 0<=k<@t$2^{24}$@> */
+#define XXX4 242 /* potentially long extension to \.DVI
+ primitives */
+#define FNT_DEF1 243 /* define the meaning of a font number */
+#define FNT_DEF2 244 /* ??? */
+#define FNT_DEF3 245 /* ??? */
+#define FNT_DEF4 246 /* ??? */
+#define PRE 247 /* preamble */
+#define POST 248 /* postamble beginning */
+#define POST_POST 249 /* postamble ending */
+#define TRAILER 223 /* trailer bytes in dvi file */
+
+ /* undefined_commands 250,251,252,253,254,255 */
diff --git a/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/disdvi.c b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/disdvi.c
new file mode 100644
index 0000000000..358aa862d4
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/disdvi.c
@@ -0,0 +1,454 @@
+/*****************************************************************************/
+/* */
+/* disdvi --- disassembles TeX dvi files. */
+/* */
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <ctype.h>
+#include "commands.h"
+#if defined(MSDOS)
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#endif
+
+#define LASTCHAR 127 /* max dvi character, above are commands */
+
+#define get1() num(1)
+#define get2() num(2)
+#define get3() num(3)
+#define get4() num(4)
+#define sget1() snum(1)
+#define sget2() snum(2)
+#define sget3() snum(3)
+#define sget4() snum(4)
+
+
+FILE * dvifp;
+char * dvi_name;
+long pc = 0;
+
+char * malloc ();
+
+void main ();
+void bop ();
+void preamble ();
+void postamble ();
+void postpostamble ();
+void fontdef ();
+void special ();
+void printnonprint ();
+unsigned long num ();
+long snum ();
+
+
+
+
+/*---------------------------------------------------------------------------*/
+
+void main(argc, argv)
+int argc;
+char **argv;
+{
+ register int opcode; /* dvi opcode */
+ register int i;
+
+ if (argc > 2) {
+ fprintf(stderr, "To many arguments\n");
+ fprintf(stderr, "Usage: %s [dvi-file]\n", *argv);
+ exit(1);
+ }
+
+ if (argc == 2) {
+ if ((i = strlen(argv[1])) == 0) {
+ fprintf(stderr, "Illegal empty filename\n");
+ fprintf(stderr, "Usage: %s [dvi-file]\n", *argv);
+ exit(2);
+ }
+ if ((i >= 5) && (argv[1][i-4] == '.') && (argv[1][i-3] == 'd') &&
+ (argv[1][i-2] == 'v') && (argv[1][i-1] == 'i'))
+ dvi_name = argv[1];
+ else {
+ dvi_name = malloc((i+5) * sizeof(char));
+ strcpy(dvi_name, argv[1]);
+ strcat(dvi_name, ".dvi");
+ }
+ if ((dvifp = fopen(dvi_name, "r")) == NULL) {
+ perror(dvi_name);
+ exit(3);
+ }
+ }
+ else
+ dvifp = stdin;
+
+#if defined(MSDOS)
+ setmode(fileno(dvifp), O_BINARY);
+#endif
+
+ while ((opcode = (int) get1()) != EOF) { /* process until end of file */
+ printf("%06ld: ", pc - 1);
+ if ((opcode <= LASTCHAR) && isprint(opcode)) {
+ printf("Char: ");
+ while ((opcode <= LASTCHAR) && isprint(opcode)) {
+ putchar(opcode);
+ opcode = (int) get1();
+ }
+ putchar('\n');
+ printf("%06ld: ", pc - 1);
+ }
+
+ if (opcode <= LASTCHAR)
+ printnonprint(opcode); /* it must be a non-printable */
+ else if ((opcode >= FONT_00) && (opcode <= FONT_63))
+ printf("FONT_%d\n", opcode - FONT_00);
+ else
+ switch (opcode) {
+ case SET1 :
+ case SET2 :
+ case SET3 :
+ case SET4 : printf("SET%d: %ld\n", opcode - SET1 + 1,
+ num(opcode - SET1 + 1));
+ break;
+ case SET_RULE : printf("SET_RULE: height: %ld\n", sget4());
+ printf("%06ld: ", pc);
+ printf(" length: %ld\n", sget4());
+ break;
+ case PUT1 :
+ case PUT2 :
+ case PUT3 :
+ case PUT4 : printf("PUT%d: %ld\n", opcode - PUT1 + 1,
+ num(opcode - PUT1 + 1));
+ break;
+ case PUT_RULE : printf("PUT_RULE: height: %ld\n", sget4());
+ printf("%06ld: ", pc);
+ printf(" length: %ld\n", sget4());
+ break;
+ case NOP : printf("NOP\n"); break;
+ case BOP : bop(); break;
+ case EOP : printf("EOP\n"); break;
+ case PUSH : printf("PUSH\n"); break;
+ case POP : printf("POP\n"); break;
+ case RIGHT1 :
+ case RIGHT2 :
+ case RIGHT3 :
+ case RIGHT4 : printf("RIGHT%d: %ld\n", opcode - RIGHT1 + 1,
+ snum(opcode - RIGHT1 + 1));
+ break;
+ case W0 : printf("W0\n"); break;
+ case W1 :
+ case W2 :
+ case W3 :
+ case W4 : printf("W%d: %ld\n", opcode - W0,
+ snum(opcode - W0));
+ break;
+ case X0 : printf("X0\n"); break;
+ case X1 :
+ case X2 :
+ case X3 :
+ case X4 : printf("X%d: %ld\n", opcode - X0,
+ snum(opcode - X0));
+ break;
+ case DOWN1 :
+ case DOWN2 :
+ case DOWN3 :
+ case DOWN4 : printf("DOWN%d: %ld\n", opcode - DOWN1 + 1,
+ snum(opcode - DOWN1 + 1));
+ break;
+ case Y0 : printf("Y0\n"); break;
+ case Y1 :
+ case Y2 :
+ case Y3 :
+ case Y4 : printf("Y%d: %ld\n", opcode - Y0,
+ snum(opcode - Y0));
+ break;
+ case Z0 : printf("Z0\n"); break;
+ case Z1 :
+ case Z2 :
+ case Z3 :
+ case Z4 : printf("Z%d: %ld\n", opcode - Z0,
+ snum(opcode - Z0));
+ break;
+ case FNT1 :
+ case FNT2 :
+ case FNT3 :
+ case FNT4 : printf("FNT%d: %ld\n", opcode - FNT1 + 1,
+ num(opcode - FNT1 + 1));
+ break;
+ case XXX1 :
+ case XXX2 :
+ case XXX3 :
+ case XXX4 : special(opcode - XXX1 + 1); break;
+ case FNT_DEF1 :
+ case FNT_DEF2 :
+ case FNT_DEF3 :
+ case FNT_DEF4 : fontdef(opcode - FNT_DEF1 + 1); break;
+ case PRE : preamble(); break;
+ case POST : postamble(); break;
+ case POST_POST: postpostamble(); break;
+ }
+ }
+
+} /* main */
+
+
+/*----------------------------------------------------------------------------*/
+
+
+void bop()
+{
+ int i;
+
+ printf("BOP page number : %ld", sget4());
+ for (i=0; i < 9; i++) {
+ if (i % 3 == 0)
+ printf("\n%06ld: ", pc);
+ printf(" %6ld", sget4());
+ }
+ printf("\n%06ld: ", pc);
+ printf(" prev page offset : %06ld\n", sget4());
+
+} /* bop */
+
+
+/*---------------------------------------------------------------------------*/
+
+void postamble()
+{
+
+ printf("POST last page offset : %06ld\n", sget4());
+ printf("%06ld: ", pc);
+ printf(" numerator : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" denominator : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" magnification : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" max page height : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" max page width : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" stack size needed: %d\n", (int) get2());
+ printf("%06ld: ", pc);
+ printf(" number of pages : %d\n", (int) get2());
+
+} /* postamble */
+
+void preamble()
+{
+ register int i;
+
+ printf("PRE version : %d\n", (int) get1());
+ printf("%06ld: ", pc);
+ printf(" numerator : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" denominator : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" magnification : %ld\n", get4());
+ printf("%06ld: ", pc);
+ i = (int) get1();
+ printf(" job name (%3d) :", i);
+ while (i-- > 0)
+ putchar((int) get1());
+ putchar('\n');
+
+} /* preamble */
+
+
+void postpostamble()
+{
+ register int i;
+
+ printf("POSTPOST postamble offset : %06ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" version : %d\n", (int) get1());
+ while ((i = (int) get1()) == TRAILER) {
+ printf("%06d: ", pc - 1);
+ printf("TRAILER\n");
+ }
+ while (i != EOF) {
+ printf("%06ld: ", pc - 1);
+ printf("BAD DVI FILE END: 0x%02X\n", i);
+ i = (int) get1();
+ }
+
+} /* postpostamble */
+
+
+
+void special(x)
+register int x;
+{
+ register long len;
+ register long i;
+
+ len = num(x);
+ printf("XXX%d: %ld bytes\n", x, len);
+ printf("%06ld: ", pc);
+ for (i = 0; i < len; i++)
+ putchar((int) get1());
+ putchar('\n');
+
+} /* special */
+
+
+
+void fontdef(x)
+register int x;
+{
+ register int i;
+
+ printf("FNT_DEF%d: %ld\n", x, num(x));
+ printf("%06ld: ", pc);
+ printf(" checksum : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" scale : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" design : %ld\n", get4());
+ printf("%06ld: ", pc);
+ printf(" name : ");
+ for (i = (int) get1() + (int) get1(); i > 0; i--)
+ putchar((int) get1());
+ putchar('\n');
+
+} /* fontdef */
+
+
+
+void printnonprint(ch)
+register int ch;
+{
+
+ printf("Char: ");
+ switch (ch) {
+ case 11 : printf("ff /* ligature (non-printing) */"); break;
+ case 12 : printf("fi /* ligature (non-printing) */"); break;
+ case 13 : printf("fl /* ligature (non-printing) */"); break;
+ case 14 : printf("ffi /* ligature (non-printing) */"); break;
+ case 15 : printf("ffl /* ligature (non-printing) */"); break;
+ case 16 : printf("i /* (non-printing) */"); break;
+ case 17 : printf("j /* (non-printing) */"); break;
+ case 25 : printf("ss /* german (non-printing) */"); break;
+ case 26 : printf("ae /* scadinavian (non-printing) */");
+ break;
+ case 27 : printf("oe /* scadinavian (non-printing) */");
+ break;
+ case 28 : printf("o /* scadinavian (non-printing) */");
+ break;
+ case 29 : printf("AE /* scadinavian (non-printing) */");
+ break;
+ case 30 : printf("OE /* scadinavian (non-printing) */");
+ break;
+ case 31 : printf("O /* scadinavian (non-printing) */");
+ break;
+ default : printf("0x%2X", ch); break;
+ }
+ putchar('\n');
+
+}
+
+
+
+unsigned long num(size)
+register int size;
+{
+ register int i;
+ register long x = 0;
+
+ pc += size;
+ for (i = 0; i < size; i++)
+ x = (x << 8) + (unsigned) getc(dvifp);
+ return x;
+
+} /* num */
+
+
+
+long snum(size)
+register int size;
+{
+ register int i;
+ register long x = 0;
+
+ pc += size;
+ x = getc(dvifp);
+ if (x & 0x80)
+ x -= 0x100;
+ for (i = 1; i < size; i++)
+ x = (x << 8) + (unsigned) getc(dvifp);
+ return x;
+
+} /* snum */
+
+
+
+/*
+
+
+================================================================================
+== DVI file format ==
+================================================================================
+no_ops >= 0 bytes (NOP, nops before the preamble)
+preamble_marker 1 ubyte (PRE)
+version_id 1 ubyte (should be version 2)
+numerator 4 ubytes (numerater must equal the one in postamble)
+denominator 4 ubytes (denominator must equal the one in postamble)
+magnification 4 ubytes (magnification must equal the one in postamble)
+id_len 1 ubyte (lenght of identification string)
+id_string id_len ubytes (identification string)
+
+no_ops >= 0 bytes (NOP, nops before a page)
+begin_of_page 1 ubyte (BOP)
+page_nr 4 sbytes (page number)
+do_be_do 36 bytes (filler ????)
+prev_page_offset 4 sbytes (offset in file where previous page starts, -1 for none)
+... PAGE DATA ...
+end_of_page 1 ubyte (EOP)
+
+no_ops ??? >= 0 bytes (NOPS, I think they are allowed here...)
+postamble_marker 1 ubyte (POST)
+last_page_offset 4 sbytes (offset in file where last page starts)
+numerator 4 ubytes (numerater must equal the one in preamble)
+denominator 4 ubytes (denominator must equal the one in preamble)
+magnification 4 ubytes (magnification must equal the one in preamble)
+max_page_height 4 ubytes (maximum page height)
+max_page_width 4 ubytes (maximum page width)
+max_stack 2 ubytes (maximum stack depth needed)
+total_pages 2 ubytes (number of pages in file)
+... FONT DEFINITIONS ...
+
+postamble_offset 4 sbytes (offset in file where postamble starts)
+version_id 1 ubyte (should be version 2)
+trailer >= 4 ubytes (TRAILER)
+<EOF>
+
+
+FONT DEFINITIONS:
+ do {
+ switch (c = getc(dvi_fp) {
+ case FNTDEF1 :
+ case FNTDEF2 :
+ case FNTDEF3 :
+ case FNTDEF4 : define_font(c);
+ case POSTPOST : break;
+ default : error;
+ }
+ } while (c != POSTPOST);
+
+===== A font def looks like:
+
+1,2,3 or 4 ubytes TeXfontnumber for FNTDEF1 .. FNTDEF4
+4 ubytes checksum
+4 ubytes scale
+4 ubytes design size
+1 byte deflen1
+1 byte deflen2
+deflen1 + deflen2 bytes fontname.
+
+===== A special looks like:
+
+1,2,3 or 4 ubytes telling length of special command for XXX1 .. XXX4
+all bytes in the special command are used as defined in the dvi driver.
+
+
+*/
diff --git a/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/dvimfj.c b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/dvimfj.c
new file mode 100644
index 0000000000..56bff96a58
--- /dev/null
+++ b/systems/msdos/emtex-contrib/dvimfj/dvimfj.src/dvimfj.c
@@ -0,0 +1,631 @@
+/*****************************************************************************/
+/* */
+/* dvimfj --- generates an MFJOB program from a .dvi file. */
+/* */
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <ctype.h>
+#include "commands.h"
+#if defined(MSDOS)
+ #include <stdlib.h>
+ #include <string.h>
+ #include <math.h>
+ #include <process.h>
+#endif
+
+#define LASTCHAR 127 /* max dvi character, above are commands */
+
+#define get1() num(1)
+#define get2() num(2)
+#define get3() num(3)
+#define get4() num(4)
+#define sget1() snum(1)
+#define sget2() snum(2)
+#define sget3() snum(3)
+#define sget4() snum(4)
+
+typedef struct{
+ char *name;
+ char *mag;
+ int base;
+ int mode;
+} FONTDEF;
+
+typedef struct{
+ char *pattern;
+ int base;
+ int mode;
+} FONTPAT;
+
+#define MaxBAidx 10 /* maximum number of bases (plain, cm, etc.) */
+#define MaxMOidx 10 /* maximum number of modes (lj, fx, etc.) */
+
+int FDsize, FDidx; FONTDEF **Fontdefs;
+int FPsize, FPidx; FONTPAT **FPatterns;
+int BAidx; char *BAses[MaxBAidx];
+int MOidx; char *MOdes[MaxMOidx];
+int Nomfj;
+
+char *Inputmodes, *MFjobcmd, *Outname="dvimfj.mfj";
+
+FILE * dvifp;
+char * dvi_name;
+long pc;
+
+long Numerator, Denominator, Magnification;
+double Scale = 1;
+
+char * realloc ();
+
+void main ();
+void read_dvi_file ();
+void bop ();
+void preamble ();
+void postamble ();
+void postpostamble ();
+void fontdef ();
+void special ();
+unsigned long num ();
+long snum ();
+void addfontdef ();
+void * Realloc ();
+char * Strdup ();
+void read_config_file ();
+void read_config_80 ();
+void addpatterndef ();
+void write_mfj ();
+void run_mfjob ();
+
+
+
+
+/*---------------------------------------------------------------------------*/
+
+void main(argc, argv)
+int argc;
+char **argv;
+{
+ register int i, jx;
+ long scale;
+
+ if (argc < 2) {
+ usage:
+ printf("\nUsage: %s dvifile [magstep] [no]\n", *argv);
+ printf("\tFonts scaled (1.2^magstep) or (magstep/1000).\n"
+ "\tNo MFjob spawn.\n");
+ exit(1);
+ }
+
+ else{
+ if ((i = strlen(argv[1])) == 0) {
+ printf("Illegal empty filename\n");
+ exit(2);
+ }
+ if ((i >= 5) && !strcmpi(argv[1]+i-4, ".dvi")) dvi_name = argv[1];
+ else {
+ dvi_name = Realloc(0, (i+5) * sizeof(char));
+ strcpy(dvi_name, argv[1]);
+ strcat(dvi_name, ".dvi");
+ }
+ if ((dvifp = fopen(dvi_name, "rb")) == NULL) {
+ printf("Cant open %s\n", dvi_name);
+ exit(3);
+ }
+ if (argc > 2){
+ for (jx = 2; jx < argc; jx++){
+ if ('N' == toupper(argv[jx][0])){
+ Nomfj = 1;
+ continue;
+ }
+ scale = 0;
+ if (1 > sscanf(argv[jx], " %ld", &scale)) goto usage;
+ if (scale > 30) Scale = scale/1000.f;
+ else Scale = pow((double)1.2, (double)scale);
+ }
+ }
+ }
+
+ read_config_file(argv[0]);
+ read_dvi_file();
+ write_mfj();
+ run_mfjob();
+ exit(0);
+
+} /* main */
+
+
+void read_dvi_file()
+{
+ int opcode;
+
+ while ((opcode = (int) get1()) != EOF) { /* process until end of file */
+ if ((opcode <= LASTCHAR) && isprint(opcode)) {
+ while ((opcode <= LASTCHAR) && isprint(opcode)) {
+ opcode = (int) get1();
+ }
+ }
+
+ if (opcode <= LASTCHAR) ;
+ else if ((opcode >= FONT_00) && (opcode <= FONT_63)) ;
+ else switch (opcode) {
+ case SET1 :
+ case SET2 :
+ case SET3 :
+ case SET4 : num(opcode - SET1 + 1); break;
+ case SET_RULE : sget4(); sget4(); break;
+ case PUT1 :
+ case PUT2 :
+ case PUT3 :
+ case PUT4 : num(opcode - PUT1 + 1); break;
+ case PUT_RULE : sget4(); sget4();
+ case NOP : break;
+ case BOP : bop(); break;
+ case EOP :
+ case PUSH :
+ case POP : break;
+ case RIGHT1 :
+ case RIGHT2 :
+ case RIGHT3 :
+ case RIGHT4 : snum(opcode - RIGHT1 + 1);
+ case W0 : break;
+ case W1 :
+ case W2 :
+ case W3 :
+ case W4 : snum(opcode - W0);
+ case X0 : break;
+ case X1 :
+ case X2 :
+ case X3 :
+ case X4 : snum(opcode - X0); break;
+ case DOWN1 :
+ case DOWN2 :
+ case DOWN3 :
+ case DOWN4 : snum(opcode - DOWN1 + 1);
+ case Y0 : break;
+ case Y1 :
+ case Y2 :
+ case Y3 :
+ case Y4 : snum(opcode - Y0);
+ case Z0 : break;
+ case Z1 :
+ case Z2 :
+ case Z3 :
+ case Z4 : snum(opcode - Z0); break;
+ case FNT1 :
+ case FNT2 :
+ case FNT3 :
+ case FNT4 : num(opcode - FNT1 + 1); break;
+ case XXX1 :
+ case XXX2 :
+ case XXX3 :
+ case XXX4 : special(opcode - XXX1 + 1); break;
+ case FNT_DEF1 :
+ case FNT_DEF2 :
+ case FNT_DEF3 :
+ case FNT_DEF4 : fontdef(opcode - FNT_DEF1 + 1); break;
+ case PRE : preamble(); break;
+ case POST : postamble(); break;
+ case POST_POST: postpostamble(); break;
+ }
+ }
+
+} /* read_dvi_file */
+
+
+/*----------------------------------------------------------------------------*/
+
+
+void bop()
+{
+ int i;
+
+ for (i=0; i < 11; i++) get4();
+
+} /* bop */
+
+
+/*---------------------------------------------------------------------------*/
+
+void postamble()
+{
+ sget4();
+ if (Numerator != get4() ||
+ Denominator != get4() ||
+ Magnification != get4()){
+
+ printf("Postamble does not match preamble\n");
+ exit(3);
+ }
+ get4();
+ get4();
+ get2();
+ get2();
+
+} /* postamble */
+
+void preamble()
+{
+ long ix;
+
+ get1();
+ Numerator = get4();
+ Denominator = get4();
+ Magnification = get4();
+ ix = (long)(Scale*1000); /* truncate at third decimal place */
+ Scale = ((double)ix)/1000;
+ printf("\nmagnification: %ld scale: %05.3f\n\n", Magnification, Scale);
+ get1();
+
+} /* preamble */
+
+
+void postpostamble()
+{
+ register int i;
+
+ get4();
+ get1();
+ while ((i = (int) get1()) == TRAILER) ;
+ while (i != EOF) {
+ printf("%06ld: ", pc - 1);
+ printf("BAD DVI FILE END: 0x%02X\n", i);
+ i = (int) get1();
+ }
+
+} /* postpostamble */
+
+
+
+void special(x)
+register int x;
+{
+ register long len;
+ register long i;
+
+ len = num(x);
+ for (i = 0; i < len; i++) get1();
+
+} /* special */
+
+
+
+void fontdef(x)
+register int x;
+{
+ register int ix, jx;
+ long scale, design;
+ double mag;
+ char fontname[10], fontmag[10];
+
+ num(x);
+ get4();
+ scale = get4();
+ design = get4();
+ if (0==design) mag = -1;
+ else{
+ mag = (double)scale/(double)design;
+ mag = Scale*Magnification*mag/1000;
+ }
+ sprintf(fontmag, "%07.3f", mag);
+ ix = (int) get1() + (int) get1();
+
+#if defined(MSDOS)
+ #define LIMIT8 && jx < 8
+#else
+ #define LIMIT8
+#endif
+
+ for (jx=0; jx < ix LIMIT8; jx++) fontname[jx] = (char) get1();
+ fontname[jx] = 0;
+ for (; jx < ix; jx++) get1();
+ addfontdef(fontname, fontmag);
+
+} /* fontdef */
+
+
+
+unsigned long num(size)
+register int size;
+{
+ register int i;
+ register long x = 0;
+
+ pc += size;
+ for (i = 0; i < size; i++)
+ x = (x << 8) + (unsigned) getc(dvifp);
+ return x;
+
+} /* num */
+
+
+
+long snum(size)
+register int size;
+{
+ register int i;
+ register long x = 0;
+
+ pc += size;
+ x = getc(dvifp);
+ if (x & 0x80)
+ x -= 0x100;
+ for (i = 1; i < size; i++)
+ x = (x << 8) + (unsigned) getc(dvifp);
+ return x;
+
+} /* snum */
+
+void addfontdef(name, mag)
+char *name, *mag;
+{
+ int ix, jx, found, base, mode;
+ char *pat;
+
+ if (FDsize < 2+FDidx){
+ FDsize = 30+FDidx;
+ Fontdefs = Realloc(Fontdefs, FDsize * sizeof Fontdefs[0]);
+ }
+ for (ix=0; ix < FDidx; ix++){
+ if (!strcmp(Fontdefs[ix]->name, name) &&
+ !strcmp(Fontdefs[ix]->mag, mag)){
+ return;
+ }
+ }
+ for (found=ix=0; ix < FPidx; ix++){
+ pat = FPatterns[ix]->pattern;
+ for (jx=0; pat[jx] && pat[jx]==name[jx]; jx++);
+ if (pat[jx]=='*' || !strcmp(pat, name)){
+ base = FPatterns[ix]->base;
+ mode = FPatterns[ix]->mode;
+ found = 1;
+ break;
+ }
+ }
+ if (!found){
+ printf("Font %s not found in .CFG file\n", name);
+ exit(3);
+ }
+ Fontdefs[FDidx] = Realloc(NULL, sizeof(FONTDEF));
+ Fontdefs[FDidx]->name = Strdup(name);
+ Fontdefs[FDidx]->mag = Strdup(mag);
+ Fontdefs[FDidx]->base = base;
+ Fontdefs[FDidx]->mode = mode;
+ FDidx++;
+ printf("font: %-8s mag: %s base: %-8s mode: %s\n",
+ name, mag, BAses[base], MOdes[mode]);
+
+} /* addfontdef */
+
+void *Realloc(ptr, size)
+void *ptr;
+int size;
+{
+ void *outpntr;
+
+ if (size < 0) exit(11);
+ outpntr = realloc(ptr, size);
+ if (0==outpntr){
+ printf("Memory error\n");
+ exit(4);
+ }
+ return outpntr;
+
+} /* Realloc */
+
+char *Strdup(str)
+char *str;
+{
+ char *newstr;
+
+ newstr = strdup(str);
+ if (0==newstr){
+ printf("Strdup error\n");
+ exit(4);
+ }
+ return newstr;
+
+} /* Strdup */
+
+
+char Buf80[81];
+FILE *Cfp;
+
+void read_config_file(name)
+char *name;
+{
+int ix, sl;
+
+ sl = strlen(name); if (sl >= (80-5)) exit(10); strcpy(Buf80, name);
+ for (ix = sl-1; ix > 0 && ix > sl-5; ix--){
+ if (Buf80[ix]=='.'){
+ strcpy(Buf80+ix+1, "CFG");
+ Cfp = fopen(Buf80, "r"); if (0==Cfp){
+ printf("Can't open %s\n", Buf80);
+ exit(3);
+ }
+ read_config_80(); MFjobcmd = Strdup(Buf80);
+ read_config_80(); Inputmodes = Strdup(Buf80);
+ for (;;){
+ read_config_80();
+
+ if (!strcmp(Buf80, "*end")){
+ fclose(Cfp);
+ return;
+ }
+ if (!strcmp(Buf80, "*base")){
+ read_config_80();
+ BAses[BAidx++] = Strdup(Buf80);
+ if (BAidx >= MaxBAidx){
+ printf("Too many bases\n");
+ exit(3);
+ }
+ continue;
+ }
+ if (!strcmp(Buf80, "*mode")){
+ read_config_80();
+ MOdes[MOidx++] = Strdup(Buf80);
+ if (MOidx >= MaxMOidx){
+ printf("Too many modes\n");
+ exit(3);
+ }
+ continue;
+ }
+ if (!BAidx){
+ printf("Missing *base command\n");
+ exit(3);
+ }
+ if (!MOidx){
+ printf("Missing *mode command\n");
+ exit(3);
+ }
+ addpatterndef(Buf80, BAidx-1, MOidx-1);
+ }
+ }
+ }
+ printf("Missing *end command\n");
+ exit(3);
+
+} /* read_config_file */
+
+void read_config_80()
+{
+ if (1==fscanf(Cfp, " %80s", Buf80)) return;
+ printf("Can't read config file\n");
+ exit(3);
+}
+
+void addpatterndef(pattern, base, mode)
+char *pattern;
+int base, mode;
+{
+ if (FPsize < 2+FPidx){
+ FPsize = 10+FPidx;
+ FPatterns = Realloc(FPatterns, FPsize * sizeof FPatterns[0]);
+ }
+ FPatterns[FPidx] = Realloc(NULL, sizeof(FONTDEF));
+ FPatterns[FPidx]->pattern = Strdup(pattern);
+ FPatterns[FPidx]->base = base;
+ FPatterns[FPidx]->mode = mode;
+ FPidx++;
+
+} /* addpatterndef */
+
+void write_mfj()
+{
+ int ix, jx, mx, nx, flag;
+ FILE *fp;
+
+ fp = fopen(Outname, "w");
+ if (0==fp){
+ printf("Can't create %s\n", Outname);
+ exit(3);
+ }
+ fprintf(fp, "%s\n", Inputmodes);
+ for (mx=0; mx < MOidx; mx++){
+ for (jx=0; jx < BAidx; jx++){
+ flag = 0;
+ for (ix=0; ix < FDidx; ix++){
+ if (mx != Fontdefs[ix]->mode) continue;
+ if (jx != Fontdefs[ix]->base) continue;
+ if (!flag){
+ fprintf(fp, "{\n base=%s;\n %s;\n",
+ BAses[jx], MOdes[mx]);
+ flag = 1;
+ }
+ nx = fprintf(fp, " { font=%s;", Fontdefs[ix]->name);
+ fprintf(fp, "%*smag=%s; }\n", 21-nx, " ", Fontdefs[ix]->mag);
+ }
+ if (flag) fprintf(fp, "}\n");
+ }
+ }
+ fclose(fp);
+
+} /* write_mfj */
+
+void run_mfjob()
+{
+ int retcode;
+
+ if (Nomfj) return;
+ printf("\nSpawning %s %s\n\n", MFjobcmd, Outname);
+ retcode = spawnl(P_WAIT, MFjobcmd, MFjobcmd, Outname, NULL);
+ if (0==retcode){
+ printf("\nDeleting %s\n", Outname);
+ unlink(Outname);
+ }
+
+} /* run_mfjob */
+
+
+
+/*
+
+
+================================================================================
+== DVI file format ==
+================================================================================
+no_ops >= 0 bytes (NOP, nops before the preamble)
+preamble_marker 1 ubyte (PRE)
+version_id 1 ubyte (should be version 2)
+numerator 4 ubytes (numerater must equal the one in postamble)
+denominator 4 ubytes (denominator must equal the one in postamble)
+magnification 4 ubytes (magnification must equal the one in postamble)
+id_len 1 ubyte (lenght of identification string)
+id_string id_len ubytes (identification string)
+
+no_ops >= 0 bytes (NOP, nops before a page)
+begin_of_page 1 ubyte (BOP)
+page_nr 4 sbytes (page number)
+do_be_do 36 bytes (filler ????)
+prev_page_offset 4 sbytes (offset in file where previous page starts, -1 for none)
+... PAGE DATA ...
+end_of_page 1 ubyte (EOP)
+
+no_ops ??? >= 0 bytes (NOPS, I think they are allowed here...)
+postamble_marker 1 ubyte (POST)
+last_page_offset 4 sbytes (offset in file where last page starts)
+numerator 4 ubytes (numerater must equal the one in preamble)
+denominator 4 ubytes (denominator must equal the one in preamble)
+magnification 4 ubytes (magnification must equal the one in preamble)
+max_page_height 4 ubytes (maximum page height)
+max_page_width 4 ubytes (maximum page width)
+max_stack 2 ubytes (maximum stack depth needed)
+total_pages 2 ubytes (number of pages in file)
+... FONT DEFINITIONS ...
+
+postamble_offset 4 sbytes (offset in file where postamble starts)
+version_id 1 ubyte (should be version 2)
+trailer >= 4 ubytes (TRAILER)
+<EOF>
+
+
+FONT DEFINITIONS:
+ do {
+ switch (c = getc(dvi_fp) {
+ case FNTDEF1 :
+ case FNTDEF2 :
+ case FNTDEF3 :
+ case FNTDEF4 : define_font(c);
+ case POSTPOST : break;
+ default : error;
+ }
+ } while (c != POSTPOST);
+
+===== A font def looks like:
+
+1,2,3 or 4 ubytes TeXfontnumber for FNTDEF1 .. FNTDEF4
+4 ubytes checksum
+4 ubytes scale
+4 ubytes design size
+1 byte deflen1
+1 byte deflen2
+deflen1 + deflen2 bytes fontname.
+
+===== A special looks like:
+
+1,2,3 or 4 ubytes telling length of special command for XXX1 .. XXX4
+all bytes in the special command are used as defined in the dvi driver.
+
+
+*/
diff --git a/systems/msdos/emtex-contrib/edit-4.33/README b/systems/msdos/emtex-contrib/edit-4.33/README
new file mode 100644
index 0000000000..8cdd4551ef
--- /dev/null
+++ b/systems/msdos/emtex-contrib/edit-4.33/README
@@ -0,0 +1,35 @@
+---------
+EDIT 4.33
+---------
+
+(c) 1984-95 Peter Gerwinski, Essen, Germany
+
+EDIT is a ShareWare program for the PC running MS-DOS or
+any compatible operating system. EDIT is an easy-to-use
+text processor written to act as a comfortable user
+interface for TeX, preferably emTeX. The current version
+(4.33) is only available in German; an English translation
+is provided but will take some time.
+
+EDIT consists of a text editor with integrated TeX (DVI-)
+previewer and printing utility. It has the special ability
+to display a text editor window and a TeX preview window
+simultaneously on the screen. The program is equipped with
+help screens (in German) about EDIT itself and about the
+most important LaTeX commands.
+
+The distribution consists of 3 floppy disks (3.5") to be
+labeled "EDIT", "PKfonts 1/2" and "PKfonts 2/2". (EDIT
+uses its own tree of TeX character sets.) For a complete
+installation (together with TeX) you also need the six
+emTeX distribution disks, refered as disk "emTeX 1/6"
+through "emTeX 6/6" during the EDIT installation.
+
+To install EDIT on a MS-DOS computer just insert the disk
+labeled "EDIT". Switch to that disk, start the program
+INSTALL.EXE and follow the instructions of that program.
+It will install the EDIT system and all necessary parts of
+the emTeX distribution.
+
+ 18. August 1995
+ Peter Gerwinski
diff --git a/systems/msdos/emtex-contrib/emt2tex/e2t_read.me b/systems/msdos/emtex-contrib/emt2tex/e2t_read.me
new file mode 100644
index 0000000000..bfe7df9409
--- /dev/null
+++ b/systems/msdos/emtex-contrib/emt2tex/e2t_read.me
@@ -0,0 +1,49 @@
+Thie is the documentation--file to the program emt2tex
+----------------------------------------------------------------------
+It is easy to compile German text--files,
+which contain all that signs as „,,”,á,Ž,™,š, with EMTeX
+at an PC, because this program understands these signs.
+As soon the text is supposed to be compiled on other computer--
+types (VAX's, UNIX--systems) one comes into trouble, because
+LaTeX/TeX will not be able to read that strange things, which have
+arrived at the other (non--PC)-System.
+
+This program exchanges the signs („”᎙š) against the correct
+TeX--sign ({\"a} {\"o} {\"u} {\ss} {\"A} {\"O} {\"U}).
+If after that there are lines, which are longer
+than 80 signs, they will be reduced, because some transfer programs
+cut long lines automatically.
+
+All you need is the program emt2tex.exe (or: compile it by yourself,
+it is all FORTRAN) and the file emt2tex.cfg (in the same directory
+on the PC from which you start the program), which, please, check,
+if the first line contains the 7 single signs, each followed by two blancs.
+If it is O.K., then you can run emt2tex. The program converts
+your file ....tex into the outputfile ....txc.
+After this transfer the stuff to the other computer and compile
+it without trouble.
+
+
+
+Have fun with this.
+If You have trouble, then contact me!
+
+
+ ^ ^
+ O O
+---OOO----(_)----OOO-----
+
+Sylvia Zinser
+-----------------------------------------------------------------------------
+private office
+-----------------------------------------------------------------------------
+ Inst. f. Molek. Biophysik
+Gonsenheimer Str. 56 J.-Welder-Weg 26
+55257 Budenheim 55099 Mainz
+-----------------------------------------------------------------------------
+ Germany
+-----------------------------------------------------------------------------
+Phone 0049+6139-5149 0049+6131-393568
+-----------------------------------------------------------------------------
+ email szinser@mzdmza.zdv.uni-mainz.de
+ szinser@vppmza.vk.medizin.uni-mainz.de
diff --git a/systems/msdos/emtex-contrib/emtexgi/readme.txt b/systems/msdos/emtex-contrib/emtexgi/readme.txt
new file mode 100644
index 0000000000..de6de08d93
--- /dev/null
+++ b/systems/msdos/emtex-contrib/emtexgi/readme.txt
@@ -0,0 +1,14 @@
+readme.txt
+
+Starting point for emtexgi documentation.
+Version 2.01 Beta of late 1996
+
+For the latest documentation, including guidance on installing
+emtexgi -- a Windows shell for emTeX -- please see the Web
+page
+
+http://www.wfu.edu/Academic-departments/Economics/ftp/emtexgi.html
+
+Allin Cottrell
+email: cottrell@wfu.edu
+
diff --git a/systems/msdos/emtex-contrib/hp2tex/what_it.is b/systems/msdos/emtex-contrib/hp2tex/what_it.is
new file mode 100644
index 0000000000..f448716d24
--- /dev/null
+++ b/systems/msdos/emtex-contrib/hp2tex/what_it.is
@@ -0,0 +1,111 @@
+CONTENTS:
+
+1. GENERAL
+2. VIRUS CHECK
+3. LICENCE
+4. DISCLAIMER
+
+
+
+1. GENERAL:
+
+ *** The current version of HP2TeX is 1.20a ****
+
+HP2TeX is a program, that converts a HPGL Plot file into a syntax, that
+it can be processed with emTeX. This makes the output of chart programs
+or CAD programs useable for emTeX.
+
+emTeX can draw lines of any gradient, so only TeX programs that share
+this capability will work with the output of HP2TeX.
+(This feature is known from CS-TeX for the ATARI.)
+
+HP2TeX's output file is compatible with TeXcad, a Cad program for emTeX.
+
+Additionally, a program called HPopt is added to the package.
+HPopt is a program to search double lines and to connect lines with the
+same gradient. This reduces the number of lines when processing with HP2TeX,
+and of course with emTeX.
+
+The complete package containes the following files:
+
+What_it.is This file
+hp2tex__.zip Archive containing:
+\emtex\bin\HP2TeX.EXE HP2TeX Executable
+\emtex\bin\HPopt.EXE HPopt Executable
+\emtex\doc\History.h2t History of HP2TeX and HPopt
+\emtex\doc\HP2TXPIC.DVI Example of HPGL-Plots in emTeX
+\emtex\doc\german\HP2TeXGE.DVI Documentation (German)
+\emtex\doc\english\HP2TeXEN.DVI Documentation (English)
+\emtex\texinput\emlines2.sty Makro
+
+The archive can be unpacked with
+pkunzip -d -o hp2tex__
+
+ ****** READ INSTRUCTIONS BEFORE USE !! *******
+
+2. VIRUS CHECK:
+
+The virus check with McAfee's Validate 0.4 should give the results:
+
+ File Name: hp2tex.exe
+ Size: 66,174
+ Date: 10-18-1995
+File Authentication:
+ Check Method 1 - C17D
+ Check Method 2 - 0038
+
+ File Name: hpopt.exe
+ Size: 67,348
+ Date: 7-15-1994
+File Authentication:
+ Check Method 1 - 253F
+ Check Method 2 - 05F7
+
+
+3. LICENSE:
+
+The HP2TeX software is copyright (c) 1992 -- 95 Axel Braun, all rights
+reserved, except emlines2.sty, written by Georg Horn / Eberhard Mattes.
+HP2TeX software may not be circulated in any incomplete or modified form,
+nor sold for profit, without written permission of the author.
+
+This software is free may be copied free. If you distribute this
+software to others, you are required to distribute the ENTIRE
+package consisting of the following files:
+
+What_it.is This file
+hp2tex__.zip Arcchive containing:
+\emtex\bin\HP2TeX.EXE HP2TeX Executable
+\emtex\bin\HPopt.EXE HPopt Executable
+\emtex\doc\History.h2t History of HP2TeX and HPopt
+\emtex\doc\HP2TXPIC.DVI Example of HPGL-Plots in emTeX
+\emtex\doc\german\HP2TeXGE.DVI Documentation (German)
+\emtex\doc\english\HP2TeXEN.DVI Documentation (English)
+\emtex\texinput\emlines2.sty Makro
+
+
+4. DISCLAIMER:
+
+This software (HP2TeX , HPopt) is provided on an "as is" basis without
+warranty of any kind, expressed or implied, including but not limited to
+the implied warranties of merchantability and fitness for a particular
+purpose. The person using the software bears all risk as to the quality
+and performance of the software. The author will not be liable for any
+special, incidental, consequential, indirect or similar damages due to
+loss of data or any other reason, even if the author or an agent of the
+author has been advised of the possibility of such damages. In no event
+shall the author's liability for any damages ever exceed the price paid
+for the license to use the software, regardless of the form of the
+claim.
+
+For problems or bugs please contact author:
+ADDRESS (in TeX-notification):
+
+ Axel Braun
+ L\"uneburger Weg 11c
+ D -- 40468 D\"usseldorf
+ EMail: brn@eue11.fb9eue.uni-duisburg.de (May change!)
+
+****************************** HAVE FUN *********************************
+
+.eof
diff --git a/systems/msdos/emtex-contrib/makeinst/readme.1st b/systems/msdos/emtex-contrib/makeinst/readme.1st
new file mode 100644
index 0000000000..a00b228a8b
--- /dev/null
+++ b/systems/msdos/emtex-contrib/makeinst/readme.1st
@@ -0,0 +1,7 @@
+This is MAKEINST, a program to create .BAT files to install emTeX.
+To use it, UNZIP MAKEINST.ZIP from C:\ and read README.TXT carefully.
+
+Enjoy!
+
+Santiago Vila
+sanvila@ba.unex.es
diff --git a/systems/msdos/emtex-contrib/zemtex/lj1990.cnf b/systems/msdos/emtex-contrib/zemtex/lj1990.cnf
new file mode 100644
index 0000000000..f0222eb267
--- /dev/null
+++ b/systems/msdos/emtex-contrib/zemtex/lj1990.cnf
@@ -0,0 +1,16 @@
+% Amended lj.cnf file for the 1990 version of emTeX
+%
+% lj.cnf (300x300 DPI using LJ fonts)
+/pd=%DVIDRVINPUT%
+%
+%the following is the original line
+%/pl=%DVIDRVFONTS%;lj_0;lj_h;lj_1;lj_2;lj_3;lj_4;lj_5a;lj_5b
+%
+%the following is the amended line
+/pl=%DVIDRVFONTS%;lj_0;lj_h;lj_1;lj_2;lj_3;lj_4;lj_5a;lj_5b;lj_amsz
+%
+/pf=%DVIDRVFONTS%\pixel.lj\$rdpi
+/pg=%DVIDRVGRAPH%
+/r=300
+/rf=300
+/fs=1
diff --git a/systems/msdos/emtex-contrib/zemtex/lj1992.cnf b/systems/msdos/emtex-contrib/zemtex/lj1992.cnf
new file mode 100644
index 0000000000..3d867f4d2f
--- /dev/null
+++ b/systems/msdos/emtex-contrib/zemtex/lj1992.cnf
@@ -0,0 +1,18 @@
+% Amended lj.cnf file for the 1992 version of emTeX
+%
+% lj.cnf (300x300 DPI using LJ fonts)
+/pd={,$DVIDRVINPUT:}@i
+%
+%the following is the original line
+%/pl=$DVIDRVFONTS:lj_{0,h,1,2,3,4,5a,5b,sli}
+%
+%the following is the amended line
+/pl=$DVIDRVFONTS:lj_{0,h,1,2,3,4,5a,5b,sli,amsz}
+%
+/pf=$DVIDRVFONTS:pixel.lj\@Rrdpi\@f{.pk,.pxl}
+/pg={,$DVIDRVGRAPH:}{@Rrdpi\,}@PBf{@Ef,.msp,.pcx,.bmp}
+/r=300
+/rf=300
+/fs=1
+/fm=hplaser
+/fd=2
diff --git a/systems/msdos/emtex-contrib/zemtex/lj_amsz.fli b/systems/msdos/emtex-contrib/zemtex/lj_amsz.fli
new file mode 100644
index 0000000000..3a9541d8be
--- /dev/null
+++ b/systems/msdos/emtex-contrib/zemtex/lj_amsz.fli
Binary files differ
diff --git a/systems/msdos/emtex-contrib/zemtex/oz.tex b/systems/msdos/emtex-contrib/zemtex/oz.tex
new file mode 100644
index 0000000000..a45b40da28
--- /dev/null
+++ b/systems/msdos/emtex-contrib/zemtex/oz.tex
@@ -0,0 +1,1483 @@
+%\documentstyle[11pt,oz,threecolumn]{article} Changed for PC file names.(SR-QUT ISRC)
+\documentstyle[11pt,oz,3column]{article}
+% you may need to change some of the dimensions below to position
+% the document correctly on the page (depending on your local printer setup).
+% alw - document DOESN'T PRINT in one go on the alw, print a few pages at a time
+\oddsidemargin -2mm
+\evensidemargin -2mm
+\topmargin 0mm
+\textwidth 188mm
+\textheight 256mm
+\headheight 0 pt
+\headsep 0 pt
+\footheight 16 pt
+\footskip 24 pt
+\parskip 4 pt
+\parindent 0 pt
+%
+% just ignore any over- or under-full hboxes
+% this document uses most of the (physical) page and isn't spread
+% out either. This may make it slightly harder to read first time
+% through, but makes it more suitable for later reference.
+%
+% before we start, let's make a few definitions
+%
+\makeatletter
+\def\example{\begin{sidebyside}}
+\def\verbpart{\nextside\small\vspace*{-1ex}\begin{quote}\begin{verbatim}}
+\def\endexample{\end{quote}\vspace*{-2ex}\end{sidebyside}\vspace*{-3ex}\ignorespaces}
+\def\symbol#1{#1 & \tt\string#1}
+\def\symbols{\@ifnextchar[{\@symbols}{\@symbols[0]}}
+\def\@symbols[#1]{\interzedlinepenalty=\interdisplaylinepenalty\z@env
+ \openup #1\jot
+ \halign\bgroup\zstrut\hbox to 3.8em{$##$\hss}\tabskip=0pt&##\hss\cr
+ \noalign{\vskip-#1\jot}}% equal vspace above and below argue display
+\let\endsymbols=\endzed
+\makeatother
+%
+\begin{document}
+\begin{center}
+{\Large\bf Printing Z and Object-Z \LaTeX\ documents}\\[2.5ex]
+{\em Paul King}\\[1ex]
+Department of Computer Science\\
+University of Queensland\\
+Australia, 4072\\
+king@batserver.cs.uq.oz.au\\[1ex]
+May 29, 1990
+\end{center}
+
+\section{Introduction}
+This note describes a package of \LaTeX\ macros for printing
+Z and Object-Z specifications. The macros and this note are
+based originally on Mike Spivey's \verb'zed.sty' macros and documentation.
+The package does several related things for you:
+\begin{itemize}
+\item It loads extra fonts and defines mnemonics
+ for the Z symbols they contain.
+\item It defines macros for some Z symbols (e.g. $\pinj$) which
+ don't appear in any of our fonts.
+\item It fixes the way \TeX\ sets letters in mathematical formulas so
+ that multi-character identifiers look better.
+\item It provides various brands of `boxed mathematics'
+ which appear in Z and Object-Z specifications.
+\end{itemize}
+
+The package is kept in a file {\tt oz.sty}
+in the directory \verb|/usr/local/lib/tex/localinputs|.
+This directory should be mentioned in your \verb|TEXINPUTS| shell variable.
+To use the macros you just begin your \LaTeX\ document with something like:
+\begin{quote}
+\begin{verbatim}
+\documentstyle[11pt,oz]{article}
+\end{verbatim}
+\end{quote}
+\vspace*{-1.5ex}
+
+\section{Schema Boxes}
+
+The example below shows a schema on the left and what you
+need to say to get it on the right.
+
+\begin{example}
+\begin{schema}{BirthdayBook}
+ known: \pset NAME \\
+ birthday: NAME \pfun DATE
+\ST
+ known = \dom birthday
+\end{schema}
+\verbpart
+\begin{schema}{BirthdayBook}
+ known: \pset NAME \\
+ birthday: NAME \pfun DATE
+\ST
+ known = \dom birthday
+\end{schema}
+\end{verbatim}
+\end{example}
+
+The command \verb|\ST| (read `Such That') is the same as the previously used
+command \verb|\where| which has been kept as an alias for upward compatibility.
+If you want a schema with no name, just a horizontal rule at the top,
+use the \verb|schema*| environment instead.
+You can set various parameters (see Section 7) to change the box style,
+for example:
+
+\begin{example}
+\begin{leftschemas}
+\zedcornerheight=3ex\zedlinethickness=0.9pt
+\zedbar=10em\zedleftsep=1.5em
+\begin{schema}{BirthdayBook}
+ known: \pset NAME \\
+ birthday: NAME \pfun DATE
+\ST
+ known = \dom birthday
+\end{schema}
+\end{leftschemas}
+\nextside\small\vspace{-1ex}
+\begin{quote}
+In document preamble: \hfil\\
+~~\verb|\leftschemas|\hfil\\
+~~\verb|\zedcornerheight=3ex|\hfil\\
+~~\verb|\zedlinethickness=0.9pt|\hfil\\
+~~\verb|\zedbar=10em\zedleftsep=3em|\hfil\\
+\end{example}
+
+Schemas can also be defined using a horizontal notation, for example:
+\begin{example}
+\begin{zed}
+BirthdayBook \sdef \lsch \ldots \rsch
+\end{zed}
+\verbpart
+$BirthdayBook \sdef \lsch ... \rsch$
+\end{verbatim}
+\end{example}
+
+A generic schema is produced as follows.
+
+\begin{example}
+\begin{genschema}{Pool}{RESOURCE}
+owner : RESOURCE \pfun USER \\
+free : \pset RESOURCE
+\ST
+(\dom owner) \uni free = RESOURCE \\
+(\dom owner) \int free = \emptyset
+\end{genschema}
+\verbpart
+\begin{genschema}{Pool}{RESOURCE}
+owner : RESOURCE \pfun USER \\
+free : \pset RESOURCE
+\ST
+(\dom owner) \uni free = RESOURCE \\
+(\dom owner) \int free = \emptyset
+\end{genschema}
+\end{verbatim}
+\end{example}
+
+\section{Axiomatic definitions}
+
+A `liberal' axiomatic definition is produced as follows.
+
+\vspace{-1ex}\begin{example}
+\vspace{\ht\zstrutbox}
+\begin{axdef}
+limit : \nat
+\ST
+limit \leq 65536
+\end{axdef}
+\verbpart
+\begin{axdef}
+limit : \nat
+\ST
+limit \leq 65536
+\end{axdef}
+\end{verbatim}
+\end{example}
+
+A `generic' axiomatic definition is produced as follows.
+
+\begin{example}
+\begin{gendef}{X,Y}
+first : X \prod Y \tfun X
+\ST
+\all x : X; y : Y \dot first(x,y) = x
+\end{gendef}
+\verbpart
+\begin{gendef}{X,Y}
+first : X \prod Y \tfun X
+\ST
+\all x : X; y : Y \dot first(x,y) = x
+\end{gendef}
+\end{verbatim}
+\end{example}
+
+A `unique' axiomatic definition is produced as follows.
+
+\begin{example}
+\begin{uniqdef}
+\pi : \real
+\ST
+\pi = 3.14159265\ldots
+\end{uniqdef}
+\verbpart
+\begin{uniqdef}
+\pi : \real
+\ST
+\pi = 3.14159265\ldots
+\end{uniqdef}
+\end{verbatim}
+\end{example}
+
+\section{Object-Z Class Boxes}
+
+Object-Z allows class types to be defined using a box very
+similar to the schema box previously described.
+It allows the previously described boxed environments
+(as well as nested sub-classes) to be placed within a class box.
+%
+In addition, special names can be used for some of the boxed-environments
+when they appear within a class box.
+The following example illustrates a class definition.
+
+\begin{example}
+\begin{class}{Shape}
+\also
+colour : Colour \\
+\begin{axdef}
+perim : \real
+\ST
+perim > 0
+\end{axdef} \\
+\begin{classcom}
+This class has 2 constants
+$colour$ and $perim$.
+\end{classcom} \\
+\begin{state}
+x, y : \real
+\end{state} \\
+\begin{init}
+x = y = 0
+\end{init} \\
+\begin{op}{Translate}
+\Delta (x,y) \\
+dx?, dy? : \real
+\ST
+x' = x + dx? \\
+y' = y + dy?
+\end{op}
+\end{class}
+\verbpart
+\begin{class}{Shape}
+\also
+colour : Colour \\
+\begin{axdef}
+perim : \real
+\ST
+perim > 0
+\end{axdef} \\
+\begin{classcom}
+This class has 2 constants
+$colour$ and $perim$.
+\end{classcom} \\
+\begin{state}
+x, y : \real
+\end{state} \\
+\begin{init}
+x = y = 0
+\end{init} \\
+\begin{op}{Translate}
+\Delta (x,y) \\
+dx?, dy? : \real
+\ST
+x' = x + dx? \\
+y' = y + dy?
+\end{op}
+\end{class}
+\end{verbatim}
+\end{example}
+
+The \verb|classcom| environment hasn't been seen before.
+It creates a paragraph of text with the same margins as used
+for schemas and other Z environments. It uses a special font
+intended for use when placing comments inside classes.
+A similar environment, \verb|zpar|, uses the same margins
+but with the normal roman font.
+
+The \verb|\begin{init}| command is an abbreviation for
+\verb|\begin{schema}{\Init}|. Similarly \verb|\begin{state}|
+is a more meaningful synonym for \verb|\begin{schema*}|.
+
+You will be given \LaTeX\ warning messages if you try to
+use a \verb|state| environment outside of a class box
+or if you try to place an environment such as \verb|syntax|
+inside a class. You can ask for additional help in these
+cases using the normal \LaTeX\ \verb|h| or \verb|H| help commands.
+If you proceed with \LaTeX ing, the macros will attempt to
+do the best they can to do what you probably intend, even though
+you are violating the recommended nesting guidelines.
+
+\section{Controlling the Spacing within Equations and Boxes}
+
+Most of the special Z symbols are defined
+in a way that allows \TeX\ to space them out correctly.
+Sometimes, however, you'll need to give \TeX\ a helping hand if
+you want it to get the spacing right. For example, to get $map\,f$
+you need to type \verb|map\,f|. The \verb|\,| gives you a thin space:
+if this is omitted, the input \verb|map f| gives
+$map f$, because \TeX\ ignores spaces in math mode.
+
+Sometimes it is useful to indent the left margin to emphasis
+the logical structure of the predicate.
+The command \verb|\t1| does this by making the corresponding
+line in the output have one helping of indentation.
+As things get more nested, you can say \verb|\t2|, \verb|\t3|, and so on.
+But if you should ever get beyond \verb|t9|, you'll need to use braces
+around the argument: \verb|\t{10}|, and you'd better look for some way
+to simplify your specification!
+These little tab marks might look different to normal tabs
+but are never the less convenient. They're short,
+and they don't get longer as the tabbing gets deeper, within reason,
+so they can be tucked in neatly on the left, well away from the maths.
+The size of `helping' you get with \verb|\t| is determined by
+the \verb|\zedtab| parameter (see Section 7).
+
+If you want a more powerful aligning mechanism than tabbing
+then you can use the margin stack as shown in the example below.
+The command \verb|\M| sets the future left margin to the current
+horizontal position and pushes the old value onto a margin stack.
+The command \verb|\O| resets the left margin to its previous value
+(which is popped off the stack).
+
+\begin{example}
+\begin{schema}{Test}
+x, y : \nat
+\ST
+x + 1/x = 0 \imp \M y + 1/y = 0 \\
+y = x \O \\
+\end{schema}
+\verbpart
+\begin{schema}{Test}
+x, y : \nat
+\ST
+x + 1/x = 0 \imp \M y + 1/y = 0 \\
+y = x \O \\
+\end{schema}
+\end{verbatim}
+\end{example}
+
+If a schema or other box contains more than one predicate below the
+line, it often looks better to add a tiny vertical space between
+them, as in this example:
+
+\begin{example}
+\begin{schema}{AddBirthday}
+ \Delta BirthdayBook \\
+ n?: NAME \\
+ d?: DATE
+\ST
+ n? \nem known
+\also
+ birthday' = birthday \uni \{n? \map d?\}
+\end{schema}
+\verbpart
+\begin{schema}{AddBirthday}
+ \Delta BirthdayBook \\
+ n?: NAME \\
+ d?: DATE
+\ST
+ n? \nem known
+\also
+ birthday'=birthday \uni \{n? \map d?\}
+\end{schema}
+\end{verbatim}
+\end{example}
+
+This is done with the command \verb|\also|, which behaves syntactically
+like \verb|\ST|.
+The command \verb|\also| is provided {\em instead\/} of the
+optional argument to \verb|\\|
+which \LaTeX\ provides in other environments.
+If larger vertical spacing is required, the commands
+\verb|\Also| and \verb|\ALSO| may be used (giving 2 and 4 times
+as much space as \verb|\also| respectively).
+
+Normally, the contents of a schema box are kept on a single page.
+For large schemas it may be necessary to split the box across pages.
+You must specify which places are suitable for splitting using one of
+\verb|\zbreak|, \verb|\Zbreak| or \verb|\ZBREAK|. If no split is
+performed at this point, a vertical space will be added as if the
+user had typed \verb|\also|, \verb|\Also|, or \verb|\ALSO| respectively.
+You can also use the \verb|\znewpage| command to force a page break within
+a box. (These breaking facilities will hopefully never be needed for schemas,
+but may become necessary for class specifications.)
+
+\section{Other Display Environments}
+
+The \verb|zed| environment can be used to set multi-line formulas without
+an enclosing box: it is useful for given-set declarations, theorems, and the
+miscellaneous bits of mathematics that don't come in a box:
+
+\vspace{-1ex}\begin{example}
+\vspace{\ht\zstrutbox}
+\begin{zed}
+ \all n: \nat \dot \\
+\t1 n+n \mem even.
+\end{zed}
+\verbpart
+\begin{zed}
+ \all n: \nat \dot \\
+\t1 n+n \mem even.
+\end{zed}
+\end{verbatim}
+\end{example}
+
+The formula \verb|\begin{zed} ... \end{zed}| may be abbreviated to
+\verb|\[ ... \]|; the \verb|zed| environment is a generalization of the
+\verb|displaymath| environment of \LaTeX, so this redefinition of
+commands is fairly benign. Notice that the maths is set flush left on the
+same indentation as schemas and their friends.
+Here too you can use \verb|\also| for a little extra space
+between lines.
+
+For algebraic-style proofs, there is the \verb|argue| environment.
+This is like the \verb|zed| environment, but the separation between
+lines is increased a little, and page breaks may occur between lines.
+When the left-hand side is long this style wastes less space
+than the \LaTeX\ \verb|eqnarray| style.
+The intended use is for arguments like this:
+\begin{argue}
+ rev(append(cons(x,s),t)) \\
+\t1 = rev(cons(x,append(s,t))) \\
+\t1 = append(rev(append(s,t)),cons(x,nil)) \\
+\t1 = append(append(rev(t),rev(s)),cons(x,nil))
+ \quad \hbox{by hypothesis} \\
+\t1 = append(rev(t),append(rev(s),cons(x,nil))) \\
+\t1 = append(rev(t),rev(cons(x,s))).
+\end{argue}
+Here is the input:
+\begin{quote}
+\begin{verbatim}
+\begin{argue}
+ rev(append(cons(x,s),t)) \\
+\t1 = rev(cons(x,append(s,t))) \\
+\t1 = append(rev(append(s,t)),cons(x,nil)) \\
+\t1 = append(append(rev(t),rev(s)),cons(x,nil))
+ \quad \hbox{by hypothesis} \\
+\t1 = append(rev(t),append(rev(s),cons(x,nil))) \\
+\t1 = append(rev(t),rev(cons(x,s))).
+\end{argue}
+\end{verbatim}
+\end{quote}
+
+The example below shows an inference rule (the optional argument
+to \verb|\derive| gives a side-condition of the rule):
+
+\vspace{-1ex}\begin{example}
+\vspace{\ht\zstrutbox}
+\begin{infrule}
+ \Gamma \shows P
+\derive[x \nem freevars(\Gamma)]
+ \Gamma \shows \all x \dot P
+\end{infrule}
+\verbpart
+\begin{infrule}
+ \Gamma \shows P
+\derive[x \nem freevars(\Gamma)]
+ \Gamma \shows \all x \dot P
+\end{infrule}
+\end{verbatim}
+\end{example}
+
+The \verb|syntax| environment is used for making displays like this:
+
+\begin{syntax}
+ EXPR & \ddef & IDENT & identifier \\
+ & \bbar & EXPR\;EXPR & application \\
+ & \bbar & \lambda IDENT \dot EXPR & lambda-abstraction.
+\end{syntax}
+from input like this:
+\begin{quote}
+\begin{verbatim}
+\begin{syntax}
+ EXPR & \ddef & IDENT & identifier \\
+ & \bbar & EXPR\;EXPR & application \\
+ & \bbar & \lambda IDENT \dot EXPR & lambda-abstraction.
+\end{syntax}
+\end{verbatim}
+\end{quote}
+
+This kind of thing is useful when you're describing a language,
+and it can also be used for data-type definitions as shown below.
+The optional final column was omitted below by leaving out the third \verb|&|.
+
+{\small
+\vspace{-1ex}\begin{example}
+\vspace{0.5\ht\zstrutbox}
+\begin{syntax}
+TYPE & \ddef & givenT \lang NAME \rang \\
+ & \bbar & powerT \lang TYPE \rang \\
+ & \bbar & tupleT \lang \seq TYPE \rang \\
+ & \bbar & schemaT \lang IDENT \ffun TYPE \rang \\
+ & \bbar & classT \lang IDENT \ffun ClassAttr \rang \\
+\end{syntax}
+\verbpart
+\begin{syntax}
+TYPE & \ddef & givenT \lang NAME \rang \\
+& \bbar & powerT \lang TYPE \rang \\
+& \bbar & tupleT \lang \seq TYPE \rang \\
+& \bbar & schemaT \lang IDENT \ffun TYPE \rang \\
+& \bbar & classT \lang IDENT \ffun ClassAttr \rang
+\end{syntax}
+\end{verbatim}
+\end{example}}
+
+This can be compared with the layout adopted by the UQ Z editor (version 1).
+
+{\small
+\vspace{-1ex}\begin{example}
+\vspace{0.5\ht\zstrutbox}
+\begin{zed}
+TYPE \ddef \M givenT \lang NAME \rang \\
+ \bbar powerT \lang TYPE \rang \\
+ \bbar tupleT \lang \seq TYPE \rang \\
+ \bbar schemaT \lang IDENT \ffun TYPE \rang \\
+ \bbar classT \lang IDENT \ffun ClassAttr \rang \O
+\end{zed}
+\verbpart
+\begin{zed}
+TYPE \ddef \M givenT \lang NAME \rang \\
+\bbar powerT \lang TYPE \rang \\
+\bbar tupleT \lang \seq TYPE \rang \\
+\bbar schemaT \lang IDENT \ffun TYPE \rang \\
+\bbar classT \lang IDENT \ffun ClassAttr \rang \O
+\end{zed}
+\end{verbatim}
+\end{example}}
+
+The {\tt sidebyside} environment allows a display as shown in the
+first two columns below to be produced from the text of the third column.
+Note the use of the \verb|\comment| command.
+
+\begin{example}
+\begin{sidebyside}
+\begin{schema}{Schema}
+\comment*{declarations}
+\ST
+a < b & [{\sf pred-1}]\\
+aaaaa < bbbbb \comment{pred-2}
+\end{schema}
+\nextside
+\begin{zpar}
+This is a paragraph which has the same
+margins as the standard schemas do.
+\end{zpar}
+\end{sidebyside}
+\verbpart
+\begin{sidebyside}
+\begin{schema}{Schema}
+\comment*{declarations}
+\ST
+a < b \comment{pred-1} \\
+aaaaa < bbbbb \comment{pred-2}
+\end{schema}
+\nextside
+\begin{zpar}
+This is a paragraph which has the same
+margins as the standard schemas do.
+\end{zpar}
+\end{sidebyside}
+\end{verbatim}
+\end{example}
+
+In fact, this environment was used throughout this note to
+display the examples beside the required input text.
+Incidentally, the above example shows that \verb|sidebyside|
+environments can be nested; so what the author of this note typed
+to get the above display was:
+
+\begin{quote}
+\begin{verbatim}
+\begin{sidebyside}
+ \begin{sidebyside}
+ ...
+ \nextside
+ ...
+ \end{sidebyside}
+\nextside
+ ...
+\end{sidebyside}
+\end{verbatim}
+\end{quote}
+
+This resulted in the first two columns being equally spaced and
+together taking up as much space as the third column.
+You can have more than 2 columns without nesting by specifying an optional
+parameter to \verb|sidebyside|. For example, the display below has three
+equally spaced columns obtained using \verb|\begin{sidebyside}[3]|.
+\begin{sidebyside}[3]
+\begin{schema}{BirthdayBook}
+ known: \pset NAME \\
+ birthday: NAME \pfun DATE
+\ST
+ known = \dom birthday
+\end{schema}
+\nextside
+\begin{schema}{BirthdayBook}
+ known: \pset NAME \\
+ birthday: NAME \pfun DATE
+\ST
+ known = \dom birthday
+\end{schema}
+\nextside
+\begin{zpar}
+Don't get carried away with \verb|sidebyside|
+like this example does.
+\end{zpar}
+\end{sidebyside}
+\newpage
+\section{Style Parameters}
+
+\begin{description}
+\item[\tt\string\zedindent] The (horizontal) indentation for mathematical text.
+ By default, this is the same as \verb|\leftmargini|, the indentation
+ used for list environments.
+\item[\tt\string\zedleftsep] The (horizontal) space between the vertical line on the left
+ of schemas, etc., and the maths inside. The default is 1em.
+\item[\tt\string\zedtab] The unit of indentation used by \verb|\t|. The default
+ is 2em.
+\item[\tt\string\zedbar] The length of the horizontal bar in the middle of a
+ schema. The default is 8em.
+\item[\tt\string\leftschemas] A declaration which makes schema names be
+ set flush left. Use it in the document preamble.
+\item[\tt\string\zedlinethickness] The thickness of the lines that make up
+ schema and class boxes. You can change the thickness
+ with a command such as \verb|\zedlinethickness=0.1pt|. This may
+ be useful if you are creating overhead slides.
+ \begin{description}
+ \makeatletter
+ \item[0.1pt] \zedlinethickness=0.1pt
+ ~\hbox to 4cm{\z@hrulefill}
+ \item[0.4pt] \zedlinethickness=0.4pt
+ ~\hbox to 4cm{\z@hrulefill}~~~(The default)
+ \item[\hphantom{0.}1pt] \zedlinethickness=1pt
+ ~\hbox to 4cm{\z@hrulefill}
+ \end{description}
+\item[\tt\string\baselinestretch] The spacing for the text part of your
+ document. It doesn't change the spacing within Z environments. It's
+ default value is 1. A command such as \verb|\def\baselinestretch{2}|
+ will make your text double spaced, but not your Z environments.
+\item[\tt\string\zedbaselinestretch] The spacing for the Z environment
+ part of your document. It's default value is 1.
+\item[\tt\string\zedsize] The size of the material within the Z
+ part of your document. It doesn't affect the remainder of your document.
+ For example, \verb|\zedsize{\large}| will give you large Z symbols
+ and equations but will not affect the size of the surrounding text.
+\item[\tt\string\zedcornerheight] The height of `corners' that can be placed
+ on the right hand side of the top and bottom lines of schema and class
+ boxes. The default is 0em (i.e. no corners).
+\end{description}
+
+\section{Symbols}
+
+Multi-letter identifiers have been changed to look
+better than they do with vanilla \LaTeX: instead of
+$\mit specifications$, you get $specifications$.
+The letters haven't been spread apart, and the
+ligature $fi$ has been used.
+
+Almost all of the mathematical symbols of \LaTeX\ can be used;
+some have been redefined---usually to fix the spacing so that it is
+suitable for Z specifications.
+The commands for obtaining additional symbols are listed below.
+Sometimes more than one command may produce a symbol you
+require. You should use the one that seems to be designed for the
+context you have in mind. This is because the spacing around (and size of)
+symbols has been chosen for their typical context.
+
+Throughout the lifetime of these macros a number of alternate control
+sequences for any symbol may have existed. A list of aliases has been
+set up so that old commands may still be used. It is
+recommended however that you stick to the recommended command
+names for symbols as these names may be supported by other tools.
+Within the table below non-recommended aliases are surrounded by
+brackets, e.g., \verb|(\power)|.
+\threecolumn
+\setcounter{secnumdepth}{2}
+\zedindent=0.2\zedindent
+\subsection{Special Z Notation}
+\vspace*{-0.5ex}
+\subsubsection{Numbers}
+\vspace*{-2.5ex}
+\begin{symbols}
+\nat & \verb' \nat' \\
+\natone & \verb' \natone (\nplus)' \\
+\integer & \verb' \integer (\num)' \\
+\real & \verb' \real' \\
+\div~\mod & \verb' \div \mod' \\
+i^n & \verb' i^n i\expon n' \\
+\succ & \verb' \succ' \\
+%\prec & \verb' \prec' \\
+=~\neq & \verb' = \neq' \\
+<~\leq~\leqslant & \verb' < \leq \leqslant' \\
+>~\geq~\geqslant & \verb' > \geq \geqslant' \\
+*\,/\,+ - & \verb' * / + -' \\
+\end{symbols}
+\subsubsection{Logic}
+\vspace*{-2.5ex}
+\begin{symbols}
+\lnot & \verb'\lnot' \\
+\land & \verb'\land (\wedge)' \\
+\lor & \verb'\lor (\vee)' \\
+\all & \verb'\all (\forall)' \\
+\exi & \verb'\exi (\exists)' \\
+\exi_1 & \verb'\exione' \\
+\nexi & \verb'\nexi (\nexists)' \\
+\dot & \verb'@ \dot (\spot)' \\
+%\cond & \verb'\cond' \\
+\imp & \verb'\imp (\implies)' \\
+\iff & \verb'\iff' \\
+\true & \verb'\true' \\
+\false & \verb'\false' \\
+\bool & \verb'\bool' \\
+\end{symbols}
+\subsubsection{Sets}
+\vspace*{-2.5ex}
+\begin{symbols}
+\{~~\cbar~~\} & \verb' \{ \cbar \}' \\
+\emptyset & \verb' \emptyset' \\
+\varemptyset & \verb' \varemptyset' \\
+\mem & \verb' \mem (\in)' \\
+\nmem & \verb' \nem (\nmem \notin)' \\
+\pset & \verb' \pset (\power)' \\
+\fset & \verb' \fset (\finset)' \\
+\psetone~~\fsetone & \verb' \fsetone \psetone' \\
+\uni & \verb' \uni (\union)' \\
+\int & \verb' \int (\inter)' \\
+\psubs & \verb' \psubs (\subset)' \\
+\subs & \verb' \subs (\subseteq)' \\
+\psups & \verb' \psups (\supset)' \\
+\sups & \verb' \sups (\supseteq)' \\
+\prod & \verb' \prod (\cross)' \\
+\min~\max & \verb' \min \max' \\
+\# & \verb' \#' \\
+\duni & \verb' \duni (\dunion)' \\
+\dint & \verb' \dint (\dinter)' \\
+\upto & \verb' \upto' \\
+\end{symbols}
+
+\subsubsection{Relations and Functions}
+\vspace*{-2.5ex}
+\begin{symbols}[0.1]
+\lambda~~~\mu & \verb'\lambda \mu' \\
+\dom & \verb'\dom' \\
+\ran & \verb'\ran' \\
+\dres & \verb'\dres' \\
+\dsub & \verb'\dsub (\ndres)' \\
+\rres & \verb'\rres' \\
+\rsub & \verb'\rsub (\nrres)' \\
+\fovr & \verb'\fovr' \\
+\cmp & \verb'\cmp' \\
+\fcmp & \verb'\fcmp (\comp)' \\
+(\!|~~~|\!) & \verb'\limg \rimg' \\
+\id & \verb'\id' \\
+R\inv & \verb'R^{-1} R\inv' \\
+R^+ & \verb'R^+ R\tcl' \\
+R^* & \verb'R^* R\rtcl' \\
+R^k & \verb'R^k R\iter k' \\
+iter\,0\,R & \verb'iter \, 0 \, R' \\
+\map & \verb'\map' \\
+\rel & \verb'\rel' \\
+\tfun & \verb'\tfun (\fun)' \\
+\tinj & \verb'\tinj (\inj)' \\
+\tsur & \verb'\tsur (\surj)' \\
+\pfun & \verb'\pfun' \\
+\pinj & \verb'\pinj' \\
+\psur & \verb'\psur (\psurj)' \\
+\ffun & \verb'\ffun' \\
+\finj & \verb'\finj' \\
+\bij & \verb'\bij' \\
+\end{symbols}
+\subsubsection{Sequences}
+\vspace*{-2.5ex}
+\begin{symbols}
+\seq & \verb' \seq' \\
+\seqone & \verb' \seqone' \\
+\emptyseq & \verb' \emptyseq' \\
+\lseq~~~\rseq & \verb' \lseq \rseq' \\
+\head~~\tail & \verb' \head \tail' \\
+\front~~\last & \verb' \front \last' \\
+\rev & \verb' \rev' \\
+\next & \verb' \next' \\
+\inseq & \verb' \inseq' \\
+\prefix & \verb' \prefix' \\
+\suffix & \verb' \suffix' \\
+\squash & \verb' \squash' \\
+\cat & \verb' \cat' \\
+\dcat & \verb' \dcat' \\
+\dcmp & \verb' \dcmp' \\
+\dovr & \verb' \dovr' \\
+\ires & \verb' \ires' \\
+\sres & \verb' \sres \filter' \\
+\partitions & \verb' \partitions' \\
+\disjoint & \verb' \disjoint' \\
+\end{symbols}
+
+\subsubsection{Schemas}
+\vspace*{-2.5ex}
+\begin{symbols}
+\Delta & \verb'\Delta' \\
+\equiv~~\Xi & \verb'\equiv \Xi' \\
+\pred & \verb'\pred' \\
+\pre & \verb'\pre' \\
+\post & \verb'\post' \\
+\project & \verb'\zproject \project' \\
+\zand & \verb'\zand' \\
+\zor & \verb'\zor' \\
+\zcmp & \verb'\zcmp (\semi)' \\
+\zexi & \verb'\zexi' \\
+\zall & \verb'\zall' \\
+\znot & \verb'\znot' \\
+\zhide & \verb'\zhide (\hide)' \\
+\zfor & \verb'\zfor' \\
+\zimp & \verb'\zimp' \\
+\zeq & \verb'\zeq' \\
+\zovr & \verb'\zovr' \\
+\zpipe & \verb'\zpipe' \\
+\theta & \verb'\theta' \\
+\lsch~~\zbar~~\rsch & \verb'\lsch \zbar \rsch' \\
+. & \verb'.' \\
+\end{symbols}
+\subsubsection{Bags}
+\vspace*{-2.5ex}
+\begin{symbols}
+\lbag~~~\rbag & \verb'\lbag \rbag' \\
+\bag & \verb'\bag' \\
+\emptybag & \verb'\emptybag' \\
+\items & \verb'\items' \\
+\bagcount & \verb'\bagcount' \\
+\buni & \verb'\buni' \\
+\inbag & \verb'\inbag' \\
+\end{symbols}
+\subsubsection{Definitions and Declarations}
+\vspace*{-2.5ex}
+\begin{symbols}
+::= & \verb'\ddef' \\
+\bbar & \verb'\bbar' \\
+== & \verb'\defs' \also
+\widehat= & \verb'\sdef' \also
+\triangleq & \verb'\varsdef' \\
+,~~\semicolon~~: & \verb', ; :' \\
+\lang~~~\rang & \verb'\lang \rang' \\
+\end{symbols}
+\subsubsection{Miscellaneous}
+\vspace*{-2.5ex}
+\begin{symbols}[0]
+[~~~] & \verb'[ ]' \\
+(~~~) & \verb'( )' \\
+!~~~? & \verb'! ?' \\
+\zlet & \verb'\zlet' \\
+\zwhere & \verb'\zwhere' \\
+\zin & \verb'\zin' \\
+\langle\!|~~~|\!\rangle & \verb'\lblot \rblot' \\
+\intern Bump & \verb'\intern Bump' \\
+\Init & \verb'\Init'\\
+\Exit & \verb'\Exit'
+\end{symbols}
+
+\subsection{Other Special Notation}
+\vspace*{-1ex}
+\subsubsection{Temporal Logic}
+\vspace*{-2.5ex}
+\begin{symbols}
+\always~\uptilnow & \verb'\always \uptilnow' \\
+~&\verb'(\henceforth)'\\
+\atnext~\atlast & \verb'\atnext \atlast' \\
+\eventually~\previously & \verb'\eventually \previously' \\
+\end{symbols}
+\subsubsection{Proofs}
+\vspace*{-2.5ex}
+\begin{symbols}[0.1]
+\TH & \verb' \TH' \\
+\PR & \verb' \PR' \\
+\LE & \verb' \LE' \\
+\ETH~\Qed & \verb' \qed (\ETH) \Qed' \\
+\QED~\BLACKQED & \verb' \QED \BLACKQED' \\
+\vdash & \verb' \shows (\thrm)' \\
+\vDash & \verb' \vDash' \\
+\refines & \verb' \refines' \\
+\weakrefine & \verb' \weakrefine' \\
+\end{symbols}
+\subsubsection{Object Theory}
+\vspace*{-2.5ex}
+\begin{symbols}
+\subclass & \verb'\subclass \isa' \\
+\weaksubclass & \verb'\weaksubclass \islikea' \\
+\supclass & \verb'\supclass' \\
+\weaksupclass & \verb'\weaksupclass' \\
+\hasa & \verb'\hasa \instantiates' \\
+\instancein & \verb'\instancein' \\
+\subtype~~\subtypeeq & \verb'\subtype \subtypeeq' \\
+\suptype~~\suptypeeq & \verb'\suptype \suptypeeq' \\
+\end{symbols}
+\subsubsection{Orders}
+\vspace*{-2.5ex}
+\begin{symbols}
+\mono & \verb' \mono' \\ % these lines fudged to give more spacing
+\torder & \verb' \torder' \\
+\porder & \verb' \porder' \\
+\end{symbols}
+\subsubsection{Word Styles}
+\vspace*{-2.5ex}
+\begin{symbols}[0.4]
+\word{word} & \verb'\word{word}' \\
+\keyword{word} & \verb'\keyword{word}' \\
+\boldword{word} & \verb'\boldword{word}' \\
+\underword{word} & \verb'\underword{word}' \\
+\underkeyword{word} & \verb'\underkeyword{word}' \\
+\underboldword{word} & \verb'\underboldword{word}' \\
+\String{word} & \verb'\String{word}' \\
+\STRING{word} & \verb'\STRING{word}' \\
+a \infix{rel} b & \verb'a \infix{rel} b' \\
+\end{symbols}
+
+\subsection{Special Letter Fonts}
+\vspace*{-1ex}
+\subsubsection{Greek}
+\vspace*{-2.5ex}
+\begin{symbols}
+\alpha & \verb'\alpha' \\
+\beta & \verb'\beta' \\
+\gamma~\Gamma & \verb'\gamma \Gamma' \\
+\delta~\Delta & \verb'\delta \Delta' \\
+\epsilon~\varepsilon & \verb'\epsilon \varepsilon' \\
+\zeta & \verb'\zeta' \\
+\eta & \verb'\eta' \\
+\theta~\vartheta~\Theta & \verb'\theta \vartheta \Theta' \\
+\iota & \verb'\iota' \\
+\kappa~\varkappa & \verb'\kappa \varkappa' \\
+\lambda~\Lambda & \verb'\lambda \Lambda' \\
+\mu & \verb'\mu' \\
+\nu & \verb'\nu' \\
+\xi~\Xi & \verb'\xi \Xi' \\
+\pi~\varpi~\Pi & \verb'\pi \varpi \Pi' \\
+\rho~\varrho & \verb'\rho \varrho' \\
+\sigma~\varsigma~\Sigma & \verb'\sigma \varsigma \Sigma' \\
+\tau & \verb'\tau' \\
+\upsilon~\Upsilon & \verb'\upsilon \Upsilon' \\
+\phi~\varphi~\Phi & \verb'\phi \varphi \Phi' \\
+\chi & \verb'\chi' \\
+\psi~\Psi & \verb'\psi \Psi' \\
+\omega~\Omega & \verb'\omega \Omega' \\
+\end{symbols}
+\subsubsection{Caligraphic}
+\vspace*{-2.5ex}
+\begin{symbols}
+\cal A & \verb'\cal A' \\
+\cal B & \verb'\cal B' \\
+\cal C & \verb'\cal C' \\
+\cal D & \verb'\cal D' \\
+\cal E & \verb'\cal E' \\
+\cal F & \verb'\cal F' \\
+\cal G & \verb'\cal G' \\
+\cal H & \verb'\cal H' \\
+\cal I & \verb'\cal I' \\
+\cal J & \verb'\cal J' \\
+\cal K & \verb'\cal K' \\
+\cal L & \verb'\cal L' \\
+\cal M & \verb'\cal M' \\
+\cal N & \verb'\cal N' \\
+\cal O & \verb'\cal O' \\
+\cal P & \verb'\cal P' \\
+\cal Q & \verb'\cal Q' \\
+\cal R & \verb'\cal R' \\
+\cal S & \verb'\cal S' \\
+\cal T & \verb'\cal T' \\
+\cal U & \verb'\cal U' \\
+\cal V & \verb'\cal V' \\
+\cal W & \verb'\cal W' \\
+\cal X & \verb'\cal X' \\
+\cal Y & \verb'\cal Y' \\
+\cal Z & \verb'\cal Z' \\
+\end{symbols}
+\subsubsection{BlackBoard Bold}
+\vspace*{-2.5ex}
+\begin{symbols}
+\bbold A & \verb'\bbold A' \\
+\bbold B & \verb'\bbold B' \\
+\bbold C & \verb'\bbold C' \\
+\bbold D & \verb'\bbold D' \\
+\bbold E & \verb'\bbold E' \\
+\bbold F & \verb'\bbold F' \\
+\bbold G & \verb'\bbold G' \\
+\bbold H & \verb'\bbold H' \\
+\bbold I & \verb'\bbold I' \\
+\bbold J & \verb'\bbold J' \\
+\bbold K & \verb'\bbold K' \\
+\bbold L & \verb'\bbold L' \\
+\bbold M & \verb'\bbold M' \\
+\bbold N & \verb'\bbold N' \\
+\bbold O & \verb'\bbold O' \\
+\bbold P & \verb'\bbold P' \\
+\bbold Q & \verb'\bbold Q' \\
+\bbold R & \verb'\bbold R' \\
+\bbold S & \verb'\bbold S' \\
+\bbold T & \verb'\bbold T' \\
+\bbold U & \verb'\bbold U' \\
+\bbold V & \verb'\bbold V' \\
+\bbold W & \verb'\bbold W' \\
+\bbold X & \verb'\bbold X' \\
+\bbold Y & \verb'\bbold Y' \\
+\bbold Z & \verb'\bbold Z' \\
+\end{symbols}
+\subsubsection{Miscellaneous}
+\vspace*{-2.5ex}
+\begin{symbols}
+\hslash & \verb'\hslash' \\
+\hbar & \verb'\hbar' \\
+\backepsilon & \verb'\backepsilon' \\
+\eth & \verb'\eth' \\
+\beth & \verb'\beth' \\
+\gimel & \verb'\gimel' \\
+\daleth & \verb'\daleth' \\
+\complement & \verb'\complement' \\
+\intercal & \verb'\intercal' \\
+\aleph & \verb'\aleph' \\
+\nabla & \verb'\nabla' \\
+\hbar & \verb'\hbar' \\
+\imath & \verb'\imath' \\
+\jmath & \verb'\jmath' \\
+\ell & \verb'\ell' \\
+\wp & \verb'\wp' \\
+\Re & \verb'\Re' \\
+\Im & \verb'\Im' \\
+\mho & \verb'\mho' \\
+\digamma & \verb'\digamma' \\
+\end{symbols}
+
+\subsection{Shapes}
+\vspace*{-2ex}
+\begin{symbols}
+\Box & \verb'\Box' \\
+\square & \verb'\square' \\
+\blacksquare & \verb'\blacksquare' \\
+\diamond & \verb'\diamond' \\
+\Diamond & \verb'\Diamond' \\
+\lozenge & \verb'\lozenge' \\
+\blacklozenge & \verb'\blacklozenge' \\
+\vartriangleright & \verb'\vartriangleright' \\
+\vartriangleleft & \verb'\vartriangleleft' \\
+\blacktriangledown & \verb'\blacktriangledown' \\
+\blacktriangleright & \verb'\blacktriangleright' \\
+\blacktriangleleft & \verb'\blacktriangleleft' \\
+\vartriangle & \verb'\vartriangle' \\
+\blacktriangle & \verb'\blacktriangle' \\
+\triangledown & \verb'\triangledown' \\
+\triangle & \verb'\triangle' \\
+\triangleleft & \verb'\triangleleft' \\
+\triangleright & \verb'\triangleright' \\
+\bigtriangleup & \verb'\bigtriangleup' \\
+\bigtriangledown & \verb'\bigtriangledown' \\
+\clubsuit & \verb'\clubsuit' \\
+\diamondsuit & \verb'\diamondsuit' \\
+\heartsuit & \verb'\heartsuit' \\
+\spadesuit & \verb'\spadesuit' \\
+\ast & \verb'\ast' \\
+\star & \verb'\star' \\
+\maltese & \verb'\maltese' \\
+\bigstar & \verb'\bigstar' \\
+\bigcirc & \verb'\bigcirc' \\
+\circ & \verb'\circ' \\
+\bullet & \verb'\bullet' \\
+\centerdot & \verb'\centerdot' \\
+\cdot & \verb'\cdot' \\
+\cdots & \verb'\cdots' \\
+\ldots & \verb'\ldots' \\
+\vdots & \verb'\vdots' \\
+\ddots & \verb'\ddots' \\
+\end{symbols}
+\subsubsection{Circled Operations}
+\vspace*{-2.5ex}
+\begin{symbols}
+\circledS & \verb'\circledS' \\
+\circledcirc & \verb'\circledcirc' \\
+\circledast & \verb'\circledast' \\
+\circleddash & \verb'\circleddash' \\
+\circledR & \verb'\circledR' \\
+\copyright & \verb'\copyright' \\
+\fovr & \verb'\fovr' \\
+\ominus & \verb'\ominus' \\
+\otimes & \verb'\otimes' \\
+\oslash & \verb'\oslash' \\
+\odot & \verb'\odot' \\
+\end{symbols}
+
+\subsubsection{Boxed operators}
+\vspace*{-2.5ex}
+\begin{symbols}[0.2]
+\boxdot & \verb'\boxdot' \\
+\boxplus & \verb'\boxplus' \\
+\boxtimes & \verb'\boxtimes' \\
+\boxminus & \verb'\boxminus' \\
+\end{symbols}
+\subsection{Arrow Symbols}
+\vspace*{-1ex}
+\subsubsection{Left Arrows}
+\vspace*{-2.5ex}
+\begin{symbols}[0.7]
+\leftarrow & \verb'\leftarrow \gets' \\
+\Leftarrow & \verb'\Leftarrow' \\
+\hookleftarrow & \verb'\hookleftarrow' \\
+\leftharpoonup & \verb'\leftharpoonup' \\
+\leftharpoondown & \verb'\leftharpoondown' \\
+\longleftarrow & \verb'\longleftarrow' \\
+\Longleftarrow & \verb'\Longleftarrow' \\
+\twoheadleftarrow & \verb'\twoheadleftarrow' \\
+\leftleftarrows & \verb'\leftleftarrows' \\
+\leftarrowtail & \verb'\leftarrowtail' \\
+\Lleftarrow & \verb'\Lleftarrow' \\
+\nleftarrow & \verb'\nleftarrow' \\
+\nLeftarrow & \verb'\nLeftarrow' \\
+\end{symbols}
+
+\subsubsection{Right Arrows}
+\begin{symbols}[0.7]
+\rightarrow & \verb'\rightarrow \to' \\
+\Rightarrow & \verb'\Rightarrow' \\
+\map & \verb'\map' \\
+\longmapsto & \verb'\longmapsto' \\
+\hookrightarrow & \verb'\hookrightarrow' \\
+\rightharpoonup & \verb'\rightharpoonup' \\
+\rightharpoondown & \verb'\rightharpoondown' \\
+\leadsto & \verb'\leadsto' \\
+\longrightarrow & \verb'\longrightarrow' \\
+\Longrightarrow & \verb'\Longrightarrow' \\
+\twoheadrightarrow & \verb'\twoheadrightarrow' \\
+\rightrightarrows & \verb'\rightrightarrows' \\
+\rightarrowtail & \verb'\rightarrowtail' \\
+\rightsquigarrow & \verb'\rightsquigarrow' \\
+\Rrightarrow & \verb'\Rrightarrow' \\
+\nrightarrow & \verb'\nrightarrow' \\
+\nRightarrow & \verb'\nRightarrow' \\
+\end{symbols}
+\newpage
+\subsubsection{Left Right Arrows}
+\begin{symbols}[0.6]
+\leftrightarrow & \verb'\leftrightarrow' \\
+\Leftrightarrow & \verb'\Leftrightarrow' \\
+\rightleftharpoons & \verb'\rightleftharpoons' \\
+\longleftrightarrow & \verb'\longleftrightarrow' \\
+\Longleftrightarrow & \verb'\Longleftrightarrow' \\
+\rightleftharpoons & \verb'\rightleftharpoons' \\
+\leftrightharpoons & \verb'\leftrightharpoons' \\
+\leftrightarrows & \verb'\leftrightarrows' \\
+\rightleftarrows & \verb'\rightleftarrows' \\
+\leftrightsquigarrow & \verb'\leftrightsquigarrow' \\
+\nLeftrightarrow & \verb'\nLeftrightarrow' \\
+\nleftrightarrow & \verb'\nleftrightarrow' \\
+\end{symbols}
+
+\subsubsection{Up Down Arrows}
+\begin{symbols}[1]
+\uparrow & \verb'\uparrow' \\
+\Uparrow & \verb'\Uparrow' \\
+\downarrow & \verb'\downarrow' \\
+\Downarrow & \verb'\Downarrow' \\
+\updownarrow & \verb'\updownarrow' \\
+\Updownarrow & \verb'\Updownarrow' \\
+\upuparrows & \verb'\upuparrows' \\
+\downdownarrows & \verb'\downdownarrows' \\
+\upharpoonright & \verb'\upharpoonright' \\
+\downharpoonright & \verb'\downharpoonright' \\
+\upharpoonleft & \verb'\upharpoonleft' \\
+\downharpoonleft & \verb'\downharpoonleft' \\
+\end{symbols}
+
+\subsubsection{Miscellaneous}
+\begin{symbols}[0.9]
+\nearrow & \verb'\nearrow' \\
+\searrow & \verb'\searrow' \\
+\swarrow & \verb'\swarrow' \\
+\nwarrow & \verb'\nwarrow' \\
+\circlearrowright & \verb'\circlearrowright' \\
+\circlearrowleft & \verb'\circlearrowleft' \\
+\Lsh & \verb'\Lsh' \\
+\Rsh & \verb'\Rsh' \\
+\looparrowleft & \verb'\looparrowleft' \\
+\looparrowright & \verb'\looparrowright' \\
+\curvearrowleft & \verb'\curvearrowleft' \\
+\curvearrowright & \verb'\curvearrowright' \\
+\end{symbols}
+\pagebreak[4]
+
+\subsection{Relations}
+\begin{symbols}[0.8]
+\ll & \verb'\ll' \\
+\gg & \verb'\gg' \\
+\llless & \verb'\lll \llless' \\
+\gggtr & \verb'\ggg \gggtr' \\
+\sqsubset & \verb'\sqsubset' \\
+\sqsupset & \verb'\sqsupset' \\
+\sqsubseteq & \verb'\sqsubseteq' \\
+\sqsupseteq & \verb'\sqsupseteq' \\
+\owns & \verb'\owns' \\
+\vdash & \verb'\vdash' \\
+\Vdash & \verb'\Vdash' \\
+\vDash & \verb'\vDash' \\
+\dashv & \verb'\dashv' \\
+\Vvdash & \verb'\Vvdash' \\
+\models & \verb'\models' \\
+\nvdash & \verb'\nvdash' \\
+\nVdash & \verb'\nVdash' \\
+\nvDash & \verb'\nvDash' \\
+\nVDash & \verb'\nVDash' \\
+\perp & \verb'\perp' \\
+\sim & \verb'\sim' \\
+\simeq & \verb'\simeq' \\
+\eqsim & \verb'\eqsim' \\
+\backsim & \verb'\backsim' \\
+\backsimeq & \verb'\backsimeq' \\
+\thicksim & \verb'\thicksim' \\
+\nsim & \verb'\nsim' \\
+\approx & \verb'\approx' \\
+\napprox & \verb'\napprox' \\
+\thickapprox & \verb'\thickapprox' \\
+\approxeq & \verb'\approxeq' \\
+\asymp & \verb'\asymp' \\
+\cong & \verb'\cong' \\
+\ncong & \verb'\ncong' \\
+\doteq & \verb'\doteq' \\
+\doteqdot & \verb'\Doteq \doteqdot' \\
+\risingdotseq & \verb'\risingdotseq' \\
+\fallingdotseq & \verb'\fallingdotseq' \\
+\lessdot & \verb'\lessdot' \\
+\gtrdot & \verb'\gtrdot' \\
+\eqcirc & \verb'\eqcirc' \\
+\circeq & \verb'\circeq' \\
+\bumpeq & \verb'\bumpeq' \\
+\Bumpeq & \verb'\Bumpeq' \\
+\triangleq & \verb'\triangleq' \\
+\multimap & \verb'\multimap' \\
+\propto & \verb'\propto' \\
+\varpropto & \verb'\varpropto' \\
+\lesssim & \verb'\lesssim' \\
+\gtrsim & \verb'\gtrsim' \\
+\lessapprox & \verb'\lessapprox' \\
+\gtrapprox & \verb'\gtrapprox' \\
+\xprec & \verb'\xprec' \\
+\xsucc & \verb'\xsucc' \\
+\preceq & \verb'\preceq' \\
+\succeq & \verb'\succeq' \\
+\precsim & \verb'\precsim' \\
+\succsim & \verb'\succsim' \\
+\precapprox & \verb'\precapprox' \\
+\succapprox & \verb'\succapprox' \\
+\eqslantless & \verb'\eqslantless' \\
+\eqslantgtr & \verb'\eqslantgtr' \\
+\curlyeqprec & \verb'\curlyeqprec' \\
+\curlyeqsucc & \verb'\curlyeqsucc' \\
+\preccurlyeq & \verb'\preccurlyeq' \\
+\succcurlyeq & \verb'\succcurlyeq' \\
+\leqq & \verb'\leqq' \\
+\geqq & \verb'\geqq' \\
+\leqslant & \verb'\leqslant' \\
+\geqslant & \verb'\geqslant' \\
+\lessgtr & \verb'\lessgtr' \\
+\gtrless & \verb'\gtrless' \\
+\lesseqgtr & \verb'\lesseqgtr' \\
+\Also
+\gtreqless & \verb'\gtreqless' \\
+\Also
+\lesseqqgtr & \verb'\lesseqqgtr' \\
+\Also
+\gtreqqless & \verb'\gtreqqless' \\
+\also
+\lvertneqq & \verb'\lvertneqq' \\
+\gvertneqq & \verb'\gvertneqq' \\
+\nleq & \verb'\nleq' \\
+\ngeq & \verb'\ngeq' \\
+\nless & \verb'\nless' \\
+\ngtr & \verb'\ngtr' \\
+\nprec & \verb'\nprec' \\
+\nsucc & \verb'\nsucc' \\
+\lneqq & \verb'\lneqq' \\
+\gneqq & \verb'\gneqq' \\
+\nleqslant & \verb'\nleqslant' \\
+\ngeqslant & \verb'\ngeqslant' \\
+\lneq & \verb'\lneq' \\
+\gneq & \verb'\gneq' \\
+\npreceq & \verb'\npreceq' \\
+\nsucceq & \verb'\nsucceq' \\
+\precnsim & \verb'\precnsim' \\
+\succnsim & \verb'\succnsim' \\
+\lnsim & \verb'\lnsim' \\
+\gnsim & \verb'\gnsim' \\
+\nleqq & \verb'\nleqq' \\
+\ngeqq & \verb'\ngeqq' \\
+\precneqq & \verb'\precneqq' \\
+\succneqq & \verb'\succneqq' \\
+\precnapprox & \verb'\precnapprox' \\
+\succnapprox & \verb'\succnapprox' \\
+\lnapprox & \verb'\lnapprox' \\
+\gnapprox & \verb'\gnapprox' \\
+\Subset & \verb'\Subset' \\
+\Supset & \verb'\Supset' \\
+\subseteqq & \verb'\subseteqq' \\
+\supseteqq & \verb'\supseteqq' \\
+%\varsubsetneq & \verb'\varsubsetneq' \\
+%\varsupsetneq & \verb'\varsupsetneq' \\
+\nsubseteqq & \verb'\nsubseteqq' \\
+\also
+\nsupseteqq & \verb'\nsupseteqq' \\
+\also
+\subsetneqq & \verb'\subsetneqq' \\
+\also
+\supsetneqq & \verb'\supsetneqq' \\
+%\varsubsetneqq & \verb'\varsubsetneqq' \\
+%\varsupsetneqq & \verb'\varsupsetneqq' \\
+\subsetneq & \verb'\subsetneq' \\
+\supsetneq & \verb'\supsetneq' \\
+\nsubseteq & \verb'\nsubseteq' \\
+\nsupseteq & \verb'\nsupseteq' \\
+\trianglerighteq & \verb'\trianglerighteq' \\
+\trianglelefteq & \verb'\trianglelefteq' \\
+\ntrianglerighteq & \verb'\ntrianglerighteq' \\
+\ntrianglelefteq & \verb'\ntrianglelefteq' \\
+\ntriangleleft & \verb'\ntriangleleft' \\
+\ntriangleright & \verb'\ntriangleright' \\
+\between & \verb'\between' \\
+| & \verb'| \vert \mid' \\
+\| & \verb'\| \Vert \parallel' \\
+\interleave & \verb'\interleave' \\
+\shortmid & \verb'\shortmid' \\
+\shortparallel & \verb'\shortparallel' \\
+\shortinterleave & \verb'\shortinterleave' \\
+\nparallel & \verb'\nparallel' \\
+\nmid & \verb'\nmid' \\
+\nshortmid & \verb'\nshortmid' \\
+\nshortparallel & \verb'\nshortparallel' \\
+\end{symbols}
+
+\subsection{Binary Operations}
+\begin{symbols}[1.4]
+\curlywedge & \verb'\curlywedge' \\
+\curlyvee & \verb'\curlyvee' \\
+\veebar & \verb'\veebar' \\
+\barwedge & \verb'\barwedge' \\
+\doublebarwedge & \verb'\doublebarwedge' \\
+\pm & \verb'\pm' \\
+\mp & \verb'\mp' \\
+\times & \verb'\times' \\
+\ltimes & \verb'\ltimes' \\
+\rtimes & \verb'\rtimes' \\
+\leftthreetimes & \verb'\leftthreetimes' \\
+\rightthreetimes & \verb'\rightthreetimes' \\
+\divideontimes & \verb'\divideontimes' \\
+\divides & \verb'\divides' \\
+\uplus & \verb'\uplus' \\
+\sqcap & \verb'\sqcap' \\
+\sqcup & \verb'\sqcup' \\
+\Cup & \verb'\Cup \doublecup' \\
+\Cap & \verb'\Cap \doublecap' \\
+\backslash & \verb'\backslash' \\
+\setminus & \verb'\setminus' \\
+\smallsetminus & \verb'\smallsetminus' \\
+\wr & \verb'\wr' \\
+\lhd & \verb'\lhd' \\
+\rhd & \verb'\rhd' \\
+\unlhd & \verb'\unlhd' \\
+\unrhd & \verb'\unrhd' \\
+\restriction & \verb'\restriction' \\
+\amalg & \verb'\amalg' \\
+\top & \verb'\top' \\
+\bot & \verb'\bot' \\
+\smallsmile & \verb'\smallsmile' \\
+\smallfrown & \verb'\smallfrown' \\
+\smile & \verb'\smile' \\
+\frown & \verb'\frown' \\
+\pitchfork & \verb'\pitchfork' \\
+\dotplus & \verb'\dotplus' \\
+\Join & \verb'\Join' \\
+\bowtie & \verb'\bowtie' \\
+\end{symbols}
+
+\subsection{Miscellaneous Symbols}
+\begin{symbols}
+\dagger & \verb'\dagger' \\
+\ddagger & \verb'\ddagger' \\
+\sectionsymbol & \verb'\sectionsymbol' \\
+\P & \verb'\P' \\
+\angle & \verb'\angle' \\
+\measuredangle & \verb'\measuredangle' \\
+\sphericalangle & \verb'\sphericalangle' \\
+\prime & \verb'\prime' \\
+\backprime & \verb'\backprime' \\
+\surd & \verb'\surd' \\
+\smallint & \verb'\smallint' \\
+\flat & \verb'\flat' \\
+\natural & \verb'\natural' \\
+\sharp & \verb'\sharp' \\
+\partial & \verb'\partial' \\
+\infty & \verb'\infty' \\
+\yen & \verb'\yen' \\
+\therefore & \verb'\therefore' \\
+\because & \verb'\because' \\
+\checkmark & \verb'\checkmark' \\
+\end{symbols}
+
+\subsection{Variable-sized Symbols}
+These symbols come in two sizes which
+do not vary with the point size of your
+font. The big size can be obtained
+by preceding the symbol command with
+the command \verb'\displaystyle'.
+\begin{symbols}[1.3]
+\sum \displaystyle \sum & \verb'\sum' \\
+\product \displaystyle \product & \verb'\product' \\
+\coprod \displaystyle \coprod & \verb'\coprod' \\
+\integral \displaystyle \integral & \verb'\integral' \\
+\oint \displaystyle \oint & \verb'\oint' \\
+\bigcap \displaystyle \bigcap & \verb'\bigcap' \\
+\bigcup \displaystyle \bigcup & \verb'\bigcup' \\
+\bigsqcup \displaystyle \bigsqcup & \verb'\bigsqcup' \\
+\bigvee \displaystyle \bigvee & \verb'\bigvee' \\
+\bigwedge \displaystyle \bigwedge & \verb'\bigwedge' \\
+\bigodot \displaystyle \bigodot & \verb'\bigodot' \\
+\bigotimes \displaystyle \bigotimes & \verb'\bigotimes' \\
+\bigoplus \displaystyle \bigoplus & \verb'\bigoplus' \\
+\biguplus \displaystyle \biguplus & \verb'\biguplus' \\
+\end{symbols}
+
+\subsection{Delimiters}
+\vspace*{-1ex}
+These symbols can be made large to surround large formula.
+E.g., $$\left\lfloor\displaystyle\sum_{i=1}^n x^i\right\rfloor$$
+was generated using
+
+\begin{verbatim}
+\left\lfloor...\right\rfloor
+\end{verbatim}
+\vspace*{-2ex}
+\begin{symbols}[0.8]
+(~~~) & \verb'( )' \\
+\{~~~\} & \verb'\{ \}' \\
+\lfloor~~~\rfloor & \verb'\lfloor \rfloor' \\
+\lceil~~~\rceil & \verb'\lceil \rceil' \\
+\langle~~~\rangle & \verb'\langle \rangle' \\
+\ulcorner~~~\urcorner & \verb'\ulcorner \urcorner' \\
+\llcorner~~~\lrcorner & \verb'\llcorner \lrcorner' \\
+\uparrow & \verb'\uparrow' \\
+\downarrow & \verb'\downarrow' \\
+\updownarrow & \verb'\updownarrow' \\
+\Uparrow & \verb'\Uparrow' \\
+\Downarrow & \verb'\Downarrow' \\
+\Updownarrow & \verb'\Updownarrow' \\
+\end{symbols}
+
+\subsection{Math Accents}
+\vspace*{-1ex}
+\begin{symbols}[0.2]
+\hat{a} & \verb'\hat{a}' \\
+\widehat{a} & \verb'\widehat{a}' \\
+\widehat{aa} & \verb'\widehat{aa}' \\
+\widehat{aaa} & \verb'\widehat{aaa}' \\
+\tilde{a} & \verb'\tilde{a}' \\
+\widetilde{a} & \verb'\widetilde{a}' \\
+\widetilde{aa} & \verb'\widetilde{aa}' \\
+\widetilde{aaa} & \verb'\widetilde{aaa}' \\
+\check{a} & \verb'\check{a}' \\
+\breve{a} & \verb'\breve{a}' \\
+\acute{a} & \verb'\acute{a}' \\
+\grave{a} & \verb'\grave{a}' \\
+\bar{a} & \verb'\bar{a}' \\
+\vec{a} & \verb'\vec{a}' \\
+\dotaccent{a} & \verb'\dotaccent{a}' \\
+\ddot{a} & \verb'\ddot{a}' \\
+\end{symbols}
+
+\subsection{Size Commands}
+\vspace*{-1ex}
+\begin{symbols}
+\mu~\zsmall\mu~\zSmall\mu &\verb'\mu \zsmall\mu \zSmall\mu'\\
+\zbig\mu~\zBig\mu~\zBIG\mu &\verb'\zbig\mu \zBig\mu \zBIG\mu'\\
+\end{symbols}
+\end{document}
+
diff --git a/systems/msdos/emtex-contrib/zemtex/zemtex11.doc b/systems/msdos/emtex-contrib/zemtex/zemtex11.doc
new file mode 100644
index 0000000000..78add65154
--- /dev/null
+++ b/systems/msdos/emtex-contrib/zemtex/zemtex11.doc
@@ -0,0 +1,203 @@
+
+ Documentation on Using Z with EMTEX LaTex
+ -----------------------------------------
+ Version 1.1 28 May 1993
+
+
+
+ Introduction
+ ------------
+
+There are numerous macros available for extending LaTex to set Z and
+other predicate calculus documents. The file 'oz.tex' by Paul King is
+very good and demonstrates what can be done. It also incorporates the
+Object-Z extensions by the University of Queenland.
+
+I had a problem with fonts when I tried to run 'oz.tex'. Speaking to
+others, it seems this is common with would-be users.
+I am running emtex on a PC, either in a DOS session with extended
+environment space within OS/2 2.0, or in an OS/2 text screen.
+I discovered that some fonts are available on Internet (if you know what
+you need) for immediate use; others have to be massaged before use.
+I now have a set which works.
+
+There are two sets of fonts needed. The former is used to translate from
+a '.tex' file to a '.dvi' file. A different set is needed to generate a
+printer file from the '.dvi' file. I have constructed a font library for
+the hp laser jet printer. You will need another version of the second
+set if you are not using a laser jet printer.
+
+To save others from spending lots of hours on setting up their systems,
+here is a description of what to do.
+
+
+
+ Differences from Version 1.0
+ ----------------------------
+
+Version 1.0 was written for emTeX version of late 1990. Since then,
+another version has been released, in late 1992. The files for my
+version 1.0 were not all useable with the 1992 release. Specifically,
+the problem was with the fli file. This has been rectified by changing
+the name 'amsz.fli' to lj_amsz.fli'.
+
+A change to the calling of libraries in config files has required the
+addition of another config file. To distinguish between the two
+versions, I have added the year to the file name. Now there is an
+'lj1990.cnf' file and an 'lj1992.cnf' file.
+
+
+
+ Associated Files
+ ----------------
+
+You should have the following associated files:
+
+ texinput.zip
+ This contains style additions to the texinput directory.
+ The files are oz.sty and 3column.sty. The latter is the normal
+ 'threecolumn.sty' with a name change as mentioned below.
+
+ tfm.zip
+ This contains additional fonts in tfm format. These are used to
+ produce the '.dvi' files.
+
+ lj_amsz.fli
+ This is a font library for producing laser jet output from the
+ '.dvi' files. (In my version 1.0, this was known as 'amsz.fli').
+
+ lj1990.cnf
+ lj1992.cnf
+ These are two versions of the (modified) configuration file used
+ by 'dvihplj'. The file 'lj1990.cnf' is for the 1990 version of
+ emTeX; the file 'lj1992.cnf' is for the 1992 version of emTeX.
+ Select the appropriate one for your system and either use it as
+ a template for modifications to your own, or use it in place of
+ your existing. To use either unchanged, do a
+ "copy a:lj1990.cnf c:\emtex\lj.cnf /v"
+ or
+ "copy a:lj1992.cnf c:\emtex\lj.cnf /v"
+ Of course, you adjust the source and destination drives and
+ destination directory to suit your own preferences. The examples
+ are guides.
+
+ oz.tex
+ This is a tutorial on using LaTex for Z and test document. This
+ version has 'threecolumn' changed to '3column'.
+
+
+
+ Setting Up
+ ----------
+
+1. To produce a dvi file:
+-------------------------
+
+
+a) Load the style files.
+
+Unzip 'oz.sty' and '3column.sty' from 'texinput.zip'.
+Use 'pkunzip a:texinput' or 'unzip a:texinput'.
+Copy 'oz.sty' and '3column.sty' into the directory used for 'texinput'
+styles etc. On emtex, this defaults on installation to '\emtex\texinput'.
+It should contain files like 'article.sty' and 'book.sty'.
+
+Note that on the Internet, '3column.sty' is 'threecolumn.sty'.
+I changed the name for PC FAT file system use. For the same reason, in
+'oz.tex', I changed the reference to 'threecolumn' to '3column'.
+
+You can do this process in one step. If the zip file is on drive A:,
+ cd \emtex\texinput
+ pkunzip a:texinput
+will extract the files into the correct directory.
+
+
+
+b) Load the dvi fonts.
+
+To set up the fonts for the dvi genertion phase, copy the contents of
+the 'tfm.zip' file into the directory for '.tfm' files.
+With emtex, this defaults on installation to 'emtex\tfm'.
+Again, in one step, if the zip file is on drive A:,
+ cd \emtex\tfm
+ a:pkunzip a:tfm
+will extract the files into the working directory.
+
+
+
+Now you can run 'latex oz' to generate from 'oz.tex' a file 'oz.dvi'.
+
+
+
+
+
+2. To produce laser jet output:
+-------------------------------
+
+
+a) Copy the font library.
+
+The font library is stored with other '.fli' files in a directory set by
+the environment variable 'DVIDRVFONTS'. This value is set when
+an initialization batch file is run. The default file is 'set-tex.bat'
+for DOS or 'set-tex.cmd' for OS/2, and the default value of
+'DVIDRVFONTS' is 'c:\texfonts'. To check your current setting, enter
+'set' after normal initialization.
+
+Find the directory and copy the library 'lj_amsz.fli' into it.
+(NB: In version 1.0 of this file, the file name was 'amsz.fli'. I have
+changed the name, but not the contents. If you have already installed
+the earlier file, you need only to change the name.)
+
+I created this library using fontlib and fonts from the AMS ftp server.
+The name means AMS symbols for Z.
+
+
+
+b) Modify the configuration file 'lj.cnf'.
+
+This file is used by the program 'dvihplj'. The change is on the line
+where the value '/pl' is set.
+
+If you are using the 1990 version of emTeX,
+append ';lj_amsz' to the line so this library will be searched too.
+Refer to the sample file 'lj1990.cnf'.
+
+If you are running the 1992 version of emTeX,
+add the name by changing the line
+'/pl=$DVIDRVFONTS:lj_{0,h,1,2,3,4,5a,5b,sli}'
+to the line
+'/pl=$DVIDRVFONTS:lj_{0,h,1,2,3,4,5a,5b,sli,amsz}'
+Refer to the sample file 'lj1992.cnf'.
+
+Alternatively, copy the modified version from my distribution package.
+If you are using the 1990 version of emTeX, do a
+'copy a:lj1990.cnf c:\emtex\lj.cnf /v'
+or, if you are using the 1992 version, do a
+'copy a:lj1992.cnf c:\emtex\lj.cnf /v'
+(See also the note above in 'Associated Files'.)
+
+
+
+Now you can run 'dvihplj @lj.cnf <dvi file>'.
+
+When dvihplj is loading fonts, there are some warning messages about wrong
+magnification. The output seems to be ok so these probably need not
+trouble you.
+
+
+------------------------------------------------------
+
+Selwyn Russell
+Information Security Research Centre
+Faculty of Information Technology
+Queensland University of Technology
+2 George Street
+Brisbane 4000
+Australia
+
+Telephone: +61 7 864 1619
+Fax: +61 7 221 2384
+Internet: selwyn@fitmail.qut.edu.au
+
+
diff --git a/systems/msdos/emtex-fonts/contrib/00readme b/systems/msdos/emtex-fonts/contrib/00readme
new file mode 100644
index 0000000000..4e0b2d98c4
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/00readme
@@ -0,0 +1,23 @@
+%
+% 300dpi DC_Fonts 24.08.94
+%
+% Matthias Eckermann, Munich, Germany <ud311aa@sunmail.lrz-muenchen.de>
+%
+
+In some mailing and news lists people wanted PKs for the DC-Fonts,
+because they could not install them properly.
+So I produced two FLI-files for 300dpi which can be used by:
+emTeX's DVIDRV, some DVIPS, XDVI-FLI (LinuX).
+
+There is also a file testdc.tex which I used to test if I really made
+all (or) most fonts of DC for LaTeX2e.
+
+Hope it's helpful -
+
+Matthias Eckermann
+
+P.S.: Please check out the file dc_all.mfj, because it's a hand-made
+ translation of LaTeX2e's t1*.fd-files to mfj.
+
+** ERRARE HUMANUM EST **
+
diff --git a/systems/msdos/emtex-fonts/contrib/ams101.fli b/systems/msdos/emtex-fonts/contrib/ams101.fli
new file mode 100644
index 0000000000..4212286309
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/ams101.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/cmcyrfnt/INSTALL b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/INSTALL
new file mode 100644
index 0000000000..571e4ce2b2
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/INSTALL
@@ -0,0 +1,108 @@
+ Installation instruction for cyrillic fonts in ALT encoding
+ -----------------------------------------------------------
+
+This file describes how to install cyrillic fonts on a TeX/LaTeX system.
+Special attention is given to installation for EmTeX
+(MSDOS-OS/2 implementation of TeX).
+
+The CMCYRALT font distribution presented here was uploaded
+to CTAN by Vadim V. Zhytnikov (vvzhy@phy.ncu.edu.tw)
+on behalf of Alexander Harin (harin@lourie.und.ac.za).
+
+I added this INSTALL file to make instllation easier for users
+that don't have a lot of TeX/LaTeX experience.
+For users of EmTeX I supply cyrillic font library cmcyr_lj.fli,
+so they do not have to learn how to use MetaFont/MfJob.
+
+
+What is required
+================
+
+1. TeX ver 3.0 or later, version 3.1415 is preferable.
+
+MSDOS-OS/2 users:
+You can get EmTeX 3.0 from CTAN directory /systems/msdos/emtex
+(CTAN is Common TeX Archive Network, its site in the US
+is ftp.shsu.edu:/tex-archive).
+You also can get beta release of EmTeX 3.1415
+from /systems/msdos/emtex/betatest.
+
+UNIX users:
+You probably already have newest version of TeX on your system.
+Otherwise take a look at /systems/unix of CTAN.
+
+
+2. Cyrillic style files for LaTeX2e or LaTeX 2.09.
+You can get LaTeX2e files from /macros/latex/contrib/other/cmcyralt
+or from ftp.cs.umd.edu:/pub/cyrillic/cmcyralt/cmcyr2e.zip.
+LaTeX 2.09 (this version of LaTeX is now considered obsolete)
+files can be obtained from /macros/latex209/contrib.
+
+
+How to unpack and install
+=========================
+
+1. Create directory cmcyrfnt and unpack the zip file into it
+with preserving directory structure.
+
+For example, in MSDOS:
+
+pkunzip -d cmcyrfnt.zip
+
+1a. MSDOS users only: In this distribution end-of-line
+character for text files is LF.
+To convert text files to MSDOS convention (end-of-line is
+CR-LF), type "convers.exe +r *.*" in directory cmcyrfnt
+and all its text subdirectories (that is, all subdirectories
+except VF and TFM). Convers.exe is supplied together with
+this distribution.
+
+
+2. Add TFM subdirectory to TFM (font metrics) path variable.
+
+For example, in MSDOS:
+
+set tfm=d:\emtex\tfm;d:\cmcyrfnt\tfm
+
+Now if LaTeX cmcyr package is installed, you can use LaTeX
+to produce *.dvi files. However, to print or view *.dvi files,
+you have to do more.
+
+
+3. Add VF subdirectory to virtual font path.
+
+For example, if you are using dviscr to view *.dvi files
+and dvihplj to print them, you have to change the /pv line
+in file lj.cnf to:
+
+/pv=d:\cmcyrfnt\vf
+
+
+4. Getting cyrillic font bodies.
+
+a) EmTeX users who need 300 DPI fonts for HP LaserJet and screen viewer:
+Download file cmcyr_lj.fli to the same directory cmcyrfnt.
+
+Add the cmcyrfnt directory to the font library path.
+Change the /pl line in lj.cnf to something like:
+
+/pl=%DVIDRVFONTS%;d:\cmcyrfnt;lj_0;lj_h;lj_1;lj_2;lj_3;lj_4;lj_5a;lj_5b;cmcyr_lj
+
+Examples of autoexec.bat and emtex\lj.cnf files are given
+in directory cmcyrfnt\setup.
+
+
+b) All others.
+
+You will need to generate font bodies (*.pk) from
+the font sources (*.mf) using MetaFont and MfWare programs
+(they are part of any decent TeX package (for example, of EmTeX)).
+
+File cmcyr.mfj is a batch file for MfJob that performs
+generation of cmcyralt fonts in PK format.
+Since there is a bug in definition of cyrillic letter d
+in fonts czssq8 and czssqi8, I included file mfjob.log
+that lists these bugs.
+
+After generating fonts you can create a font library (*.fli)
+from them using the file setup/cmcyr.bat (EmTeX only).
diff --git a/systems/msdos/emtex-fonts/contrib/cmcyrfnt/README b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/README
new file mode 100644
index 0000000000..3bbe822d1b
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/README
@@ -0,0 +1,49 @@
+NOTE: I changed directory structure a little bit and added
+generated font library cmcyr_lj.fli, so you won't have to learn
+how to use Metafont. See file INSTALL for installation instructions.
+The changes that I did are meant to make installation easier.
+
+Vadim Maslov, vadik@cs.umd.edu
+-----------------------------------------------------------------
+
+ Russian fonts in alternative encoding.
+
+The alternative encoding is de-facto standard on MS-DOS PC
+computers in Russia. In this encoding first half of code
+table (0-127) coincides with standard ASCII and cyrillic
+characters are located in second part of the table (128-255).
+Usually some simple screen and keyboard driver is used in order
+to type cyrillic characters.
+
+This directory contains:
+
+readme - this file
+readme.ori - original readme by A.Harin
+cmcyralt.tex - original readme by A.Harin in Russian
+
+mf.zip - METAFONT sources *.mf of cmcyr fonts by A.Samarin and N.Glonti
+ with modifications by A.Harin
+
+vf.zip - Virtual fonts *.vf by A.Harin. This composite fonts
+ reproduce alternative encoding by mapping first half
+ of ASCII table to standard TeX's Computer Modern font
+ and second part to cmcyr fonts in alternative encoding.
+
+vpl.zip - readable analog of *.vf files
+
+tfm.zip - Font Metric files
+
+emtex.zip - Some useful files which can help to set up
+ Russian fonts with emTeX
+
+The LaTeX styles which can be used with these fonts are in CTAN:
+/macros/latex209/contrib/cmcyralt for LaTeX NFSS1
+/macros/latex/contrib/other/cmcyralt for LaTeX 2e
+
+In order to use this fonts and styles you will need TeX which
+understand 8-bit input, and drivers which understand virtual fonts.
+The best choice for MS-DOS PC is emTeX and its dvidrv drivers
+(/systems/msdos/emtex directory on CTAN).
+
+Uploaded by Vadim V. Zhytnikov (vvzhy@phy.ncu.edu.tw)
+on the behalf of Alexander Harin (harin@lourie.und.ac.za)
diff --git a/systems/msdos/emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.fli b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.fli
new file mode 100644
index 0000000000..cf894eb8a6
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/dc_all.mfj b/systems/msdos/emtex-fonts/contrib/dc_all.mfj
new file mode 100644
index 0000000000..fdeae5cf88
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/dc_all.mfj
@@ -0,0 +1,81 @@
+%
+% This mfjob-file is only experimental -- try it with \LaTeXe and DC-Fonts.
+% Matthias Eckermann, Munich <ud311aa@sunmail.lrz-muenchen.de>
+%
+% dc_all.mfj
+%
+{
+ mode=hplaser[300];
+ base=dx;
+ output=pk[c:\newfonts\@Rrdpi\@f];
+%
+% 1.: all fonts that are ONLY produced in design-size: s0
+%
+ {
+ name=[@f@s];
+ commands=[gensize:=@s; generate @f];
+ mags=s0;
+ font(sizes)=dcdunh (5 6 7 8 9)
+ dcfib (8 9 10 12)
+ dcff (10)
+ dcfi (10)
+ dcr (5 6 7 8 9)
+ dcsl (9)
+ dcti (7 8 9)
+ dcu (7 8 9)
+ dcb (5 6 7 8 9)
+ dcbx (5 6 7 8 9)
+ dcbxsl (5 6 7 8 9)
+ dcss (9)
+ dcssi (9)
+ dctt (8 9)
+ dcitt (8 9)
+ dcsltt (8 9);
+ }
+%
+% 2.: all fonts that are ONLY produced in s0, sh
+%
+ {
+ mags=s0 sh;
+ fonts=dcdunh10 dcr10 dcsl10 dcti10 dcu10 dcb10 dcbx10
+ dcbxsl10 dcss10 dcssi10 dctt10 dcitt10 dcsltt10 dctcsc10;
+ }
+%
+% 3.: all fonts that are ONLY produced in s0, s1
+%
+ {
+ mags=s0 s1;
+ fonts=dcdunh12 dcr12 dcsl12 dcti12 dccsc12 dcu12 dcb12 dcbxti12
+ dcss12 dcssi12 dcitt12 dctcsc12;
+ }
+%
+% 4.: all fonts that are ONLY produced in s0, s1, s2 (mostly 17-design-size)
+%
+ {
+ mags=s0 s1 s2;
+ fonts=dcdunh17 dcr17 dcsl17 dcti17 dccsc17 dcu17 dcb17 dcbxti17
+ dcss17 dcssi17 dcitt17 dctcsc17;
+ }
+%
+% 5.: dcbx12 dcbxsl12 dctt12 dcsltt12
+%
+ {
+ mags=s0 s1 s2 s3 s4;
+ fonts=dcbx12 dcbxsl12 dctt12 dcsltt12;
+ }
+%
+% 6.: varia
+%
+ {
+ font(mags) = dcsl8 (0.625 0.75 0.875 1)
+ dcss8 (0.625 0.75 0.875 1)
+ dcssi8 (0.625 0.75 0.875 1)
+ dcti7 (0.714286 0.857143)
+ dcu7 (0.714286 0.857143)
+ dccsc10 (0.5 0.6 0.7 0.8 0.9 1.0 sh)
+ dcbxti10 (0.5 0.6 0.7 0.8 0.9 1.0 sh)
+ dcssdc10 (0.5 0.6 0.7 0.8 0.9 1.0 sh s1 s2 s3 s4 s5)
+ dcssbx10 (0.5 0.6 0.7 0.8 0.9 1.0 sh s1 s2 s3 s4 s5);
+ }
+}
+
diff --git a/systems/msdos/emtex-fonts/contrib/fdori101.fli b/systems/msdos/emtex-fonts/contrib/fdori101.fli
new file mode 100644
index 0000000000..bee7ab95b9
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/fdori101.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/lj_dc_a.fli b/systems/msdos/emtex-fonts/contrib/lj_dc_a.fli
new file mode 100644
index 0000000000..08d405dda5
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/lj_dc_a.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/lj_dc_b.fli b/systems/msdos/emtex-fonts/contrib/lj_dc_b.fli
new file mode 100644
index 0000000000..35bef0b509
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/lj_dc_b.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/p6h_dc.readme b/systems/msdos/emtex-fonts/contrib/p6h_dc.readme
new file mode 100644
index 0000000000..0f8f6217f6
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/p6h_dc.readme
@@ -0,0 +1,16 @@
+This is the README for
+ p6h_dc_a.fgz
+ p6h_dc_b.fgz
+where ".FGZ" means ".FLI.GZ".
+These are the DC_FONTS for 360dpi
+(EPSON & NEC D - dot printers) as emTeX-FLI-Libraries.
+The Libs are generated by running "mfjob dc_all.mfj"
+with the appropriate mode.
+
+Hope it's helpful --
+ Matthias
+
+--
+Matthias Eckermann -- errare humanum est --
+stud.phil., Munich/ Germany <ud311aa@sunmail.lrz-muenchen.de>
+
diff --git a/systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgz b/systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgz
new file mode 100644
index 0000000000..dd150c7866
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgz
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgz b/systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgz
new file mode 100644
index 0000000000..e98bd4841d
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgz
Binary files differ
diff --git a/systems/msdos/emtex-fonts/contrib/testdc.tex b/systems/msdos/emtex-fonts/contrib/testdc.tex
new file mode 100644
index 0000000000..05552480fd
--- /dev/null
+++ b/systems/msdos/emtex-fonts/contrib/testdc.tex
@@ -0,0 +1,58 @@
+%
+% This is only a small hack, 24.08.94
+% Matthias Eckermann, Munich, Germany <ud311aa@sunmail.lrz-muenchen.de>
+%
+% THIS "DOCUMENT" PRODUCES AS MANY DIFFERENT FONTS AS POSSIBLE
+% TO TEST YOUR DC-FONT INSTALLATION: DON'T CARE ABOUT LATEX-WARNINGS
+% TRY SAME WITH 11pt AND 12pt!
+% PERHAPS YOU HAVE TO ENLARGE YOUR DVI-DRIVER!? (works fine with emTeX's DVIDRV)
+% With LaTeX2e PatchLevel3 your DVI-Driver must load 130 Fonts at 10pt,
+% 134 at 11pt, 121 at 12pt
+%
+% Header
+%
+%\documentclass[12pt]{article}
+%\documentclass[11pt]{article}
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\pagestyle{empty}
+\parindent0in
+\textheight9.5in
+\textwidth6.5in
+%
+% Macros
+%
+\newcommand{\TestSizes}{{%
+\tiny Test\scriptsize Test\footnotesize Test\small Test
+\normalsize Test
+\large Test\Large Test\LARGE Test\huge Test\Huge Test}}
+%
+\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}
+%
+% Body
+%
+\begin{document}
+\message{.THIS "DOCUMENT" PRODUCES AS MANY DIFFERENT FONTS AS POSSIBLE............}
+\message{.TO TEST YOUR DC-FONT INSTALLATION: DON'T CARE ABOUT LATEX-WARNINGS......}
+\message{.TRY SAME WITH 11pt AND 12pt!............................................}
+\message{.PERHAPS YOU HAVE TO ENLARGE YOUR DVI-DRIVER!?..With LaTeX2e PatchLevel3.}
+\message{.your DVI-Driver must load 130 Fonts at 10pt, 134 at 11pt, 121 at 12pt...}
+\TestShapes
+\end{document}
+%
+% End
+%
+
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/README.fx_med_fonts b/systems/msdos/emtex-fonts/fx_med_fonts/README.fx_med_fonts
new file mode 100644
index 0000000000..cd5161330f
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/README.fx_med_fonts
@@ -0,0 +1,21 @@
+Date: Tue, 22 Jun 93 04:23:26 PDT
+From: sendouk@scf.usc.edu (Hippocrates Sendoukas)
+Message-ID: <9306221123.AA05934@phakt.usc.edu>
+
+I put a set TeX fonts in the directory /incoming/fx_med. The files are:
+ fx_med_0.fli fx_med_2.fli fx_med_5.fli
+ fx_med_h.fli fx_med_3.fli
+ fx_med_1.fli fx_med_4.fli
+These fonts are for the Epson 9-pin printers at 240x144dpi and are in
+the FLI format which can be used by the EmTeX drivers, dvips, dviwin and
+possibly other dvi drivers. Each file corresponds to a standard magstep
+and contains all the fonts for plain TeX, LaTeX and some of the utility
+fonts used by Knuth (logo* and manfnt). The main reason for uploading them
+is that the FX fonts supplied with EmTeX use a resolution of 240x216dpi
+which cannot be used under MS-Windows because the printer drivers do not
+support that resolution. These fonts are the only ones I know that can be
+used under MS-Windows.
+
+Sincerely,
+
+Hippocrates Sendoukas sendouk@scf.usc.edu
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_0.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_0.fli
new file mode 100644
index 0000000000..107e9c1ab7
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_0.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_1.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_1.fli
new file mode 100644
index 0000000000..4da8f5bd66
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_1.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_2.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_2.fli
new file mode 100644
index 0000000000..a291cd2140
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_2.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_3.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_3.fli
new file mode 100644
index 0000000000..9f777b6015
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_3.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_4.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_4.fli
new file mode 100644
index 0000000000..a4097fa31a
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_4.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_5.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_5.fli
new file mode 100644
index 0000000000..c120013430
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_5.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_h.fli b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_h.fli
new file mode 100644
index 0000000000..21240e6877
--- /dev/null
+++ b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_h.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/README.PS b/systems/msdos/emtex-fonts/psfonts/README.PS
new file mode 100644
index 0000000000..8163449a66
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/README.PS
@@ -0,0 +1,189 @@
+%
+% This file has been corrected and modified on 05/31/93
+%
+Instructions to install PostScript Font Libraries
+in Your System:
+The following files form this group:
+
+ 1) ps_0.fli
+ 2) ps_1.fli
+ 3) ps_2.fli
+ 4) ps_3.fli
+ 5) ps_4.fli
+ 6) ps_5.fli
+ 7) ps_h.fli
+ 8) fonttst1.tex , fonttst2.tex
+ 10) readme ( this file).
+
+------------------------------------------------------
+
+These library files have been generated from the .pk
+files available in the file
+\pub\archive\fonts\postscript\pk-files\psfonts.zip
+
+These files were converted from UNIX naming convention
+i.e. fontname.(res)pk to DOS naming convention
+i.e. fontname.pk.
+
+This enables a user to use 6 files instead of the numerous
+.pk files.
+------------------------------------------------------
+
+1) The following 6 files have been created, using the
+ betatest version of emtex FONTLIB program.
+ ( If you have any problems with the older version
+ please contact us at the email address mentioned below)
+
+ ps_0.fli,ps_1.fli,ps_2.fli,ps_3.fli,ps_4.fli,ps_5.fli,ps_h.fli.
+
+2) Move these files into the \texfonts directory where you
+ have stored your lj_*.fli files (or other printer type
+ library files).
+
+3) Modify the .cnf (or other appropriate .cnf file that
+ you are using) in the \emtex directory. The /pl line is
+ to be modified as shown in the sample lj.cnf here. (You
+ can copy this file into the \emtex directory if you are
+ using laserjet fonts). This is modified to use both the
+ laserjet and postscript fonts.( See first arrow line
+ in (8) below ). We have worked with p6l.cnf,p6m.cnf,p6h.cnf
+ as of now.
+
+4) Also modify newfonts.sub in the emtex directory with
+ the one given here and shown below in (10). Add the line
+ /ps=c:\emtex\newfonts.sub
+ in your .cnf file. ( This has already been done in the
+ lj.cnf file shown here). See second arrow line in (8) below.
+
+
+5) YOU ARE GOOD TO GO.
+
+6) EXAMPLES :
+ --------
+
+ i) FONTTST1.TEX - This gives the available postscript
+ fonts that can be used.
+ ii) FONTTST2.TEX- This gives postscript fonts at different
+ sizes. The sizes shown here are the ones that can exactly
+ be simulated.
+ Look into them for details. LaTeX them for checking your
+ installation.
+
+7) USAGE :
+ -----
+ a) Available Fonts:
+ ---------------
+
+ The available fonts are shown in the file fonttst1.tex.
+ The bracketed term shows the short form of these fonts to be used.
+
+ b) Point sizes available:
+ ---------------------
+
+ The point size can be defined by you. Look in the file
+ fonttst2.tex for its usage. Fonttst2.dvi shows the size. You
+ can use the following point size exactly (5,6,7,8,9,10,11,14,
+ 17,20,25). The previewer will however work with any point size
+ from 5 to 25, but will display only the above font sizes exactly
+ ( since the .pk files have been available only in the above sizes).
+ This has been done by using font substitution in the file newfonts.sub.
+ See section (10) below for the modifications in newfonts.sub
+ These point sizes are exact for 300DPI resolution. For resolutions
+ 180x180 DPI and 360x360 DPI appropriate substitutions have been made.
+
+ c) Driver prompts for unavailable resolution ?
+ -----------------------------------------
+
+ In this event the only choice is to specify a resolution closest
+ to the ones available ( 150,180,210,240,270,300,329,360,432,518,
+ 622,746).
+
+8) Modifications in the .cnf ( Example here uses lj.cnf). These
+ templates are for dvidrv 1.4s. The template for dvidrv 1.4d
+ or other versions is slightly different. ( You can rename it
+ as ps.cnf and change the batch files suitably ).
+
+ % lj.cnf (300x300 DPI using LJ fonts)
+ /pd={,$DVIDRVINPUT:}@i
+======> /pl=$DVIDRVFONTS:{lj_{0,h,1,2,3,4,5a,5b,sli},ps_{0,1,2,3,4,5,h}}
+ /pf={,{$DVIDRVFONTS:pixel{.lj,.ps}}\@Rrdpi\}@f{.pk,.pxl}
+ /pg={,$DVIDRVGRAPH:}{@Rrdpi\,}@PBf{@Ef,.msp,.pcx,.bmp}
+ /r=300
+ /rf=300
+ /fs=1
+ /fm=hplaser
+ /fd=2
+======> /ps=d:\emtex\newfonts.sub
+
+9) Printing exact fontsizes that are not defined above:
+ ---------------------------------------------------
+
+ However you can print the exact point sizes (other than the ones
+ shown above) as you have defined using the utility : DVIPS (to
+ create a .ps file from the .dvi file). Use GHOSTSCRIPT to print
+ your postscript file.
+
+
+10) Modifications in NEWFONTS.SUB.
+ ----------------------------
+
+ The font substitutions are currently working for 300X300 DPI
+ printer ( HP laserjet printer ), 360 x 360 DPI printer driver
+ and 180 x 180 DPI printer driver. These substitutions have
+ been done to work with the following .cnf files ( p6l.cnf ,
+ p6m.cnf & p6h.cnf and lj.cnf).
+
+ circle* * -> lcircle* *
+ %
+ % Substitution for 11pt-25pt at 300 x 300 DPI
+ %
+ p* 330 -> p* 329
+ p* 420 -> p* 432
+ p* 450 -> p* 432
+ p* 480 -> p* 432
+ p* 510 -> p* 518
+ p* 540 -> p* 518
+ p* 570 -> p* 518
+ p* 600 -> p* 622
+ p* 630 -> p* 622
+ p* 660 -> p* 622
+ p* 690 -> p* 622
+ p* 720 -> p* 746
+ p* 750 -> p* 746
+ %
+ % Substitution for 11pt-25pt at 180 x 180 DPI
+ %
+ p* 197.18011 -> p* 180
+ p* 259.2 -> p* 270
+ p* 373.194 -> p* 360
+ p* 447.66 -> p* 432
+ p* 306 -> p* 329
+ p* 252 -> p* 240
+ p* 216 -> p* 216
+ p* 198 -> p* 210
+ p* 162 -> p* 180
+ p* 144 -> p* 150
+ p* 126 -> p* 150
+ p* 108 -> p* 108
+ p* 108.00002 -> p* 150
+ p* 90 -> p* 150
+ %
+ % Substitution for 11pt-25pt at 360 x 360 DPI
+ %
+ p* 900 -> p* 746
+ p* 612 -> p* 622
+ p* 504 -> p* 518
+ p* 396 -> p* 432
+ p* 394.36024 -> p* 432
+ p* 324 -> p* 329
+ p* 288 -> p* 270
+ p* 216 -> p* 216
+ p* 216.00002 -> p* 210
+
+
+ GOOD LUCK WITH THIS USAGE. YOU CAN ADDRESS ANY COMMENTS/PROBLEMS TO
+
+ GANESH THIAGARAJAN / ANTHONY VENSON
+ email:
+ gany@rtpc01.eng.lsu.edu
+ andy@rtpc01.eng.lsu.edu.
diff --git a/systems/msdos/emtex-fonts/psfonts/fonttst1.tex b/systems/msdos/emtex-fonts/psfonts/fonttst1.tex
new file mode 100644
index 0000000000..cc9538dc8b
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/fonttst1.tex
@@ -0,0 +1,68 @@
+\documentstyle{article}
+\font\tmr=ptmr at 10.966pt
+\font\tmri=ptmri at 10.966pt
+\font\tmb=ptmb at 10.966pt
+\font\tmbi=ptmbi at 10.966pt
+\font\hvr=phvr at 10.966pt
+\font\hvo=phvro at 10.966pt
+\font\hvb=phvb at 10.966pt
+\font\hvbo=phvbo at 10.966pt
+\font\cou=pcrr at 10.966pt
+\font\couo=pcrro at 10.966pt
+\font\coubo=pcrbo at 10.966pt
+\font\coub=pcrb at 10.966pt
+\font\avgd=pagd at 10.966pt
+\font\avgdo=pagdo at 10.966pt
+\font\avgdk=pagk at 10.966pt
+\font\avgdko=pagko at 10.966pt
+\font\bkl=pbkl at 10.966pt
+\font\bkli=pbkli at 10.966pt
+\font\bkd=pbkd at 10.966pt
+\font\bkdi=pbkdi at 10.966pt
+\font\hvnr=phvrrn at 10.966pt
+%\font\hvnro=phvron at 10.966pt
+\font\ncr=pncr at 10.966pt
+\font\ncri=pncri at 10.966pt
+\font\ncb=pncb at 10.966pt
+\font\ncbi=pncbi at 10.966pt
+\font\plr=pplr at 10.966pt
+\font\plri=pplri at 10.966pt
+\font\plb=pplb at 10.966pt
+\font\plbi=pplbi at 10.966pt
+
+\begin{document}
+\begin{center}
+\tmbi \underline{Available Postscript fonts}
+\end{center}
+\tmr (ptmr) - This is a demo for Times-Roman \\
+\tmri (ptmri) - This is a demo for Times-Italic \\
+\tmb (ptmb) - This is a demo for Times-Bold \\
+\tmbi (ptmbi) - This is a demo for Times-BoldItalic \\
+\hvr (phvr) - This is a demo for Helvetica \\
+\hvo (phvo) - This is a demo for Helvetica-Italic \\
+\hvb (phvb) - This is a demo for Helvetica-Bold \\
+\hvbo (phvbo) - This is a demo for Helvetica-BoldOblique \\
+\cou (pcou) - This is a demo for Courier \\
+\couo (pcouo) - This is a demo for Courier Oblique \\
+\coubo (pcoubo) - This is a demo for Courier Bold \\
+\coub (pcoub) - This is a demo for Courier Bold Oblique \\
+\avgd (pagd) - This is a demo for AvanGarde Book \\
+\avgdo (pagdo) - This is a demo for AvantGarde Book Oblique \\
+\avgdk (pagk) - This is a demo for AvantGarde Demi \\
+\avgdko (pagko) - This is a demo for AvantGarde Demi Oblique \\
+\bkl (pbkl) - This is a demo for Bookman-Light \\
+\bkli (pbkli) - This is a demo for Bookman-Light Italic \\
+\bkd (pbkd) - This is a demo for Bookman-Demi \\
+\bkdi (pbkdi) - This ia a demo for Bookman-DemiItalic \\
+\hvnr (phvrrn) - This is a demo for Helvetica Narrow \\
+%\hvnro This is a demo for Helvetica Narrow Oblique \\
+%\hvnbo This is a demo for Helvetica Narrow Bold Oblique \\
+\ncr (pncr) - This is a demo for NewCentury \\
+\ncri (pncri) - This is a demo for NewCentury Italic \\
+\ncb (pncb) - This is a demo for NewCentury Bold \\
+\ncbi (pncbi) - This is a demo for NewCentury Bold Italic \\
+\plr (pplr) - This is a demo for Palatino-Roman \\
+\plri (pplri) - This is a demo for Palatino-Roman Italic \\
+\plb (pplb) - This is a demo for Palatino-Roman Bold \\
+\plbi (pplbi) - This is a demo for Palatino-Roman Italic \\
+\end{document}
diff --git a/systems/msdos/emtex-fonts/psfonts/fonttst2.tex b/systems/msdos/emtex-fonts/psfonts/fonttst2.tex
new file mode 100644
index 0000000000..44676605cb
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/fonttst2.tex
@@ -0,0 +1,30 @@
+\documentstyle{article}
+\font\tmra=pagko at 5pt
+\font\tmrb=pagko at 6pt
+\font\tmrc=pagko at 7pt
+\font\tmrd=pagko at 8pt
+\font\tmre=pagko at 9pt
+\font\tmrf=pagko at 10pt
+\font\tmrg=pagko at 11pt
+\font\tmrh=pagko at 14pt
+\font\tmri=pagko at 17pt
+\font\tmrk=pagko at 20pt
+\font\tmrl=pagko at 25pt
+
+\begin{document}
+\tmrg
+\begin{center}
+\underline{AVAILABLE POSTSCRIPT FONT SIZES}
+\end{center}
+\tmra Demo for Avant Garde Book Oblique - 5 pt\\
+\tmrb Demo for Avant Garde Book Oblique - 6 pt\\
+\tmrc Demo for Avant Garde Book Oblique - 7 pt\\
+\tmrd Demo for Avant Garde Book Oblique - 8 pt\\
+\tmre Demo for Avant Garde Book Oblique - 9 pt\\
+\tmrf Demo for Avant Garde Book Oblique - 10 pt\\
+\tmrg Demo for Avant Garde Book Oblique - 11 pt\\
+\tmrh Demo for Avant Garde Book Oblique - 14 pt\\
+\tmri Demo for Avant Garde Book Oblique - 17 pt\\
+\tmrk Demo for Avant Garde Book Oblique - 20 pt\\
+\tmrl Demo for Avant Garde Book Oblique - 24 pt\\
+\end{document}
diff --git a/systems/msdos/emtex-fonts/psfonts/lj.cnf b/systems/msdos/emtex-fonts/psfonts/lj.cnf
new file mode 100644
index 0000000000..73af3c556f
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/lj.cnf
@@ -0,0 +1,12 @@
+% lj.cnf (300x300 DPI using LJ fonts)
+/pd={,$DVIDRVINPUT:}@i
+%/pv=d:\emtex\fonts\vf\@f{.vf}
+/pl=$DVIDRVFONTS:{lj_{0,h,1,2,3,4,5a,5b,sli},ps_{0,1,2,3,4,5,h}}
+/pf={,{$DVIDRVFONTS:pixel{.lj,.ps}}\@Rrdpi\}@f{.pk,.pxl}
+/pg={,$DVIDRVGRAPH:}{@Rrdpi\,}@PBf{@Ef,.msp,.pcx,.bmp}
+/r=300
+/rf=300
+/fs=1
+/fm=hplaser
+/fd=2
+/ps=d:\emtex\newfonts.sub
diff --git a/systems/msdos/emtex-fonts/psfonts/newfonts.sub b/systems/msdos/emtex-fonts/psfonts/newfonts.sub
new file mode 100644
index 0000000000..b078de2058
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/newfonts.sub
@@ -0,0 +1,47 @@
+circle* * -> lcircle* *
+%
+% Substitution for 11pt-25pt at 300 x 300 DPI
+%
+p* 330 -> p* 329
+p* 360 -> p* 329
+p* 360 -> p* 329
+p* 420 -> p* 432
+p* 450 -> p* 432
+p* 480 -> p* 432
+p* 510 -> p* 518
+p* 540 -> p* 518
+p* 570 -> p* 518
+p* 600 -> p* 622
+p* 630 -> p* 622
+p* 660 -> p* 622
+p* 690 -> p* 622
+p* 720 -> p* 746
+p* 750 -> p* 746
+%
+% Substitution for 11pt-25pt at 180 x 180 DPI
+%
+p* 197.18011 -> p* 180
+p* 259.2 -> p* 270
+p* 373.194 -> p* 329
+p* 447.66 -> p* 432
+p* 306 -> p* 329
+p* 216 -> p* 210
+p* 252 -> p* 240
+p* 198 -> p* 210
+p* 162 -> p* 180
+p* 144 -> p* 150
+p* 126 -> p* 150
+p* 108.00002 -> p* 150
+p* 90 -> p* 150
+%
+% Substitution for 11pt-25pt at 360 x 360 DPI
+%
+p* 900 -> p* 746
+p* 612 -> p* 622
+p* 504 -> p* 518
+p* 396 -> p* 432
+p* 394.36024 -> p* 432
+p* 324 -> p* 329
+p* 288 -> p* 270
+p* 216.00002 -> p* 210
+
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_0.fli b/systems/msdos/emtex-fonts/psfonts/ps_0.fli
new file mode 100644
index 0000000000..ddc01c7069
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_0.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_1.fli b/systems/msdos/emtex-fonts/psfonts/ps_1.fli
new file mode 100644
index 0000000000..fb1a0fa16f
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_1.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_2.fli b/systems/msdos/emtex-fonts/psfonts/ps_2.fli
new file mode 100644
index 0000000000..94cf25e8a8
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_2.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_3.fli b/systems/msdos/emtex-fonts/psfonts/ps_3.fli
new file mode 100644
index 0000000000..b6568e4ece
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_3.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_4.fli b/systems/msdos/emtex-fonts/psfonts/ps_4.fli
new file mode 100644
index 0000000000..557e603f1c
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_4.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_5.fli b/systems/msdos/emtex-fonts/psfonts/ps_5.fli
new file mode 100644
index 0000000000..4294e73464
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_5.fli
Binary files differ
diff --git a/systems/msdos/emtex-fonts/psfonts/ps_h.fli b/systems/msdos/emtex-fonts/psfonts/ps_h.fli
new file mode 100644
index 0000000000..210cf1ad6f
--- /dev/null
+++ b/systems/msdos/emtex-fonts/psfonts/ps_h.fli
Binary files differ
diff --git a/systems/msdos/emtex/CHANGES.ENG b/systems/msdos/emtex/CHANGES.ENG
new file mode 100644
index 0000000000..8daff96e7c
--- /dev/null
+++ b/systems/msdos/emtex/CHANGES.ENG
@@ -0,0 +1,460 @@
+==============================================================================
+CHANGES.ENG (emTeX DISTRIBUTION) 09-Jul-1998
+==============================================================================
+
+This document describes the most important changes to the emTeX
+distribution.
+
+IMPORTANT NOTE: For each change to the emTeX distribution, the files
+first.zip and install.dat file will be updated. Don't forget to fetch
+those files!
+
+
+25-Jun-1995
+===========
+
+Directory structure
+-------------------
+
+- The directory structure has been reorganized. There are no longer
+ any files in directory \emtex; executable files have been moved to
+ \emtex\bin, other files to \emtex\data. In consequence, you have to
+ change your PATH. Moreover, all files of \emtex\mfinput,
+ \emtex\texinput, and \emtex\tfm have been moved to subdirectories of
+ these directories
+
+ Unfortunately, there are third-party packages which do no yet use
+ the new directory structure and do not support subdirectory search.
+ It is recommended to install those packages in their own tree for
+ now
+
+- All emx stuff (with the exception of rsx) has been moved out of the
+ \emtex directory tree to its own directory tree rooted at \emx
+ (package emxrsx). In consequence, you might have to change your
+ PATH and LIBPATH
+
+
+Packaging
+---------
+
+- Info-ZIP's UnZip is now used instead of pkunzip for unpacking ZIP
+ archive files
+
+- Packages have been rearranged, split, combined, and renamed. Some of
+ the ZIP archive files do not fit on 360KB and 720KB diskettes
+
+- Format files for TeX and base files for METAFONT are no longer
+ shipped. You have to create them yourself. The documentation
+ explains how to do that. The new makefmt tool will assist you in
+ creating TeX formats
+
+- emremove.exe and emdelete.exe are now shipped in first.zip; these
+ programs were formerly called remove.exe and delete.exe
+
+
+Fonts
+-----
+
+- Both the METAFONT modes and the Computer Modern font sources have
+ been changed, resulting in changed character shapes. You should
+ delete all old fonts to avoid mixing old and new shapes
+
+- Only a collection of frequently used fonts is shipped pre-compiled.
+ Missing fonts will be generated on the fly as required. In
+ consequence, you have to install METAFONT and MFjob
+
+- The font library files have been renamed. A base set of fonts is
+ shipped in a FLI file named xx_base.fli where xx depends on the
+ METAFONT mode. You can put extra fonts into xx_more.fli. The
+ dvidrv configuration files now try to load xx_base.fli and
+ xx_more.fli (instead of xx_0.fli through xx_5.fli)
+
+- A METAFONT mode for the HP DeskJet has been added and pre-compiled
+ fonts for the HP DeskJet are now available. DeskJet users should
+ switch from LJ fonts to DJ fonts. Do not mix LJ and DJ fonts!
+
+- Some METAFONT modes have been renamed. You can find the new names
+ in \emtex\mfinput\etc\local.mf
+
+
+LaTeX
+-----
+
+- Both LaTeX2e and the obsolete LaTeX 2.09 are provided
+
+- As the order in which subdirectories are visited for locating files
+ is not completely specified, you should list either
+ \emtex\texinput\latex2e or \emtex\texinput\latex209 in the TEXINPUT
+ environment variable, preceding \emtex\texinput! (the bang is part
+ of TEXINPUT's value and enables subdirectory search). The makefmt
+ tool automatically creates batch files which temporarily adjust
+ TEXINPUT appropriately. Therefore, you don't have to set TEXINPUT
+ unless you use the LaTeX format files without those batch files
+
+
+New features
+------------
+
+- Most programs now support subdirectory search: On request, either
+ one level of subdirectories or the entire hierarchy of
+ subdirectories of a given directory is searched for locating files.
+ This feature is enabled by appending `!' or `!!', respectively, to
+ the directory name listed in an environment variable. One level of
+ subdirectories is searched for the default directories
+
+- To specify the root of the emTeX directory tree, setting one
+ environment variable, EMTEXDIR, is now sufficient unless you change
+ the directory structure. However, there are some exceptions such as
+ MakeIndex. Moreover, TEXINPUT should be set to select LaTeX2e
+ vs. LaTeX 2.09 (unless you use the batch files created by makefmt).
+ The EMTEXDRV environment variable is history
+
+- Long file names are now supported on OS/2's HPFS. If a file with a
+ long name cannot be found or created, its name will be truncated
+ according to the `5+3.3' and `8.3' rules
+
+- 32-bit versions of TeX, METAFONT, BibTeX, and MakeIndex are now
+ provided
+
+- The DVI drivers support more printers and have a lot of new
+ features. A screen previewer for the OS/2 Presentation Manager is
+ now included. dvimsp's job has been taken over by dvidot
+
+- tex286.exe, mf286.exe, etc. have been renamed to tex186.exe,
+ mf186.exe, etc.
+
+- Various limits of emTeX, METAFONT, and utilities have been raised
+
+- emTeX optionally supports the \charsubdef primitive (MLTeX)
+
+- Programs which use graphics mode (dviscr, mf, pkedit) support
+ additional graphics adapters and modes
+
+- TeXcad is no longer Shareware
+
+- Some documentation files are also available as OS/2 on-line manuals
+ for viewing with OS/2's `view' command
+
+- Package dvidrvma is currently not available
+
+- IMPORTANT: The command line options of emdelete.exe (formerly called
+ delete.exe) have changed
+
+
+03-Jul-1995
+===========
+
+- first.zip: updated
+
+- dvid16b?.zip, replacing dvid16a?.zip: bug in dviscr removed,
+ dvipm improved
+
+- l2input.zip, l2base.zip, and l2tools.zip: patch level 1 of LaTeX2e.
+ Please create new format files for LaTeX2e!
+
+
+11-Jul-1995
+===========
+
+- emxrsx.zip: New emx.dll (0.9a fix06)
+
+
+24-Jul-1995
+===========
+
+- l2input.zip and l2base.zip: patch level 3 of LaTeX2e.
+ Please create new format files for LaTeX2e!
+
+
+07-Aug-1995
+===========
+
+- dvid16c?.zip, replacing dvid16b?.zip: various bug fixes and
+ improvements
+
+- mfjob12b.zip, replacing mfjob12a.zip: use MFjob macros in templates
+
+- bibtex4b.zip, replacing bibtex4a.zip: wizard function space increased.
+ IMPORTANT: New directory structure, use `emremove' to remove package
+ `bibtex4a' before installing package `bibtex4b'!
+
+- dvisp10b.zip, replacing dvisp10a.zip: various improvements
+
+
+23-Aug-1995
+===========
+
+- dvid16d?.zip, replacing dvid16c?.zip: various bug fixes (prtfaxwk, dvipm)
+ and improvements (dvipm)
+
+- web.zip: tangle's max_texts limit increased
+
+
+10-Sep-1995
+===========
+
+- dvid16e?.zip, replacing dvid16d?.zip: various bug fixes
+
+- tex4b.zip, replacing tex4a.zip: Bug fixed (Ctrl-Break), makefmt
+ now sets the /o option if the `8bit' keyword is used
+
+- mf4b.zip, replacing mf4a.zip: Bug fixed (Ctrl-Break)
+
+- texware.zip: VFtoVP and VPtoVF enlarged
+
+
+19-Sep-1995
+===========
+
+- mfjob12c.zip, replacing mfjob12b.zip: Fix bugs related to DC fonts 1.2
+
+
+14-Dec-1995
+===========
+
+- emxrsx.zip: emx 0.9b
+
+
+21-Dec-1995
+===========
+
+- l2input.zip, l2base.zip, and l2tools.zip: 1995/12/01 version of
+ LaTeX2e
+ +---------------------------------------------------------------+
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+- fontdc.zip: Version 1.2
+ +---------------------------------------------------------------+
+ | Please remove the old fontdc package before installing the |
+ | new one: |
+ | |
+ | emremove c:\emtex\remove\fontdc.rem c:\ |
+ | |
+ | Please delete all DC pixel files: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ | |
+ | If you have installed the new fontdc package without removing |
+ | the old one, delete all files in the \emtex\mfinput\dc and |
+ | \emtex\tfm\dc directories, then reinstall the fontdc package. |
+ | |
+ | To avoid warnings about checksum mismatches (1200), recreate |
+ | all DVI files which use DC fonts. |
+ +---------------------------------------------------------------+
+
+
+14-Jan-1996
+===========
+
+- l2input.zip and l2base.zip: patch level 1 of LaTeX2e
+ +---------------------------------------------------------------+
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+
+26-Feb-1996
+===========
+
+- emxrsx.zip: emx 0.9b FIX 02; new version of rsx.exe.
+ (Please delete all files in \emtex\doc\rsx before unpacking emxrsx.zip!)
+
+
+02-Mar-1996
+===========
+
+- emxrsx.zip: now in fact includes the new version of rsx.exe
+
+
+17-Mar-1996
+===========
+
+- l2input.zip, l2base.zip and l2tools.zip: patch level 2 of LaTeX2e
+
+
+09-Apr-1996
+===========
+
+- dvid16f?.zip, replacing dvid16e?.zip: various bug fixes
+
+
+04-May-1996
+===========
+
+- german.sty: german.sty 2.5c
+
+
+07-May-1996
+===========
+
+- emxrsx.zip: emx 0.9b FIX 04
+
+
+24-May-1996
+===========
+
+- emxrsx.zip: emx 0.9b FIX 05
+
+
+03-Jun-1996
+===========
+
+- fontdc.zip: Version 1.3
+ +---------------------------------------------------------------+
+ | Please remove the old fontdc package before installing the |
+ | new one: |
+ | |
+ | emremove c:\emtex\remove\fontdc.rem c:\ |
+ | |
+ | Please delete all DC pixel files: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ | |
+ | If you have installed the new fontdc package without removing |
+ | the old one, delete all files in the \emtex\mfinput\dc and |
+ | \emtex\tfm\dc directories, then reinstall the fontdc package. |
+ | |
+ | To avoid warnings about checksum mismatches (1200), recreate |
+ | all DVI files which use DC fonts. |
+ +---------------------------------------------------------------+
+
+
+20-Jun-1996
+===========
+
+- l2input.zip, l2base.zip, and l2tools.zip: 1995/12/01 version of
+ LaTeX2e
+ +---------------------------------------------------------------+
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+- fontdc.zip: dc*1095.tfm are back again; creation of dx.bas with
+ makebas works again
+
+- mf4b.zip: mf4b.rem fixed
+
+- tex4b.zip: plain.tex 3.141592
+
+
+01-Sep-1996
+===========
+
+- fontdc.zip: Version 1.3 patch level 4
+ +---------------------------------------------------------------+
+ | Please delete all DC pixel files: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ +---------------------------------------------------------------+
+
+
+04-Mar-1997
+===========
+
+- Installation program now included: install.exe, install.ovl, and
+ install.dat
+
+- dvid16g?.zip, replacing dvid16f?.zip: various bug fixes, support for
+ EC fonts
+
+- tex4b.zip and mf4b.zip: improvements for Windows 95 and Windows NT
+
+- l2kurz.zip: updated
+
+- fontec.zip, replacing fontdc.zip
+ +---------------------------------------------------------------+
+ | Please remove the old fontdc package before installing the |
+ | fontec package: |
+ | |
+ | emremove c:\emtex\remove\fontdc.rem c:\ |
+ | |
+ | Please delete all DC pixel files: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ | emdelete -s c:\texfonts\tc*.pk |
+ +---------------------------------------------------------------+
+
+- l2input.zip, l2base.zip, and l2tools.zip: 1996/12/01 version of
+ LaTeX2e
+ +---------------------------------------------------------------+
+ | Please remove the old l2input package before installing the |
+ | new one: |
+ | |
+ | emremove c:\emtex\remove\l2input.rem c:\ |
+ | |
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+- emxrsx.zip: emx 0.9c FIX 02; new version of rsx.exe.
+ (Please delete all files in \emtex\doc\rsx before unpacking emxrsx.zip!)
+
+
+07-Mar-1997
+===========
+
+- l2input.zip, l2base.zip and l2tools.zip: patch level 1 of LaTeX2e
+
+- mfjob12d.zip, replacing mfjob12c.zip: support EC fonts
+
+
+12-May-1997
+===========
+
+- german.zip: german.sty 2.5d
+
+
+29-Jun-1997
+===========
+
+- l2input.zip, l2base.zip, and l2tools.zip: 1997/06/01 version of
+ LaTeX2e
+ +---------------------------------------------------------------+
+ | Please remove the old l2input package before installing the |
+ | new one: |
+ | |
+ | emremove c:\emtex\remove\l2input.rem c:\ |
+ | |
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+
+30-Jun-1997
+===========
+
+- texsys.cfg was missing in l2input.zip of 29-Jun-1997.
+
+
+25-Jan-1998
+===========
+
+- l2input.zip, l2base.zip, and l2tools.zip: 1997/12/01 version (patch
+ level 1) of LaTeX2e
+ +---------------------------------------------------------------+
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+- emxrsx.zip: emx 0.9c FIX 04
+
+
+02-Jul-1998
+===========
+
+- l2input.zip, l2base.zip, and l2tools.zip: 1998/06/01 version of
+ LaTeX2e
+ +---------------------------------------------------------------+
+ | Please create new format files for LaTeX2e! |
+ +---------------------------------------------------------------+
+
+- dvid16h?.zip, replacing dvid16g?.zip: various bug fixes; 32-bit
+ version of dvihplj; support for EPSON Stylus Color 800
+
+
+09-Jul-1998
+===========
+
+- first.zip, dvid16?.zip: Fix documentation errors, rename
+ dvihplj32.exe to dvihplj3.exe, and enable dvihplj3.exe to
+ print to devices under DOS
+
+- l2base.zip: update ltnews09.tex
+
+ -------- End of CHANGES.ENG -------------
diff --git a/systems/msdos/emtex/CHANGES.GER b/systems/msdos/emtex/CHANGES.GER
new file mode 100644
index 0000000000..12404d97b4
--- /dev/null
+++ b/systems/msdos/emtex/CHANGES.GER
@@ -0,0 +1,478 @@
+==============================================================================
+CHANGES.GER (emTeX DISTRIBUTION) 09-Jul-1998
+==============================================================================
+
+Dieses Dokument beschreibt die wichtigsten Unterschiede zu frueheren
+Versionen der emTeX-Distribution.
+
+WICHTIG: Bei jeder Aenderung an der emTeX-Distribution werden die
+Dateien first.zip und install.dat erneuert; vergessen Sie nicht, diese
+Dateien zu holen!
+
+
+25-Jun-1995
+===========
+
+Verzeichnisstruktur
+-------------------
+
+- Die Verzeichnistruktur wurde geaendert: Im Verzeichnis \emtex
+ befinden sich keine Dateien mehr; alle Programmdateien wurden nach
+ \emtex\bin verschoben, die anderen Dateien nach \emtex\data. Sie
+ muessen also Ihren Suchpfad fuer Programme (PATH) aendern. Weiterhin
+ wurden die Dateien in \emtex\mfinput, \emtex\texinput und \emtex\tfm
+ in Unterverzeichnisse dieser Verzeichnisse verschoben
+
+ Ungluecklicherweise gibt es Zusatzpakete, die noch nicht die neue
+ Verzeichnisstruktur und kein automatisches Durchsuchen von
+ Unterverzeichnissen unterstuetzen. Es wird empfohlen, diese Pakete
+ vorerst in ihrem eigenen Verzeichnisbaum zu installieren
+
+- Die emx-Dateien (mit Ausnahme von rsx) wurden aus dem
+ \emtex-Verzeichnis in Unterverzeichnisse von \emx verschoben (Paket
+ emxrsx). Sie muessen also Ihren Suchpfad fuer Programme (PATH) und
+ unter OS/2 die Einstellung von LIBPATH anpassen
+
+
+Pakete
+------
+
+- Zum Auspacken der Distribution wird jetzt Info-ZIPs UnZip statt pkunzip
+ verwendet
+
+- Viele Pakete wurden umgeordnet, zerteilt, zusammengefasst oder
+ umbenannt. Einige der ZIP-Archive passen nicht auf
+ 360KB- oder 720KB-Disketten.
+
+- Format-Dateien fuer TeX und Base-Dateien fuer METAFONT sind nicht mehr
+ Teil der Distribution, da sie diese mit Hilfe der mitgelieferten
+ Dokumentation leicht selbst erstellen koennen. Die neuen Programme
+ makefmt und makebas koennen Ihnen bei der Erstellung eigener Format-
+ und Base-Dateien helfen
+
+- emremove.exe und emdelete.exe (ehemals remove.exe und delete.exe)
+ befinden sich jetzt im Paket first.zip
+
+
+Zeichensaetze
+-------------
+
+- Sowohl die METAFONT-Modes als auch die Computer-Modern-Zeichensaetze
+ wurden leicht geaendert, was sich in veraenderten Buchstabenformen
+ niederschlaegt. Sie sollten alle alten Zeichensaetze loeschen, um ein
+ Vermischen von alten mit neuen Zeichensaetzen zu verhindern
+
+- Es ist nur eine Auswahl an oft benoetigten Zeichensaetzen fertig
+ berechnet. Fehlende Zeichensaetze werden automatisch generiert,
+ sobald ein DVI-Treiber diese benoetigt. Dazu muessen Sie METAFONT und
+ MFjob installieren
+
+- Die Zeichensatzbibliotheksdateien wurden umbenannt. Eine
+ Basisauswahl befindet sich in einer FLI-Datei mit dem Namen
+ xx_base.fli, worin xx den entsprechenden METAFONT-Mode kennzeichnet.
+ Sie koennen zusaetzliche Zeichensaetze in xx_more.fli packen. Die
+ DVI-Treiber versuchen nun xx_base.fli und xx_more.fli (statt
+ xx_0.fli bis xx_5[ab].fli) zu lesen
+
+- Ein METAFONT-Mode fuer den HP DeskJet und fertig ausgerechnete
+ Zeichensaetze fuer den HP DeskJet sind verfuegbar. Falls Sie auf mit
+ einem HP DeskJet drucken, sollten Sie diese statt den bisher
+ verwendeten LaserJet-Zeichensaetzen verwenden. Vermischen Sie
+ DJ-Zeichensaetze nicht mit LJ-Zeichensaetzen!
+
+- Einige METAFONT-Modes wurden umbenannt. Sie finden die neuen Namen in
+ \emtex\mfinput\etc\local.mf
+
+
+LaTeX
+-----
+
+- Sowohl LaTeX2e als auch das offiziell nicht mehr unterstuetzte LaTeX
+ 2.09 werden bereitgestellt
+
+- Da die Reihenfolge, in der Unterverzeichnisse automatisch durchsucht
+ werden, nicht vollstaendig festgelegt ist, sollten Sie entweder
+ \emtex\texinput\latex2e oder \emtex\texinput\latex209 in der
+ Environment-Variablen TEXINPUT VOR \emtex\texinput! setzen. (Das
+ Ausrufezeichen ist Teil des Wertes der Environment-Variablen und
+ erlaubt das Durchsuchen von Unterverzeichnissen.) Das Programm
+ makefmt erzeugt automatisch Batch-Dateien, die voruebergehend die
+ Environment-Variable TEXINPUT auf den erforderlichen Wert setzen;
+ deshalb brauchen Sie TEXINPUT nur dann zu setzen, wenn Sie die
+ LaTeX-Format-Dateien ohne diese Batch-Dateien verwenden
+
+
+Neue Eigenschaften
+------------------
+
+- Die meisten Programme unterstuetzen jetzt das automatische
+ Durchsuchen von Unterverzeichnissen: Wahlweise wird nur eine Ebene
+ von Unterverzeichnissen oder die gesamte Unterverzeichnisstruktur
+ eines gegebenen Verzeichnisses durchsucht. Dieses wird durch ein an
+ den Verzeichnisnamen in der Environment-Variablen angehaengtes `!'
+ fuer eine Ebene oder `!!' fuer alle Ebenen eingeschaltet. Bei den
+ voreingestellten Verzeichnissen wird eine Ebene Unterverzeichnisse
+ durchsucht
+
+- Um das emTeX-Hauptverzeichnis festzulegen, brauchen Sie nur die
+ Environment-Variable EMTEXDIR zu setzen, es sei denn, Sie aenderten
+ die Verzeichnisstruktur. Es gibt allerdings einige Ausnahmen wie
+ z.B. MakeIndex. Desweiteren sollten Sie die Environment-Variable
+ TEXINPUT setzen, um zwischen LaTeX2e und LaTeX 2.09 umschalten zu
+ koennen (sofern Sie nicht die von makefmt erzeugten Batch-Dateien
+ verwenden). Die Environment-Variable EMTEXDRV gibt es nicht mehr
+
+- Unter OS/2 werden auf HPFS-Laufwerken lange Dateinamen unterstuetzt.
+ Wenn eine Datei mit einem langen Dateinamen nicht gefunden wird,
+ wird der Name zunaechst nach der 5+3.3-Regel und dann nach der
+ 8.3-Regel gekuerzt
+
+- 32-Bit-Versionen von TeX, METAFONT, BibTeX und MakeIndex stehen
+ jetzt zur Verfuegung
+
+- Die DVI-Treiber unterstuetzen noch mehr Drucker und haben eine Menge
+ neuer Einstellmoeglichkeiten. Ein Screen-Previewer fuer den OS/2
+ Presentation Manager steht jetzt zur Verfuegung. dvimsp wurde durch
+ dvidot ersetzt
+
+- tex286.exe, mf286.exe usw. wurden in tex186.exe, mf186.exe umbenannt
+
+- Verschiedene Speichergrenzen von emTeX, METAFONT und anderen
+ Programmen wurden erhoeht
+
+- emTeX unterstuetzt optional den Befehl \charsubdef (MLTeX)
+
+- Programme mit graphischer Ausgabe (dviscr, mf, pkedit) unterstuetzen
+ zusaetzliche Grafikkarten und Grafikmodi
+
+- TeXcad ist nicht mehr Shareware
+
+- Einige Dokumentationsdateien sind auch als OS/2 Online-Handbuecher fuer
+ das `view'-Programm von OS/2 verfuegbar
+
+- Das Paket dvidrvma is momentan nicht verfuegbar
+
+- WICHTIG: Die Kommandozeilenoptionen von emdelete.exe wurden
+ gegenueber delete.exe geaendert!
+
+
+03-Jul-1995
+===========
+
+- first.zip: auf den neuesten Stand gebracht
+
+- dvid16b?.zip ersetzen dvid16a?.zip: Fehler in dviscr korrigiert,
+ dvipm verbessert
+
+- l2input.zip, l2base.zip und l2tools.zip: Patch level 1 von LaTeX2e.
+ Bitte neue Format-Dateien fuer LaTeX2e erzeugen!
+
+
+11-Jul-1995
+===========
+
+- emxrsx.zip: Neue emx.dll (0.9a fix06)
+
+
+24-Jul-1995
+===========
+
+- l2input.zip und l2base.zip: Patch level 3 von LaTeX2e.
+ Bitte neue Format-Dateien fuer LaTeX2e erzeugen!
+
+
+07-Aug-1995
+===========
+
+- dvid16c?.zip ersetzen dvid16b?.zip: Verschiedene Fehler beseitigt,
+ verschiedene Verbesserungen
+
+- mfjob12b.zip ersetzt mfjob12a.zip: MFjob-Makros koennen in Schablonen
+ verwendet werden
+
+- bibtex4b.zip ersetzt bibtex4a.zip: `Wizard function space' vergroessert.
+ WICHTIG: Neue Verzeichnisstruktur, bitte entfernen Sie das Paket
+ `bibtex4a' mit `emremove' bevor Sie `bibtex4b' installieren!
+
+- dvisp10b.zip ersetzt dvisp10a.zip: Verschiedene Verbesserungen
+
+
+23-Aug-1995
+===========
+
+- dvid16d?.zip ersetzen dvid16c?.zip: Verschiedene Fehler beseitigt
+ (prtfaxwk, dvipm), verschiedene Verbesserungen (dvipm)
+
+- web.zip: max_texts-Konstante von tangle erhoeht
+
+
+10-Sep-1995
+===========
+
+- dvid16e?.zip ersetzen dvid16d?.zip: Verschiedene Fehler beseitigt
+
+- tex4b.zip ersetzt tex4a.zip: Fehler beseitigt (Ctrl-Break), makefmt
+ setzt jetzt /o falls `8bit' verwendet wird
+
+- mf4b.zip ersetzt mf4a.zip: Fehler beseitigt (Ctrl-Break)
+
+- texware.zip: VFtoVP und VPtoVF wurden vergroessert
+
+
+19-Sep-1995
+===========
+
+- mfjob12c.zip ersetzt mfjob12b.zip: Fehler, DC-Fonts 1.2 betreffend,
+ beseitigt
+
+
+14-Dez-1995
+===========
+
+- emxrsx.zip: emx 0.9b
+
+
+21-Dez-1995
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Version 1995/12/01 von
+ LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+- fontdc.zip: Version 1.2
+ +----------------------------------------------------------------+
+ | Bitte entfernen Sie vor Installation von fontdc.zip die alte |
+ | Version des fontdc-Pakets: |
+ | |
+ | emremove c:\emtex\remove\fontdc.rem c:\ |
+ | |
+ | Bitte loeschen Sie bereits berechnete DC-Zeichensatzdateien: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ | |
+ | Falls Sie das neue fontdc-Paket schon installiert haben, ohne |
+ | das alte entfernt zu haben, loeschen Sie bitte alle Dateien in |
+ | den Verzeichnissen \emtex\tfm\dc und \emtex\mfinput\dc und |
+ | installieren das neue fontdc-Paket erneut. |
+ | |
+ | Um Warnungen wegen nicht uebereinstimmender Pruefsummen (1200) |
+ | zu vermeiden, erzeugen Sie bitte alle DVI-Dateien, welche |
+ | DC-Zeichensaetze verwenden, neu. |
+ +----------------------------------------------------------------+
+
+
+14-Jan-1996
+===========
+
+- l2input.zip und l2base.zip: Patch level 1 von LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+
+26-Feb-1996
+===========
+
+- emxrsx.zip: emx 0.9b FIX 02; neue Version von rsx.exe.
+ (Bitte vor Installation alle Dateien in \emtex\doc\rsx loeschen!)
+
+
+02-Mrz-1996
+===========
+
+- emxrsx.zip: Jetzt wirklich mit neuer Version von rsx.exe
+
+
+17-Mrz-1996
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Patch level 2 von LaTeX2e
+
+
+09-Apr-1996
+===========
+
+- dvid16f?.zip ersetzen dvid16e?.zip: Verschiedene Fehler beseitigt
+
+
+04-Mai-1996
+===========
+
+- german.sty: german.sty 2.5c
+
+
+07-Mai-1996
+===========
+
+- emxrsx.zip: emx 0.9b FIX 04
+
+
+24-Mai-1996
+===========
+
+- emxrsx.zip: emx 0.9b FIX 05
+
+
+03-Jun-1996
+===========
+
+- fontdc.zip: Version 1.3
+ +----------------------------------------------------------------+
+ | Bitte entfernen Sie vor Installation von fontdc.zip die alte |
+ | Version des fontdc-Pakets: |
+ | |
+ | emremove c:\emtex\remove\fontdc.rem c:\ |
+ | |
+ | Bitte loeschen Sie bereits berechnete DC-Zeichensatzdateien: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ | |
+ | Falls Sie das neue fontdc-Paket schon installiert haben, ohne |
+ | das alte entfernt zu haben, loeschen Sie bitte alle Dateien in |
+ | den Verzeichnissen \emtex\tfm\dc und \emtex\mfinput\dc und |
+ | installieren das neue fontdc-Paket erneut. |
+ | |
+ | Um Warnungen wegen nicht uebereinstimmender Pruefsummen (1200) |
+ | zu vermeiden, erzeugen Sie bitte alle DVI-Dateien, welche |
+ | DC-Zeichensaetze verwenden, neu. |
+ +----------------------------------------------------------------+
+
+
+21-Jun-1996
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Version 1996/06/01 von
+ LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+- fontdc.zip: dc*1095.tfm wieder vorhanden; dx.bas kann wieder mit
+ makebas erzeugt werden
+
+- mf4b.zip: mf4b.rem korrigiert
+
+- tex4b.zip: plain.tex 3.141592
+
+
+01-Sep-1996
+===========
+
+- fontdc.zip: Version 1.3 Patch level 4
+ +----------------------------------------------------------------+
+ | Bitte loeschen Sie bereits berechnete DC-Zeichensatzdateien: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ +----------------------------------------------------------------+
+
+
+04-Mrz-1997
+===========
+
+- Installationsprogramm: install.exe, install.ovl und install.dat
+
+- dvid16g?.zip ersetzen dvid16f?.zip: Verschiedene Fehler beseitigt,
+ Unterstuetzung fuer EC-Fonts
+
+- tex4b.zip und mf4b.zip: Verbesserungen fuer Windows 95 und Windows NT
+
+- fontec.zip ersetzt fontdc.zip
+ +----------------------------------------------------------------+
+ | Bitte entfernen Sie das Paket fontdc vor der Installation von |
+ | fontec.zip: |
+ | |
+ | emremove c:\emtex\remove\fontdc.rem c:\ |
+ | |
+ | Bitte loeschen Sie bereits berechnete DC-Zeichensatzdateien: |
+ | |
+ | emdelete -s c:\texfonts\dc*.pk |
+ | emdelete -s c:\texfonts\tc*.pk |
+ +----------------------------------------------------------------+
+
+- l2input.zip, l2base.zip und l2tools.zip: Version 1996/12/01 von
+ LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte entfernen Sie vor Installation von l2input.zip die alte |
+ | Version des l2input-Pakets: |
+ | |
+ | emremove c:\emtex\remove\l2input.rem c:\ |
+ | |
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+- emxrsx.zip: emx 0.9c FIX 02; neue Version von rsx.exe.
+ (Bitte vor Installation alle Dateien in \emtex\doc\rsx loeschen!)
+
+
+07-Mrz-1997
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Patch level 1 von LaTeX2e
+
+- mfjob12d.zip ersetzt mfjob12c.zip: Unterstuetzung fuer EC-Fonts
+
+
+12-Mai-1997
+===========
+
+- german.zip: german.sty 2.5d
+
+
+29-Jun-1997
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Version 1997/06/01 von
+ LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte entfernen Sie vor Installation von l2input.zip die alte |
+ | Version des l2input-Pakets: |
+ | |
+ | emremove c:\emtex\remove\l2input.rem c:\ |
+ | |
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+
+30-Jun-1997
+===========
+
+- texsys.cfg fehlte in l2input.zip vom 29-Jun-1997.
+
+
+25-Jan-1998
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Version 1997/12/01 (patch
+ level 1) von LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+- emxrsx.zip: emx 0.9c FIX 04
+
+
+02-Jul-1998
+===========
+
+- l2input.zip, l2base.zip und l2tools.zip: Version 1998/06/01 von
+ LaTeX2e
+ +----------------------------------------------------------------+
+ | Bitte neue Format-Dateien fuer LaTeX2e erzeugen! |
+ +----------------------------------------------------------------+
+
+- dvid16h?.zip ersetzen dvid16g?.zip: Verschiedene Fehler beseitigt;
+ 32-Bit-Version von dvihplj; Unterstuetzung des EPSON Stylus Color 800
+
+
+09-Jul-1998
+===========
+
+- first.zip, dvid16?.zip: Fehler in der Dokumentation beseitigt,
+ dvihplj32.exe in dvihplj3.exe umbenannt, dvihplj3.exe kann
+ jetzt unter DOS auf LPT1 usw. drucken
+
+- l2base.zip: korrigierte Version von ltnews09.tex
+
+ -------- Ende von CHANGES.GER -------------
diff --git a/systems/msdos/emtex/DISKETTE.DOC b/systems/msdos/emtex/DISKETTE.DOC
new file mode 100644
index 0000000000..9cd03d73b0
--- /dev/null
+++ b/systems/msdos/emtex/DISKETTE.DOC
@@ -0,0 +1,82 @@
+==============================================================================
+DISKETTE.DOC (emTeX DISTRIBUTION) 09-Jul-1998
+==============================================================================
+
+Recommendation for putting the emTeX files onto diskettes
+---------------------------------------------------------
+
+90mm (3.5") diskettes, high density (1440 KByte):
+
++--------------+--------------+--------------+--------------+--------------+
+| 1 | 2 | 3 | 4 | 5 |
++--------------+--------------+--------------+--------------+--------------+
+| README.ENG | dvid16h1.zip | dvid16h2.zip | tex4b.zip | mf4b.zip |
+| README.GER | l2tools.zip | latex209.zip | lkurz.zip | fontcm.zip |
+| README.BET | | german.zip | dvisp10b.zip | fontltx.zip |
+| INSTALL.ENG | | pictex.zip | makeindx.zip | |
+| INSTALL.GER | | | | |
+| QUICK.ENG | | | | |
+| QUICK.GER | | | | |
+| HELP.ENG | | | | |
+| HELP.GER | | | | |
+| CHANGES.ENG | | | | |
+| CHANGES.GER | | | | |
+| DISKETTE.DOC | | | | |
+| unz512.exe | | | | |
+| unz512x3.exe | | | | |
+| first.zip | | | | |
+| install.exe | | | | |
+| install.ovl | | | | |
+| install.dat | | | | |
+| emxrsx.zip | | | | |
+| pkedit.zip | | | | |
++--------------+--------------+--------------+--------------+--------------+
+
++--------------+--------------+--------------+--------------+
+| 6 | 7 | 8 | 9 |
++--------------+--------------+--------------+--------------+
+| l2input.zip | fontec.zip | l2base.zip | srcmkidx.zip |
+| mfjob12d.zip | mfware.zip | texware.zip | web.zip |
+| fontams.zip | bibtex4b.zip | texcad.zip | |
+| l2kurz.zip | | fontemsy.zip | |
+| srctcad.zip | | | |
++--------------+--------------+--------------+--------------+
+
+130mm (5.25") diskettes, high density (1200 KByte):
+
++--------------+--------------+--------------+--------------+--------------+
+| 1 | 2 | 3 | 4 | 5 |
++--------------+--------------+--------------+--------------+--------------+
+| README.ENG | emxrsx.zip | srcmkidx.zip | tex4b.zip | mf4b.zip |
+| README.GER | dvid16h2.zip | dvid16h1.zip | | lkurz.zip |
+| README.BET | | | | web.zip |
+| INSTALL.ENG | | | | |
+| INSTALL.GER | | | | |
+| QUICK.ENG | | | | |
+| QUICK.GER | | | | |
+| HELP.ENG | | | | |
+| HELP.GER | | | | |
+| CHANGES.ENG | | | | |
+| CHANGES.GER | | | | |
+| DISKETTE.DOC | | | | |
+| unz512.exe | | | | |
+| unz512x3.exe | | | | |
+| first.zip | | | | |
+| install.exe | | | | |
+| install.ovl | | | | |
+| install.dat | | | | |
++--------------+--------------+--------------+--------------+--------------+
+
++--------------+--------------+--------------+--------------+--------------+
+| 6 | 7 | 8 | 9 | 10 |
++--------------+--------------+--------------+--------------+--------------+
+| l2input.zip | texcad.zip | l2base.zip | fontec.zip | fontams.zip |
+| fontcm.zip | bibtex4b.zip | german.zip | pkedit.zip | mfware.zip |
+| fontltx.zip | l2tools.zip | | fontemsy.zip | texware.zip |
+| l2kurz.zip | latex209.zip | | | |
+| dvisp10b.zip | mfjob12d.zip | | | |
+| srctcad.zip | makeindx.zip | | | |
+| | pictex.zip | | | |
++--------------+--------------+--------------+--------------+--------------+
+
+ -------- End of DISKETTE.DOC -------------
diff --git a/systems/msdos/emtex/HELP.ENG b/systems/msdos/emtex/HELP.ENG
new file mode 100644
index 0000000000..6bf27eecc4
--- /dev/null
+++ b/systems/msdos/emtex/HELP.ENG
@@ -0,0 +1,1131 @@
+==============================================================================
+HELP.ENG (emTeX DISTRIBUTION) 23-Feb-1997
+==============================================================================
+
+This file contains frequently asked questions about emTeX and their
+answers. If you have a question which is not here and you cannot find
+the answer in the documentation (or it is very difficult to find),
+please let me know.
+
+If you don't know how to install emTeX, see INSTALL.ENG.
+
+
+Contents
+========
+
+1. TeX
+2. DVIDRV
+3. METAFONT
+4. FONTS
+5. Miscellaneous topics
+
+
+1. TeX
+======
+
+1.1: What's the difference between standard TeX and bigTeX?
+
+ `bigTeX' is bigger than `standard TeX' (and much slower). If TeX
+ runs out of memory, try bigTeX. If you have a 386 or better CPU
+ use tex386.exe instead of btex*.exe -- it's faster and provides
+ more space for strings (pool size).
+
+
+1.2: TeX says:
+
+ Fatal format file error; I'm stymied
+
+ What shall I do?
+
+ You are trying to use a format file of a different TeX version
+ (for instance, standard vs. big, or 3.14 vs. 3.14159). Note that
+ the big emTeX versions including tex386 use the BTEXFMT
+ environment variable. The standard-sized versions use the TEXFMT
+ environment variable. (Also note that usually you don't have to
+ set these environment variables.) Perhaps you forgot to use the
+ `386' keyword of makefmt when creating a format file for
+ tex386.exe.
+
+ If the error message includes
+
+ Must increase the trie size
+
+ you forgot to use the /mt option. For both creating and using a
+ FMT file with a non-standard trie size, you have to use the /mt
+ option. Putting it into the environment variable EMTEXOPT is a
+ convenient method for achieving this. The makefmt tool optionally
+ creates a batch file; that batch file uses the optimal value for
+ the /mt option. See \emtex\doc\english\tex.doc for details.
+
+
+1.3: TeX says:
+
+ I can't find the PLAIN format file!
+
+ What's wrong?
+
+ You forgot to create the plain format file (plain.fmt) or emTeX
+ cannot find it. Use makefmt to create the format file (see
+ INSTALL.ENG, QUICK.ENG and \emtex\doc\english\tex.doc for
+ details). Be careful to do this in the correct directory.
+ Usually you should not set the TEXFMT, BTEXFMT, and HTEXFMT
+ environment variables.
+
+
+1.4: When trying to use LaTeX, the error message
+
+ ! Undefined control sequence.
+ l.1 \documentclass
+
+ or
+
+ ! Undefined control sequence.
+ l.1 \documentstyle
+
+ is displayed. What's wrong?
+
+ Apparently, TeX is using the PLAIN format instead of the LaTeX
+ format. You have to tell TeX to use the LaTeX format. Invoke the
+ batch file created by makefmt instead of TeX proper and make sure
+ that the LaTeX format file does exist and can be found (see the
+ answer to question 1.2).
+
+
+1.5: makefmt complains about `plain.tex' not being installed.
+ What's wrong?
+
+ As mentioned by INSTALL.ENG, you should unset the TEXINPUT
+ environment variable. If you need TEXINPUT, don't forget to add
+ `!' to the end of the path of emTeX's `texinput' directory.
+
+
+1.6: makefmt cannot find `makefmt.dat'. What's wrong?
+
+ You have not correctly set the EMTEXDIR environment variable.
+ Note that the value must be the pathname of a single directory,
+ without `;', `!', and `!!'. There must be no spaces at the end.
+ It must point to the emTeX directory. Example:
+
+ set emtexdir=c:\emtex
+
+
+1.7: When will a TeX-XeT or TeX--XeT variant of emTeX be available?
+
+ emTeX won't become a TeX-XeT, which has been superseded by
+ TeX--XeT. TeX--XeT creates standard DVI files, in contrast to
+ TeX-XeT which creates IVD files, requiring special DVI drivers or
+ an intermediate step for converting to DVI format.
+
+ TeX-XeT and TeX--XeT are special variants of TeX capable of
+ left-to-right and right-to-left (for Hebrew etc.) typesetting. I
+ don't know whether and when I'll make a TeX--XeT.
+
+
+1.8: Why is tex386.exe slower than tex.exe on my machine?
+
+ If there isn't enough memory, tex386.exe swaps to disk. Don't use
+ all your extended memory for caching or as virtual disk!
+
+
+1.9: How can I run tex386 under Windows without opening a DOS
+ window?
+
+ Fetch /tex-archive/systems/msdos/dpmigcc/rsxwin3c.zip from CTAN.
+
+
+1.10: Why doesn't the /mm# option work for me?
+
+ TeX's main memory is divided into two parts, one for `small'
+ things and one for `big' things. Only the size for `small' things
+ is affected by /mm#. Unfortunately, in most cases you run out of
+ space for `big' things.
+
+
+1.11: I have seen emTeX described as very fast but I find that
+ abcTeX is much faster processing the file xyz.tex! Why is
+ that?
+
+ emTeX's speed depends heavily on the amount of memory available.
+ If there is not much spare memory then it can happen that another
+ TeX, which cannot run the large TeX files that emTeX can, will be
+ faster.
+
+
+1.12: There is no INITEX with emTeX, what can I do?
+
+ INITEX *is* there, use `tex /i'. Note that the /i option must
+ precede any other arguments. See \emtex\doc\english\tex.doc for
+ details.
+
+
+1.13: TeX displays the error message
+
+ ! TeX capacity exceeded, sorry [buffer size=2048].
+
+ How can I prevent this?
+
+ Some text processing packages write complete paragraphs as one
+ line to the text file. If a paragraph contains, say, 3000
+ characters, the line will contain 3000 characters, without regard
+ to the appearance of the paragraph on the display. Remedy: Most
+ of those text processing packages offer an option for writing the
+ file formatted, i.e., line by line.
+
+
+1.14: What's the difference between between TeX, emTeX, and LaTeX?
+
+ TeX is a program for typesetting texts. emTeX is an
+ implementation of TeX for OS/2 and DOS. LaTeX is a macro package
+ for TeX (and can therefore be used with emTeX).
+
+
+1.15: What's the difference between LaTeX, LaTeX 2.09, and LaTeX2e?
+
+ LaTeX 2.09 is Leslie Lamport's original macro package which is no
+ longer supported. LaTeX2e is the successor to LaTeX 2.09,
+ produced by the LaTeX3 project. LaTeX formerly referred to LaTeX
+ 2.09, nowadays it means LaTeX2e.
+
+
+1.16: Directly entered accented characters do not work with LaTeX2e.
+ What's wrong?
+
+ If you get the error message
+
+ ! Text line contains an invalid character.
+
+ you should recreate the format file using makefmt's `8bit'
+ keyword.
+
+ If there are no error messages on the screen, you should use
+
+ \usepackage[cp850]{inputenc}
+
+ in your documents. (The LOG file of the failed TeX run contains
+ lines like
+
+ Missing character: There is no ^^84 in font cmr10!
+
+ in this case.)
+
+
+1.17: Why can emTeX not use the format files created by other versions
+ of TeX?
+
+ Format files are implementation dependent, for instance, the sizes
+ of the different memory areas, hash size etc. You are very
+ unlikely to find two implementations which can use the same format
+ files!
+
+
+1.18: When I try and print DVI files generated by TeX on another
+ machine, the printer driver says they are invalid.
+
+ This usually arises from corruption while transferring the data --
+ uuencode/uudecode or xxencode/xxdecode will solve the problem.
+ DVI files are portable between different TeX implementations and
+ between different machines.
+
+
+1.19: I would like to run my text through a spelling checker (style
+ checker).
+
+ Feed the DVI into dvispell and run the spelling checker on
+ dvispell's output.
+
+
+1.20: emTeX generates a DVI file which differs from that produced by
+ another implementation though the input file was the same and
+ the printed output is identical.
+
+ That may be expected. The optimization of position changes
+ depends on the size of the DVI file buffer -- and it need not be
+ done at all. In addition, in some places, floating point
+ arithmetic is allowed and used (\leaders). Floating point
+ precision differs from machine to machine.
+
+
+1.21: TeX breaks words after the first letter, for instance, T-est!
+
+ You are using a macro package which is not written for TeX 3.0.
+ You should recreate the format file and this time set
+ \lefthyphenmin and \righthyphenmin appropriately for the
+ hyphenation patterns being used.
+
+
+1.22: TeX displays the following message (when run under DOS):
+
+ Please insert diskette containing TEX.EXE into drive x press
+ any key to continue
+
+ Increase the value for FILES= in config.sys.
+
+
+1.23: Where's german.tex?
+
+ Use german.sty instead.
+
+
+1.24: How do I run LaTeX? There is no latex.exe!
+
+ See \emtex\doc\english\install.eng for instructions on
+ installation of LaTeX. See \emtex\doc\english\tex.doc on how to
+ create a format file for LaTeX with the makefmt tool; makefmt will
+ also create a batch file (say, latex.bat) for running LaTeX.
+
+
+1.25: How do I install AMSTeX?
+
+ See the installation instructions of AMSTeX. (emTeX does not
+ include AMSTeX; however, you can get it from CTAN.)
+
+
+1.26: How can I make emTeX look for TFM files in the current directory?
+
+ Set the TEXTFM environment variable to include `.' and the usual
+ TFM directories:
+
+ set textfm=.;c:\emtex\tfm!
+
+
+1.27: Running tex386.exe or htex386.exe yields the error message
+
+ emx not found
+
+ What's wrong?
+
+ You forgot to add the directory c:\emx\bin to the PATH (or you
+ forgot to reboot after making that change). If you don't want to
+ list that directory in the PATH, let the EMX environment variable
+ point to the emx.exe file:
+
+ set emx=c:\emx\bin\emx.exe
+
+ (Use the correct drive letter, as usual.)
+
+
+1.28: Running tex386.exe or htex386.exe yields the error message
+
+ SYS1804: The system cannot find the file EMX.
+
+ What's wrong?
+
+ You forgot to add the directory c:\emx\dll to the LIBPATH
+ statement of config.sys (or you forgot to reboot after making that
+ change).
+
+
+1.29: How can I avoid emTeX saying
+
+ ! I can't write on file `xxx.dvi'.
+
+ when I try to run emTeX while dvipm displays xxx.dvi?
+
+ In dvipm, select File->New or File->Auto_reload.
+
+
+1.30: tex386.exe says
+
+ Usage: emx [-cdeoOV] ...
+
+ What's wrong?
+
+ You have an out-dated version of emx.exe somewhere in your PATH.
+ Delete it and keep \emx\bin\emx.exe of emxrsx.zip.
+
+
+1.31: How can I preload a TeX format, i.e., create an EXE file
+ containing a format file?
+
+ That isn't supported by emTeX because it isn't useful in my
+ opinion.
+
+
+1.32: Has emTeX passed the trip test?
+
+ Yes.
+
+
+1.33: TeX crashes (I am using a somewhat unusual memory card).
+
+ Use the /d option when running TeX.
+
+
+1.34: How can I run tex386.exe and htex386.exe under Windows or in a
+ DOS window of OS/2? The programs say `DYN: out of memory'.
+
+ Increase the DPMI memory limit of Windows or of the DOS window.
+
+
+2. DVIDRV
+=========
+
+General
+-------
+
+2.1: I have a PostScript printer but emTeX does not have a suitable
+ driver. Where can I find a suitable driver?
+
+ Use Tomas Rokicki's dvips. It has been ported to OS/2 and DOS and
+ is for anonymous ftp on CTAN hosts, in directory
+ /tex-archive/systems/msdos/emtex/dvips. dvips can use emTeX's
+ font library files.
+
+
+2.2: Automatic generating of missing fonts does not work. METAFONT
+ generates a GF file (but no TFM file) which GFtoPK does not
+ find, or MFjob complains about not being able to move a TFM
+ file. What's wrong?
+
+ If MFjob calls GFtoPK with a file name that has a long extension
+ (say, cmr10.300gf), but METAFONT has created a file with a
+ truncated extension (say, cmr10.300), try the /z option of MFjob:
+
+ set mfjobopt=/z
+
+ (Don't forget to include the previous value of MFJOBOPT!)
+
+ Check the EMXOPT environment variable: It must not contain `-t'.
+
+ If MFjob calls GFtoPK with a file name that has a truncated
+ extension (say, cmr10.300), but METAFONT has created a file with a
+ long extension (say, cmr10.300gf), you have erroneously used
+ MFjob's /z option, probably in the MFJOBOPT environment variable.
+
+ If that does not help, it is very likely that you have ignored the
+ installation instructions. Either you have not deleted the \emtex
+ directory tree of a previous emTeX release (causing METAFONT to
+ load an out-dated local.mf file), or you have not created new base
+ files.
+
+ You can find instructions for creating base files in
+ \emtex\doc\english\metafont.doc.
+
+ The correct local.mf file is in \emtex\mfinput\etc, the old one is
+ in \emtex\mfinput. If you have \emtex\mfinput\local.mf, you
+ should delete the entire emTeX directory tree and reinstall the
+ latest version.
+
+ Check the LOG file (typically \emtex\bmfbases\plain.log) written
+ by METAFONT when the base file was created: It should contain
+
+ (c:\emtex\mfinput\etc\local.mf)
+
+ but not
+
+ (c:\emtex\mfinput\local.mf)
+
+ Note that some METAFONT modes have been renamed. Check that the
+ CNF files (e.g., lj.cnf) used by the DVI driver contain the
+ correct (new) METAFONT mode in the line starting with
+ `+metafont-mode' (if there is a line starting with `/fm', please
+ install the latest version of the DVI drivers). Also check that
+ the file \emtex\mfjob\modes.mfj uses the correct (new) METAFONT
+ modes. If there is a mismatch, there is perhaps a version
+ mismatch (or you use your own CNF files). Please update the DVI
+ drivers, MFjob, and METAFONT to the latest version.
+
+ If the problem occurs with dvips, config.ps should be changed to
+ use the new METAFONT modes of local.mf. Check the line starting
+ with `M'.
+
+ The following table shows the old and the corresponding new
+ METAFONT modes:
+
+ Old METAFONT mode | New METAFONT mode
+ -------------------+--------------------
+ hplaser | laserjet or deskjet
+ kyocera | laserjet
+ hpquiet | quietjet
+
+
+2.3: The driver won't find the font after generating a missing
+ font. Why?
+
+ That's a rounding problem which should have been fixed in version
+ 1.6a. If you still experience that problem, add the size of the
+ font as generated by MFjob to the list of font sizes searched by
+ the driver. For instance, if the driver wants cmr10<746.63959>
+ and MFjob puts the font into the 746dpi directory (instead of
+ 747dpi), use
+
+ +font-sizes:+746
+
+ (You might want to add that option it to the batch file or to the
+ configuration file.)
+
+
+2.4: How can I make MFjob invoke mf386.exe (instead of mf.exe)?
+
+ SET MFJOBOPT=/3
+
+
+2.5: My printer is connected to the serial port and prints nonsense.
+
+ You should turn on the XON-XOFF protocol with the +xon-xoff
+ parameter giving the port name as COM1, COM2, COM3 or COM4.
+
+
+2.6: I am using a DVI driver which cannot use font library files,
+ do I have to have both the fonts and a font library on my
+ disk?
+
+ No -- see the answer to question 4.2.
+
+
+2.7: The driver writes a DLG file (e.g., dviscr.dlg) every time,
+ how can I suppress it?
+
+ Use the command line option +transcript-file (without a filename).
+
+
+2.8: I have a PCX file (or MSP file) which doesn't work with
+ \special{em:graph}.
+
+ Please send the file (and a correct hard copy) to the emTeX author.
+ Note that PCX files written by certain programs cannot be
+ interpreted unambiguously. emTeX's DVI drivers rejects those PCX
+ files. Consider using bm2font for including images in TeX
+ documents.
+
+
+2.9: I have inserted a picture using \special{em:graph} exactly as
+ the documentation says but it appears too far to the right (or
+ too low).
+
+ The reason is that many pictures have an empty left or upper
+ margin. To overcome this you can use the following trick -- pass
+ these commands through TeX:
+
+ \noindent\special{em:graph xxx}\bye
+
+ where xxx is the name of the graphics file. Then convert the DVI
+ file into a bitmap file with dvidot, using the +minimize option.
+ The +minimize option removes the empty margins. You can now use
+ the resulting bitmap file in your document.
+
+
+2.10: Graphics inserted with \special{em:graph} appear too small (or
+ too large).
+
+ The driver copies the picture without altering its size -- if this
+ size is wrong then you must use a suitable program to adjust it.
+ Consider using bm2font for including images in TeX documents.
+
+
+2.11: What is bm2font?
+
+ bm2font is a program written by Friedhelm Sowa which converts
+ bitmaps (many formats) into PK fonts. It features scaling and
+ dithering. bm2font is available for anonymous ftp on CTAN hosts
+ in directory /tex-archive/graphics/bm2font.
+
+
+2.12: What does the error message
+
+ [cannot open dvidrv.err]
+
+ mean?
+
+ Error messages are read from a file called dvidrv.err. This file
+ must exist in the `data' subdirectory of the emTeX directory. The
+ EMTEXDIR environment variable should point to the emTeX directory.
+ If EMTEXDIR is not set, dvidrv.err is assumed to be in
+ \emtex\data. If this file cannot be found then you will get the
+ number of the error or warning and you can look up the text in
+ dvidrv.doc.
+
+
+2.13: The driver issues fatal error 2003 if I try to let it print
+ directly to a device such as PRN.
+
+ If you are using MS-DOS:
+
+ mode lpt1,,p (DOS 2.x and 3.x)
+ mode lpt1 retry=r (DOS 4.0 or later)
+
+ If you are using DR-Dos:
+
+ This failure is due to a bug in DR-Dos 5.0. DR-Dos 5.0 cannot
+ send a Ctrl-Z character to any device because the IOCTL system
+ call which is used to enable output of Ctrl-Z to devices seems to
+ be ignored by DR-Dos 5.0. Even printing to a file and copying
+ that file to the device using `copy /b' does not work. It is
+ reported that there is a new version of DR-Dos 5.0 with that bug
+ fixed. Remedy: Obtain that new version, a later version, or use
+ OS/2, MS-DOS or PC-DOS.
+
+
+2.14: The drivers cannot find the fonts circle10 and circlew10.
+ What can I do?
+
+ See the answer to question 4.10.
+
+
+2.15: I get the error message
+
+ A numeric coprocessor exception occurred and a numeric
+ coprocessor exception handler was not registered
+
+ with all drivers but dviscrs (note the `s' at the end) and
+ dvivik.
+
+ This problem should disappear when you remove the (n)nansi.sys
+ driver from config.sys. Currently, I don't know any other remedy.
+
+
+2.16: I get the error message
+
+ A program started an invalid instruction without registering
+ an invalid opcode exception handler
+
+ with all drivers but dviscrs (note the `s' at the end) and dvivik.
+
+ There seems to be a problem with old RAM disk drivers which use
+ neither XMS nor EMS.
+
+
+2.17: How can I send a fax document created with TeX?
+
+ Under DOS, use pcxfax.bat to create a PCX file. Feed that PCX
+ file into your fax software.
+
+ Under OS/2, use prtfaxwk.cmd to print to a printer port attached
+ to FaxWorks. By default, prtfaxwk.cmd prints to LPT3.
+ Alternatively, you can use dvipm (with fax.cnf) to print to the
+ FxPrint printer.
+
+
+2.18: Where can I get a DVI previewer for Windows?
+
+ Fetch /tex-archive/dviware/dviwin/dviwin29.zip from CTAN.
+
+
+dviscr
+------
+
+2.19: I have a video adapter which is not supported by dviscr. What
+ can I do?
+
+ Send me the hardware and software documentation. If it is not too
+ difficult, then there is a good chance that I will extend dviscr.
+
+
+2.20: Why can't I use ESC for quitting dviscr?
+
+ ESC is used for leaving the status line when entering a search
+ string (for the S command), a page index (G command), a page
+ number (P command), scaling factors (Alt+G and Alt+S commands), or
+ the transformation (T command). To avoid quitting dviscr by
+ mistake, the key for leaving the status line is different from the
+ keys for quitting dviscr. Use Q or Ctrl+C to quit dviscr.
+
+
+dvihplj
+-------
+
+2.21: How can I stop dvihplj from deleting preloaded soft fonts in
+ an HP LaserJet?
+
+ dvihplj deletes all fonts designated temporary unless
+ +delete-fonts:off is used. You should preload the fonts as
+ permanent or use +delete-fonts:off. You may still get problems
+ due to the font numbers assigned to the fonts loaded by the driver
+ duplicating those of the soft fonts. To avoid this use the
+ +font-offset option: by setting +font-offset:1000 the driver will
+ use 1000 to 1031 for the fonts it downloads.
+
+
+2.22: Characters go missing at the edges of the page.
+
+ Set the correct page size with +page-height and +page-width. Note
+ that laser printers cannot print within about 5mm from any edge of
+ the paper.
+
+ Some DeskJet models have a switch for selecting the page length.
+ Set that switch correctly. If your DeskJet does not have such a
+ switch, use the +paper and +set-paper options.
+
+
+2.23: My HP LaserJet II produces an interesting, but undesired,
+ pattern in the middle of the page.
+
+ This sometimes happens when the page height set with +page-height
+ is larger than the printer permits.
+
+
+2.24: How can I include a PCL file (a print file for the LaserJet
+ produced by another program) in a TeX document?
+
+ Use \special{em:pclfile ...} to include a PCL file; however, that
+ works with dvihplj only.
+
+ If the file contains only graphics (no text), you can convert it
+ into a MSP or PCX file with PCLtoMSP and then include it with
+ \special{em:graph}. This works with all emTeX DVI drivers,
+ including dviscr and dvipm.
+
+
+2.25: dvihplj doesn't work with my HP LaserJet+ compatible printer.
+
+ Try the following options: +optimize-graphics:off,
+ +negative-top-offset:off, +clear-fonts:1, and
+ +full-page-bitmap:on.
+
+
+dvidot
+------
+
+2.26 The output has `shadows' or the left margin is jagged.
+
+ Create a new DOT file with empty BLANK_WIDTH or switch the printer
+ to 10 CPI. See \emtex\doc\english\makedot.doc for details.
+
+2.27: Why is the printed output so bad? Sometimes lines overprint
+ one another and at other times characters are cut by this
+ horizontal lines. Sometimes lines are reduced in height.
+
+ The fault is usually the printer's. To print correctly even the
+ smallest paper movement must be executed exactly. You could try
+ experimenting with tractor feed and sheet feed. This problem
+ occurs more frequently with printers from some manufacturers than
+ others but I am not going to name names. Remedy: Use 360x180 DPI
+ instead of 360x360 DPI.
+
+
+2.28: How can I make sure that the margin from the perforation is
+ correct; I am using fanfold paper?
+
+ Always feed an empty sheet through first and adjust the paper so
+ that the margin is correct. The empty first page is necessary as
+ many printers cannot start printing right at the top of the first
+ page.
+
+
+dvipm
+-----
+
+2.29: How can I save the options of dvipm?
+
+ Use Options->Save_options to save the options to a file, say,
+ \emtex\data\dvipm.cnf. Use that file as response file on the
+ command line of dvipm.exe or load it with Options>-Load_options.
+ You can save the other settings (window position etc.) with
+ File->Settings->Save. These will be reloaded automatically.
+
+
+2.30: How can I print with dvipm? dvipm says
+
+ 0x203e - GpiSetBitmap failed.
+
+ when printing.
+
+ Select File->Print_Options to open the `Print Options' dialog,
+ then select `Bitmap' and `Use GpiDrawBits'.
+
+
+2.31: How can I print with dvipm? All character codes are shifted: A
+ is printed instead of B, etc.
+
+ Select File->Print_Options to open the `Print Options' dialog,
+ then select `Bitmap'.
+
+
+2.32: How can I avoid emTeX saying
+
+ ! I can't write on file `xxx.dvi'.
+
+ when I try to run emTeX while dvipm displays xxx.dvi?
+
+ In dvipm, select File->New or File->Auto_reload.
+
+
+2.33: A dialog box is displayed when I start dvipm:
+
+ SYS2070
+ The system could not demand load the application's segment.
+ DVIPM->EMDLL2X.46 is in error.
+
+ What's wrong?
+
+ You are using an out-dated version of emdll2x.dll. Make sure that
+ exactly one directory containing emdll2x.dll (c:\emtex\dll) is
+ listed in the LIBPATH statement of config.sys. Make sure that you
+ are using the version of emdll2x.dll shipped with dvipm.
+
+
+2.34: dvipm shows boxes of characters, how can I make it show characters?
+
+ Start dvipm by running vp.cmd instead of running dvipm.exe. If
+ you want to create a WorkPlace Shell program object for dvipm,
+ type `@p6l' (or a reference to another configuration file) in the
+ `Parameters' entryfield.
+
+
+3. METAFONT
+===========
+
+3.1: Why doesn't METAFONT display a picture on my screen?
+
+ METAFONT works only with the following adapters: CGA, EGA and VGA.
+ In particular, if you have a Hercules compatible card then you
+ will not get any graphic output. mf386 does not support graphical
+ output under DOS.
+
+
+3.2: emTeX does not have INIMF. What shall I do?
+
+ INIMF is there, simply call METAFONT with `mf /i' (see also
+ \emtex\doc\english\metafont.doc).
+
+
+3.3: METAFONT displays error messages for some fonts or creates
+ wrong TFM files.
+
+ MF files that don't contain a line similar to
+
+ if unknown cmbase: input cmbase fi
+
+ should usually be processed with plain.bas, not with cm.bas.
+ Examples are the line and lcircle fonts.
+
+
+3.4: makebas complains about `plain.mf' or `s640x480.mf' not being
+ installed. What's wrong?
+
+ As mentioned by INSTALL.ENG, you should unset the MFINPUT
+ environment variable. If you need MFINPUT, don't forget to add
+ `!' to the end of the path of emTeX's `mfinput' directory.
+
+
+3.5: METAFONT says
+
+ I can't find the PLAIN base file!
+
+ What's wrong?
+
+ You forgot to create the base files or METAFONT cannot find the
+ base files. See the installation instructions in
+ \emtex\doc\english\metafont.doc. Usually, you should not set the
+ MFBAS and BMFBAS environment variables.
+
+
+3.5: I call METAFONT with the command line
+
+ mf &cm \smode="mymode"; input cmr10
+
+ but the quotes disappear.
+
+ You should use
+
+ mf &cm \smode=\"mymode\"; input cmr10
+
+ instead, see \emtex\doc\english\metafont.doc.
+
+
+3.7: Why does METAFONT not switch back into text mode when it is finished?
+
+ That would clear the screen, removing the messages there. Type
+
+ mode co80
+
+ to switch back to text mode (type `mode mono' if a monochrome
+ adapter is installed).
+
+
+3.8: Why does METAFONT overwrite the graphics with text?
+
+ I was too lazy to put it right, besides it is not easy. The
+ problem has been solved for OS/2.
+
+
+3.9: METAFONT overwrites the graphics with blanks.
+
+ Some versions of ansi.sys (and replacements) seem to cause this
+ problem. Try without ANSI driver. Try another ANSI driver.
+
+
+3.10: How can I get rid of the mfj*.tmp subdirectory that MFjob
+ sometimes leaves behind ?
+
+ Run `emdelete -r mfj*.tmp' in all directories that contains such
+ subdirectories.
+
+
+3.11: METAFONT's version number is 2.718, however plain.mf's version
+ number is 2.71. Is there anything wrong?
+
+ No.
+
+
+3.12: METAFONT crashes (I have a rather unusual memory card).
+
+ Use the /d option with METAFONT or MFjob.
+
+
+3.13: GFtoDVI cannot find gray.tfm or slant.tfm or black.tfm.
+
+ See \emtex\doc\english\mfware.doc.
+
+
+3.14 When computing a DC font, METAFONT says:
+
+ ! Not implemented: (boolean)or(unknown numeric).
+
+ What shall I do?
+
+ Delete or regenerate the dx.bas base file.
+
+
+3.15: Has emTeX's METAFONT passed the trap test?
+
+ Yes.
+
+
+3.16: How do I add a new METAFONT mode?
+
+ 1. Add a `mode_def' for the new mode to \emtex\mfinput\etc\local.mf
+
+ 2. Add appropriate definitions to \emtex\mfjob\modes.mfj, using
+ the existing definitions as models
+
+ 3. Create a configuration file (CNF file) for the new mode and put
+ it into directory \emtex\data
+
+ 4. Recreate all the base files with makebas
+
+
+4. FONTS
+========
+
+4.1: What are FLI files (files with extension .fli)?
+
+ These are "font libraries". A single file contains several font
+ files (PK or PXL). Further information can be found in
+ fontlib.doc and dvidrv.doc (+font-libraries).
+
+
+4.2: I have other printer drivers which cannot use font libraries;
+ does this mean that I have to keep both the font library and
+ the font files on the disk?
+
+ No. The files in the font library can be unpacked with fontlib,
+ that is, split up into single files again. The dvidrv printer
+ drivers work both with font libraries and with single files.
+ After unpacking, the font libraries are no longer needed. The
+ font library file does, however, make a good backup as backing up
+ many small files is inefficient. See fontlib.doc and dvidrv.doc
+ (+font-files).
+
+
+4.3: What is the difference between "cmr10 scaled 1200" (that is,
+ "cmr10 at 12pt" and "cmr12"? Removing duplicate fonts would
+ save quite a bit of space on the disk!
+
+ The answer is given in The TeXbook, page 16. Each font is
+ designed for a particular size, magnified fonts are just that,
+ magnified: the stroke widths, height, width and spacing must be
+ changed for the new size, they are not simply in proportion.
+ Using a magnified font is a last resort for use when the correct
+ font is not available -- unless, of course, the page is to be
+ reduced after printing. There are parameter files (from John
+ Sauter) to generate Computer Modern fonts in unusual sizes (other
+ than 5, 6, 7, 8, 9, 10, 12, 17pt) but these are not yet in general
+ use. The DC font use a similar scheme.
+
+
+4.4: I already have a set of TeX fonts, do I need the FLI files
+ mentioned in INSTALL.ENG, QUICK.ENG, README.ENG, and
+ dvidrv.doc?
+
+ You can use your fonts as long as they are PK files (with ID 89)
+ or PXL files (with ID 1001 or 1002). Fonts in GF format cannot be
+ used (GFtoPK.exe will convert them). Note, however, that the
+ sources for the Computer Modern fonts have changed in 1992 and
+ 1995; you should no longer use the old fonts. The TFM files have
+ not changed.
+
+
+4.5: I would like to generate the fonts myself, how do I do this?
+
+ INSTALL.ENG tells you how to create the base font library files.
+ See also the documentation for MFjob (mfjob.doc). It is not
+ recommended to run MFjob on all.mfj, that's overkill. The DVI
+ drivers automatically call MFjob to generate missing fonts.
+
+
+4.6: Why can't GF files be used?
+
+ GF files use a great deal of disk space and the routines to read
+ GF files would make the DVI drivers even larger. Apart from this,
+ GF files can easily be converted into PK files. For these reasons
+ I have decided not to support GF files in the drivers.
+
+
+4.7: I would like to print using 180 DPI fonts for draft as well as
+ 360 DPI fonts for final copy but I haven't enough room on my
+ disk for both the P6L and the P6H fonts.
+
+ The drivers can reduce the size of the fonts they use. For
+ instance, you can have the P6H fonts on your disk which the driver
+ can scale down to 180 DPI -- though the result is not as good as
+ using the P6L fonts. Fonts can be scaled by the factors 1, 2, 3,
+ 4, 5, 6, 7 and 8 --- fractional values are not possible. You can,
+ however, have different horizontal and vertical factors.
+
+
+4.8: What is a virtual font?
+
+ While we used Computer Modern fonts and 7-bit characters,
+ everything was simple. But increasingly, built-in font sets
+ (PostScript!) were being used too. This caused difficulties when
+ a document was to be previewed on the screen, or printed on a
+ device which did not contain these fonts. Virtual fonts come to
+ the rescue here: they consist of a TFM file (which contains
+ information on ligatures and character widths) and a VF file. The
+ VF file tells the printer driver how the different characters of
+ the font are to be generated. For instance, whether the
+ characters can be replaced by another font (e.g. cm font) or made
+ up from two other characters. If we have an 8-bit virtual font in
+ which the characters from 0 to 127 correspond to a cm font and the
+ rest are accented characters, then the VF information for these
+ accented characters can show that they are to be made from
+ existing ones, for instance, letter and accent.
+
+
+4.9: How can I fix wrong character spacing?
+
+ The fonts must match the TFM files used for typesetting the
+ document. Perhaps you got hit by a bug in emTeX's printer drivers
+ which strikes when substituting a font with one of a different
+ design size. Until this bug is fixed, don't substitute fonts with
+ fonts of a different design size.
+
+
+4.10: The drivers cannot find the fonts circle10 and circlew10.
+ What can I do?
+
+ The fonts containing circles, quarter circles, and discs have been
+ renamed from circle* to lcircle*. You can make the emTeX DVI
+ drivers change the names (circle* -> lcircle*) using the font
+ substitution file circle.sub: +font-subst-file:circle.
+
+
+4.11: What's the `Cork Encoding'?
+
+ The Computer Modern fonts employ a 7-bit encoding, allowing for
+ 128 different characters. In 1990, at the TeX User's Group
+ meeting in Cork, Ireland, an 8-bit encoding was created (allowing
+ for 256 different characters). That encoding is called the `Cork
+ Encoding'. For instance, the DC fonts use the Cork Encoding.
+
+
+4.12: Where can I find xx_more.fli?
+
+ Those font libraries are intended for local fonts. See
+ INSTALL.ENG on how to create them.
+
+
+5. Miscellaneous topics
+=======================
+
+5.1: A program complains about not being able to create a temporary
+ file. What's wrong?
+
+ The environment variable TMP should point to an existing, writable
+ directory. Note that writing to the root directory of network
+ drives is usually not permitted.
+
+
+5.2: Will emTeX use a coprocessor if present? If not, would it run
+ faster with coprocessor support?
+
+ No. No.
+
+
+5.3: I have only a 360 KB (or 720 KB) drive in my machine, how can
+ I get emTeX on suitable disks?
+
+ Use ZIPSPLIT or SLICE to split the ZIP files. Or use BACKUP to
+ make 360 KB diskettes.
+
+
+5.4: The emTeX documentation is rubbish, I can write better!
+
+ Please do so and then send it to me so I can include it with
+ emTeX.
+
+
+5.5: Where can I find an exact description of VFtoVP, VPtoVF,
+ TFtoPL and PLtoTF?
+
+ You can find the description in the files vftovp.web, vptovf.web,
+ tftopl.web and pltotf.web, which are not included with emTeX.
+
+
+5.6: Where can I find a description of PiCTeX?
+
+ You will find the answer in \emtex\doc\english\install.eng.
+
+
+5.7: Is there an emTeX version for Linux, Macintosh, Windows NT,
+ Unix, ...?
+
+ No. emTeX is available for OS/2, MS-DOS, and PC-DOS. There are
+ other ports of TeX for other machines and operating systems.
+ Apparently emTeX works under Windows.
+
+
+5.8: Will there be emTeX etc. for other operating systems?
+
+ No, that's not planned.
+
+
+5.9: What is CTAN?
+
+ CTAN means Comprehensive TeX Archive Network, a collective term
+ for certain ftp servers using the same directory structure and
+ mirroring each other. Please use the host closest to you:
+
+ ftp.dante.de (Germany)
+ ftp.tex.ac.uk (UK)
+
+ There are a lot of partial and complete mirrors of CTAN, for
+ instance:
+
+ ftp.cdrom.com /pub/tex/ctan (USA)
+
+
+5.10: Where's the book list? There used to be one in the README.ENG
+ file of previous emTeX releases.
+
+ It has been removed because there are too many books available.
+ Any selection of books would be incomplete, biased, out-dated, and
+ unqualified (because I haven't read all the books).
+
+
+5.11: Are there any user interfaces (shells) for emTeX?
+
+ There are too many to be listed here. Most of them are available
+ from CTAN. Let me give just four examples:
+
+ J\"urgen Schlegelmilch's TeXShell (DOS, text mode)
+ CTAN: /tex-archive/systems/msdos/texshell/ts271.zip
+
+ Andreas Krebs' TeXtelmExtel (Windows)
+ CTAN: /tex-archive/systems/msdos/emtex-contrib/TeXtelmExtel/...
+
+ Jon Hacker's EPMTeX (enhancements for OS/2's EPM editor)
+ CTAN: /tex-archive/systems/os2/epmtex/...
+
+ Kresten Krab Thorup's and Per Abrahamsen's AUC TeX (for GNU Emacs)
+ CTAN: /tex-archive/support/auctex/...
+
+
+5.12: Is there an installation program for emTeX?
+
+ An installation program for emTeX is now available for beta testing.
+
+ CTAN: /tex-archive/systems/msdos/emtex/betatest/README.INS
+
+ -------- End of HELP.ENG -------------
diff --git a/systems/msdos/emtex/HELP.GER b/systems/msdos/emtex/HELP.GER
new file mode 100644
index 0000000000..fbd8b4aa4e
--- /dev/null
+++ b/systems/msdos/emtex/HELP.GER
@@ -0,0 +1,1223 @@
+==============================================================================
+HELP.GER (emTeX DISTRIBUTION) 23-Feb-1997
+==============================================================================
+
+Diese Datei enthaelt haeufig gestellte Fragen und die Antworten darauf.
+Wenn Sie weitere Fragen (mit oder ohne Antworten) haben, die nicht
+oder nur schwierig anhand der Anleitungen zu beantworten sind, teilen Sie
+mir diese bitte mit.
+
+Falls Sie nicht wissen, wie emTeX installiert wird, lesen Sie bitte
+INSTALL.GER.
+
+
+Inhalt
+======
+
+1. TeX
+2. DVIDRV
+3. METAFONT
+4. ZEICHENSAETZE
+5. Verschiedenes
+
+
+1. TeX
+======
+
+1.1: Was ist der Unterschied zwischen normalem TeX und bigTeX?
+
+ `bigTeX' ist groesser als das normalgrosse TeX (und viel langsamer).
+ Wenn irgendein TeX-Speicherbereich ueberlaeuft, sollten Sie
+ versuchen, bigTeX zu verwenden. Wenn Sie einen 80386 oder besseren
+ Prozessor haben, sollten Sie tex386.exe statt btex*.exe verwenden,
+ da es viel schneller ist und mehr Speicher fuer Zeichenketten
+ zur Verfuegung stellt (pool size).
+
+
+1.2: TeX gibt die Fehlermeldung
+
+ Fatal format file error; I'm stymied
+
+ aus. Was kann ich dagegen tun?
+
+ Sie haben versucht, eine Format-Datei fuer eine andere TeX-Version
+ zu laden (z.B. normalgross gegenueber bigTeX, oder Version 3.14
+ gegenueber 3.14159). Beachten Sie, dass die bigTeX-Programme
+ (einschliesslich tex386.exe) die Umgebungsvariable BTEXFMT
+ benutzen. Die normalgrossen Versionen benutzen die Variable TEXFMT.
+ (Beachten Sie auch, dass diese Environment-Variablen normalerweise
+ nicht gesetzt werden muessen.) Vielleicht haben Sie vergessen, das
+ Argument `386' auf der makefmt-Kommandozeile anzugeben.
+
+ Falls die Meldung den Text
+
+ Must increase the trie size
+
+ enthaelt, haben sie vergessen, TeX mit der Option /mt aufzurufen.
+ Um eine Format-Datei mit einem anderen als dem voreingestellten
+ Wert von `trie size' zu erstellen und zu benutzen, muessen Sie die
+ Option /mt verwenden. Ein geeigneter Weg ist, diese Option in die
+ Environment-Variable EMTEXOPT aufzunehmen. Das Programm makefmt
+ erzeugt auf Wunsch eine Batch-Datei; diese Batch-Datei verwendet
+ den optimalen Wert fuer die /mt-Option. Weitere Hinweise finden Sie
+ in \emtex\doc\german\tex.doc.
+
+
+1.3: TeX gibt die Meldung
+
+ I can't find the PLAIN format file!
+
+ aus. Was ist falsch?
+
+ Sie haben vergessen, die Format-Dateien zu erzeugen oder emTeX
+ kann diese nicht finden. Sie koennen makefmt verwenden, um die
+ Format-Dateien zu erzeugen (siehe INSTALL.GER, QUICK.GER und
+ \emtex\doc\german\tex.doc). Achten Sie darauf, dass Sie dies im
+ richtigen Verzeichnis tun. Normalerweise sollten Sie die
+ Environment-Variablen TEXFMT, BTEXFMT und HTEXFMT nicht setzen.
+
+
+1.4: Beim Versuch, LaTeX zu verwenden, erhalte ich die
+ Fehlermeldung
+
+ ! Undefined control sequence.
+ l.1 \documentclass
+
+ oder
+
+ ! Undefined control sequence.
+ l.1 \documentstyle
+
+ Was mache ich falsch?
+
+ Anscheinend verwendet TeX das PLAIN-Format anstelle des
+ LaTeX-Formats. Sie muessen TeX mitteilen, dass Sie das LaTeX-Format
+ verwenden wollen. Hierzu sollten Sie die von makefmt erzeugte
+ Batch-Datei anstelle von TeX aufrufen und sicherstellen, dass die
+ Format-Datei existiert und gefunden werden kann (siehe die Antwort
+ auf Frage 1.2).
+
+
+1.5: makefmt beschwert sich ueber eine fehlende Datei `plain.tex'.
+ Was habe ich falsch gemacht?
+
+ Sie sollten die Environment-Variable TEXINPUT entfernen, wie in
+ INSTALL.GER erwaehnt. Falls Sie TEXINPUT wirklich benoetigen,
+ sollten Sie `!' an den Pfad zum `texinput' Verzeichnis von emTeX
+ anhaengen.
+
+
+1.6: makefmt kann `makefmt.dat' nicht finden. Was habe ich falsch
+ gemacht?
+
+ Sie haben die Environment-Variable EMTEXDIR nicht richtig gesetzt.
+ Der Wert muss der Pfadname eines einzigen Verzeichnisses sein, ohne
+ `;', `!' und `!!'. Es duerfen keine Leerzeichen am Ende sein. Der
+ Wert muss auf das emTeX-Verzeichnis zeigen, z.B.:
+
+ set emtexdir=c:\emtex
+
+
+1.7: Wann wird eine TeX-XeT oder TeX--XeT Variante von emTeX
+ verfuegbar sein?
+
+ emTeX wird kein TeX-XeT werden, da TeX-XeT durch TeX--XeT
+ ersetzt worden ist. TeX--XeT erstellt normale DVI-Dateien,
+ wohingegen TeX-XeT IVD-Dateien erstellt, die spezielle DVI-Treiber
+ oder einen weiteren Konvertierungsschritt erfordern.
+
+ TeX-XeT und TeX--XeT sind spezielle TeX-Versionen, die Texte
+ sowohl von links nach rechts als auch von rechts nach links (fuer
+ Hebraeisch usw.) setzen koennen. Ich weiss nicht, ob und wann ich ein
+ TeX--XeT machen werde.
+
+
+1.8: Warum ist tex386.exe auf meinem Rechner langsamer als tex.exe?
+
+ Wenn es nicht genug Speicher hat, benutzt tex386.exe die
+ Festplatte als virtuellen Speicher. Konfigurieren Sie nicht Ihren
+ ganzen EMS- oder XMS-Speicher als Cache oder als RAM-Disk!
+
+
+1.9: Wie kann ich tex386 unter Windows verwenden, ohne ein
+ DOS-Fenster zu oeffnen?
+
+ Besorgen Sie sich /tex-archive/systems/msdos/dpmigcc/rsxwin3c.zip
+ von einem CTAN-Server.
+
+
+1.10: Warum funktioniert die Option /mm# bei mir nicht?
+
+ Der Hauptspeicher von TeX ist zweigeteilt: Ein Teil fuer `kleine'
+ Dinge und ein Teil fuer `grosse' Dinge, und nur der Teil fuer
+ `kleine' Dinge wird von /mm# veraendert. Ungluecklicherweise geht in
+ den meisten Faellen der Speicher fuer `grosse' Dinge aus.
+
+
+1.11: Angeblich ist emTeX doch soooo schnell. Aber bei mir ist
+ abcTeX beim Text xyz.tex deutlich schneller als emTeX! Woran
+ liegt das?
+
+ Die Geschwindigkeit von emTeX haengt sehr von der Groesse des
+ verfuegbaren Speichers ab. Wenn sehr wenig freier Speicher
+ vorhanden ist, kann es sein, dass eine andere TeX-Implementation,
+ die Ihnen weniger Speicher zur Verfuegung stellt, schneller ist.
+
+
+1.12: Bei emTeX ist kein INITEX dabei! Was nun?
+
+ INITEX *ist* dabei, einfach `tex /i' aufrufen (Sie haetten
+ \emtex\doc\german\tex.doc lesen sollen). Beachten Sie, dass die /i
+ Option vor allen anderen Kommandozeilenargumenten stehen muss.
+
+
+1.13: TeX zeigt folgende Fehlermeldung:
+
+ ! TeX capacity exceeded, sorry [buffer size=2048].
+
+ Was kann ich dagegen tun?
+
+ Manche Textverarbeitungsprogramme speichern ganze Absaetze als nur
+ eine Zeile. Falls solch ein Absatz z.B. 3000 Zeichen enthaelt, wird
+ eine Zeile mit 3000 Zeichen in die Datei geschrieben, unabhaengig
+ davon, wie der Absatz auf dem Bildschirm aussieht. Abhilfe: Diese
+ Textverarbeitungsprogramme bieten meistens die Moeglichkeit an, die
+ Datei formatiert abzuspeichern.
+
+
+1.14: Was ist der Unterschied zwischen TeX, emTeX und LaTeX?
+
+ TeX ist ein Textsatzsystem. emTeX ist eine Implementation von TeX
+ fuer OS/2 und DOS. LaTeX ist ein Makropaket fuer TeX (welches daher
+ mit emTeX benutzt werden kann).
+
+
+1.15: Was ist der Unterschied zwischen LaTeX, LaTeX 2.09 und LaTeX2e?
+
+ LaTeX 2.09 ist das Makropaket, welches von Leslie Lamport
+ entwickelt wurde. Dieses Makropaket wird nicht mehr offiziell
+ unterstuetzt. LaTeX2e ist der Nachfolger von LaTeX 2.09 und wird
+ vom LaTeX3-Projekt entwickelt. Mit LaTeX war urspruenglich LaTeX
+ 2.09 gemeint, jetzt ist damit LaTeX2e gemeint.
+
+
+1.16: Direkt eingegebene Zeichen mit Akzenten (z.B. Umlaute)
+ funktionieren nicht mit LaTeX2e. Was ist falsch?
+
+ Falls Sie die Fehlermeldung
+
+ ! Text line contains an invalid character.
+
+ erhalten, sollten Sie die Format-Datei mit dem `8bit'-Argument von
+ makefmt neu erzeugen.
+
+ Falls Sie auf dem Bildschirm keine Fehlermeldungen sehen, sollten
+
+ \usepackage[cp850]{inputenc}
+
+ in Ihren Dokumenten verwenden. (In der LOG-Datei des
+ fehlgeschlagenen TeX-Laufs sollten Sie Zeilen der Art
+
+ Missing character: There is no ^^84 in font cmr10!
+
+ sehen koennen.)
+
+
+1.17: Warum kann ich die Format-Dateien von anderen TeX-Versionen
+ nicht mit emTeX verwenden?
+
+ Format-Dateien haengen sehr von der Implementation (z.B. von den
+ Groessen der verschiedenen Speicherbereiche (z.B. hash size)) ab.
+ Sie werden kaum zwei verschiedene TeX-Implementationen finden,
+ zwischen denen die Format-Dateien austauschbar sind!
+
+
+1.18: Wenn ich die von emTeX erzeugten DVI-Dateien auf einen anderen
+ Rechner zum Drucken uebertrage, meint der dortige
+ Druckertreiber, die DVI-Datei waere defekt.
+
+ Dies liegt ueblicherweise an der Datenuebertragung.
+ uuencode/uudecode oder xxencode/xxdecode beseitigen das Problem.
+ DVI-Dateien sind portabel und rechnerunabhaengig.
+
+
+1.19: Ich moechte meinen Text mit einem Rechtschreibpruefprogramm
+ bearbeiten.
+
+ Bearbeiten Sie die DVI-Datei mit dvispell und lassen das
+ Pruefprogramm ueber die dvispell-Ausgabe laufen.
+
+
+1.20: emTeX erzeugt eine andere DVI-Datei als eine andere
+ TeX-Implementation bei gleicher Eingabe.
+
+ Das ist zulaessig. Die Optimierung von Positionsaenderungen haengt
+ von der Groesse des DVI-Dateipuffers ab (oder kann ganz weggelassen
+ werden. Ausserdem ist an bestimmten Stellen (\leaders)
+ Fliesskommaarithmetik zulaessig und diese haengt vom Rechner und
+ Compiler ab.
+
+
+1.21: TeX trennt Woerter schon nach dem ersten Buchstaben, z.B. T-est!
+
+ Sie haben eine neue Format-Datei erzeugt mit einem Makropaket, das
+ nicht fuer TeX 3.0 geeignet ist. Sie sollten die Format-Datei
+ nochmals erzeugen und diesmal \lefthyphenmin und \righthyphenmin
+ geeignet fuer die verwendete Trennmuster setzen.
+
+
+1.22: Ich bekomme folgende Fehlermeldung (unter DOS):
+
+ Please insert diskette containing TEX.EXE into drive x
+ press any key to continue
+
+ Erhoehen Sie den Wert von FILES= in Ihrer config.sys-Datei.
+
+
+1.23: Wo ist german.tex?
+
+ Verwenden Sie german.sty.
+
+
+1.24: Wie rufe ich LaTeX auf? Ich kann kein latex.exe finden!
+
+ Lesen Sie in \emtex\doc\german\install.ger nach, wie LaTeX
+ installiert wird. Lesen Sie in \emtex\doc\german\tex.doc nach,
+ wie Sie eine Format-Datei fuer LaTeX mit dem Programm makefmt
+ erzeugen koennen; makefmt erzeugt auch eine Batch-Datei
+ (z.B. latex.bat) zum Aufruf von LaTeX.
+
+
+1.25: Wie wird AMSTeX installiert?
+
+ Lesen Sie die Installationsanleitung von AMSTeX. (AMSTeX ist bei
+ emTeX nicht dabei, ist aber von CTAN erhaeltlich.)
+
+
+1.26: Wie kann ich emTeX dazu bringen, TFM-Dateien im
+ Arbeitsverzeichnis zu suchen?
+
+ Setzen Sie die Environment-Variable TEXTFM dergestalt, dass sie
+ auch `.' enthaelt:
+
+ set textfm=.;c:\emtex\tfm!
+
+
+1.27: Beim Start von tex386.exe oder htex386.exe erhalte ich die
+ Fehlermeldung
+
+ emx not found
+
+ Was ist falsch?
+
+ Sie haben vergessen, das Verzeichnis c:\emx\bin zum Suchpfad fuer
+ Programme (PATH) hinzuzufuegen (oder Sie haben vergessen, den
+ Rechner nach dieser Aenderung neu zu starten). Falls Sie dieses
+ Verzeichnis nicht im Suchpfad haben wollen, koennen Sie die
+ Environment-Variable EMX auf den Pfadnamen von emx.exe setzen:
+
+ set emx=c:\emx\bin\emx.exe
+
+ (Wie ueblich sollten Sie den korrekten Laufwerksbuchstaben
+ einsetzen.)
+
+
+1.28: Beim Start von tex386.exe oder htex386.exe erhalte ich die
+ Fehlermeldung
+
+ SYS1804: The system cannot find the file EMX.
+
+ oder
+
+ SYS1804: Datei EMX kann nicht gefunden werden.
+
+ Was ist falsch?
+
+ Sie haben vergessen, das Verzeichnis c:\emx\dll zum
+ LIBPATH-Kommando in config.sys hinzuzufuegen (oder Sie haben
+ vergessen, den Rechner nach dieser Aenderung neu zu starten).
+
+
+1.29: Wie kann ich vermeiden, dass emTeX
+
+ ! I can't write on file `xxx.dvi'.
+
+ sagt, falls ich versuche, emTeX aufzurufen, waehrend ich mit
+ dvipm xxx.dvi betrachte?
+
+ Selektieren Sie File->New oder File->Auto_reload in dvipm.
+
+
+1.30: tex386.exe gibt die Meldung
+
+ Usage: emx [-cdeoOV] ...
+
+ aus. Was ist falsch?
+
+ Sie haben eine veraltete Version von emx.exe in Ihrem Suchpfad fuer
+ Programme (PATH). Loeschen Sie die alte Version und behalten Sie
+ \emx\bin\emx.exe aus emxrsx.zip.
+
+
+1.31: Wie kann ich ein TeX-Format vorladen (preload), d.h., eine
+ EXE-Datei erzeugen, die die Format-Datei enthaelt?
+
+ Dies wird von emTeX nicht unterstuetzt, da ich es nicht fuer
+ sinnvoll halte.
+
+
+1.32: Besteht emTeX den trip-Test?
+
+ Ja.
+
+
+1.33: TeX stuerzt ab (ich benutze eine etwas seltsame Speicherkarte).
+
+ Verwenden Sie die /d-Option von TeX.
+
+
+1.34: Wie kann ich tex386.exe und htex386.exe unter Windows oder in
+ einem DOS-Fenster von OS/2 verwenden? Die Programme sagen
+ `DYN: out of memory'.
+
+ Vergroessern Sie den DPMI-Speicherbereich von Windows oder des
+ DOS-Fensters.
+
+
+2. DVIDRV
+=========
+
+Allgemeines
+-----------
+
+2.1: Ich habe einen PostScript-Drucker, aber bei emTeX ist kein
+ passender Treiber dabei. Wo kann ich einen PostScript-Treiber
+ finden?
+
+ Benutzen Sie dvips von Tomas Rokicki. Es gibt Portierungen fuer
+ OS/2 und DOS, die fuer Anonymous ftp auf CTAN-Servern im
+ Verzeichnis /tex-archive/systems/msdos/emtex/dvips558
+ bereitstehen. dvips kann emTeX-Zeichensatzbibliotheken benutzen.
+
+
+2.2: Die automatische Zeichensatzerstellung funktioniert nicht.
+ METAFONT schreibt zwar eine GF-Datei (aber keine TFM-Datei),
+ aber GFtoPK findet diese nicht. Was ging schief?
+
+ Falls MFjob GFtoPK mit einem Dateinamen aufruft, der eine lange
+ Extension hat (z.B. cmr10.300gf), aber METAFONT eine Datei mit
+ verkuerzter Extension erzeugt hat (z.B. cmr10.300), sollten Sie die
+ /z Option von MFjob verwenden:
+
+ set mfjobopt=/z
+
+ (Sie sollten den bisherigen Wert von MFJOBOPT durch /z erweitern,
+ nicht ersetzen.)
+
+ Ueberpruefen Sie die Environment-Variable EMXOPT: Diese darf nicht
+ `-t' enthalten.
+
+ Falls MFjob GFtoPK mit einem Dateinamen aufruft, der eine
+ verkuerzte Extension hat (z.B. cmr10.300), aber METAFONT eine Datei
+ mit langer Extension erzeugt hat (z.B. cmr10.300gf), haben Sie
+ faelschlicherweise die /z-Option von MFjob verwendet,
+ wahrscheinlich in der Environment-Variablen MFJOBOPT.
+
+ Falls dies nicht hilft, haben Sie wahrscheinlich die
+ Installationsanweisungen ignoriert: Entweder haben Sie nicht den
+ \emtex-Verzeichnisbaum einer aelteren emTeX-Version nicht geloescht
+ (wodurch METAFONT eine veraltete local.mf-Datei erwischte) oder
+ Sie haben keine neuen Base-Dateien erzeugt.
+
+ Wie Sie die Base-Dateien erzeugen koennen, steht in
+ \emtex\doc\german\metafont.doc.
+
+ Die korrekte local.mf-Datei befindet sich in \emtex\mfinput\etc,
+ die alte in \emtex\mfinput. Falls die Datei
+ \emtex\mfinput\local.mf existiert, sollten Sie den gesamten emTeX
+ Verzeichnisbaum loeschen und die neueste Version von emTeX neu
+ installieren.
+
+ Ueberpruefen Sie bitte die LOG-Datei (\emtex\bmfbases\plain.log,
+ ueblicherweise), die von METAFONT beim Erzeugen der Base-Datei
+ geschrieben wurde: Die LOG-Datei sollte
+
+ (c:\emtex\mfinput\etc\local.mf)
+
+ aber nicht
+
+ (c:\emtex\mfinput\local.mf)
+
+ enthalten.
+
+ Bitte beachten Sie, dass einige METAFONT-Modes umbenannt wurden.
+ Stellen Sie sicher, dass die CNF-Dateien (z.B. lj.cnf) der
+ DVI-Treiber den korrekten, neuen METAFONT Mode, in der Zeile die
+ mit `+metafont-mode' beginnt, einstellen (falls eine Zeile
+ existiert, die mit `/fm' beginnt, sollten Sie die neueste Version
+ der DVI-Treiber installieren). Stellen Sie ausserdem sicher, dass
+ die Datei \emtex\mfjob\modes.mfj die korrekten, neuen METAFONT
+ Modes verwendet. Falsche Einstellungen koennen durch Installation
+ nicht zu einander passender Programmversionen enstehen;
+ moeglicherweise verwenden Sie auch veraenderte CNF-Dateien. Bitte
+ installieren Sie die neueste Version der DVI-Treiber, von MFjob
+ und von METAFONT.
+
+ Falls das Problem mit dvips auftritt, sollten Sie den METAFONT
+ Mode in config.ps (in der Zeile die mit `M' beginnt) korrekt
+ einstellen.
+
+ Die folgende Tabelle enthaelt die alten und zugehoerigen neuen
+ METAFONT Modes:
+
+ Alt | Neu
+ -------------------+-----------------------
+ hplaser | laserjet oder deskjet
+ kyocera | laserjet
+ hpquiet | quietjet
+
+
+2.3: Die Treiber finden einen gerade automatisch erstellten
+ Zeichensatz nicht. Warum?
+
+ Dies ist ein Rundungsproblem welches in Version 1.6a beseitigt
+ sein sollte. Falls Sie das Problem noch immer haben, fuegen Sie
+ bitte die Groesse des von MFjob erzeugten Zeichensatzes der Liste
+ der vom Treiber durchsuchten Groessen hinzu. Beispiel: Wenn der
+ Treiber cmr10<746.63959> anfordert, MFjob den Zeichensatz aber in
+ das Verzeichnis `746dpi' schreibt (statt in `747dpi'), fuegen Sie
+
+ +font-sizes:+746
+
+ in der Batch-Datei oder der Konfigurationsdatei hinzu.
+
+
+2.4: Wie kann ich MFjob dazu bringen, mf386.exe statt mf.exe
+ aufzurufen?
+
+ SET MFJOBOPT=/3
+
+
+2.5: Mein Drucker ist an der seriellen Schnittstelle angeschlossen
+ und es wird Unsinn gedruckt.
+
+ Sie sollten das XON-XOFF-Protokoll mit +xon-xoff einschalten (als
+ Ausgabegeraet sollte dann COM1, COM2, COM3 oder COM4 angegeben
+ werden).
+
+
+2.6: Ich verwende noch andere Druckertreiber, die aber keine
+ FLI-Dateien verwenden koennen. Muss ich jetzt die ganzen
+ Zeichensaetze doppelt auf der Platte haben?
+
+ Nein, siehe die Antwort auf Frage 4.2.
+
+
+2.7: Die Treiber hinterlassen immer eine Protokolldatei (DLG-Datei,
+ z.B. dviscr.dlg). Wie kann ich das abschalten?
+
+ Durch Angabe von +transcript-file (ohne Dateiname).
+
+
+2.8: Ich habe eine PCX- (oder MSP-Datei), die nicht mit
+ \special{em:graph} verwendet werden kann.
+
+ Bitte dem emTeX-Autor die Grafikdatei (inklusive Ausdruck dieser
+ Grafik) schicken. Beachten Sie, dass von bestimmten Programmen
+ geschriebene PCX-Dateien nicht eindeutig interpretiert werden
+ koennen. Die DVI-Treiber von emTeX weisen diese PCX-Dateien zurueck.
+ Eventuell sollten Sie bm2font verwenden.
+
+
+2.9: Ich fuege mit \special{em:graph} genau nach dvidrv-Handbuch
+ eine Grafik ein. Leider sitzt diese aber zu weit rechts oder
+ zu weit unten.
+
+ Das liegt daran, dass manche Grafiken einen linken und oberen
+ (leeren) Rand haben. Sie koennen den folgenden Trick benutzen (fuer
+ xxx den Namen der Grafikdatei eintragen):
+
+ \noindent\special{em:graph xxx}\bye
+
+ durch TeX jagen. Die DVI-Datei mit dvidot wieder in eine
+ Grafikdatei umwandeln, wobei die +minimize Option verwendet wird.
+ Diese Option bewirkt das Entfernen der Raender. Die nun erzeugte
+ Grafikdatei koennen Sie dann in Ihren Text einfuegen.
+
+
+2.10: Die mit \special{em:graph} eingefuegten Grafiken werden viel zu
+ klein (oder zu gross).
+
+ Die Treiber kopieren die Grafik ohne sie zu vergroessern oder zu
+ verkleinern. Wenn die Grafik die falsche Groesse hat, sollten Sie
+ diese vorher mit einem dafuer geeigneten Programm vergroessern oder
+ verkleinern. Eventuell sollten Sie bm2font verwenden.
+
+
+2.11: Was ist bm2font?
+
+ Das ist ein von Friedhelm Sowa geschriebenes Programm, welches
+ Grafikdateien (viele Formate) in PK-Dateien umwandelt. Das
+ Programm unterstuetzt Skalierung und Dithering. bm2font ist per ftp
+ erhaeltlich im Verzeichnis /tex-archive/graphics/bm2font von
+ CTAN-Servern erhaeltlich.
+
+
+2.12: Was hat die Meldung
+
+ [cannot open dvidrv.err]
+
+ zu bedeuten?
+
+ Die dvidrv-Fehlermeldungen stehen in der Datei dvidrv.err. Diese
+ muss im Unterverzeichnis `data' des emTeX-Verzeichnisses stehen,
+ welches durch die Environment-Variable EMTEXDIR festgelegt wird.
+ Falls EMTEXDIR nicht gesetzt ist, wird angenommen, dass dvidrv.err
+ in \emtex\data zu finden ist. Wenn dvidrv.err nicht gefunden
+ werden kann, erhalten Sie nur die Nummer der Warnung oder
+ Fehlermeldung (die koennen Sie in dvidrv.doc anhand der Nummer
+ nachschlagen).
+
+
+2.13: Ich bekomme Fehlermeldung 2003 wenn ich als Ausgabedatei einen
+ Geraetenamen (z.B. PRN) angegeben habe.
+
+ Falls Sie MS-DOS verwenden:
+
+ mode lpt1,,p (DOS 2.x oder 3.x)
+ mode lpt1 retry=r (DOS 4.0 oder spaeter)
+
+ Falls Sie DR-Dos verwenden:
+
+ Dies ist ein Fehler in DR-Dos 5.0, nicht in den Treibern. DR-Dos
+ 5.0 kann kein Ctrl-Z an ein Geraet (z.B. Drucker) ausgeben, da
+ anscheinend der IOCTL-Aufruf, der dies ermoeglicht, ignoriert wird.
+ In eine Datei drucken und diese mit `copy /b' zum Drucker schicken
+ hilft bei nicht, da auch `copy /b' bei DR-Dos 5.0 nicht richtig
+ funktioniert. Angeblich gibt es inzwischen eine neuere Version von
+ DR-Dos 5.0, bei der dieser Fehler behoben sein soll. Abhilfe:
+ Diese neue Version besorgen oder OS/2, MS-DOS oder PC-DOS
+ verwenden.
+
+
+2.14: Der DVI-Treiber beschwert sich ueber einen fehlenden
+ Zeichensatz circle10 oder circlew10. Was tun?
+
+ Siehe die Antwort auf Frage 4.10.
+
+
+2.15: Mit allen Treibern ausser dviscrs (`s' am Ende!) und dvivik
+ bekomme ich die Fehlermeldung
+
+ A numeric coprocessor exception occurred and a numeric
+ coprocessor exception handler was not registered.
+
+ Was tun?
+
+ Dieses Problem sollte verschwinden, wenn Sie aus config.sys den
+ Treiber (n)nansi.sys entfernen. Zur Zeit ist keine andere Loesung
+ des Problems bekannt.
+
+
+2.16: Mit allen Treibern ausser dviscrs (`s' am Ende!) und dvivik
+ bekomme ich die Fehlermeldung
+
+ A program started an invalid instruction without registering
+ an invalid opcode exception handler.
+
+ Was tun?
+
+ Hieran scheinen alte RAM-Disk-Treiber schuld zu sein, die weder
+ XMS noch EMS verwenden.
+
+
+2.17: Wie kann ich ein mit TeX erstelltes Dokument per Fax verschicken?
+
+ Unter DOS erzeugen Sie mit pcxfax.bat eine PCX-Datei, welche Sie
+ mit Ihrer Fax-Software verschicken koennen sollten.
+
+ Unter OS/2 drucken Sie mit prtfaxwk.cmd auf eine
+ Druckerschnittstelle, die mit FaxWorks verbunden ist. Wenn nichts
+ anderes eingestellt wird, druckt prtfaxwk.cmd auf LPT3. Alternativ
+ koennen Sie dvipm (mit fax.cnf) zum Drucken verwenden.
+
+
+2.18: Wo kann ich einen DVI-Previewer fuer Windows bekommen?
+
+ Besorgen Sie sich /tex-archive/dviware/dviwin/dviwin29.zip
+ von einem CTAN-Server.
+
+
+dviscr
+------
+
+2.19: Ich habe eine Grafikkarte, die nicht von dviscr unterstuetzt
+ wird. Was tun?
+
+ Mir die Hardware- und Software-Unterlagen schicken. Wenn der
+ Aufwand nicht zu gross ist, stehen die Chancen recht gut, dass ich
+ dann dviscr erweitere.
+
+
+2.20: Warum kann ich dviscr nicht mit ESC beenden?
+
+ Die ESC-Taste wird zum Verlassen der Statuszeile verwendet, wenn
+ Sie einen Suchtext (S), einen Seitenindex (G), eine Seitennummer
+ (P), Skalierungsfaktoren (Alt+G und Alt+S) oder eine
+ Transformation (T) eingeben. Damit dviscr nicht versehentlich
+ verlassen wird, sind die Tasten zum Verlassen der Statuszeile und
+ zum Beenden von dviscr verschieden. Zum Verlassen von dviscr
+ koennen Sie Q oder Ctrl+C verwenden.
+
+
+dvihplj
+-------
+
+2.21: Wie kann ich verhindern, dass dvihplj in den Drucker (LaserJet)
+ geladene Zeichensaetze (Soft-Fonts) loescht?
+
+ dvihplj loescht alle temporaeren Zeichensaetze falls nicht
+ +delete-fonts:off eingestellt ist. Sie sollten Ihre Zeichensaetze
+ als permanente Zeichensaetze in den Drucker laden oder
+ +delete-fonts:off einstellen. Aber dann kann es noch immer zu
+ Ueberschneidungen der Zeichensatznummern kommen. Dies koennen Sie
+ vermeiden, indem Sie mit +font-offset einstellen, welche
+ Zeichensatznummern dvihplj verwenden soll. Bei +font-offset:1000
+ verwendet dvihplj die Zeichensatznummern 1000 bis 1031.
+
+
+2.22: Am Blattrand fehlen Zeichen!
+
+ Blattgroesse mit +page-height und +page-width korrekt einstellen!
+ Bitte beachten Sie, dass bei Laserdrucker ein unbedruckbarer Rand
+ von etwa 5mm existiert.
+
+ Manche DeskJet-Modelle besitzen einen Schalter, mit dem die
+ Papierlaenge eingestellt wird. Bitte stellen Sie diesen Schalter
+ korrekt ein. Falls Ihr DeskJet keinen solchen Schalter besitzt,
+ verwenden Sie bitte die Optionen +paper und +set-paper.
+
+
+2.23: Mein HP LaserJet II produziert recht interessante (aber
+ unerwuenschte) Muster mitten auf dem Blatt.
+
+ Dies geschieht manchmal, wenn die Seitenhoehe mit +page-height
+ groesser eingestellt wird, als der Drucker vertraegt.
+
+
+2.24: Wie kann ich eine PCL-Datei (eine fuer den LaserJet gedachte
+ Druckdatei, die von einem anderen Programm erzeugt wurde) in
+ ein TeX-Dokument einfuegen?
+
+ Mit \special{em:pclfile ...} koennen Sie PCL-Dateien einfuegen;
+ jedoch funktioniert dies nur mit dvihplj.
+
+ Falls die Druckdatei nur Grafik enthaelt (also keine
+ Einzelzeichen), koennen Sie diese mit PCLtoMSP in eine Grafikdatei
+ umwandeln und dann mit \special{em:graph} in Ihren Text einbauen.
+ Dies hat den Vorteil, dass dies mit allen DVI-Treibern von emTeX,
+ inklusive dviscr und dvipm, funktioniert.
+
+
+2.25: dvihplj funktioniert nicht mit meinem HP-LaserJet+-kompatiblen
+ Drucker.
+
+ Versuchen Sie die folgenden Optionen: +optimize-graphics:off,
+ +negative-top-offset:off, +clear-fonts:1 und +full-page-bitmap:on.
+
+
+dvidot
+------
+
+2.26: Der Ausdruck zeigt `Schatten' oder der linke Rand ist gezackt.
+
+ Erstellen Sie eine neue DOT-Datei mit leerem BLANK_WIDTH oder
+ schalten Sie den Drucker auf 10 Zeichen pro Zoll um.
+
+
+2.27: Warum ist das Druckbild so schlecht? Es werden mal Zeilen
+ ueberdruckt, mal sind Zeichen (durch eine klitzekleine
+ waagrechte Linie) zerrissen, manchmal ist eine Zeile
+ gequetscht (Hoehe zu klein).
+
+ Meistens liegt's an der Mechanik der Drucker: Auch kleinste
+ Zeilenvorschuebe muessen funktionieren, damit die Ausgabe ordentlich
+ wird. Sie sollten mit Stachelradantrieb oder Gummiwalzenantrieb
+ experimentieren. Dieses Problem tritt bei Druckern mancher
+ Hersteller haeufiger auf als bei anderen (ich moechte keine Namen
+ nennen). Abhilfe: 360x180 DPI statt 360x360 DPI verwenden.
+
+
+2.28: Wie erreiche ich es, dass der obere Papierrand stimmt (ich
+ verwende Endlospapier)?
+
+ Immer ein Blatt `Vorlauf' haben und das Papier so einlegen, dass
+ der Rand stimmt. Das `Vorlaufblatt' ist noetig, da die meisten
+ Drucker nicht ganz am Anfang des ersten Blattes beginnen koennen.
+
+
+dvipm
+-----
+
+2.29: Wie kann ich die Optionen von dvipm sichern?
+
+ Schreiben Sie die Optionen mit Options->Save_options in eine
+ Datei, z.B. \emtex\data\dvipm.cnf. Verwenden Sie diese Datei als
+ Antwortdatei auf der Kommandozeile beim Start von dvipm.exe oder
+ laden Sie sie mit Options->Load_options. Die anderen Einstellungen
+ (Fensterposition etc.) koennen mit File->Settings->Save gesichert
+ werden und werden automatisch geladen.
+
+
+2.30: Wie kann ich mit dvipm drucken? dvipm sagt
+
+ 0x203e - GpiSetBitmap failed.
+
+ beim Versuch zu drucken.
+
+ Selektieren Sie File->Print_Options um den `Print Options' Dialog
+ zu oeffnen, dann selektieren Sie `Bitmap' und `Use GpiDrawBits'.
+
+
+2.31: Wie kann ich mit dvipm drucken? Alle Zeichencodes sind
+ verschoben, statt B wird A gedruckt, usw.
+
+ Selektieren Sie File->Print_Options um den `Print Options' Dialog
+ zu oeffnen, dann selektieren Sie `Bitmap'.
+
+
+2.32: Wie kann ich vermeiden, dass emTeX
+
+ ! I can't write on file `xxx.dvi'.
+
+ sagt, falls ich versuche, emTeX aufzurufen, waehrend ich mit
+ dvipm xxx.dvi betrachte?
+
+ Selektieren Sie File->New oder File->Auto_reload in dvipm.
+
+
+2.33: Die folgende Dialog-Box wird angezeigt wenn ich dvipm starte:
+
+ SYS2070
+ Ein Segment der Anwendung konnte nicht geladen werden.
+ DVIPM->EMDLL2X.46 ist fehlerhaft.
+
+ Was ist falsch?
+
+ Sie verwenden eine veraltete Version von emdll2x.dll. Stellen Sie
+ sicher, dass genau ein Verzeichnis das emdll2x.dll enthaelt
+ (c:\emtex\dll) im LIBPATH-Befehl von config.sys aufgefuehrt ist.
+ Stellen Sie sicher, dass die Version von emdll2x.dll die bei dvipm
+ mitgeliefert wird verwendet wird.
+
+
+2.34: dvipm zeigt nur Rechtecke statt Zeichen an, wie kann ich dvipm
+ dazu bringen, Zeichen anzuzeigen?
+
+ Starten Sie dvipm durch Aufruf von vp.cmd statt durch Aufruf von
+ dvipm.exe. Falls Sie ein Programmobjekt fuer die WorkPlace Shell
+ erstellen wollen, tragen Sie bitte `@p6l' (oder einen Verweis auf
+ eine andere Konfigurationsdatei) im `Parameter'-Feld ein.
+
+
+3. METAFONT
+===========
+
+3.1: Warum erzeugt METAFONT keine Grafikausgabe auf dem Bildschirm?
+
+ METAFONT arbeitet nur mit folgenden Grafikkarten: CGA, EGA und
+ VGA. Insbesondere bei Verwendung der Hercules-Karte erhalten Sie
+ keine Grafikausgabe. mf386 unterstuetzt keine Grafikausgabe unter
+ DOS.
+
+
+3.2: Bei emTeX ist kein INIMF dabei! Was nun?
+
+ INIMF *ist* dabei, einfach `mf /i' aufrufen (Sie haetten
+ \emtex\doc\german\metafont.doc lesen sollen).
+
+
+3.3: METAFONT zeigt bei manchen Zeichensaetzen Fehlermeldungen an
+ oder erzeugt falsche TFM-Dateien.
+
+ Zeichensaetze, die nicht eine Zeile der Art
+
+ if unknown cmbase: input cmbase fi
+
+ enthalten, sind ueblicherweise nicht mit cm.bas sondern mit
+ plain.bas zu verarbeiten. Beispiele sind die line- und
+ lcircle-Zeichensaetze.
+
+
+3.4: makebas beschwert sich ueber eine fehlende Datei `plain.mf'
+ oder `s640x480.mf'. Was habe ich falsch gemacht?
+
+ Sie sollten die Environment-Variable MFINPUT entfernen, wie in
+ INSTALL.GER erwaehnt. Falls Sie MFINPUT wirklich benoetigen,
+ sollten Sie `!' an den Pfad zum `mfinput' Verzeichnis von emTeX
+ anhaengen.
+
+
+3.5: METAFONT gibt die Meldung
+
+ I can't find the PLAIN base file!
+
+ aus; was habe ich falsch gemacht?
+
+ Sie haben vergessen, die Base-Dateien zu erzeugen oder METAFONT
+ kann diese nicht finden. Bitte beachten Sie INSTALL.GER und die
+ Installationshinweise in \emtex\doc\german\metafont.doc.
+ Normalerweise sollten Sie die Environment-Variablen MFBAS und
+ BMFBAS nicht setzen.
+
+
+3.6: Ich rufe METAFONT mit
+
+ mf &cm \smode="mymode"; input cmr10
+
+ auf, aber die Anfuehrungszeichen werden von METAFONT weggelassen.
+
+ Sie sollten
+
+ mf &cm \smode=\"mymode\"; input cmr10
+
+ verwenden, siehe \emtex\doc\german\metafont.doc.
+
+
+3.7: Warum schaltet METAFONT nicht in den Textmodus zurueck?
+
+ Das wuerde den Bildschirm loeschen; dadurch gingen die Meldungen
+ verloren. Mit dem Kommando
+
+ mode co80
+
+ koennen Sie in den Textmodus zurueckschalten (`mode mono' fuer
+ Monochrome-Adapter).
+
+
+3.8: Warum ueberschreibt METAFONT die Grafik auf dem Bildschirm mit
+ Text?
+
+ Ich war bisher zu faul, das richtig zu machen (ist auch nicht ganz
+ einfach). Fuer OS/2 ist das Problem geloest.
+
+
+3.9: METAFONT ueberschreibt die Grafik auf dem Bildschirm mit
+ Leerzeichen.
+
+ Dieses Problem wird vermutlich durch ein paar Versionen von
+ ansi.sys (oder Ersatz) verursacht. Versuchen Sie es ohne
+ ANSI-Treiber.
+
+
+3.10: Wie kann ich die mfj*.tmp-Verzeichnisse, die MFjob manchmal
+ zuruecklaesst, loswerden?
+
+ Fuehren Sie `emdelete -r mfj*.tmp' in allen Verzeichnissen aus, die
+ solche Verzeichnisse enthalten.
+
+
+3.11: Die Versionsummer von METAFONT ist 2.718, aber die
+ Versionsnummer von plain.mf ist 2.71. Ist irgendetwas falsch?
+
+ Nein.
+
+
+3.12: METAFONT stuerzt ab (ich benutze eine etwas seltsame Speicherkarte).
+
+ Verwenden Sie die /d-Option von METAFONT oder MFjob.
+
+
+3.13: GFtoDVI kann gray.tfm oder slant.tfm oder black.tfm nicht finden.
+
+ Siehe \emtex\doc\german\mfware.doc.
+
+
+3.14: Beim Berechnen eines DC-Zeichensatzes sagt METAFONT:
+
+ ! Not implemented: (boolean)or(unknown numeric).
+
+ Was soll ich tun?
+
+ Sie sollten die Base-Datei dx.bas loeschen oder neu erzeugen.
+
+
+3.15: Besteht die METAFONT-Version von emTeX den trap-Test?
+
+ Ja.
+
+
+3.16: Wie kann ich einen neuen METAFONT-Mode hinzufuegen?
+
+ 1. Fuegen Sie ein neues `mode_def' fuer den Modus zu den bisherigen
+ Definitionen in \emtex\mfinput\etc\local.mf
+
+ 2. Ergaenzen Sie \emtex\mfjob\modes.mfj um Definitionen fuer den
+ neuen Modus. Sie koennen die vorhandenen Definitionen als
+ Vorlage verwenden
+
+ 3. Erstellen Sie eine Konfigurationsdatei (CNF-Datei) fuer den
+ neuen Modus im Verzeichnis \emtex\data
+
+ 4. Erstellen Sie alle Base-Dateien neu mit makebas
+
+
+4. ZEICHENSAETZE
+================
+
+4.1: Was sind FLI-Dateien? (Dateien mit der Erweiterung .fli)
+
+ Das sind `Font libraries' (Zeichensatzbibliotheksdateien). Diese
+ fassen mehrere Einzeldateien (im PK- oder PXL-Format) zusammen.
+ Weitere Informationen koennen Sie in fontlib.doc und dvidrv.doc
+ (+font-libraries) finden.
+
+
+4.2: Ich verwende noch andere Druckertreiber, die aber keine
+ FLI-Dateien verwenden koennen. Muss ich jetzt die ganzen
+ Zeichensaetze doppelt auf der Platte haben?
+
+ Nein. Die Zeichensaetze koennen mit fontlib ausgepackt werden (d.h.
+ wieder in Einzeldateien kopiert werden). Die dvidrv-Treiber koennen
+ auch mit den Einzeldateien arbeiten. Die FLI-Dateien werden nach
+ dem Auspacken nicht mehr benoetigt (sind aber als Sicherungskopie
+ sehr nuetzlich, da es sehr ineffizient ist, eine Sicherungskopie
+ von derart vielen kurzen Dateien zu machen.) Siehe fontlib.doc und
+ dvidrv.doc (+font-files).
+
+
+4.3: Was ist der Unterschied zwischen "cmr10 scaled 1200" (d.h.
+ "cmr10 at 12pt") und "cmr12"? Da koennte man doch einiges an
+ Plattenplatz sparen!
+
+ Das steht in The TeXbook, Seite 16. Jeder Zeichensatz ist (sollte)
+ fuer jede Groesse speziell entworfen werden. Die vergroesserten
+ Zeichensaetze sind einfach nur vergroessert. Unter anderem sind die
+ Strichdicken, die Hoehe, die Breite und die Zeichenabstaende
+ unterschiedlich. Die Verwendung von vergroesserten Zeichensaetzen
+ stellt also nur eine Notloesung dar, wenn keine Zeichensaetze in der
+ richtigen Groesse vorhanden sind (Ausnahme: Der Text wird nach dem
+ Drucken verkleinert). Es gibt uebrigens Parameterdateien (von John
+ Sauter) fuer die cm-Zeichensaetze auch in unueblichen Groessen (d.h.
+ nicht 5, 6, 7, 8, 9, 10, 12, 17pt), diese sind aber noch nicht
+ allgemein gebraeuchlich. Die DC-Zeichensaetze verwenden eine
+ aehnliche Methode.
+
+
+4.4: Ich habe schon TeX-Zeichensaetze. Benoetige ich die FLI-Dateien,
+ die in README.GER, INSTALL.GER, QUICK.GER und dvidrv.doc
+ erwaehnt sind?
+
+ Sie koennen PK-Dateien (mit ID 89) und PXL-Dateien (mit ID 1001
+ oder 1002) verwenden. GF-Dateien koennen nicht direkt verwendet
+ werden; GFtoPK kann diese in PK-Dateien konvertieren. Beachten Sie
+ aber, dass die Computer-Modern-Zeichensaetze 1992 und 1995 geaendert
+ wurden; Sie sollten die alten Varianten nicht mehr verwenden. Die
+ TFM-Dateien haben sich nicht geaendert.
+
+
+4.5: Ich moechte die Zeichensaetze selber ausrechnen lassen. Wie geht
+ das?
+
+ In INSTALL.GER steht, wie Sie die Basis-Zeichensatzbibliotheken
+ erzeugen koennen. Weitere Informationen finden Sie in mfjob.doc. Es
+ ist nicht notwendig, MFjob mit all.mfj aufzurufen, da dies viel zu
+ viele selten benoetigte Zeichensaetze erzeugt. Die DVI-Treiber rufen
+ automatisch MFjob auf, wenn erforderliche Zeichensaetze nicht
+ vorhanden sind.
+
+
+4.6: Warum koennen keine GF-Dateien verwendet werden?
+
+ Diese brauchen sehr viel Plattenplatz und die zum Lesen von
+ GF-Dateien benoetigten Routinen wuerden die Treiber noch groesser
+ machen. Ausserdem koennen GF-Dateien leicht in PK-Dateien
+ umgewandelt werden. Daher habe ich beschlossen, GF-Dateien nicht
+ in den Treibern zu unterstuetzen.
+
+
+4.7: Ich moechte auf meinem Drucker sowohl mit (z.B.) 180 DPI (fuer
+ schnelle Probeausdrucke) als auch mit 360 DPI (langsamer
+ Schoendruck) drucken, habe aber nicht genug Plattenplatz um
+ sowohl die P6L- als auch die P6H- Zeichensaetze verwenden zu
+ koennen.
+
+ Die Treiber koennen die Zeichensaetze verkleinern. Sie kommen also
+ (z.B.) mit den P6H-Zeichensaetzen aus, diese koennen von 360 DPI auf
+ 180 DPI verkleinert werden; allerdings ist das Ergebnis nicht so
+ gut wie mit den P6L-Zeichensaetzen. Es kann nur um die Faktoren 1,
+ 2, 3, 4, 5, 6, 7 und 8 verkleinert werden, Zwischenstufen sind
+ nicht moeglich. Es koennen aber verschiedene Faktoren fuer
+ horizontale und vertikale Verkleinerung verwendet werden.
+
+
+4.8: Was ist ein Virtual Font?
+
+ Solange man nur mit den Computer-Modern-Zeichensaetzen (und mit
+ 7-Bit-Zeichen) gearbeitet hat, war alles noch einfach. Aber
+ inzwischen werden zunehmend eingebaute Druckerzeichensaetze
+ (PostScript!!!) verwendet. Hierdurch ist nun das Probelesen mit
+ einem Screen Previewer (oder ein Probedruck auf einem Drucker, der
+ nicht ueber diese Zeichensaetze verfuegt) schwierig geworden. Hier
+ helfen Virtual Fonts: Diese bestehen aus einer TFM-Datei (diese
+ enthaelt die Beschreibung, z.B. Ligaturen und Zeichenbreiten, des
+ Virtual Fonts) und den VF-Dateien. Die VF-Dateien teilen dem
+ DVI-Treiber mit, wie er die einzelnen Zeichen des Virtual Fonts zu
+ behandeln hat. Z.B. koennen die Zeichen durch Zeichen aus einem
+ anderen Zeichensatz (z.B. einem cm-Zeichensatz) ersetzt werden
+ oder aus anderen Zeichen zusammengesetzt werden. Wenn wir nun
+ einen 8-Bit-Virtual-Font haben, der bei den Zeichen 0 bis 127 mit
+ einem cm-Zeichensatz uebereinstimmt, aber zusaetzlich Zeichen mit
+ Akzenten (z.B. Umlaute) enthaelt, die aber nicht im verfuegbaren
+ cm-Zeichensatz fuer den Drucker vorhanden sind, koennen diese
+ zusaetzlichen Zeichen ueber eine VF-Datei aus den vorhandenen
+ Zeichen (d.h. Buchstabe und Akzent) zusammengesetzt werden.
+
+
+4.9: Wie kann ich falsche Zeichenabstaende korrigieren?
+
+ Die Zeichensaetzen sollten zu den von TeX verwendeten TFM-Dateien
+ passen. Vielleicht wurden Sie ein Opfer eines bekannten Defektes
+ in den DVI-Treibern von emTeX. Dieser Defekt bewirkt falsche
+ Zeichenabstaende, falls ein Zeichensatz durch einen Zeichensatz mit
+ anderer Entwurfsgroesse (Design size) ersetzt wird. Bis dieser
+ Defekt behoben ist, sollten Sie solche Ersetzungen vermeiden.
+
+
+4.10: Der DVI-Treiber beschwert sich ueber einen fehlenden
+ Zeichensatz circle10 oder circlew10. Was tun?
+
+ Die Zeichensaetze, die Kreise, Viertelkreise und Kreisscheiben
+ enthalten, wurden von circle* in lcircle* umbenannt. Sie koennen
+ die emTeX-DVI-Treiber veranlassen, die Namen zu ersetzen (circle*
+ -> lcircle*), indem Sie die ZE-Datei circle.sub verwenden:
+ +font-subst-file:circle.
+
+
+4.11: Was versteht man unter `Cork Encoding'?
+
+ Die Computer-Modern-Schriften verwenden eine 7-Bit-Codierung,
+ womit 128 verschiedene Zeichen verwendet werden koennen. Im Jahre
+ 1990 wurde auf der europaeischen TeX-Tagung in Cork (Irland) eine
+ 8-Bit-Codierung beschlossen, womit 256 verschiedene Zeichen
+ verwendet werden koennen. Diese Codierung wird `Cork Encoding'
+ genannt. Ein Beispiel fuer Schriften mit `Cork Encoding' sind die
+ DC-Schriften.
+
+
+4.12: Wo kann ich xx_more.fli finden?
+
+ Diese Zeichensatzbibliotheksdateien sind fuer lokale Zeichensaetze
+ gedacht. In INSTALL.GER steht, wie Sie diese erzeugen koennen.
+
+
+5. Verschiedenes
+================
+
+5.1: Ein Programm beschwert sich, dass es eine temporaere Datei nicht
+ anlegen koenne. Was ist falsch?
+
+ Die Environment-Variable TMP sollte auf ein existierendes
+ Verzeichnis zeigen, fuer welches Sie Schreibrechte besitzen.
+ Beachten Sie bitte, dass Sie auf Netzwerklaufwerken normalerweise
+ keine Schreibrechte im Hauptverzeichnis haben.
+
+
+5.2: Verwendet emTeX einen Coprozessor, falls einer vorhanden ist?
+ Wenn nicht: Wuerde es schneller arbeiten, wenn es den
+ Coprozessor verwenden wuerde?
+
+ Nein. Nein.
+
+
+5.3: Mein Rechner kann nur 360-KB-Disketten (oder 720-KB-Disketten)
+ lesen; wie kann ich emTeX auf meinen Rechner bekommen?
+
+ Benutzen Sie ZIPSPLIT oder SLICE um die ZIP-Dateien zu zerteilen.
+ Oder benutzen Sie BACKUP um 360-KB-Disketten zu erzeugen.
+
+
+5.4: Die emTeX-Anleitungen gefallen mir nicht, ich kann viel
+ bessere schreiben!
+
+ Tun Sie das und schicken Sie mir Ihre emTeX-Anleitungen, damit ich
+ sie bei emTeX mitliefern kann!
+
+
+5.5: Wo finde ich eine genauere Beschreibung von VFtoVP, VPtoVF,
+ TFtoPL und PLtoTF?
+
+ Die Beschreibung befindet sich in den Dateien vftovp.web,
+ vptovf.web, tftopl.web und pltotf.web, welche aber nicht bei emTeX
+ mitgeliefert werden.
+
+
+5.6: Wo finde ich eine Anleitung zu PiCTeX?
+
+ Die Antwort steht in INSTALL.GER.
+
+
+5.7: Gibt es emTeX-Versionen fuer Linux, Macintosh, Windows NT, Unix
+ usw.?
+
+ Nein. emTeX ist fuer OS/2, MS-DOS und PC-DOS verfuegbar. Fuer andere
+ Systeme gibt es andere Portierungen von TeX. Anscheinend
+ funktioniert emTeX auch unter Windows.
+
+
+5.8: Wird es emTeX und Zubehoer auch fuer andere Betriebssysteme
+ geben?
+
+ Nein, das ist nicht geplant.
+
+
+5.9: Was ist CTAN?
+
+ CTAN bedeutet `Comprehensive TeX Archive Network', eine
+ Sammelbezeichnung fuer gewisse ftp-Server, die dieselbe
+ Verzeichnisstruktur besitzen und einander spiegeln. Bitte benutzen
+ den naechstgelegenen Server:
+
+ ftp.dante.de (Deutschland)
+ ftp.tex.ac.uk (England)
+
+ Es gibt einige weitere ftp-Server, die CTAN teilweise oder
+ vollstaendig spiegeln, z.B:
+
+ ftp.cdrom.com /pub/tex/ctan (USA)
+
+
+5.10: Wo ist die Buecherliste? Bei frueheren emTeX-Versionen gab es
+ eine solche in README.GER.
+
+ Die Buecherliste wurde entfernt, da es zuviele Buecher gibt. Jede
+ Auswahl waere unvollstaendig, abhaengig von meinen Vorurteilen,
+ veraltet und unqualifiziert (da ich nicht alle Buecher gelesen
+ habe).
+
+
+5.11: Gibt es Benutzeroberflaechen fuer emTeX?
+
+ Es gibt zu viele um hier alle auffuehren zu koennen. Die meisten
+ sind auch auf CTAN zu finden. Hier nur vier Beispiele:
+
+ TeXShell von Juergen Schlegelmilch (DOS, Textmodus)
+ CTAN: /tex-archive/systems/msdos/texshell/ts271.zip
+
+ TeXtelmExtel von Andreas Krebs (Windows)
+ CTAN: /tex-archive/systems/msdos/emtex-contrib/TeXtelmExtel/...
+
+ EPMTeX von Jon Hacker (Erweiterungen fuer den EPM-Editor von OS/2)
+ CTAN: /tex-archive/systems/os2/epmtex/...
+
+ AUC TeX von Kresten Krab Thorup and Per Abrahamsen (fuer GNU Emacs)
+ CTAN: /tex-archive/support/auctex/...
+
+
+5.12: Gibt es ein Installationsprogramm fuer emTeX?
+
+ Ein Installationsprogramm fuer emTeX ist jetzt verfuegbar (Betatest):
+
+ CTAN: /tex-archive/systems/msdos/emtex/betatest/README.INS
+
+ -------- Ende von HELP.GER -------------
diff --git a/systems/msdos/emtex/INSTALL.ENG b/systems/msdos/emtex/INSTALL.ENG
new file mode 100644
index 0000000000..f607edfde6
--- /dev/null
+++ b/systems/msdos/emtex/INSTALL.ENG
@@ -0,0 +1,786 @@
+==============================================================================
+INSTALL.ENG (emTeX DISTRIBUTION) 02-Jul-1998
+==============================================================================
+
+ Installing emTeX
+
+------------------------------------------------------------------------------
+Contents
+------------------------------------------------------------------------------
+
+- Introduction
+- What to do if an old version of emTeX is already installed
+- Installing Info-ZIP's UnZip
+- Installing a package
+- Updating a package
+- Installing emTeX
+ 1. First things first
+ 2. Adding support for 32-bit programs
+ 3. Installing the TeX compiler
+ 4. Installing METAFONT
+ 5. Installing the printer drivers, screen previewers, and fonts
+ 6. Installing MakeIndex
+ 7. Installing BibTeX
+ 8. Installing TeXcad
+ 9. Installing dvispell
+ 10. Installing PiCTeX
+ 11. Installing WEB
+ 12. Viewing and printing additional documentation
+- Installing emTeX in a different directory
+- Removing a package
+- Unpacking LaTeX2e
+- Sample autoexec.bat for DOS
+- Sample config.sys for OS/2
+
+
+------------------------------------------------------------------------------
+Introduction
+------------------------------------------------------------------------------
+
+IMPORTANT: See HELP.ENG if you encounter any problems. That file is
+available separately and in first.zip, as \emtex\doc\english\help.eng.
+
+There's an installation program for emTeX, install.exe. Just run it
+to install emTeX:
+
+ a:\install
+
+If you are using Windows, please run the installation program in a DOS
+window, not from the Program Manager.
+
+If the installation program doesn't work for you or you need a special
+installation, you'll have to read the rest of this document
+(INSTALL.ENG).
+
+Simplified installation instructions are available in QUICK.ENG. See
+the introduction of QUICK.ENG to see whether you can use and want to
+use those instructions.
+
+These installation instructions assume that emTeX will be installed on
+drive C: in directory \emtex and that the distribution files are on
+diskettes in drive A:. If you choose to install emTeX in a different
+directory or if the distribution files are in a different location,
+you have to modify the commands appropriately.
+
+
+------------------------------------------------------------------------------
+What to do if an old version of emTeX is already installed
+------------------------------------------------------------------------------
+
+This emTeX distribution completely replaces any previously distributed
+emTeX versions. If you already have emTeX installed, you must entirely
+remove (or rename) the installed \emtex directory tree. Moreover, you
+should un-set all environment variables you had defined for previous
+emTeX versions: delete all SET commands for the following environment
+variables from autoexec.bat and config.sys:
+
+ BIBINPUT BTEXFMT MFBAS MFJOB TEXINPUT
+ BMFBAS EMTEXDRV MFINPUT TEXFMT TEXTFM
+
+Moreover, remove the \emtex directory from PATH (this release of emTeX
+uses \emtex\bin instead of \emtex). After modifying autoexec.bat or
+config.sys, you should reboot your machine. Do this now to avoid
+installation problems caused by the old settings of the environment
+variables.
+
+(The environment variables listed above still exist, with the
+exception of EMTEXDRV which has been replaced by EMTEXDIR. However,
+the old settings disable subdirectory search, prohibiting proper
+operation of emTeX. Moreover, setting EMTEXDIR is sufficient in most
+cases.)
+
+If you have installed third-party packages such as dvips, it is
+recommended to remove all emTeX packages with the `emremove' tool and
+then rename the \emtex directory:
+
+ emremove c:\emtex\remove\tex.rem c:\
+ emremove c:\emtex\remove\mf.rem c:\
+ etc. etc. etc.
+ move c:\emtex emtex.old
+
+You can find emremove.exe in first.zip.
+
+To delete the entire emTeX directory tree, type
+
+ cd \
+ emdelete -r c:\emtex
+
+using emdelete.exe from first.zip (previous versions of delete.exe
+require a different syntax). To get the new emdelete.exe, follow the
+instructions for unpacking first.zip below, then copy emdelete.exe to
+a directory listed in PATH.
+
+Note that you should copy emdelete.exe to another directory if it is
+currently located in the directory tree to be deleted.
+
+Since by this procedure all files in the directory c:\emtex and in all
+subdirectories of this directory will be deleted, you should not use
+this directory for your own files!
+
+
+------------------------------------------------------------------------------
+Installing Info-ZIP's UnZip
+------------------------------------------------------------------------------
+
+emTeX is packaged using Info-ZIP's compression utility. Info-ZIP's
+software (Zip, UnZip and related utilities) is free and can be
+obtained as source code or executables from various bulletin board
+services and anonymous-ftp sites, including CompuServe's IBMPRO forum
+and ftp.uu.net:/pub/archiving/zip/*.
+
+Prior to installing emTeX, you have to install UnZip (unless UnZip is
+already installed). UnZip is distributed as self-extracting archive,
+that is, an .exe file with a ZIP archive attached which will be
+unpacked when running the .exe file. The UnZip files should be put
+into a scratch directory. The following examples assume that the
+UnZip self-extracting archives are stored on a diskette in drive A:.
+
+If you are using OS/2, type
+
+ md \unzip
+ cd \unzip
+ a:\unz512
+
+to unpack UnZip into directory \unzip.
+
+If you are using DOS, type
+
+ md \unzip
+ cd \unzip
+ a:\unz512x3
+
+to unpack UnZip into directory \unzip.
+
+After unpacking UnZip, you'll find several documentation and
+executable files.
+
+For installing emTeX, you have to choose an UnZip executable and put
+it into a directory of the PATH under the name `unzip.exe'.
+
+For OS/2, the following two UnZip executables are available:
+
+ unzip16.exe 16-bit executable for OS/2 1.0 and later
+ unzip32.exe 32-bit executable for OS/2 2.0 and later
+
+For DOS, the following two UnZip executables are available:
+
+ unzip.exe 16-bit executable for 8088 and better CPUs
+ unzip386.exe 32-bit executable for 80386 and better CPUs
+
+If your machine is equipped with a 80386 CPU or better, you can use a
+32-bit executable. The 32-bit executables are usually faster than
+their 16-bit counterparts, there are no other differences. If the
+32-bit executable does not work for you, try the 16-bit executable.
+
+For instance, to use unzip386.exe type
+
+ copy unzip386.exe c:\bin\unzip.exe
+
+if c:\bin is a directory listed in your PATH. The rest of this
+document assumes that UnZip is invoked by typing `unzip'.
+
+See unzip.doc for further information on UnZip.
+
+
+------------------------------------------------------------------------------
+Installing a package
+------------------------------------------------------------------------------
+
+Before installing an update of a package, you should remove the
+previously installed version of that package. See below.
+
+Installing a package involves unpacking the ZIP archive files of that
+package. Most packages are distributed in one ZIP archive file.
+
+To unpack a ZIP archive file select as current working directory the
+directory into which the `emtex' directory should be placed.
+Typically this is the root directory of your C: drive:
+
+ c:
+ cd \
+
+To unpack, say, first.zip from drive A:, type the following command:
+
+ unzip a:\first
+
+Directories will be created as required.
+
+To view the contents (file listing) of the ZIP archive file, type
+
+ unzip -l a:\first
+
+To update a package (that is, install a newer version of a package
+that is already installed), remove the currently installed package
+with emremove.exe (see below), then install the new package.
+
+Before updating a package, you might want to check whether the new ZIP
+archive files are readable and not corrupted. This can be done by
+running
+
+ unzip -tq a:\*.zip
+
+
+------------------------------------------------------------------------------
+Updating a package
+------------------------------------------------------------------------------
+
+Before installing an update of a package, you should remove the
+previously installed version of that package. See below.
+
+
+------------------------------------------------------------------------------
+Installing emTeX
+------------------------------------------------------------------------------
+
+1. First things first
+---------------------
+
+Please remove all environment variables of any previously installed
+emTeX version (EMTEXDRV, MFINPUT, TEXINPUT, TEXTFM, etc.) from
+config.sys and/or autoexec.bat.
+
+First, you should install package `first' which contains documentation
+files and some tools. As explained above, this is done approximately
+this way:
+
+ c:
+ cd \
+ unzip a:\first
+
+As usual, the drive letters and directories depend on where you choose
+to install emTeX and where the ZIP files are located.
+
+After unpacking first.zip, you should add the directory c:\emtex\bin
+to your PATH. PATH is either set in config.sys or in autoexec.bat.
+
+You should also set the EMTEXDIR environment variable to point to the
+emTeX directory:
+
+ set emtexdir=c:\emtex
+
+Please don't use spaces! (`set emtexdir = c:\emtex' won't work!)
+
+DOS users should verify that the config.sys file specifies at least
+
+ FILES=20
+ BUFFERS=20
+
+If these statements are missing or if the values are smaller than
+shown above, you should insert these statements or increase the values
+to at least the values shown above.
+
+OS/2 users might want to add c:\emtex\book\english to the BOOKSHELF
+environment variable set in config.sys. That simplifies viewing the
+OS/2 on-line manuals of emTeX.
+
+Some programs need a directory for scratch files. Those temporary
+files are stored in the directory pointed to by the TMP environment
+variable:
+
+ md c:\tmp
+ set tmp=c:\tmp
+
+You might want to use a RAM disk for scratch files. For instance, if
+your RAM disk has drive letter F, set TMP like this:
+
+ set tmp=f:\
+
+However, you should not install a RAM disk for emTeX's scratch files
+as using RAM directly is more efficient.
+
+In the process of installing various emTeX components, several
+environment variables have to be set. You can use the batch files
+\emtex\bin\set_tex.bat and \emtex\bin\set_tex.cmd as models.
+
+If the computer complains about not enough environment space, you
+should consult your DOS manual concerning the SHELL statement of
+config.sys and concerning the /E and /P options of COMMAND.COM. In
+most versions of DOS, adding a line reading
+
+ SHELL=C:\DOS\COMMAND.COM C:\DOS /E:1024 /P
+
+to config.sys will work (this example assumes that DOS is installed in
+directory c:\dos). If you already have such a line in config.sys, you
+might have to increase the value of the /E option by approximately
+512.
+
+After changing config.sys and autoexec.bat, you should reboot to
+effect the changes. However you might want to delay rebooting until
+after installing emx.
+
+
+2. Adding support for 32-bit programs
+-------------------------------------
+
+If you have a 386 CPU or better, you can use special 32-bit versions
+of some programs which take advantage of that CPU. Those 32-bit
+versions require installation of package `emxrsx'. This package is
+special as it puts files both into the EMTEX directory (like all the
+other packages) and the EMX directory. emxrsx.zip is a subset of
+emxrt.zip, the emx runtime package, plus rsx. emx and rsx are DOS
+extenders which are used by 32-bit programs. emx is for DOS
+configurations without DPMI (DOS Protected Mode Interface), rsx is for
+DOS configurations which employ DPMI (MS Windows, for instance). emx
+also includes files required for running the 32-bit programs under
+OS/2 2.x and OS/2 3 Warp. However, 32-bit programs cannot be run
+under OS/2 1.x, whatever CPU you have.
+
+To install package `emxrsx', unpack emxrsx.zip and follow the
+instructions in \emx\doc\emxrt.doc (under OS/2, you can read a nicer
+version of that text by typing `view \emx\book\emxrt'). Here's what
+to do, in a nutshell:
+
+- Add c:\emx\bin to PATH (config.sys or autoexec.bat)
+
+- Under OS/2, add c:\emx\dll to the LIBPATH statement of config.sys
+
+- Under DOS, remove BREAK=ON from config.sys
+
+- Reboot
+
+Special care must be taken if you already have emx.dll on your OS/2
+system. See emxrt.doc (or emxrt.inf) for details.
+
+
+3. Installing the TeX compiler
+------------------------------
+
+To use TeX, unpack tex4b.zip. tex386 and htex386 require emxrsx.zip,
+see above. In addition to TeX, you need font metric files (TFM files)
+which are contained in fontcm.zip. The plain TeX macros are shipped
+in tex4b.zip.
+
+If you want to use LaTeX2e, unpack l2input.zip. If you want to use
+LaTeX 2.09, unpack latex209.zip. (You can install both.) As both
+LaTeX2e and LaTeX 2.09 require the LaTeX fonts, unpack fontltx.zip.
+To use German hyphenation patterns and macros for German language
+support, unpack german.zip.
+
+IMPORTANT: See \emtex\doc\english\tex.doc for further installation
+instructions (OS/2 users can type `view tex'), including how to create
+format files.
+
+Typically, you'll create format files for plain TeX and LaTeX2e with
+US English hyphenation patterns, for use with tex386.exe:
+
+ cd \emtex\btexfmts
+ makefmt 386 plain US
+ makefmt 386 latex2e US 8bit -b \emtex\bin\latex2e
+
+IMPORTANT: See \emtex\doc\english\tex.doc for details (OS/2 users can
+type `view tex').
+
+Package l2tools contains additional macros for LaTeX2e. After
+creating format files and after unpacking l2tools.zip, type
+
+ cd \emtex\dist\latex\packages\tools
+ latex2e tools.ins
+
+(latex2e is the name of the batch file for invoking LaTeX2e, created
+by makefmt) and copy some files to the LaTeX2e input directory:
+
+ copy *.tex \emtex\texinput\latex2e
+ copy *.sty \emtex\texinput\latex2e
+
+If you don't use LaTeX 2.09, you might want to copy the files to their
+own subdirectory, such as \emtex\texinput\tools2e.
+
+See \emtex\dist\latex\packages\tools\readme.txt for further details.
+The file manifest.txt in the same directory contains a list of macro
+packages provided by l2tools. After copying the files, you can save
+some disk space by deleting files in \emtex\dist\latex\packages\tools.
+
+texware.zip contains various tools for TeX: texchk (a syntax checker
+for LaTeX 2.09), texconv (convert accented characters), DVItype (lists
+and checks DVI files) PLtoTF and TFtoPL (convert and check TFM files),
+VFtoVP and VPtoVF (convert and check virtual font files).
+
+
+4. Installing METAFONT
+----------------------
+
+To use METAFONT, mf4b.zip (METAFONT proper) and mfjob12d.zip (assists
+METAFONT in generating fonts) should be unpacked. mf386 requires
+emxrsx.zip, see above.
+
+You also need some or all font source files from fontcm.zip,
+fontec.zip, fontltx.zip, fontams.zip, and fontemsy.zip.
+
+IMPORTANT: See \emtex\doc\english\metafont.doc for further
+installation instructions (OS/2 users can type `view metafont'),
+including how to create base files.
+
+Typically, you'll create a base file for plain METAFONT, for use with
+mf386.exe:
+
+ cd \emtex\bmfbases
+ makebas 386 plain
+
+IMPORTANT: See \emtex\doc\english\metafont.doc for details (OS/2 users
+can type `view metafont'). For instance mfpm.ovl requires additional
+settings.
+
+See \emtex\doc\english\mfjob.doc and \emtex\doc\english\mfware.doc for
+further information on MFjob and METAFONT's companion tools.
+
+mfware.zip contains tools for converting between font file formats and
+other font-related tools. You don't have to install mfware.zip unless
+you want to design fonts yourself or you need the documentation for
+gftopk.exe.
+
+METAFONT is not quite perfect in generating fonts at very low
+resolutions. To correct METAFONT's errors manually, a font editor is
+provided in pkedit.zip. See \emtex\doc\english\pkedit.doc and
+\emtex\doc\pkeditpm.doc for details. pkeditpm requires emxrsx.zip,
+see above. Moreover, pkeditpm requires emdll1x.dll, emdll1x2.dll,
+and emdll2x.dll which are shipped in dvid16h1.zip.
+
+
+5. Installing the printer drivers, screen previewers, and fonts
+---------------------------------------------------------------
+
+To install the DVI drivers, unpack both dvid16h1.zip and dvid16h2.zip.
+dvipm requires emxrsx.zip, see above.
+
+IMPORTANT: See \emtex\doc\english\dvidrv.doc for further installation
+instructions (OS/2 users can type `view dvidrv').
+
+The DVI drivers need pixel fonts. Pixel fonts for emTeX are shipped
+in font library files (.FLI files). The following font library files
+are available:
+
+ bj_base.fli Base fonts for the Canon BubbleJet (360 DPI)
+ dj_base.fli Base fonts for the HP DeskJet (300 DPI)
+ fax_base.fli Base fonts for Fax (204x196 DPI)
+ fx_base.fli Base fonts for 9-pin printers (240x216 DPI)
+ ito_base.fli Base fonts for the C.ITOH 8510A (160x144 DPI)
+ ljh_base.fli Base fonts for the HP LaserJet 4 (600 DPI)
+ lj_base.fli Base fonts for the HP LaserJet (300 DPI)
+ p6h_base.fli Base fonts for 24-pin printers (360 DPI)
+ p6l_base.fli Base fonts for 24-pin printers (180 DPI)
+ p6m_base.fli Base fonts for 24-pin printers (360x180 DPI)
+ qj_base.fli Base fonts for the HP QuietJet (192 DPI)
+ sty_base.fli Base fonts for the EPSON Stylus 800 (360 DPI)
+
+As those font library files don't contain all fonts in all possible
+sizes (and as you might not have any font library files at all), the
+DVI drivers automatically call MFjob and METAFONT for generating
+missing fonts as needed. Therefore, you should also install METAFONT,
+see above.
+
+All examples assume that you use directory c:\texfonts for fonts.
+Therefore it is recommended to copy the appropriate font library file
+to c:\texfonts and to let the DVIDRVFONTS environment variable point
+to that directory.
+
+By default, new fonts generated by MFjob are placed in directory
+c:\newfonts (unless MFjob is called automatically by a DVI driver).
+If you want to use a different directory, modify the `def target='
+statement of \emtex\mfjob\modes.mfj. When called by a DVI driver,
+Mfjob uses the first directory listed in the DVIDRVFONTS environment
+variable.
+
+If you don't have the base fonts and you want to generate the base
+fonts now, modify the `def target=' statement of \emtex\mfjob\modes.mfj,
+replacing `c:\newfonts' with your font directory, such as
+`c:\texfonts'. Install fontcm.zip and fontltx.zip. Then, type
+
+ mfjob base m=MODE
+ fli_base PREFIX RES c:\texfonts
+
+where MODE, PREFIX, and RES depend on the font set:
+
+ MODE | PREFIX | RES | Font library | Description
+ -----+--------+-----+--------------+-------------------------
+ bj | bj | 360 | bj_base.fli | Canon BubbleJet (360 DPI)
+ dj | dj | 300 | dj_base.fli | HP DeskJet (300 DPI)
+ FAX | fax | 204 | fax_base.fli | Fax (204x196 DPI)
+ fx | fx | 240 | fx_base.fli | 9-pin printers (240x216 DPI)
+ ito | ito | 160 | ito_base.fli | C.ITOH 8510A (160x144 DPI)
+ lj | lj | 300 | lj_base.fli | HP LaserJet (300 DPI)
+ ljh | ljh | 600 | ljh_base.fli | HP LaserJet 4 (600 DPI)
+ lqh | p6h | 360 | p6h_base.fli | 24-pin printers (360 DPI)
+ lql | p6l | 180 | p6l_base.fli | 24-pin printers (180 DPI)
+ lqm | p6m | 360 | p6m_base.fli | 24-pin printers (360x180 DPI)
+ qj | qj | 192 | qj_base.fli | HP QuietJet (192 DPI)
+ sty | sty | 360 | sty_base.fli | EPSON Stylus 800 (360 DPI)
+
+If you are not sure, you can take the appropriate pair of lines from
+\emtex\bin\makefli.bat (don't forget to update the font directory).
+
+To let MFjob call mf386, use the /3 option. It is recommended to set
+this option in the MFJOBOPT environment variable:
+
+ set mfjobopt=/3
+
+(Do this before calling MFjob.) For low-resolution fonts such as
+`ito', you should use the /i option of MFjob to let it continue after
+METAFONT reports an error:
+
+ mfjob base /i m=ito
+ fli_base ito 160 c:\texfonts
+
+After creating the .FLI file with `fli_base', you can delete the .pk
+files from the subdirectories of the font directory, for instance:
+
+ emdelete -r c:\texfonts\pixel.lj
+
+As the default font configuration files look for both PREFIX_base.fli
+and PREFIX_more.fli (you can put local fonts into PREFIX_more.fli),
+the drivers will display a warning message if PREFIX_more.fli does not
+exist. To avoid that warning without modifying the configuration
+files (you should not modify the configuration files), create a dummy
+font library file:
+
+ cd \texfonts
+ fontlib /c PREFIX_more
+
+To check whether downloaded copies of the FLI files are undamaged, use
+the fontlib command:
+
+ cd \texfonts
+ fontlib /t PREFIX_base
+
+
+6. Installing MakeIndex
+-----------------------
+
+MakeIndex is a tool for generating an index for a LaTeX document. To
+install MakeIndex, unpack makeindx.zip. For processing big indexes, a
+32-bit version, mkidx32.exe, is provided. mkidx32.exe requires
+emxrsx.zip, see above.
+
+You'll find the MakeIndex documentation in \emtex\doc\makeindx.doc and
+\emtex\texinput\latex209\makeindx.tex.
+
+To use MakeIndex style files, you have to set the INDEXSTYLE
+environment variable to point to the directory containing the style
+files:
+
+ set indexstyle=c:\emtex\idxstyle
+
+You can find the source code for MakeIndex in srcmkidx.zip.
+
+
+7. Installing BibTeX
+--------------------
+
+BibTeX manages bibliography databases for LaTeX. To install BibTeX,
+unpack bibtex4b.zip. bibtex32 requires emxrsx.zip, see above.
+
+See \emtex\doc\bibtex.doc for further information.
+
+
+8. Installing TeXcad
+--------------------
+
+Georg Horn's TeXcad is an interactive designer for LaTeX pictures. To
+install TeXcad, unpack texcad.zip.
+
+If TeXcad asks for the path of a BGI device driver file, enter
+c:\emtex\bin. Then, configure the BGI directory (choose
+Options->Directories->BGI-Directory from the menu), and save the
+options in the file c:\emtex\bin\texcad.opt.
+
+You can find the source code for TeXcad in srctcad.zip.
+
+
+9. Installing dvispell
+----------------------
+
+dvispell converts DVI files into plain text files. Originally,
+dvispell was designed for preparing DVI files for spell-checking.
+However, there are lots of other possible uses. To install dvispell,
+unpack dvisp10b.zip and type
+
+ dvisprep c:\emtex\data\plain.dsi
+
+You'll find documentation in \emtex\doc\english\dvispell.doc (OS/2
+users can type `view dvispell').
+
+
+10. Installing PiCTeX
+---------------------
+
+The PiCTeX macro package is shipped in pictex.zip. The PiCTeX manual
+is currently not available. It used to be sold by:
+
+ TeX Users Group, P.O. Box 1239,
+ Three Rivers, CA 93271-1239, USA
+ Fax: +1 209 561 4584
+ E-mail: tug@mail.tug.org
+ URL: http://www.tug.org/
+
+
+11. Installing WEB
+------------------
+
+WEB is a system for literate programming in Pascal. TeX, METAFONT,
+and a lot of other programs are written in WEB. To install the WEB
+tools, unpack web.zip. See \emtex\doc\english\web.doc for further
+information.
+
+
+12. Viewing and printing additional documentation
+-------------------------------------------------
+
+After installing TeX, METAFONT, and the DVI drivers, you can view or
+print manuals which are available as TeX or DVI files.
+
+The file \emtex\doc\latex209\local.dvi (of latex209.zip) contains the
+local guide for LaTeX 2.09.
+
+The file \emtex\dist\latex\base\usrguide.tex (of l2base.zip) contains
+the document `LaTeX2e for authors'. To typeset that document
+(creating usrguide.dvi), type the following commands:
+
+ cd \emtex\dist\latex\base
+ latex2e usrguide
+ latex2e usrguide
+ latex2e usrguide
+
+A short introduction to LaTeX 2.09 written in German is available in
+file \emtex\doc\lkurz.dvi of lkurz.zip.
+
+A short introduction to LaTeX2e written in German is available in file
+\emtex\doc\l2kurz.dvi of l2kurz.zip.
+
+The file \emtex\doc\germdoc.dvi (of german.zip) contains the
+documentation for german.sty.
+
+The file \emtex\doc\english\tcman.dvi (of texcad.zip) contains the
+documentation for TeXcad.
+
+
+------------------------------------------------------------------------------
+Installing emTeX in a different directory
+------------------------------------------------------------------------------
+
+The `emtex' directory need not be in the root directory. For
+instance, you can use \local\emtex as root for the emTeX directory
+tree. To unpack a ZIP archive file into that directory structure,
+type (for instance):
+
+ cd \local
+ unzip a:\first
+
+The environment variables have to be adjusted:
+
+ set emtexdir=c:\local\emtex
+
+Don't forget to adjust PATH, HELP, BOOKSHELF, and LIBPATH!
+
+To install emTeX in, say, \tex (that is, \tex\bin, \tex\texinput,
+etc.), unpack emTeX into \emtex and then rename \emtex to \tex.
+
+It is not recommended to change the structure of the emTeX directory
+tree as that requires setting a lot of environment variables such as
+TEXINPUT (in contrast to setting only EMTEXDIR).
+
+
+------------------------------------------------------------------------------
+Removing a package
+------------------------------------------------------------------------------
+
+You can remove a package from the hard disk if the appropriate REM
+file is supplied. If, for example, you want to remove the TEXWARE
+package from drive C: you would enter the following commands:
+
+ emremove c:\emtex\remove\texware.rem c:\
+
+where
+
+ emremove run the package removal program (from c:\emtex\bin)
+ c:\emtex\remove\texware.rem
+ the list of files comprising the package
+ c:\ remove the package from this directory
+
+If you have installed the emTeX directory tree in, say, c:\local (that
+is, in directories c:\local\emtex\bin, c:\local\emtex\texinput, etc.),
+type this:
+
+ emremove c:\local\emtex\remove\texware.rem c:\local
+
+If the top-level directory of the emTeX directory tree is not named
+`emtex', you cannot use `emremove' unless you either rename the
+directory to `emtex' or edit the .rem files.
+
+
+------------------------------------------------------------------------------
+Unpacking LaTeX2e
+------------------------------------------------------------------------------
+
+The original LaTeX2e distribution is shipped in l2base.zip. That
+archive contains a lot of documentation files and the LaTeX source
+files packaged in .dtx files.
+
+If you want to unpack LaTeX2e yourself (instead of installing
+l2input.zip), type the following commands after unpacking l2base.zip:
+
+ cd \emtex\dist\latex\base
+ tex386 /i unpack.ins
+ latex2e autoload.ins
+ inst2e \emtex
+
+Instead of tex386, you might have to use one of the other emTeX
+executables, such as tex or texp. Note that this procedure does not
+create format files, therefore it does not matter what executable you
+apply to unpack.ins (the faster the better, however). Instead of
+`latex2e' you can use TeX with plain.fmt; INITEX won't work.
+
+The `inst2e' batch file copies the files required for running LaTeX2e
+to the `texinput\latex2e' and `idxstyle' subdirectories of the
+directory given as argument. If directories `\emtex\texinput\latex2e'
+or `\emtex\idxstyle' already exist, you'll get one or two error
+messages indicating that directories could not be created. Ignore
+these error messages but not any other error messages.
+
+After unpacking LaTeX2e and running `inst2e', you can save some disk
+space by deleting files in \emtex\dist\latex\base. However, you
+might want to read the documentation files in that directory first.
+
+If you want to delete the files from \emtex\texinput\latex2e when
+installing a new version of LaTeX2e, either delete the files before
+applying TeX to the *.ins files or after running `inst2e'. If you
+delete the files between those two steps, texsys.cfg will be missing.
+
+You can find further information on installation of LaTeX2e in
+\emtex\dist\latex\base\install.txt.
+
+
+------------------------------------------------------------------------------
+Sample autoexec.bat for DOS
+------------------------------------------------------------------------------
+
+This is but an excerpt, do not overwrite your autoexec.bat file with
+this sample! You don't have to use upper-case letters.
+
+SET PATH=C:\DOS;C:\APPS;C:\EMX\BIN;C:\EMTEX\BIN
+SET EMTEXDIR=C:\EMTEX
+SET DVIDRVFONTS=C:\TEXFONTS
+SET INDEXSTYLE=C:\EMTEX\IDXSTYLE
+SET MFJOBOPT=/3
+SET TMP=C:\TMP
+SET EMTEXED=q %%2 -n%%1
+
+
+------------------------------------------------------------------------------
+Sample config.sys for OS/2
+------------------------------------------------------------------------------
+
+This is but an excerpt, do not overwrite your config.sys file with
+this sample! You don't have to use upper-case letters.
+
+LIBPATH=C:\OS2\DLL;C:\OS2\MDOS;C:\OS2\APPS\DLL;C:\EMX\DLL;C:\EMTEX\DLL;
+SET PATH=C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS;C:\OS2\APPS;C:\EMX\BIN;C:\EMTEX\BIN
+SET HELP=C:\OS2\HELP;C:\OS2\HELP\TUTORIAL;C:\EMTEX\HELP
+SET BOOKSHELF=C:\OS2\BOOK;C:\EMX\BOOK;C:\EMTEX\BOOK\ENGLISH
+SET EMTEXDIR=C:\EMTEX
+SET DVIDRVFONTS=C:\TEXFONTS
+SET INDEXSTYLE=C:\EMTEX\IDXSTYLE
+SET MFJOBOPT=/3
+SET TMP=C:\TMP
+SET EMTEXED=emacsclient +%1 %2
+IOPL=YES
+
+ -------- End of INSTALL.ENG -------------
diff --git a/systems/msdos/emtex/INSTALL.GER b/systems/msdos/emtex/INSTALL.GER
new file mode 100644
index 0000000000..9d2340965c
--- /dev/null
+++ b/systems/msdos/emtex/INSTALL.GER
@@ -0,0 +1,846 @@
+==============================================================================
+INSTALL.GER (emTeX DISTRIBUTION) 02-Jul-1998
+==============================================================================
+
+ Installation von emTeX
+
+------------------------------------------------------------------------------
+Inhalt
+------------------------------------------------------------------------------
+
+- Einfuehrung
+- Falls schon eine alte Version von emTeX installiert ist...
+- Installation von Info-ZIPs UnZip
+- Installation eines Pakets
+- Aktualisieren eines Pakets
+- Installation von emTeX
+ 1. Das Wichtigste zuerst
+ 2. Unterstuetzung von 32-Bit-Programmen
+ 3. Installation des TeX-Compilers
+ 4. Installation von METAFONT
+ 5. Installation der Druckertreiber, der Previewer und der Zeichensaetze
+ 6. Installation von MakeIndex
+ 7. Installation von BibTeX
+ 8. Installation von TeXcad
+ 9. Installation von dvispell
+ 10. Installation von PiCTeX
+ 11. Installation von WEB
+ 12. Betrachten und Drucken weiterer Anleitungen
+- Installation von emTeX in einem anderen Verzeichnis
+- Loeschen eines Paketes
+- Entpacken von LaTeX2e
+- Beispiel fuer autoexec.bat von DOS
+- Beispiel fuer config.sys von OS/2
+
+
+------------------------------------------------------------------------------
+Einfuehrung
+------------------------------------------------------------------------------
+
+WICHTIG: Falls Sie auf Probleme stossen, sollten Sie die Datei HELP.GER
+lesen. Diese Datei ist sowohl separat verfuegbar als auch in first.zip
+(als \emtex\doc\german\help.ger) enthalten.
+
+Es gibt ein Installationsprogramm fuer emTeX: install.exe. Rufen Sie
+dies einfach auf um emTeX zu installieren:
+
+ a:\install
+
+Falls Sie Windows verwenden, sollten Sie das Installationsprogramm in
+einem DOS-Fenster starten, nicht vom Program Manager aus.
+
+Falls das Installationsprogramm fuer Sie nichts taugt (z.B. weil es
+derzeit nur englisch spricht) oder falls sie spezielle Anforderungen
+an die Installation haben, muessen Sie wohl oder uebel diese Anleitung
+(INSTALL.GER) lesen.
+
+Eine vereinfachte Installationsanleitung ist in QUICK.GER verfuegbar.
+Lesen Sie die Einleitung von QUICK.GER um zu sehen, ob Sie die
+vereinfachte Installationsanleitung verwenden koennen und wollen.
+
+Diese Installationsanleitung geht davon aus, dass Sie emTeX auf
+Laufwerk C: im Verzeichnis \emtex installieren werden und dass die
+Distributions-Dateien sich auf Disketten im Laufwerk A: befinden. Wenn
+Sie andere Laufwerke oder Verzeichnisse verwenden, muessen Sie die
+Kommandos entsprechend aendern.
+
+Beachten Sie bitte, dass ein Installationsprogramm fuer emTeX als
+Betatest-Version verfuegbar ist:
+
+ CTAN: /tex-archive/systems/msdos/emtex/betatest/README.INS
+
+
+------------------------------------------------------------------------------
+Falls schon eine alte Version von emTeX installiert ist...
+------------------------------------------------------------------------------
+
+Diese emTeX-Distribution ersetzt alle vorangegangenen Versionen von
+emTeX. Wenn Sie bereits emTeX installiert haben, muessen Sie den
+gesamten \emtex-Verzeichnisbaum loeschen oder umbenennen. Ausserdem
+sollten Sie alle Environment-Variablen loeschen, die Sie fuer die vorige
+emTeX-Version gesetzt haben: Entfernen Sie alle SET-Kommandos fuer die
+folgenden Environment-Variablen aus autoexec.bat und config.sys:
+
+ BIBINPUT BTEXFMT MFBAS MFJOB TEXINPUT
+ BMFBAS EMTEXDRV MFINPUT TEXFMT TEXTFM
+
+Ausserdem sollten Sie das Verzeichnis \emtex aus PATH entfernen, da
+emTeX nun \emtex\bin statt \emtex verwendet. Nach Aenderung von
+autoexec.bat oder config.sys sollten Sie Ihren Rechner neu starten,
+damit die alten Werte der Environment-Variablen keine Probleme
+bei der Installation bereiten.
+
+(Die oben angefuehrten Environment-Variablen existieren noch immer,
+ausgenommen EMTEXDRV, welche durch EMTEXDIR ersetzt wurde. Jedoch
+unterdruecken die alten Einstellungen das Durchsuchen von
+Unterverzeichnissen und verhindern damit das korrekte Arbeiten von
+emTeX.)
+
+Wenn Sie andere Pakete wie z.B. dvips installiert haben, sollten Sie
+die emTeX-Pakete mit dem Programm `emremove' entfernen und das alte
+\emtex-Verzeichnis umbenennen:
+
+ emremove c:\emtex\remove\tex.rem c:\
+ emremove c:\emtex\remove\mf.rem c:\
+ usw. usw. usw.
+ move c:\emtex emtex.old
+
+emremove.exe ist in first.zip enthalten.
+
+Um den ganzen emTeX-Verzeichnisbaum zu loeschen, geben Sie
+
+ cd \
+ emdelete -r c:\emtex
+
+ein, wobei emdelete.exe aus first.zip verwendet werden muss. Aeltere
+Versionen (delete.exe) werden anders aufgerufen. Um das neue
+emdelete.exe zu erhalten, folgen Sie den Anweisungen zum Entpacken von
+first.zip weiter unten und kopieren Sie emdelete.exe in ein
+Verzeichnis Ihres Suchpfads fuer Programme (PATH).
+
+Achten Sie darauf, dass Sie emdelete.exe nicht in den Verzeichnisbaum
+kopieren, den Sie gerade loeschen wollen!
+
+Da dieses Verfahren alle Dateien im Verzeichnis c:\emtex und in allen
+Unterverzeichnissen von c:\emtex loescht, sollten Sie Ihre eigenen
+Dateien nicht in c:\emtex und dessen Unterverzeichnissen ablegen.
+
+
+------------------------------------------------------------------------------
+Installation von Info-ZIPs UnZip
+------------------------------------------------------------------------------
+
+emTeX ist mit Info-ZIPs Komprimierungsprogramm eingepackt. Die
+Programme von Info-ZIP (Zip, UnZip und aehnliche) sind kostenlos
+erhaeltlich als Quellcode oder ausfuehrbare Programme, in vielen
+Mailboxen und Anonymous-ftp-Servern, unter anderem im CompuServe
+IBMPRO-Forum und ftp.uu.net:/pub/archiving/zip/*.
+
+Vor der emTeX-Installation muessen Sie UnZip installieren (ausser es
+ist bereits installiert). UnZip wird als selbstentpackendes Archiv
+verbreitet, also einer Programmdatei (.exe-Datei) die das ZIP-Archiv
+enthaelt. Zum Entpacken wird einfach die Programmdatei aufgerufen. Sie
+sollten die UnZip-Dateien in einem temporaeren Verzeichnis entpacken.
+Die folgenden Beispiele gehen davon aus, dass sich die
+selbstentpackenden Archive auf einer Diskette in Laufwerk A: befinden.
+
+Wenn Sie OS/2 benutzen, geben Sie
+
+ md \unzip
+ cd \unzip
+ a:\unz512
+
+ein, um UnZip im Verzeichnis \unzip auszupacken.
+
+Wenn Sie DOS benutzen, geben Sie
+
+ md \unzip
+ cd \unzip
+ a:\unz512x3
+
+ein, um UnZip im Verzeichnis \unzip auszupacken.
+
+Nach dem Entpacken von UnZip koennen Sie verschiedene Dokumentations-
+und Programmdateien finden.
+
+Um emTeX zu installieren, waehlen Sie eine UnZip-Programmdatei und
+kopieren Sie diese unter dem Namen unzip.exe in ein Verzeichnis Ihres
+Suchpfads fuer Programme (PATH).
+
+Unter OS/2 stehen die folgenden zwei UnZip-Programme zur Verfuegung:
+
+ unzip16.exe 16-Bit-Programm fuer OS/2 1.0 oder spaeter
+ unzip32.exe 32-Bit-Programm fuer OS/2 2.0 oder spaeter
+
+Unter DOS stehen die folgenden zwei UnZip-Programme zur Verfuegung:
+
+ unzip.exe 16-Bit-Programm fuer 8088-Prozessor und besser
+ unzip386.exe 32-Bit-Programm fuer 80386-Prozessor und besser
+
+Wenn Sie einen 80386-Prozessor oder besser besitzen, koennen Sie das
+32-Bit-Programm benutzen. Die 32-Bit-Programme sind normalerweise
+schneller als ihre 16-Bit-Gegenstuecke; ein anderer Unterschied besteht
+nicht. Wenn die 32-Bit-Programm bei Ihnen nicht funktionieren,
+versuchen Sie es mit den 16-Bit-Programmen.
+
+Um zum Beispiel unzip386.exe zu benutzen, geben Sie
+
+ copy unzip386.exe c:\bin\unzip.exe
+
+ein, wenn c:\bin ein Verzeichnis Ihres Suchpfads fuer Programme (PATH)
+ist. Diese Anleitung geht davon aus, dass Sie UnZip mit `unzip'
+aufrufen koennen.
+
+Lesen Sie unzip.doc fuer genauere Informationen ueber UnZip.
+
+
+------------------------------------------------------------------------------
+Installation eines Pakets
+------------------------------------------------------------------------------
+
+Bevor Sie eine neuere Version eines Pakets installieren, sollten Sie die
+bereits installierte Version loeschen (siehe unten).
+
+Die Installation eines Pakets besteht aus dem Entpacken der
+ZIP-Archivdateien dieses Pakets. Die meisten Pakete bestehen jedoch
+nur aus einer ZIP-Archivdatei.
+
+Um ein ZIP-Archiv auszupacken, waehlen Sie das Verzeichnis, in dem das
+`emtex'-Verzeichnis erstellt werden soll, als Arbeitsverzeichnis. Dies
+ist normalerweise das Hauptverzeichnis von Laufwerk C:
+
+ c:
+ cd \
+
+Um z.B. first.zip von Laufwerk A: auszupacken, geben Sie folgende
+Kommandozeile ein:
+
+ unzip a:\first
+
+Die erforderlichen Verzeichnisse werden automatisch erstellt.
+
+Um den Inhalt einer ZIP-Archivdatei aufzulisten, geben Sie ein:
+
+ unzip -l a:\first
+
+Um ein Paket zu aktualisieren (also eine neuere Version eines bereits
+installierten Pakets zu installieren), entfernen Sie das bereits
+installierte Paket mit emremove.exe (siehe unten) und installieren Sie
+dann das neue Paket.
+
+Bevor Sie ein Paket aktualisieren, sollten Sie ueberpruefen, ob die neue
+ZIP-Archivdatei lesbar ist und korrekt uebertragen wurde:
+
+ unzip -tq a:\*.zip
+
+
+------------------------------------------------------------------------------
+Aktualisieren eines Pakets
+------------------------------------------------------------------------------
+
+Bevor Sie eine aktualisierte Version eines Pakets installieren, sollten Sie
+die alte Version loeschen (siehe unten).
+
+
+------------------------------------------------------------------------------
+Installation von emTeX
+------------------------------------------------------------------------------
+
+1. Das Wichtigste zuerst
+------------------------
+
+Bitte entfernen Sie alle Environment-Variablen frueher installierter
+emTeX-Versionen (EMTEXDRV, MFINPUT, TEXINPUT, TEXTFM usw.) aus
+config.sys und/oder autoexec.bat.
+
+Zuerst sollten Sie das Paket `first' installieren, da es wichtige
+Dokumentationsdateien und Hilfsprogramme enthaelt. Wie bereits oben
+erklaert, geht das ungefaehr so:
+
+ c:
+ cd \
+ unzip a:\first
+
+Wie ueblich, haengen die Laufwerksbuchstaben und die Verzeichnisnamen
+davon ab, wo Sie emTeX installieren wollen und wo die ZIP-Dateien zu
+finden sind.
+
+Nach dem Entpacken von first.zip fuegen Sie das Verzeichnis
+c:\emtex\bin Ihrem Suchpfad fuer Programme (PATH) hinzu. PATH wird
+entweder in der Datei config.sys oder der Datei autoexec.bat gesetzt.
+
+Sie sollten zusaetzlich die Environment-Variable EMTEXDIR setzen, so
+dass sie auf das emTeX-Verzeichnis zeigt:
+
+ set emtexdir=c:\emtex
+
+Bitte verwenden Sie keine Leerzeichen! (`set emtexdir = c:\emtex'
+funktioniert nicht!)
+
+DOS-Benutzer sollten sicherstellen, dass ihre config.sys-Datei
+mindestens folgende Werte einstellt:
+
+ FILES=20
+ BUFFERS=20
+
+Wenn diese Zeilen fehlen oder die Zahlen kleiner als 20 sind, sollten Sie
+diese Zeilen einfuegen oder die Werte erhoehen.
+
+OS/2-Benutzern wird empfohlen, die Environment-Variable BOOKSHELF in
+config.sys um das Verzeichnis c:\emtex\book\german erweitern. Das
+vereinfacht das Betrachten der Online-Handbuecher von emTeX.
+
+Einige Programme erstellen temporaere Dateien in dem durch die
+Environment-Variable TMP festgelegten Verzeichnis:
+
+ md c:\tmp
+ set tmp=c:\tmp
+
+Falls Sie eine RAM-Disk eingerichtet haben, empfiehlt es sich diese
+fuer die temporaeren Dateien zu verwenden. Falls, z.B., die RAM-Disk den
+Laufwerksbuchstaben F besitzt, stellen Sie folgendes ein:
+
+ set tmp=f:\
+
+Jedoch sollten Sie nicht extra eine RAM-Disk fuer temporaere Dateien
+einrichten, da es effizienter ist, den Speicher direkt zu verwenden.
+
+Im Laufe der Installation der emTeX-Pakete muessen verschiedene
+Environment-Variablen gesetzt werden. Die Batch-Dateien
+\emtex\bin\set_tex.bat (fuer DOS) und \emtex\bin\set_tex.cmd (fuer OS/2)
+koennen als Muster dienen.
+
+Wenn Ihr Computer meldet, dass nicht genug Speicher fuer
+Environment-Variablen verfuegbar ist (`Kein Speicherplatz mehr im
+Umgebungsbereich'), lesen Sie in Ihrem DOS-Handbuch nach, wie Sie den
+Umgebungsbereich mit dem SHELL-Eintrag von config.sys und den Optionen
+/E und /P von command.com vergroessern koennen. Bei den meisten Versionen
+von DOS funktioniert das Hinzufuegen von
+
+ SHELL=C:\DOS\COMMAND.COM C:\DOS /E:1024 /P
+
+zu config.sys (dieses Beispiel geht davon aus, dass DOS im Verzeichnis
+c:\dos installiert ist). Falls eine solche Zeile sich bereits in
+config.sys befindet, sollten Sie eventuell den Wert der /E-Option um
+etwa 512 vergroessern.
+
+Wenn Sie config.sys und autoexec.bat geaendert haben, sollten Sie den
+Computer neu starten, damit die Aenderungen wirksam werden. Am besten
+warten Sie aber mit dem Neustart, bis Sie das Paket `emxrsx'
+installiert haben (siehe unten).
+
+
+2. Unterstuetzung von 32-Bit-Programmen
+---------------------------------------
+
+Wenn Sie einen 80386-Prozessor oder besser haben, koennen Sie
+32-Bit-Versionen einiger Programme benutzen, die die Moeglichkeiten
+dieser Prozessoren besser nutzen. Dazu muessen Sie das Paket `emxrsx'
+installieren. Dieses Paket besitzt die Besonderheit, dass es Dateien
+sowohl im \emtex-Verzeichnis als auch in einem Verzeichnis \emx
+installiert. emxrsx.zip enthaelt eine Teilmenge von emxrt.zip (dem
+Laufzeitpaket von emx) zusammen mit rsx. emx und rsx sind
+DOS-Extender, die die 32-Bit-Programme benoetigen: emx ist fuer
+DOS-Konfigurationen ohne DPMI (DOS Protected Mode Interface), rsx ist
+fuer Konfigurationen mit DPMI (z.B. Windows). Ausserdem enthaelt das
+Paket Dateien, die von den 32-Bit-Programme unter OS/2 2.x und OS/2 3
+Warp benoetigt werden. 32-Bit-Programme laufen nicht unter OS/2 1.x,
+unabhaengig vom Typ Ihres Prozessors.
+
+Um das Paket `emxrsx' zu installieren, entpacken Sie emxrsx.zip und
+folgen Sie den Anweisungen in \emx\doc\emxrt.doc (unter OS/2 koennen
+Sie eine schoenere Version mit dem Kommando `view \emx\book\emxrt'
+lesen!). Hier das Wichtigste in Kuerze:
+
+- Fuegen Sie c:\emx\bin zu Ihrem Suchpfad fuer Programme (PATH) in
+ config.sys oder autoexec.bat
+
+- Unter OS/2, fuegen Sie c:\emx\dll dem LIBPATH-Kommando in config.sys
+ hinzu
+
+- Unter DOS, loeschen Sie die Zeile BREAK=ON aus config.sys
+
+- Starten Sie den Rechner neu.
+
+Wenn emx.dll bereits in Ihrem OS/2-System installiert ist, muessen
+darauf achten, dass immer die neueste Version von emx.dll verwendet
+wird. Siehe emxrt.doc bzw. emxrt.inf fuer weitere Informationen.)
+
+
+3. Installation des TeX-Compilers
+---------------------------------
+
+Um TeX zu installieren, entpacken Sie tex4b.zip. tex386.exe und
+htex386.exe benoetigen emxrsx.zip (siehe oben). Zusaetzlich brauchen Sie
+die TFM-Dateien, die in fontcm.zip enthalten sind. Die
+plain-TeX-Makros sind in tex4b.zip enthalten.
+
+Wenn Sie zusaetzlich LaTeX2e oder LaTeX 2.09 benutzen wollen, entpacken
+Sie l2input.zip oder latex209.zip. (Sie koennen auch beide Pakete
+installieren.) Sowohl LaTeX2e also auch LaTeX 2.09 benoetigen die
+LaTeX-Zeichensaetze, daher sollten Sie fontltx.zip entpacken. Um
+deutsche Trennmuster und Makros zur Unterstuetzung der deutschen
+Sprache zu verwenden, entpacken Sie german.zip.
+
+WICHTIG: Weitere Installationsanweisungen finden Sie in
+\emtex\doc\german\tex.doc (OS/2-Benutzer koennen einfach `view tex'
+eingeben), insbesondere, wie Sie die Format-Dateien erstellen.
+
+In den meisten Faellen wird je eine Format-Datei fuer plain TeX und
+LaTeX2e erzeugt, die erstere mit US-englischen, die letztere mit
+US-englischen und deutschen Trennmustern, fuer die Verwendung mit
+tex386.exe:
+
+ cd \emtex\btexfmts
+ makefmt 386 plain US
+ makefmt 386 latex2e US German 8bit -b \emtex\bin\latex2e
+
+WICHTIG: Dies ist in \emtex\doc\german\tex.doc genau erklaert
+(OS/2-Benutzer koennen `view tex' eingeben).
+
+(Der in tex.doc angegebene makefmt-Aufruf fuer LaTeX2e mit deutschen
+Trennmustern erzeugt latexg.fmt und gltx2e.bat bzw. gltx2e.cmd, im
+Gegensatz zu obigem Aufruf, der latex.fmt und latex2e.bat
+bzw. latex2e.cmd erzeugt -- da aber die mit obigem Aufruf erzeugte
+LaTeX2e-Format-Datei auch die US-englische Trennmuster enthaelt, wurde
+auf die Wahl separater Dateinamen verzichtet.)
+
+Das Paket l2tools enthaelt zusaetzliche Makros fuer LaTeX2e. Nach dem
+Erstellen der Format-Dateien und dem Entpacken von l2tools.zip geben
+Sie bitte
+
+ cd \emtex\dist\latex\packages\tools
+ latex2e tools.ins
+
+ein (latex2e ist der Name der Batch-Datei die von makefmt zum Aufruf
+von LaTeX2e erstellt wurde) und kopieren die noetigen Dateien in das
+Makro-Verzeichnis fuer LaTeX2e:
+
+ copy *.tex \emtex\texinput\latex2e
+ copy *.sty \emtex\texinput\latex2e
+
+Falls Sie nicht LaTeX 2.09 verwenden, moegen Sie eventuell ein
+separates Verzeichnis wie z.B. \emtex\texinput\tools2e vorziehen.
+
+In \emtex\dist\latex\packages\tools\readme.txt finden Sie weitere
+Informationen zum l2tools-Paket. In manifest.txt im selben Verzeichnis
+finden Sie eine Liste der Makropakete von l2tools. Nach dem Kopieren
+koennen Sie die Dateien in \emtex\dist\latex\packages\tools loeschen, um
+Plattenplatz zu sparen.
+
+texware.zip enthaelt verschiedene Zusatzprogramme fuer TeX: texchk (ein
+Syntax-Checker fuer LaTeX 2.09), texconv (konvertiert Zeichen mit
+Akzent), DVItype (listet und prueft DVI-Dateien), PLtoTF und TFtoPL
+(konvertieren und pruefen TFM-Dateien), VFtoVP und VPtoVF (konvertieren
+und pruefen Virtual-Font-Dateien).
+
+
+4. Installation von METAFONT
+----------------------------
+
+Um METAFONT zu benutzen, muessen Sie mf4b.zip (das eigentliche
+METAFONT) und mfjob12d.zip (vereinfacht den METAFONT-Aufruf)
+installieren. mf386.exe benoetigt das Paket `emxrsx' (siehe oben).
+
+Sie brauchen zusaetzlich einige oder alle Zeichensatz-Quelldateien aus
+fontcm.zip, fontec.zip, fontltx.zip, fontams.zip und fontemsy.zip.
+
+WICHTIG: In \emtex\doc\german\metafont.doc stehen weitere
+Installationsanweisungen (OS/2-Benutzer koennen einfach `view tex'
+eingeben), insbesondere, wie Sie die Base-Dateien erstellen.
+
+In den meisten Faellen wird eine Base-Datei fuer plain METAFONT fuer die
+Verwendung mit mf386.exe erstellt:
+
+ cd \emtex\bmfbases
+ makebas 386 plain
+
+WICHTIG: Dies ist in \emtex\doc\german\metafont.doc genau erklaert
+(OS/2-Benutzer koennen `view metafont' eingeben).
+
+Weitere Informationen ueber MFjob und Hilfsprogramme fuer METAFONT
+finden Sie in \emtex\doc\german\mfjob.doc und
+\emtex\doc\german\mfware.doc.
+
+mfware.zip enthaelt Programme zur Konvertierung zwischen verschiedenen
+Zeichensatz-Dateiformaten und andere Hilfsprogramme zur
+Zeichensatzerzeugung. Sie brauchen mfware.zip nur dann zu
+installieren, falls Sie eigene Zeichensaetze entwerfen wollen oder
+Dokumentation fuer gftopk.exe benoetigen.
+
+METAFONT ist nicht perfekt im Erzeugen von Zeichensaetzen bei sehr
+kleiner Aufloesung. Um die Fehler von METAFONT per Hand zu korrigieren,
+steht ein Zeichensatzeditor in pkedit.zip bereit. Genaueres steht in
+\emtex\doc\german\pkedit.doc und \emtex\doc\pkeditpm.doc. pkeditpm
+benoetigt emxrsx.zip (siehe oben). Ausserdem benoetigt pkeditpm die
+Dateien emdll1x.dll, emdll1x2.dll und emdll2x.dll, welche in
+dvid16h1.zip enthalten sind.
+
+
+5. Installation der Druckertreiber, der Previewer und der Zeichensaetze
+-----------------------------------------------------------------------
+
+Um die DVI-Treiber zu installieren, entpacken Sie dvid16h1.zip und
+dvid16h2.zip. dvipm benoetigt emxrsx.zip (siehe oben).
+
+WICHTIG: Weitere Installationsanweisungen und Informationen finden Sie
+in \emtex\doc\german\dvidrv.doc. (OS/2-Benutzer koennen einfach `view
+dvidrv' eingeben.)
+
+Die DVI-Treiber benoetigen Zeichensaetze. Die wichtigsten Zeichensaetze
+werden in Zeichensatzbibliotheksdateien (.FLI-Dateien) geliefert:
+
+ bj_base.fli Zeichensaetze fuer den Canon BubbleJet (360 DPI)
+ dj_base.fli Zeichensaetze fuer den HP DeskJet (300 DPI)
+ fax_base.fli Zeichensaetze fuer Fax (204x196 DPI)
+ fx_base.fli Zeichensaetze fuer 9-Nadel-Drucker (240x216 DPI)
+ ito_base.fli Zeichensaetze fuer den C.ITOH 8510A (160x144 DPI)
+ ljh_base.fli Zeichensaetze fuer den HP LaserJet 4 (600 DPI)
+ lj_base.fli Zeichensaetze fuer den HP LaserJet (300 DPI)
+ p6h_base.fli Zeichensaetze fuer 24-Nadel-Drucker (360 DPI)
+ p6l_base.fli Zeichensaetze fuer 24-Nadel-Drucker (180 DPI)
+ p6m_base.fli Zeichensaetze fuer 24-Nadel-Drucker (360x180 DPI)
+ qj_base.fli Zeichensaetze fuer den HP QuietJet (192 DPI)
+ sty_base.fli Zeichensaetze fuer den EPSON Stylus 800 (360 DPI)
+
+Da diese Zeichensatzbibliotheken nicht jeden Zeichensatz in jeder
+Vergroesserungsstufe enthalten (und da Sie diese vielleicht diese
+Zeichensatzbibliotheken ueberhaupt nicht haben), rufen die DVI-Treiber
+automatisch MFjob und METAFONT auf, wenn benoetigte Zeichensaetze nicht
+vorhanden sind; deshalb sollten Sie auch METAFONT installieren (siehe
+oben).
+
+Alle Beispiele gehen davon aus, dass Ihre Zeichensaetze im Verzeichnis
+c:\texfonts stehen. Deshalb ist es empfehlenswert, die entsprechenden
+Zeichensatzbibliotheksdateien nach c:\texfonts zu kopieren und die
+Environment-Variable DVIDRVFONTS auf dieses Verzeichnis zeigen zu
+lassen.
+
+MFjob legt neu erzeugte Zeichensaetze im Verzeichnis c:\newfonts ab,
+sofern nichts anderes eingestellt ist (und MFjob nicht von einem
+Treiber automatisch aufgerufen wird). Wenn Sie ein anderes Verzeichnis
+haben moechten, aendern Sie die `def target='-Anweisung in
+\emtex\mfjob\modes.mfj. Wenn MFjob von einem DVI-Treiber aufgerufen
+wird, legt es die Zeichensaetze in dem ersten Verzeichnis ab, das in
+der Environment-Variablen DVIDRVFONTS aufgefuehrt ist.
+
+Wenn Sie die Zeichensatzbibliotheksdateien nicht haben und diese
+selbst erzeugen wollen, aendern Sie die `def target='-Anweisung in
+\emtex\mfjob\modes.mfj, indem Sie `c:\newfonts' durch Ihr
+Zeichensatz-Verzeichnis (z.B. `c:\texfonts') ersetzen. Installieren
+Sie fontcm.zip und fontltx.zip. Dann geben sie folgendes ein:
+
+ mfjob base m=MODE
+ fli_base PREFIX RES c:\texfonts
+
+wobei MODE, PREFIX und RES vom Zeichensatztyp abhaengen:
+
+ MODE | PREFIX | RES | FLI-Datei | Beschreibung
+ -----+--------+-----+--------------+-------------------------
+ bj | bj | 360 | bj_base.fli | Canon BubbleJet (360 DPI)
+ dj | dj | 300 | dj_base.fli | HP DeskJet (300 DPI)
+ FAX | fax | 204 | fax_base.fli | Fax (204x196 DPI)
+ fx | fx | 240 | fx_base.fli | 9-Nadel-Drucker (240x216 DPI)
+ ito | ito | 160 | ito_base.fli | C.ITOH 8510A (160x144 DPI)
+ lj | lj | 300 | lj_base.fli | HP LaserJet (300 DPI)
+ ljh | ljh | 600 | ljh_base.fli | HP LaserJet 4 (600 DPI)
+ lqh | p6h | 360 | p6h_base.fli | 24-Nadel-Drucker (360 DPI)
+ lql | p6l | 180 | p6l_base.fli | 24-Nadel-Drucker (180 DPI)
+ lqm | p6m | 360 | p6m_base.fli | 24-Nadel-Drucker (360x180 DPI)
+ qj | qj | 192 | qj_base.fli | HP QuietJet (192 DPI)
+ sty | sty | 360 | sty_base.fli | EPSON Stylus 800 (360 DPI)
+
+Wenn Sie nicht sicher sind, koennen Sie die entsprechenden Zeilen aus
+der Datei \emtex\bin\makefli.bat verwenden. (Vergessen Sie nicht, das
+Zeichensatzverzeichnis zu aendern.)
+
+Um mf386.exe zu verwenden, rufen Sie MFjob mit der Option /3 auf. Es ist
+empfehlenswert, diese in die Environment-Variable MFJOBOPT zu speichern:
+
+ set mfjobopt=/3
+
+(Tun Sie das, bevor Sie MFjob aufrufen.) Fuer Zeichensaetze kleiner
+Aufloesung, wie die `ito'-Zeichensaetze, benutzen Sie die Option /i,
+damit MFjob weiterlaeuft, wenn METAFONT einen Fehler meldet:
+
+ mfjob base /i m=ito
+ fli_base ito 160 c:\texfonts
+
+Wenn Sie die .FLI-Datei mit `fli_base' erstellt haben, koennen Sie die
+.pk-Dateien aus den Unterverzeichnissen des Zeichensatzverzeichnisses
+loeschen, z.B.
+
+ emdelete -r c:\texfonts\pixel.lj
+
+Da die mitgelieferten Konfigurationsdateien sowohl nach
+PREFIX_base.fli als auch nach PREFIX_more.fli suchen (Sie koennen
+lokale Zeichensaetze in PREFIX_more.fli sammeln), geben die Treiber
+eine Warnung aus, wenn die Datei PREFIX_more.fli nicht vorhanden ist.
+Wenn Sie diese Warnung abstellen wollen, ohne die
+Konfigurationsdateien zu aendern, erstellen Sie eine leere
+Zeichensatzbibliotheksdatei mit
+
+ cd \texfonts
+ fontlib /c PREFIX_more
+
+Mit fontlib koennen Sie ueberpruefen, ob die FLI-Dateien korrekt
+uebertragen wurden:
+
+ cd \texfonts
+ fontlib /t PREFIX_base
+
+
+6. Installation von MakeIndex
+-----------------------------
+
+MakeIndex ist ein Programm zur Erstellung von Stichwortverzeichnissen
+fuer LaTeX-Texte. Um MakeIndex zu installieren, entpacken Sie
+makeindx.zip. Fuer grosse Stichwortverzeichnisse ist unter Umstaenden die
+32-Bit-Version mkidx32.exe erforderlich. mkidx32.exe erfordert
+emxrsx.zip (siehe oben).
+
+Die MakeIndex-Dokumentation befindet sich in \emtex\doc\makeindx.doc
+und \emtex\texinput\latex209\makeindx.tex.
+
+Um MakeIndex-Stildateien zu benutzen, muss die Environment-Variable
+INDEXSTYLE auf das Verzeichnis zeigen, das die Stildateien enthaelt:
+
+ set indexstyle=c:\emtex\idxstyle
+
+Der Quellcode von MakeIndex befindet sich in srcmkidx.zip.
+
+
+7. Installation von BibTeX
+--------------------------
+
+BibTeX macht Literaturdatenbanken fuer LaTeX verfuegbar. Um BibTeX zu
+installieren, entpacken Sie bibtex4b.zip. bibtex32.exe benoetigt das
+Paket `emxrsx' (siehe oben).
+
+Fuer weitere Informationen lesen Sie \emtex\doc\bibtex.doc.
+
+
+8. Installation von TeXcad
+--------------------------
+
+TeXcad von Georg Horn ist ein interaktives Zeichenprogramm fuer
+LaTeX-Bilder. Um TeXcad zu installieren, entpacken Sie texcad.zip.
+
+Wenn TeXcad beim Start nach dem Pfad des BGI-Treibers fragt, geben Sie
+c:\emtex\bin ein. Dann konfigurieren Sie das BGI-Verzeichnis (Menue:
+Options->Directories->BGI-Directory) und sichern die Optionen in der Datei
+c:\emtex\bin\texcad.opt.
+
+Der Quellcode von TeXcad befindet sich in srctcad.zip.
+
+
+9. Installation von dvispell
+----------------------------
+
+dvispell wandelt DVI-Dateien in Textdateien um. Eigentlich wurde
+dvispell dazu entworfen, die Rechtschreibpruefung von DVI-Dateien zu
+ermoeglichen, jedoch gibt es eine Menge anderer Anwendungen. Um
+dvispell zu installieren, entpacken Sie dvisp10b.zip und geben das
+folgende Kommando ein:
+
+ dvisprep c:\emtex\data\plain.dsi
+
+Dokumentation finden Sie in \emtex\doc\german\dvispell.doc.
+(OS/2-Benutzer koennen einfach `view dvispell' eingeben.)
+
+
+10. Installation von PiCTeX
+---------------------------
+
+Das Makropaket PiCTeX befindet sich in pictex.zip. Das PiCTeX-Handbuch
+ist derzeit nicht lieferbar.
+
+
+11. Installation von WEB
+------------------------
+
+WEB ist ein System zur `literarischen Pascal-Programmierung'. TeX,
+METAFONT und viele andere Programme sind in WEB geschrieben. Um das
+WEB-System zu installieren, packen Sie web.zip aus. Weitere
+Informationen finden Sie in \emtex\doc\german\web.doc.
+
+
+12. Betrachten und Drucken weiterer Anleitungen
+-----------------------------------------------
+
+Nach Installation von TeX, METAFONT und der DVI-Treiber koennen Sie
+Anleitungen, die als TeX- oder DVI-Dateien vorliegen, betrachten oder
+drucken.
+
+Die Datei \emtex\doc\latex209\local.dvi (aus latex209.zip) enthaelt die
+`Local Guide' fuer LaTeX 2.09.
+
+Die Datei \emtex\dist\latex\base\usrguide.tex (aus l2base.zip) enthaelt
+das Dokument `LaTeX2e for authors'. Mit den folgenden Kommandos
+koennen Sie die Datei usrguide.dvi erzeugen:
+
+ cd \emtex\dist\latex\base
+ latex2e usrguide
+ latex2e usrguide
+ latex2e usrguide
+
+Eine kurze Einfuehrung in LaTeX 2.09 finden Sie in der Datei
+\emtex\doc\lkurz.dvi von lkurz.zip.
+
+Eine kurze Einfuehrung in LaTeX2e finden Sie in der Datei
+\emtex\doc\l2kurz.dvi von l2kurz.zip.
+
+Die Datei \emtex\doc\germdoc.dvi (aus german.zip) enthaelt die
+Anleitung zu german.sty.
+
+Die Datei \emtex\doc\german\tcman.dvi (aus texcad.zip) enthaelt die
+Anleitung fuer TeXcad.
+
+
+------------------------------------------------------------------------------
+Installation von emTeX in einem anderen Verzeichnis
+------------------------------------------------------------------------------
+
+Das `emtex'-Verzeichnis muss nicht unbedingt im Hauptverzeichnis
+stehen. Sie koennen zum Beispiel \local\emtex zum Wurzelverzeichnis des
+emTeX-Baumes machen. Um ein ZIP-Archiv in diese Struktur zu entpacken,
+geben Sie
+
+ cd \local
+ unzip a:\first
+
+ein. Sie muessen die Environment-Variablen anpassen:
+
+ set emtexdir=c:\local\emtex
+
+Vergessen Sie nicht, PATH, und unter OS/2 die Environment-Variablen
+HELP, BOOKSHELF und LIBPATH, anzupassen.
+
+Um emTeX in einem Verzeichnis \tex (beispielsweise) zu installieren (also
+die Verzeichnisse \tex\bin, \tex\texinput usw. zu haben), installieren Sie
+emTeX wie angegeben im Verzeichnis \emtex und benennen Sie das Verzeichnis
+anschliessend in \tex um.
+
+Es ist nicht empfehlenswert die Struktur des emTeX-Verzeichnisbaumes
+zu aendern, da Sie in diesem Falle ein grosse Zahl Environment-Variablen
+(wie TEXINPUT) setzen muessen, statt nur die Variable EMTEXDIR zu
+setzen.
+
+
+------------------------------------------------------------------------------
+Loeschen eines Paketes
+------------------------------------------------------------------------------
+
+Sie koennen ein Paket von der Festplatte loeschen, wenn eine passende REM-
+Datei vorhanden ist. Wenn Sie zum Beispiel das TEXWARE-Paket von Laufwerk
+C: loeschen wollen, geben Sie folgendes Kommando ein:
+
+ emremove c:\emtex\remove\texware.rem c:\
+
+Das bedeutet folgendes:
+
+ emremove startet das Loeschprogramm (aus c:\emtex\bin)
+ c:\emtex\remove\texware.rem
+ ist die Liste der Dateien, die das Paket enthaelt
+ c:\ ist das Verzeichnis in dem das Paket geloescht werden soll
+
+Wenn Sie den emTeX-Verzeichnisbaum beispielsweise in c:\local installiert
+haben (also die Verzeichnisse c:\local\emtex\bin, c:\local\emtex\texinput
+usw. haben), geben Sie folgedes ein:
+
+ emremove c:\local\emtex\remove\texware.rem c:\local
+
+Wenn das erste Verzeichnis des emTeX-Baumes nicht `emtex' heisst,
+koennen Sie emremove.exe nicht verwenden, es sei denn, Sie nennen das
+Verzeichnis in `emtex' um oder passen die REM-Dateien an.
+
+
+------------------------------------------------------------------------------
+Beispiel fuer autoexec.bat von DOS
+------------------------------------------------------------------------------
+
+Dies ist nur ein Ausschnitt! Ueberschreiben Sie Ihre autoexec.bat-Datei
+nicht mit diesem Beispiel! Sie brauchen nicht unbedingt Grossbuchstaben
+zu verwenden.
+
+SET PATH=C:\DOS;C:\APPS;C:\EMX\BIN;C:\EMTEX\BIN
+SET EMTEXDIR=C:\EMTEX
+SET DVIDRVINPUT=C:\EMTEX\DOC
+SET DVIDRVFONTS=C:\TEXFONTS
+SET DVIDRVGRAPH=C:\EMTEX\DOC
+SET INDEXSTYLE=C:\EMTEX\IDXSTYLE
+SET MFJOBOPT=/3
+SET TMP=C:\TMP
+SET EMTEXED=q %%2 -n%%1
+
+
+------------------------------------------------------------------------------
+Entpacken von LaTeX2e
+------------------------------------------------------------------------------
+
+Die Original-Distribution von LaTeX2e ist in l2base.zip
+enthalten. Dieses Archiv enthaelt einige Dokumentationsdateien und die
+Quelldateien von LaTeX2e in .dtx-Dateien verpackt.
+
+Falls Sie LaTeX2e selbst entpacken wollen (anstelle der Installation
+von l2input.zip), geben Sie bitte die folgenden Kommandos nach dem
+Entpacken von l2base.zip ein:
+
+ cd \emtex\dist\latex\base
+ tex386 /i unpack.ins
+ latex2e autoload.ins
+ inst2e \emtex
+
+Statt tex386 koennen Sie auch eine der anderen emTeX-Programmdateien
+verwenden (z.B. tex.exe oder texp.exe). Diese Prozedur erstellt noch
+nicht die neuen Format-Dateien, daher ist es egal, welches
+emTeX-Programm Sie benutzen (je schneller desto besser!). Statt
+`latex2e' koennen Sie TeX mit plain.fmt, jedoch nicht INITEX,
+verwenden.
+
+Die Batch-Datei `inst2e' kopiert die fuer LaTeX2e erforderlichen
+Dateien in die Unterverzeichnisse `texinput\latex2e' und `idxstyle'
+des Verzeichnisses, das als Argument angegeben ist. Wenn die
+Verzeichnisse \emtex\texinput\latex2e oder \emtex\idxstyle bereits
+vorhanden sind, erhalten Sie eine oder zwei Fehlermeldungen, besagend,
+dass diese nicht erstellt werden koennen. Diese Fehlermeldungen koennen
+Sie ignorieren, andere jedoch nicht.
+
+Wenn Sie LaTeX2e entpackt und `inst2e' ausgefuehrt haben, koennen Sie
+die Dateien in \emtex\dist\latex\base loeschen, um Plattenplatz zu
+sparen. Vielleicht wollen Sie aber zuerst die Dokumentationsdateien in
+diesen Verzeichnis lesen.
+
+Falls Sie zur Installation einer neuen Version von LaTeX2e die Dateien
+in \emtex\texinput\latex2e loeschen wollen, sollten Sie dies entweder
+vor dem ersten TeX-Aufruf fuer die *.ins-Dateien oder nach dem Aufruf
+von `inst2e' tun. Wenn Sie die Dateien zwischen diesen beiden
+Schritten loeschen, wird die Datei texsys.cfg fehlen.
+
+Weitere Informationen zur Installation von LaTeX2e steht in
+\emtex\dist\latex\base\install.txt.
+
+
+------------------------------------------------------------------------------
+Beispiel fuer config.sys von OS/2
+------------------------------------------------------------------------------
+
+Dies ist nur ein Ausschnitt! Ueberschreiben Sie Ihre config.sys-Datei
+nicht mit diesem Beispiel! Sie brauchen nicht unbedingt Grossbuchstaben
+zu verwenden.
+
+LIBPATH=C:\OS2\DLL;C:\OS2\MDOS;C:\OS2\APPS\DLL;C:\EMX\DLL;C:\EMTEX\DLL;
+SET PATH=C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS;C:\OS2\APPS;C:\EMX\BIN;C:\EMTEX\BIN
+SET HELP=C:\OS2\HELP;C:\OS2\HELP\TUTORIAL;C:\EMTEX\HELP
+SET BOOKSHELF=C:\OS2\BOOK;C:\EMX\BOOK;C:\EMTEX\BOOK\GERMAN
+SET EMTEXDIR=C:\EMTEX
+SET DVIDRVINPUT=C:\EMTEX\DOC
+SET DVIDRVFONTS=C:\TEXFONTS
+SET DVIDRVGRAPH=C:\EMTEX\DOC
+SET INDEXSTYLE=C:\EMTEX\IDXSTYLE
+SET MFJOBOPT=/3
+SET TMP=C:\TMP
+SET EMTEXED=emacsclient +%1 %2
+IOPL=YES
+
+ -------- Ende von INSTALL.GER -------------
diff --git a/systems/msdos/emtex/QUICK.ENG b/systems/msdos/emtex/QUICK.ENG
new file mode 100644
index 0000000000..68559a9dee
--- /dev/null
+++ b/systems/msdos/emtex/QUICK.ENG
@@ -0,0 +1,329 @@
+==============================================================================
+QUICK.ENG (emTeX DISTRIBUTION) 09-Jul-1998
+==============================================================================
+
+ Quick installation instructions for emTeX
+
+------------------------------------------------------------------------------
+Contents
+------------------------------------------------------------------------------
+
+1. Introduction
+2. Installing unzip.exe
+2.1. Installing unzip.exe for DOS
+2.2. Installing unzip.exe for OS/2
+3. Modifying autoexec.bat and config.sys
+3.1 Modifying autoexec.bat and config.sys under DOS
+3.2 Modifying config.sys under OS/2
+4. Choosing fonts
+5. Unpacking the ZIP files
+6. Creating format files
+7. Creating base files
+8. Testing the installation
+8.1. Viewing the sample output under DOS
+8.2. Viewing the sample output under OS/2
+8.3. Printing the sample
+9. Finishing the installation
+
+------------------------------------------------------------------------------
+1. Introduction
+------------------------------------------------------------------------------
+
+These instructions tell you how to perform a quick installation of
+emTeX without employing the installation program. Please try the
+installation program before attempting to install emTeX manually!
+
+These quick installation instructions apply only if all of the
+following conditions are true:
+
+- You have a 386 CPU or better and use DOS 3.0 or later or OS/2 2.0 or
+ later (including Warp).
+
+- You want to use plain TeX or LaTeX2e.
+
+- You don't want to generate the base fonts yourself (for instance,
+ because you have the appropriate xx_base.fli file for your printer).
+
+If at least one of these conditions do not apply or if you want to
+tune your installation or if you want to know what you are doing,
+please use the detailed general installation instructions in
+INSTALL.ENG.
+
+(The quick installation instructions are provided for those who take
+the general installation instructions to be too complicated -- for all
+other users, the general installation instructions are recommended.)
+
+These installation instructions assume that emTeX will be installed on
+drive C: in directory \emtex and that the distribution files are on
+diskettes in drive A:. If you choose to install emTeX in a different
+directory or if the distribution files are in a different location,
+you have to modify the commands appropriately.
+
+------------------------------------------------------------------------------
+2. Installing unzip.exe
+------------------------------------------------------------------------------
+
+If you already have unzip.exe, you can use that for unpacking the
+archive files.
+
+If you have pkunzip.exe (version 2.x), you can use that for unpacking
+the archive files. Note, however, that you have to type `pkunzip -d'
+instead of `unzip'.
+
+If you have neither unzip.exe nor pkunzip.exe (version 2.x), type the
+following commands, where `c:\bin' is a directory in your PATH
+(diskette 1 in drive A:).
+
+2.1. Installing unzip.exe for DOS
+---------------------------------
+
+Enter the following commands:
+
+ a:\unz512x3 unzip386.exe
+ ren unzip386.exe unzip.exe
+
+2.2. Installing unzip.exe for OS/2
+---------------------------------
+
+Enter the following commands:
+
+ c:
+ cd \bin
+ a:\unz512 unzip32.exe
+ ren unzip32.exe unzip.exe
+
+------------------------------------------------------------------------------
+3. Modifying autoexec.bat and config.sys
+------------------------------------------------------------------------------
+
+When adding a directory, use a semicolon to separate the new directory
+from the last one.
+
+Reboot after making these changes to autoexec.bat or config.sys.
+
+3.1 Modifying autoexec.bat and config.sys under DOS
+---------------------------------------------------
+
+Add c:\emtex\bin to PATH= of autoexec.bat.
+
+Add c:\emx\bin to PATH= of autoexec.bat.
+
+Add the following lines to autoexec.bat:
+
+ set emtexdir=c:\emtex
+ set dvidrvfonts=c:\texfonts
+ set mfjobopt=/3
+
+Please don't use spaces! (`set emtexdir = c:\emtex' won't work!)
+
+Set the environment variable TMP in autoexec.bat (unless already set)
+by adding a line line the following one to autoexec.bat:
+
+ set tmp=c:\temp
+
+TMP should point to an existing scratch directory (create the
+directory if it does not yet exist).
+
+If there is a line `FILES=xx' in config.sys where xx is less than 20,
+change xx to 20 or more.
+
+If there is no line `FILES=xx' in config.sys, add this line:
+
+ FILES=20
+
+Remove `BREAK=ON' from config.sys.
+
+To avoid overflow of the environment space, add this line to
+config.sys (this example assumes that DOS is installed in directory
+c:\dos):
+
+ SHELL=C:\DOS\COMMAND.COM C:\DOS /E:1024 /P
+
+If you already have such a line in config.sys, you might have to
+increase the value of the /E option by approximately 512. Note that
+there are some versions of DOS where the syntax or semantics are
+slightly different.
+
+3.2 Modifying config.sys under OS/2
+-----------------------------------
+
+Use E, not EPM, for editing config.sys!
+
+Add c:\emx\dll to LIBPATH= of config.sys.
+
+Add c:\emtex\dll to LIBPATH= of config.sys.
+
+Add c:\emtex\bin to SET PATH= of config.sys.
+
+Add c:\emx\bin to SET PATH= of config.sys.
+
+Add c:\emtex\help to SET HELP= of config.sys.
+
+Add c:\emtex\book\english to SET BOOKSHELF= of config.sys.
+
+Add the following lines to config.sys:
+
+ set emtexdir=c:\emtex
+ set dvidrvfonts=c:\texfonts
+ set mfjobopt=/3
+
+------------------------------------------------------------------------------
+4. Choosing fonts
+------------------------------------------------------------------------------
+
+Depending on your printer, choose one of the following font sets:
+
+ bj Canon BubbleJet (360 DPI)
+ dj HP DeskJet (300 DPI)
+ fax Fax (204x196 DPI)
+ fx 9-pin printers (240x216 DPI)
+ ito C.ITOH 8510A (160x144 DPI)
+ lj HP LaserJet (300 DPI)
+ ljh HP LaserJet 4 (600 DPI)
+ p6h 24-pin printers (360 DPI)
+ p6l 24-pin printers (180 DPI)
+ p6m 24-pin printers (360x180 DPI)
+ qj HP QuietJet (192 DPI)
+ sty EPSON Stylus 800 (360 DPI)
+
+If you do not have a printer, choose `p6l' (for a slow machine) or
+`lj' (for a fast machine).
+
+For the rest of this document, let `XX' represent the name of the font
+set you have chosen.
+
+Copy the base fonts of the font set, if you have them:
+
+ c:
+ md \texfonts
+ copy a:\XX_base.fli c:\texfonts
+
+
+------------------------------------------------------------------------------
+5. Unpacking the ZIP files
+------------------------------------------------------------------------------
+
+Type the following commands to unpack the ZIP files. The diskette
+numbers refer to the recommandations of DISKETTE.DOC:
+
+ c: --- Diskette ---
+ cd \ 1440KB 1200KB
+ unzip a:\first 1 1
+ unzip a:\emxrsx 1 2
+ unzip a:\dvid16h1 2 3
+ unzip a:\dvid16h2 3 2
+ unzip a:\tex4b 4 4
+ unzip a:\mf4b 5 5
+ unzip a:\fontcm 5 6
+ unzip a:\fontltx 5 6
+ unzip a:\l2input 6 6
+ unzip a:\mfjob12d 6 7
+
+------------------------------------------------------------------------------
+6. Creating format files
+------------------------------------------------------------------------------
+
+Type the following commands to create format files:
+
+ cd \emtex\btexfmts
+ makefmt 386 plain US <--- if you need PLAIN TeX
+ makefmt 386 latex2e US 8bit -b \emtex\bin\latex2e
+
+------------------------------------------------------------------------------
+7. Creating base files
+------------------------------------------------------------------------------
+
+Type the following commands to create the PLAIN base file:
+
+ cd \emtex\bmfbases
+ makebas 386 plain
+
+------------------------------------------------------------------------------
+8. Testing the installation
+------------------------------------------------------------------------------
+
+Type the following commands to typeset a sample document:
+
+ md \test
+ cd \test
+ latex2e sample2e
+
+The following two sections tell you how to view the sample output on
+the screen (as defined above, `XX' is the name of the font set to use,
+e.g. `lj').
+
+8.1. Viewing the sample output under DOS
+----------------------------------------
+
+Type
+
+ v @XX sample2e
+
+The following message will be displayed:
+
+ Warning 1209: do you want to call MFjob to generate 1 missing font now?
+ Type Y, N, or ?:
+
+Reply `y'. If you have not installed fonts, computing the fonts for
+the sample will take a while.
+
+When the page shows up (white background), you can scale the output by
+typing `-'. To quit, type `q'.
+
+8.2. Viewing the sample output under OS/2
+-----------------------------------------
+
+Type
+
+ vp @XX sample2e
+
+A dialog box asking
+
+ Do you want to call MFjob to generate 1 missing font now?
+
+will pop up. Click on `Yes'.
+
+Select the window titled `dvipm - sample2e'. You can scale the output
+by typing `-'. To quit, type Alt+F4.
+
+8.3. Printing the sample
+------------------------
+
+The command to print the sample depends on your printer. See
+\emtex\doc\english\dvidrv.doc for the appropriate command for your
+printer, here are examples for some printers:
+
+ prthplj sample2e <--- HP LaserJet, 300 DPI (lj)
+ prthpljh sample2e <--- HP LaserJet IV, 600 DPI (ljh)
+ prthpdj sample2e <--- HP DeskJet (lj)
+ prtp6l sample2e <--- NEC P6, 180 DPI (p6l)
+ prtp6m sample2e <--- NEC P6, 360x180 DPI (p6m)
+ prtp6h sample2e <--- NEC P6, 360 DPI (p6h)
+ prtlql sample2e <--- EPSON LQ, 180 DPI (p6l)
+ prtlqm sample2e <--- EPSON LQ, 360x180 DPI (p6m)
+ prtlqh sample2e <--- EPSON LQ, 360 DPI (p6h)
+ prtsty sample2e <--- EPSON Stylus 800 (sty)
+ prtfx sample2e <--- EPSON FX-80 (fx)
+ prtbj10e sample2e <--- Canon BJ-10e (bj)
+ prtbj300 sample2e <--- Canon BJ300 (bj)
+
+See \emtex\doc\english\dvidrv.doc for additional commands (for exotic
+printers, for creating drafts, for creating bitmaps).
+
+If your printer is not connected to the default printer port (PRN),
+give the printer port as second argument, for example:
+
+ prthplj sample2e lpt2
+
+------------------------------------------------------------------------------
+9. Finishing the installation
+------------------------------------------------------------------------------
+
+Adjust the printer-model-specific margins, according to
+\emtex\doc\english\dvidrv.doc.
+
+See the general installation instructions in INSTALL.ENG for
+installation of other packages and for further configuration of your
+installation.
+
+ -------- End of QUICK.ENG -------------
diff --git a/systems/msdos/emtex/QUICK.GER b/systems/msdos/emtex/QUICK.GER
new file mode 100644
index 0000000000..791221e66c
--- /dev/null
+++ b/systems/msdos/emtex/QUICK.GER
@@ -0,0 +1,342 @@
+==============================================================================
+QUICK.GER (emTeX DISTRIBUTION) 09-Jul-1998
+==============================================================================
+
+ Vereinfachte Installationsanleitung fuer emTeX
+
+-----------------------------------------------------------------------------
+Inhalt
+------------------------------------------------------------------------------
+
+1. Einleitung
+2. Installation von unzip.exe
+2.1. Installation von unzip.exe fuer DOS
+2.2. Installation von unzip.exe fuer OS/2
+3. Anpassung von autoexec.bat und config.sys
+3.1. Anpassung von autoexec.bat und config.sys unter DOS
+3.2. Anpassung von config.sys unter OS/2
+4. Auswahl der Zeichensaetze
+5. Entpacken der ZIP-Dateien
+6. Format-Dateien erzeugen
+7. Base-Dateien erzeugen
+8. Testen der Installation
+8.1. Betrachten des Beispiels unter DOS
+8.2. Betrachten des Beispiels unter OS/2
+8.3. Drucken des Beispiels
+9. Installation beenden
+
+------------------------------------------------------------------------------
+1. Einleitung
+------------------------------------------------------------------------------
+
+Diese Anleitung beschreibt die vereinfachte Installation von emTeX
+ohne die Verwendung des Installationsprogramms. Sie sollten auf jeden
+Fall zunaechst dem Installationsprogramm eine Chance geben.
+
+Diese vereinfachte Installationsanleitung sollte nur dann verwendet
+werden kann, wenn die folgenden Bedingungen alle erfuellt sind:
+
+- Sie haben einen 386-Prozessor oder besser und benutzen DOS 3.0 (oder
+ besser) oder OS/2 2.0 (oder besser, inklusive Warp).
+
+- Sie wollen plain TeX oder LaTeX2e verwenden.
+
+- Sie wollen die Grundausstattung an Zeichensaetzen nicht selbst
+ berechnen lassen (z.B. weil Sie die zu Ihrem Drucker passende
+ xx_base.fli-Datei haben).
+
+Falls auch nur eine dieser Bedingungen nicht zutrifft oder falls Sie
+die Installation besser an die Gegebenheiten anpassen wollen oder
+falls Sie wissen wollen, was Sie tun, sollten Sie die allgemeine
+Installationsanleitung in INSTALL.GER verwenden.
+
+(Die vereinfachte Installation ist fuer Anwender gedacht, denen die
+allgemeine Installationanleitung zu kompliziert ist. Allen anderen
+Anwendern wird die allgemeine Installationsanleitung empfohlen.)
+
+Diese Installationsanleitung geht davon aus, dass Sie emTeX auf
+Laufwerk C: im Verzeichnis \emtex installieren werden und dass die
+Distributions-Dateien sich auf Disketten im Laufwerk A: befinden. Wenn
+Sie andere Laufwerke oder Verzeichnisse verwenden, muessen Sie die
+Kommandos entsprechend aendern.
+
+------------------------------------------------------------------------------
+2. Installation von unzip.exe
+------------------------------------------------------------------------------
+
+Falls Sie unzip.exe bereits haben, koennen Sie dies zum Entpacken der
+ZIP-Dateien verwenden.
+
+Falls Sie pkunzip.exe haben (Version 2.x), koennen Sie dies zum
+Entpacken der Archive verwenden. Jedoch muessen Sie `pkunzip -d' statt
+`unzip' eingeben.
+
+Falls Sie weder unzip.exe noch pkunzip.exe (Version 2.x) haben, geben
+Sie folgende Kommandos ein, wobei `c:\bin' ein Verzeichnis im Suchpfad
+fuer Programme (PATH) ist (Diskette 1 im Laufwerk A:).
+
+2.1. Installation von unzip.exe fuer DOS
+----------------------------------------
+
+Geben Sie die folgenden Kommandos ein:
+
+ c:
+ cd \bin
+ a:\unz512x3 unzip386.exe
+ ren unzip386.exe unzip.exe
+
+2.1. Installation von unzip.exe fuer OS/2
+-----------------------------------------
+
+Geben Sie die folgenden Kommandos ein:
+
+ c:
+ cd \bin
+ a:\unz512 unzip32.exe
+ ren unzip32.exe unzip.exe
+
+------------------------------------------------------------------------------
+3. Anpassung von autoexec.bat und config.sys
+------------------------------------------------------------------------------
+
+Beim Hinzufuegen eines Verzeichnisses ist ein Semikolon zur Trennung
+des neuen Verzeichnisses vom bisher letzten einzufuegen, sofern nicht
+bereits vorhanden.
+
+Nach diesen Aenderungen muessen Sie Ihren Rechner neu starten.
+
+3.1. Anpassung von autoexec.bat und config.sys unter DOS
+--------------------------------------------------------
+
+Fuegen Sie c:\emtex\bin zu PATH= in autoexec.bat.
+
+Fuegen Sie c:\emx\bin zu PATH= in autoexec.bat.
+
+Fuegen Sie die folgenden Zeilen in autoexec.bat ein:
+
+ set emtexdir=c:\emtex
+ set dvidrvfonts=c:\texfonts
+ set mfjobopt=/3
+
+Bitte verwenden Sie keine Leerzeichen! (`set emtexdir = c:\emtex'
+funktioniert nicht!)
+
+Sofern noch nicht gesetzt, sollten Sie die Environment-Variable TMP in
+autoexec.bat durch Hinzufuegen einer Zeile folgender Art setzen:
+
+ set tmp=c:\temp
+
+TMP sollte den Pfadnamen eines existierenden Verzeichnisses fuer
+temporaere Dateien enthalten (falls das Verzeichnis nicht existiert,
+sollten Sie es anlegen).
+
+Falls eine Zeile `FILES=xx' in config.sys existiert, wobei xx
+kleines als 20 ist, aendern Sie xx in 20 (oder groesser) ab.
+
+Falls keine Zeile `FILES=xx' in config.sys existiert, fuegen Sie
+folgende Zeile in config.sys ein:
+
+ FILES=20
+
+Entfernen Sie `BREAK=ON' aus config.sys.
+
+Um den `Umgebungsbereich' zu vergroessern, sollten Sie die folgende
+Zeile in config.sys einfuegen (dieses Beispiel geht davon aus, dass DOS
+im Verzeichnis c:\dos installiert ist):
+
+ SHELL=C:\DOS\COMMAND.COM C:\DOS /E:1024 /P
+
+Falls eine solche Zeile sich bereits in config.sys befindet, sollten
+Sie eventuell den Wert der /E-Option um etwa 512 vergroessern. Beachten
+Sie bitte, dass bei manchen DOS-Versionen die Syntax oder die Bedeutung
+etwas anders ist.
+
+3.2. Anpassung von config.sys unter OS/2
+----------------------------------------
+
+Benutzen Sie bitte E statt EPM zum Aendern von config.sys!
+
+Fuegen Sie c:\emx\dll zu LIBPATH= in config.sys.
+
+Fuegen Sie c:\emtex\dll zu LIBPATH= in config.sys.
+
+Fuegen Sie c:\emtex\bin zu SET PATH= in config.sys.
+
+Fuegen Sie c:\emx\bin zu SET PATH= in config.sys
+
+Fuegen Sie c:\emtex\help zu SET HELP= in config.sys.
+
+Fuegen Sie c:\emtex\book\german zu SET BOOKSHELF= in config.sys
+
+Fuegen Sie die folgenden Zeilen in config.sys ein:
+
+ set emtexdir=c:\emtex
+ set dvidrvfonts=c:\texfonts
+ set mfjobopt=/3
+
+------------------------------------------------------------------------------
+4. Auswahl der Zeichensaetze
+------------------------------------------------------------------------------
+
+Bitte waehlen Sie passende Zeichensaetze fuer Ihren Drucker:
+
+ bj Canon BubbleJet (360 DPI)
+ dj HP DeskJet (300 DPI)
+ fax Fax (204x196 DPI)
+ fx 9-Nadel-Drucker (240x216 DPI)
+ ito C.ITOH 8510A (160x144 DPI)
+ ljh HP LaserJet 4 (600 DPI)
+ lj HP LaserJet (300 DPI)
+ p6h 24-Nadel-Drucker (360 DPI)
+ p6l 24-Nadel-Drucker (180 DPI)
+ p6m 24-Nadel-Drucker (360x180 DPI)
+ qj HP QuietJet (192 DPI)
+ sty EPSON Stylus 800 (360 DPI)
+
+Falls Sie keinen Drucker besitzen, waehlen Sie `p6l' (fuer langsame
+Rechner) oder `lj' (fuer schnelle Rechner).
+
+Im folgenden stehe `XX' fuer die von Ihnen gewaehlten Zeichensaetze.
+
+Kopieren Sie die entsprechende Zeichensatzbibliotheksdatei, sofern sie
+zur Verfuegung steht:
+
+ c:
+ md \texfonts
+ copy a:\XX_base.fli c:\texfonts
+
+------------------------------------------------------------------------------
+5. Entpacken der ZIP-Dateien
+------------------------------------------------------------------------------
+
+Geben Sie die folgenden Kommandos zum Entpacken der ZIP-Dateien ein.
+Die Diskettennummern beziehen sich auf die Empfehlung in DISKETTE.DOC:
+
+ c: --- Diskette ---
+ cd \ 1440KB 1200KB
+ unzip a:\first 1 1
+ unzip a:\emxrsx 1 2
+ unzip a:\dvid16h1 2 3
+ unzip a:\dvid16h2 3 2
+ unzip a:\german 3 8
+ unzip a:\tex4b 4 4
+ unzip a:\mf4b 5 5
+ unzip a:\fontcm 5 6
+ unzip a:\fontltx 5 6
+ unzip a:\l2input 6 6
+ unzip a:\mfjob12d 6 7
+
+------------------------------------------------------------------------------
+6. Format-Dateien erzeugen
+------------------------------------------------------------------------------
+
+Geben Sie die folgenden Kommandos zum Erzeugen der Format-Dateien ein:
+
+ cd \emtex\btexfmts
+ makefmt 386 plain US <--- nur fuer PLAIN TeX noetig
+ makefmt 386 latex2e US German 8bit -b \emtex\bin\latex2e
+
+------------------------------------------------------------------------------
+7. Base-Dateien erzeugen
+------------------------------------------------------------------------------
+
+Geben Sie die folgenden Kommandos zum Erzeugen der PLAIN-Base-Datei ein:
+
+ cd \emtex\bmfbases
+ makebas 386 plain
+
+------------------------------------------------------------------------------
+8. Testen der Installation
+------------------------------------------------------------------------------
+
+Geben Sie die folgenden Kommandos ein, um einen Beispieltext zu
+setzen:
+
+ md \test
+ cd \test
+ latex2e sample2e
+
+Die folgenden zwei Abschnitte erklaeren wie Sie das Beispiel auf dem
+Bildschirm betrachten koennen (wie oben erklaert, steht `XX' fuer die
+Zeichensaetze fuer Ihren Drucker, z.B. `lj').
+
+8.1. Betrachten des Beispiels unter DOS
+---------------------------------------
+
+Geben dieses Kommando ein:
+
+ v @XX sample2e
+
+Die folgende Meldung wird ausgegeben:
+
+ Warning 1209: do you want to call MFjob to generate 1 missing font now?
+ Type Y, N, or ?:
+
+Antworten Sie mit `y'. Falls Sie die Zeichensaetze nicht installiert
+haben, kann das Berechnen der noetigen Zeichensaetze fuer das Beispiel
+ein Weilchen dauern.
+
+Sobald die Seite angezeigt wird (weisser Hintergrund), koennen Sie die
+Ausgabe durch Eingabe von `-' verkleinern. Zum Verlassen des Programms
+geben Sie `q' ein.
+
+8.2. Betrachten des Beispiels unter OS/2
+----------------------------------------
+
+Geben dieses Kommando ein:
+
+ vp @XX sample2e
+
+Eine Dialogbox folgenden Inhalts wird angezeigt:
+
+ Do you want to call MFjob to generate 1 missing font now?
+
+Klicken Sie auf `Yes'.
+
+Selektieren Sie das Fenster mit dem Titel `dvipm - sample2e'. Sie
+koennen die Ausgabe durch Eingabe von `-' verkleinern. Zum Verlassen
+des Programms geben Sie Alt+F4 ein.
+
+8.3. Drucken des Beispiels
+--------------------------
+
+Das Kommando zum Drucken haengt von Ihrem Drucker ab. Das korrekte
+Kommando fuer Ihren Drucker finden Sie in \emtex\doc\german\dvidrv.doc.
+Hier sind zwei Beispiele:
+
+ prthplj sample2e <--- HP LaserJet, 300 DPI (lj)
+ prthpljh sample2e <--- HP LaserJet IV, 600 DPI (ljh)
+ prthpdj sample2e <--- HP DeskJet (lj)
+ prtp6l sample2e <--- NEC P6, 180 DPI (p6l)
+ prtp6m sample2e <--- NEC P6, 360x180 DPI (p6m)
+ prtp6h sample2e <--- NEC P6, 360 DPI (p6h)
+ prtlql sample2e <--- EPSON LQ, 180 DPI (p6l)
+ prtlqm sample2e <--- EPSON LQ, 360x180 DPI (p6m)
+ prtlqh sample2e <--- EPSON LQ, 360 DPI (p6h)
+ prtsty sample2e <--- EPSON Stylus 800 (sty)
+ prtfx sample2e <--- EPSON FX-80 (fx)
+ prtbj10e sample2e <--- Canon BJ-10e (bj)
+ prtbj300 sample2e <--- Canon BJ300 (bj)
+
+In \emtex\doc\german\dvidrv.doc sind weitere Kommandos aufgefuehrt (fuer
+exotische Drucker, fuer Probeausdrucke, fuer die Erzeugung von
+Grafikdarteien).
+
+Falls Ihr Drucker nicht an die Standardschnittstelle (PRN)
+angeschlossen ist, geben Sie den Namen der Druckerschnittstelle als
+zweites Argument in der Kommandozeile an, z.B.:
+
+ prthplj sample2e lpt2
+
+------------------------------------------------------------------------------
+9. Installation beenden
+------------------------------------------------------------------------------
+
+Stellen Sie die Raender genau ein, da diese vom Druckermodell abhaengen.
+Eine Anleitung hierfuer finden Sie in \emtex\doc\german\dvidrv.doc.
+
+Zur Installation weiterer Pakete und zur Anpassung Ihrer Installation
+verwenden Sie bitte die allgemeine Installationsanleitung in
+INSTALL.GER.
+
+ -------- Ende von QUICK.GER -------------
diff --git a/systems/msdos/emtex/README.BET b/systems/msdos/emtex/README.BET
new file mode 100644
index 0000000000..cb70cc05c2
--- /dev/null
+++ b/systems/msdos/emtex/README.BET
@@ -0,0 +1,235 @@
+==============================================================================
+README.BET (emTeX DISTRIBUTION) 25-Jun-1995
+==============================================================================
+
+This file lists the changes made to the betatest stuff since 20-Mar-1995.
+You can ignore this file if you have not installed any of the betatest
+packages of 20-Mar-1995 through 01-Jun-1995.
+
+Continue with README.ENG and INSTALL.ENG after reading (or skipping)
+this file.
+
+Before installing an update of a package, you should remove the
+previously installed version of that package. See INSTALL.ENG.
+
+IMPORTANT: Recreate .fmt and .bas files after installing a new version
+of TeX and METAFONT, respectively.
+
+
+23-Mar-1995
+-----------
+
+- Replace bibtexb2.zip with bibtexb3.zip. bibtex32.exe has been
+ enlarged, min_crossref can now be set with a command line option
+
+- New first.zip with improved INSTALL.ENG
+
+
+25-Mar-1995
+-----------
+
+- IMPORTANT: texb14.zip replaces texb13.zip. The 16-bit emTeX
+ executables of texb13.zip were thoroughly broken. The `german'
+ keyword of makefmt has been renamed `German'
+
+- mfware.zip: METAFONT modes in \emtex\mfinput\gftodvi\*.mf
+ renamed for new local.mf
+
+- latex2e.zip: LaTeX 2e distribution files moved from
+ \emtex\texinput\latex2e to \emtex\dist\latex2e, `inst2e' batch file
+ added. Please delete all files from \emtex\texinput\latex2e before
+ re-installing LaTeX 2e
+
+- fontcm.zip: Some .tfm files required by LaTeX 2e were missing;
+ update \emtex\mfinput\extracm\*.mf with AMSFonts 2.2, remove
+ cmex9.mf from \emtex\mfinput\extracm. This update affects the base
+ fonts
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+26-Mar-1995
+-----------
+
+- fontdc.zip: new TFM files (the old ones were out-dated and didn't
+ match the MF files)
+
+- pkedit.zip: pkedit and pkeditpm have been improved slightly
+
+- mfjob11p.zip: dvidrv.mfj now uses dx.bas instead of dxbase.bas;
+ dx.bas is not required for creating DC fonts (dxbase.mf will be
+ loaded automatically if required); automatic generation of dcr17 now
+ uses a design size of 17.28pt
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+27-Mar-1995
+-----------
+
+- mfb7.zip replaces mfb6.zip. The most important change is mf386 no
+ longer requiring RSXOPT=-Ra. You should undo `set rsxopt=-Ra'
+
+- New base fonts using AMSFonts 2.2
+
+- New first.zip with updated INSTALL.ENG, README.ENG, and HELP.ENG
+
+
+28-Mar-1995
+-----------
+
+- mfjob11p.zip: documentation fixed: \emtex\doc\german\mfjob.doc was
+ truncated, some examples of \emtex\doc\english\mfjob.doc were
+ incorrect
+
+- latex2e.zip: patch level 2; files moved from \emtex\dist\latex2e to
+ \emtex\dist\latex\base
+
+- New first.zip with updated INSTALL.ENG
+
+
+30-Mar-1995
+-----------
+
+- Replace mfjob11p.zip with mfjob11q.zip. This version of MFjob no
+ longer crashes if a non-existent directory is listed in the MFINPUT
+ environment variable
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+03-Apr-1995
+-----------
+
+- fontcm.zip: cm.ini deleted; cmcsc8.tfm, cmcsc9.tfm, cmex7.tfm, and
+ cmex8.tfm updated from AMSFonts 2.2 (the differences are benign --
+ you don't have to fetch the new fontcm.zip if you already have
+ fontcm.zip of 25-Mar-1995: see the date of \emtex\remove\fontcm.rem)
+
+
+10-Apr-1995
+-----------
+
+- latex2e.zip: patch level 3
+
+- latex209.zip: latex.bat and latex.cmd removed; documentation files
+ moved from \emtex\doc to \emtex\doc\latex209
+
+- New first.zip with updated INSTALL.ENG
+
+
+13-Apr-1995
+-----------
+
+- dvid15i1.zip and dvid15i2.zip: Several bugs removed, subdirectory
+ search is available again
+
+- texb15.zip: Bug fixes, new maketcp, makefmt improved
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+18-Apr-1995
+-----------
+
+- mfjob11r.zip: support relative paths
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+20-Apr-1995
+-----------
+
+- dvid15j1.zip and dvid15j2.zip: Bugs fixed
+
+- texb16.zip: makefmt bugs fixed
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+24-Apr-1995
+-----------
+
+- texb17.zip: makefmt bugs fixed
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+26-Apr-1995
+-----------
+
+- mfjob11s.zip: bugs fixed
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+02-May-1995
+-----------
+
+- mfb8.zip: epsonsty mode added, makebas improved
+
+- mfware.zip: gftopk moved from mfware.zip to mfb8.zip
+
+- New file sty_base.fli: base fonts for the EPSON Stylus 800
+
+- New first.zip with updated INSTALL.ENG and README.ENG
+
+
+16-May-1995
+-----------
+
+- emxrsx.zip: New emx.dll (0.9a fix04)
+
+
+19-May-1995
+-----------
+
+- mfjob11t.zip: bug fixed
+
+- New first.zip with updated INSTALL.ENG, README.ENG, HELP.ENG, CHANGES.GER,
+ and README.GER
+
+
+01-Jun-1995
+-----------
+
+- mfjob11u.zip: bug fixed
+
+- New first.zip with updated INSTALL.ENG, README.ENG, INSTALL.GER,
+ and README.GER
+
+
+25-Jun-1995 (official release)
+------------------------------
+
+- latex2e.zip: This package has been replaced by l2input.zip and
+ l2base.zip. l2input.zip contains the unpacked files, l2base.zip
+ contains the distribution files
+
+- l2tools.zip: New package
+
+- fontams.zip: New package
+
+- fontcm.zip: Some TFM files have been moved from emtex\tfm\cm to
+ emtex\tfm\extracm. dummy.tfm has been deleted (a new version is in
+ fontams.zip)
+
+- german.tip: Some files have been moved from emtex\texinput\german to
+ emtex\dist\german
+
+- first.zip: delete.exe has been renamed emdelete.exe, remove.exe has been
+ renamed emremove.exe
+
+- tex4a.zip: The files extdef.tex, frhyph.tex, and masthyph.tex have
+ been deleted; fetch them from CTAN if you need them
+
+- mf4a.zip: The files bas.bat and bas.cmd have been deleted -- please
+ use makebas
+
+- dvid16a?.zip: New versions of emdll1x.dll, emdll1x2.dll, and
+ emdll2x.dll
+
+- pkedit.zip: emdll*.dll have been removed, you should install these
+ files from dvid16a1.zip
+
+ -------- End of README.BET -------------
diff --git a/systems/msdos/emtex/README.ENG b/systems/msdos/emtex/README.ENG
new file mode 100644
index 0000000000..3d9da87356
--- /dev/null
+++ b/systems/msdos/emtex/README.ENG
@@ -0,0 +1,579 @@
+==============================================================================
+README.ENG (emTeX DISTRIBUTION) 02-Jul-1998
+==============================================================================
+
+ emTeX: TeX for OS/2, PC-DOS and MS-DOS
+
+------------------------------------------------------------------------------
+Contents
+------------------------------------------------------------------------------
+
+1. Introduction
+2. Installing emTeX
+3. Getting help
+4. Distribution files
+5. Version numbers
+6. License
+7. How do I get emTeX?
+8. The author
+9. Reporting bugs
+10. Directories
+11. File names in the emTeX system
+
+
+
+------------------------------------------------------------------------------
+1. Introduction
+------------------------------------------------------------------------------
+
+This is a complete distribution of emTeX. It replaces the previous
+official emTeX distribution as well as all previous betatest packages.
+
+IMPORTANT: See CHANGES.ENG for changes with respect to the previous
+emTeX distribution. See INSTALL.ENG for the general installation
+instructions. See QUICK.ENG for quick installation instructions.
+However, using the installation program (install.exe) is recommended.
+
+IMPORTANT: Please use the new font library files (such as lj_base.fli)
+instead of the old ones (such as lj_0.fli through lj_5b.fli) as the
+Computer Modern font sources and the METAFONT modes have changed.
+
+The emTeX distribution includes the TeX typesetter, the METAFONT font
+generation program, printer drivers, screen previewers, and tools like
+BibTeX and MakeIndex. It also includes the macro packages LaTeX 2.09
+and LaTeX2e. Fonts are included as pixel files and METAFONT source
+files.
+
+Documentation for the TeX and METAFONT `programming languages' is not
+included. You can get appropriate books at libraries and book stores.
+However, the emTeX distribution includes documentation for the emTeX
+implementations of TeX and METAFONT.
+
+
+------------------------------------------------------------------------------
+2. Installing emTeX
+------------------------------------------------------------------------------
+
+You'll find the general installation instructions in INSTALL.ENG.
+You'll find quick installation instructions in QUICK.ENG. You can
+avoid reading INSTALL.ENG and QUICK.ENG by using the installation
+program (install.exe)!
+
+You might want to print INSTALL.ENG file by typing
+
+ copy a:\install.eng prn
+
+or print QUICK.ENG by typing
+
+ copy a:\quick.eng prn
+
+(You don't need to print README.ENG.)
+
+
+------------------------------------------------------------------------------
+3. Getting help
+------------------------------------------------------------------------------
+
+You'll find some frequently asked questions with answers in
+\emtex\doc\english\help.eng. Before asking, you should read that
+file. Some don't like to be asked questions that are answered in
+help.eng.
+
+There is an electronic mailing list, emtex-user, for emTeX. To get
+information on how to subscribe and unsubscribe, send a message
+containing
+
+ HELP
+ INFO EMTEX-USER
+
+in the body to majordomo@physik.tu-berlin.de.
+
+
+------------------------------------------------------------------------------
+4. Distribution files
+------------------------------------------------------------------------------
+
+ changes.eng Changes from older versions (English)
+ changes.ger Changes from older versions (German)
+ diskette.doc How to put these files onto diskettes
+ help.eng Frequently asked questions with answers (English)
+ help.ger Frequently asked questions with answers (German)
+ install.dat Auxiliary file for install.exe
+ install.eng General installation instructions (English)
+ install.exe Installation program
+ install.ger General installation instructions (German)
+ install.ovl Auxiliary file for install.exe
+ quick.eng Quick installation instructions (English)
+ quick.ger Quick installation instructions (German)
+ readme.bet Read this if you have a betatest version installed
+ readme.eng You should read this (English)
+ readme.ger You should read this (German)
+ unz512.exe Info-ZIP's UnZip for OS/2, self-extracting archive
+ unz512x3.exe Info-ZIP's UnZip for DOS, self-extracting archive
+
+ bibtex4b.zip BibTeX, manages bibliography databases for LaTeX
+ dvid16g1.zip Printer drivers and screen previewers, part 1 of 2
+ dvid16g2.zip Printer drivers and screen previewers, part 2 of 2
+ dvisp10b.zip Convert a DVI file to a text file
+ emxrsx.zip emx and rsx runtime package (for tex386 etc.)
+ first.zip Documentation files and tools, to be installed first
+ fontams.zip Font source files and TFM files: AMSFonts
+ fontcm.zip Font source files and TFM files: Computer Modern
+ fontec.zip Font source files and TFM files: EC and TC fonts
+ fontemsy.zip Font source files and TFM files: em's symbol font
+ fontltx.zip Font source files and TFM files: LaTeX fonts
+ german.zip Files for typesetting documents written in German
+ l2base.zip Base distribution files of LaTeX2e
+ l2input.zip Unpacked input files of LaTeX2e
+ l2kurz.zip Brief introduction to LaTeX2e (German)
+ l2tools.zip Additional macros for LaTeX2e
+ latex209.zip LaTeX 2.09 macro package
+ lkurz.zip Brief introduction to LaTeX 2.09 (German)
+ makeindx.zip MakeIndex: generating an index for a LaTeX document
+ mf4b.zip METAFONT: generating fonts
+ mfjob12d.zip MFjob: assists METAFONT in generating fonts
+ mfware.zip Tools for font files
+ pictex.zip PiCTeX macro package
+ pkedit.zip Tool for editing pixel font files
+ srcmkidx.zip Source code for MakeIndex
+ srctcad.zip Source code for TeXcad
+ tex4b.zip emTeX typesetter
+ texcad.zip TeXcad: interactive designer for LaTeX pictures
+ texware.zip Tools for DVI and TFM files, etc.
+ web.zip WEB: literate programming in Pascal
+
+ bj_base.fli Base fonts for the Canon BubbleJet (360 DPI)
+ dj_base.fli Base fonts for the HP DeskJet (300 DPI)
+ fax_base.fli Base fonts for Fax (204x196 DPI)
+ fx_base.fli Base fonts for 9-pin printers (240x216 DPI)
+ ito_base.fli Base fonts for the C.ITOH 8510A (160x144 DPI)
+ ljh_base.fli Base fonts for the HP LaserJet 4 (600 DPI)
+ lj_base.fli Base fonts for the HP LaserJet (300 DPI)
+ p6h_base.fli Base fonts for 24-pin printers (360 DPI)
+ p6l_base.fli Base fonts for 24-pin printers (180 DPI)
+ p6m_base.fli Base fonts for 24-pin printers (360x180 DPI)
+ qj_base.fli Base fonts for the HP QuietJet (192 DPI)
+ sty_base.fli Base fonts for the EPSON Stylus 800 (360 DPI)
+
+The *.eng and *.ger file can also be found in first.zip.
+
+ljh_base.fli does not fit on a 1200KB diskette (130mm, 5.25"). You
+might want to use Info-ZIP's Zip program (UnZip's companion) to
+compress that file to make it fit.
+
+
+------------------------------------------------------------------------------
+5. Version numbers
+------------------------------------------------------------------------------
+
+ BibTeX 0.99c
+ dvidrv 1.6g
+ dvispell 1.0b
+ DVItype 3.5
+ fontlib 1.2b
+ GFtoDVI 3.0
+ GFtoPK 2.3
+ GFtype 3.1
+ METAFONT 2.718
+ MFT 2.0
+ MFjob 1.2d
+ makedot 1.2e
+ MakeIndex 2.12
+ maketcp 1.1d
+ PCLtoMSP 1.1a
+ pkedit 1.1h
+ pkeditpm 1.1a
+ PKtoGF 1.0
+ PKtype 2.3
+ PLtoTF 3.5
+ PXtoPK 2.2
+ TANGLE 4.4
+ TFtoPL 3.1
+ TeX 3.14159
+ TeXconv 1.2a
+ VFtoVP 1.2
+ VPtoVF 1.4
+ WEAVE 4.4
+
+ LaTeX 2.09 <25 March 1992>
+ LaTeX2e 1998/06/01
+ plain.tex 3.141592
+ plain.mf 2.71
+ german.sty 2.5d
+ AMSFonts 2.2
+ EC Fonts 1.0
+
+
+------------------------------------------------------------------------------
+6. License
+------------------------------------------------------------------------------
+
+Software written by Eberhard Mattes which is part of the emTeX
+distribution may be used without restrictions.
+
+Software written by Eberhard Mattes which is part of the emTeX
+distribution may only be distributed in UNCHANGED and COMPLETE form,
+including all the files listed in README.ENG's `Distribution files'
+section, and only if this is done WITHOUT CHARGE (you are allowed to
+omit some or all of the *.fli files).
+
+(If you want to distribute only parts of emTeX or if you want to
+charge a fee for handling etc., you have to contact the author. In
+particular, commercial distribution on CDROM or diskettes is
+prohibited without explicit permission.)
+
+For all other software of the emTeX distribution, the license
+accompanying that software applies.
+
+(In general, non-commercial use is allowed for all software
+distributed with emTeX. Apparently commercial use is restricted for
+the German hyphenation patterns (ghyph31.tex) only. In general,
+distribution of unmodified and complete software is allowed if you
+don't take money for use or distribution. In particular, the files of
+l2input.zip must not be distributed without the files of l2base.zip.)
+
+No guarantee is made as to the proper functioning of the software. No
+liability will be admitted for damage resulting from using the
+software.
+
+Instead of a list: All the trademarks used in this document and all
+the other emTeX documents are registered to whoever it is that owns
+them.
+
+
+------------------------------------------------------------------------------
+7. How do I get emTeX?
+------------------------------------------------------------------------------
+
+- Anonymous ftp:
+
+ ftp.dante.de /tex-archive/systems/msdos/emtex
+ ftp.cdrom.com /pub/tex/ctan/systems/msdos/emtex
+ ftp.tex.ac.uk /tex-archive/systems/msdos/emtex
+
+- Mail server:
+
+ ftpmail@dante.de
+ ftpmail@ftp.SHSU.edu
+
+Note that BINARY mode must be used for downloading all the files.
+
+
+------------------------------------------------------------------------------
+8. The author
+------------------------------------------------------------------------------
+
+Address:
+
+ Eberhard Mattes
+ Teckstrasse 81 (Teckstra\ss e)
+ D-71696 Moeglingen (M\"oglingen)
+ Germany
+
+No telephone calls please! Please inclose a self-addressed return
+package with postage if you expect a response. Read HELP.ENG first!
+
+Electronic mail (subject to change):
+
+ Internet: mattes@azu.informatik.uni-stuttgart.de
+
+If you want support by telephone, obtain a commercial TeX package.
+
+
+------------------------------------------------------------------------------
+9. Reporting bugs
+------------------------------------------------------------------------------
+
+If you find a bug please tell the author so that it can be corrected. Please
+send the following information which is needed for the task:
+
+- machine type (XT, AT, 386 etc.), CPU, BIOS, video card, printer
+ (manufacturer and model), operating system and version number
+ (note: SYSLEVEL command with OS/2). For instance:
+ AT compatible, 286, Award, Paradise VGA, DeskJet+, IBM PC-DOS 3.3 .
+
+- the text of the autoexec.bat and config.sys in use when the error
+ occurred: if possible, with an explanation of the programs called and
+ drivers installed that are not part of the operating system.
+
+- emTeX version
+
+- enough information for the error to be reproduced, if possible a
+ diskette containing the appropriate files (see also dvidrv.doc).
+
+- the DLG file, if the error is in a driver
+
+- the part of the printed output which shows the error, if the error is in
+ a printer driver.
+
+Please inclose a self-addressed return package with postage if you
+expect a response.
+
+
+------------------------------------------------------------------------------
+10. Directories
+------------------------------------------------------------------------------
+
+The following directories are created during the installation:
+
+\emtex
+
+ This is the root directory of the emTeX directory tree. It should
+ contain only subdirectories, no files. The EMTEXDIR environment
+ variable points to this directory.
+
+\emtex\bibtex\bib
+
+ Bibliography database for BibTeX. The (optional) BIBINPUT
+ environment variable points to this directory.
+
+\emtex\bibtex\bst
+
+ Style files for BibTeX. The (optional) BSTINPUT environment
+ variable points to this directory.
+
+\emtex\bin
+
+ Executable files (that is, programs). Add this directory to your
+ PATH.
+
+\emtex\bmfbases
+
+ METAFONT base files (macro packages such as `plain' in a
+ fast-loading format) and mf.poo, for bigMETAFONT and mf386. The
+ (optional) BMFBAS environment variable points to this directory.
+
+\emtex\book
+
+ OS/2 on-line manuals. This directory has the following
+ subdirectories:
+
+ english English manuals
+ german German manuals
+
+ To view an OS/2 on-line manual (such as dvidrv.inf), type
+
+ view c:\emtex\book\english\dvidrv
+
+ If you have added c:\emtex\book\english to the BOOKSHELF
+ environment variable, the following command will also work:
+
+ view dvidrv
+
+\emtex\btexfmts
+
+ TeX format files (macro packages such as LaTeX, in a fast-loading
+ format) and tex.poo, for bigTeX and tex386. The (optional)
+ BTEXFMT environment variable points to this directory.
+
+\emtex\data
+
+ Various configuration, parameter, and data files. This directory
+ is located via the EMTEXDIR environment variable.
+
+\emtex\dist\latex
+
+ LaTeX2e distribution files.
+
+\emtex\dll
+
+ Dynamic link libraries for OS/2. This directory should be listed
+ in the LIBPATH statement of config.sys.
+
+\emtex\doc
+
+ Instructions and manuals. The texts in this directory are
+ available in one language only (English or German).
+
+\emtex\doc\english
+
+ English instructions and manuals.
+
+\emtex\doc\german
+
+ German instructions and manuals.
+
+\emtex\doc\latex209
+
+ Documentation for LaTeX 2.09.
+
+\emtex\doc\rsx
+
+ Documentation for the rsx DOS extender. (The documentation for
+ emx is in \emx\doc.)
+
+\emtex\help
+
+ OS/2 on-line help files. Presentation Manager programs use the
+ files in this directory for displaying on-line help. This
+ directory should be listed in the HELP environment variable.
+
+\emtex\htexfmts
+
+ TeX format files (macro packages such as LaTeX, in a fast-loading
+ format) and tex.poo, for htex386. The (optional) HTEXFMT
+ environment variable points to this directory.
+
+\emtex\idxstyle
+
+ Style files for MakeIndex. To use MakeIndex style files, the
+ INDEXSTYLE environment variable points to this directory, as
+ MakeIndex does not use a default directory.
+
+\emtex\install
+
+ Files used by the installation program.
+
+\emtex\mfbases
+
+ METAFONT base files (macro packages such as `plain' in a
+ fast-loading format) and mf.poo. The (optional) MFBAS environment
+ variable points to this directory.
+
+\emtex\mfinput
+
+ Text files (font sources) which will be read by METAFONT. This
+ directory should contain only subdirectories, no files. The
+ (optional) MFINPUT environment variable points to this directory.
+
+\emtex\mfjob
+
+ Job files for MFjob. The (optional) MFJOB environment variable
+ points to this directory.
+
+\emtex\mftstyle
+
+ Style files for MFT. The filename of the style file given to MFT
+ must explicitly reference this directory.
+
+\emtex\remove
+
+ Package contents listings for emremove.exe.
+
+\emtex\src
+
+ Source code for package which must be distributed with source
+ code.
+
+\emtex\texfmts
+
+ TeX format files (macro packages such as LaTeX, in a fast-loading
+ format) and tex.poo. The (optional) TEXFMT environment variable
+ points to this directory.
+
+\emtex\texinput
+
+ Text files (macro and style files) which will be read by TeX.
+ This directory should contain only subdirectories, no files. The
+ (optional) TEXINPUT environment variable points to this directory.
+
+\emtex\tfm
+
+ TFM files (TeX font metrics). This directory should contain only
+ subdirectories, no files. The (optional) TEXTFM environment
+ variable points to this directory.
+
+\emx\bin
+
+ Executable files (that is, programs) of emx. Add this directory
+ to your PATH.
+
+\emx\book
+
+ OS/2 on-line manuals. This directory should be listed in the
+ BOOKSHELF environment variable.
+
+\emx\dll
+
+ OS/2 dynamic link libraries of emx. This directory should be
+ listed in the LIBPATH statement of config.sys.
+
+
+------------------------------------------------------------------------------
+11. File names in the emTeX system
+------------------------------------------------------------------------------
+
+ .aux Auxiliary file created and used by LaTeX
+ .bak Backup file (fontlib, pkedit)
+ .bas Fast-loading base file for METAFONT (no, not BASIC)
+ .bat Batch file (DOS)
+ .bbl Output file of BibTeX
+ .bgi Video graphics driver (used by TeXcad)
+ .bib Bibliography database for BibTeX
+ .blg Transcript file (BibTeX)
+ .bmp Bitmap file
+ .bst Bibliography style for BibTeX
+ .bug List of bugs
+ .cfg Configuration file (LaTeX2e)
+ .ch Change file (TANGLE, WEAVE and MFT)
+ .clo Document class option (LaTeX2e)
+ .cls Document class (LaTeX2e)
+ .cmd Batch file (OS/2)
+ .cnf Configuration file for dvidrv
+ .dat Data file (for makefmt, makebas, and install)
+ .def Definitions (LaTeX2e)
+ .dlg Transcript file (dvidrv)
+ .dll OS/2 dynamic link library
+ .doc Instructions (straight text) or commented sty file
+ .dot Parameter file for dvidot
+ .dsb dvispell binary parameter file
+ .dsi dvisprep input file (dvispell parameter file)
+ .dtx Documented code file
+ .dvi Device independent output of TeX
+ .eng English documentation file
+ .err Error messages and warnings (dvidrv); errata for LaTeX books
+ .exe Executable program
+ .fd Font definition file (LaTeX2e)
+ .fdd Documented source for .fd file
+ .fli Font library file (dvidrv)
+ .fmt Fast-loading format file for TeX
+ .ger German documentation file
+ .gf Font file created by METAFONT (usually .#gf)
+ .gft Default extension for the output of GFtype
+ .glo LaTeX auxiliary file for \glossary
+ .hlp OS/2 on-line help file
+ .ico OS/2 icon file
+ .idx Index entries (created by LaTeX)
+ .ilg MakeIndex transcript file
+ .ind Index entries (created by MakeIndex)
+ .inf OS/2 on-line manual
+ .ins Installation script (docstrip)
+ .ist MakeIndex style file
+ .lof LaTeX auxiliary file for \listoffigures
+ .log Transcript file (TeX and METAFONT)
+ .lot LaTeX auxiliary file for \listoftables
+ .ltx LaTeX input file
+ .mac TeXcad macro file
+ .mf Source text for a font
+ .mfj Job file for MFjob
+ .mft Style file for MFT
+ .msp Bitmap file
+ .mtc maketcp input file for a .tcp file
+ .opt TeXcad parameters
+ .ovl Overlay
+ .pas Pascal source file (TANGLE)
+ .pcx Bitmap file
+ .pic Picture environment created by TeXcad
+ .pk Compressed font file
+ .pkt Default extension for the output of PKtype
+ .pl Readable form of a TFM file
+ .poo String pool for INITEX or INIMF (pool file)
+ .pxl Font file (obsolete)
+ .rem Package contents listing for the `emremove' program
+ .sty Document style or document style option for LaTeX
+ .sub Font substitution file (dvidrv)
+ .tcp TeX code page (translation of code pages and special characters)
+ .tex TeX text
+ .tfm Symbol widths and other properties of a font (font metrics)
+ .toc Notes of LaTeX for contents
+ .txt Documentation file, instructions
+ .ver List of program versions (TeXcad)
+ .vf Virtual font (dvidrv, VFtoVP, VPtoVF)
+ .vpl Readable form of a VF file (VFtoVP and VPtoVF)
+ .web WEB source text (TANGLE and WEAVE)
+ .zip ZIP archive file (collection of compressed files)
+
+(No claim as to completeness.)
+
+
+ -------- End of README.ENG -------------
diff --git a/systems/msdos/emtex/README.GER b/systems/msdos/emtex/README.GER
new file mode 100644
index 0000000000..68d606ce0e
--- /dev/null
+++ b/systems/msdos/emtex/README.GER
@@ -0,0 +1,598 @@
+==============================================================================
+README.GER (emTeX DISTRIBUTION) 02-Jul-1998
+==============================================================================
+
+ emTeX: TeX fuer OS/2, PC-DOS und MS-DOS
+
+------------------------------------------------------------------------------
+Inhalt
+------------------------------------------------------------------------------
+
+1. Einfuehrung
+2. Installation von emTeX
+3. Wo bekomme ich Hilfe?
+4. Distributions-Dateien
+5. Versionsnummern
+6. Lizenz
+7. Woher bekomme ich emTeX?
+8. Der Autor
+9. Wohin melde ich Fehler?
+10. Verzeichnisse
+11. Dateinamen im emTeX-System
+
+
+------------------------------------------------------------------------------
+1. Einfuehrung
+------------------------------------------------------------------------------
+
+Dies ist eine vollstaendige emTeX-Distribution. Sie ersetzt sowohl die
+vorige offizielle emTeX-Distribution als auch alle vorigen
+Betatest-Pakete.
+
+WICHTIG: Die Datei CHANGES.GER informiert ueber Aenderungen gegenueber
+der vorigen emTeX-Distribution. Die allgemeine Installationsanleitung
+finden Sie in der Datei INSTALL.GER. Eine vereinfachte
+Installationsanleitung finden Sie in der Datei QUICK.GER. Jedoch
+sollten Sie das Installationsprogramm (install.exe) verwenden.
+
+WICHTIG: Bitte benutzen Sie die neuen Zeichensatzbibliotheksdateien
+(wie z.B. lj_base.fli) statt der alten (wie z.B. lj_5b.fli), da sich
+sowohl die Computer-Modern-Zeichensaetze als auch die METAFONT-Modes
+geaendert haben.
+
+Die emTeX-Distribution enthaelt das Textsatzprogramm TeX, das
+Zeichensatzgenerierungsprogramm METAFONT, Druckertreiber,
+Bildschirmtreiber und Hilfsprogramme wie BibTeX und MakeIndex. Die
+Makropakete LaTeX 2.09 und LaTeX2e sind ebenfalls enthalten.
+Zeichensaetze stehen als Pixel-Dateien und als METAFONT-Quelldateien
+zur Verfuegung.
+
+Dokumentation fuer die `Programmiersprachen' TeX und METAFONT ist nicht
+enthalten. Sie koennen entsprechende Buecher in Buechereien und
+Buchhandlungen erhalten. Dokumentation zur emTeX-Implementation von
+TeX und METAFONT und zu den Hilfsprogrammen ist jedoch in der
+emTeX-Distribution enthalten.
+
+
+------------------------------------------------------------------------------
+2. Installation von emTeX
+------------------------------------------------------------------------------
+
+Sie finden die allgemeine Installationsanleitung in INSTALL.GER. Eine
+vereinfachte Installationsanleitung finden Sie in QUICK.GER. Wenn Sie
+jedoch das Installationsprogramm (install.exe) verwenden, brauchen
+Sie weder INSTALL.GER noch QUICK.GER zu lesen!
+
+Sie koennen INSTALL.GER mit dem Kommando
+
+ copy a:\install.ger prn
+
+oder QUICK.GER mit dem Kommando
+
+ copy a:\quick.ger prn
+
+auf Ihrem Drucker ausdrucken. (Sie brauchen README.GER nicht
+auszudrucken!)
+
+
+------------------------------------------------------------------------------
+3. Wo bekomme ich Hilfe?
+------------------------------------------------------------------------------
+
+Sie finden die Antworten auf viele immer wieder gestellte Fragen in
+\emtex\doc\german\help.ger. Sie sollten diese Datei lesen, bevor Sie
+fragen. Manche Leute moegen es nicht, wenn Sie ihnen Fragen stellen,
+die auch in help.ger beantwortet werden.
+
+Es gibt eine Elektropostliste fuer emTeX: emtex-user. Um Informationen
+ueber das Anmelden und Abmelden zu erhalten, schicken Sie eine
+Mitteilung mit Inhalt
+
+ HELP
+ INFO EMTEX-USER
+
+an majordomo@physik.tu-berlin.de.
+
+
+------------------------------------------------------------------------------
+4. Distributions-Dateien
+------------------------------------------------------------------------------
+
+ changes.eng Aenderungen gegenueber frueheren Versionen (Englisch)
+ changes.ger Aenderungen gegenueber frueheren Versionen (Deutsch)
+ diskette.doc Verteilung dieser Dateien auf Disketten
+ help.eng Antworten auf oft gestellte Fragen (Englisch)
+ help.ger Antworten auf oft gestellte Fragen (Deutsch)
+ install.eng Allgemeine Installationsanleitung (Englisch)
+ install.dat Zusatzdatei zu install.exe
+ install.exe Installationsprogramm
+ install.ger Allgemeine Installationsanleitung (Deutsch)
+ install.ovl Zusatzdatei zu install.exe
+ quick.eng Vereinfachte Installationsanleitung (Englisch)
+ quick.ger Vereinfachte Installationsanleitung (Deutsch)
+ readme.bet Sollten Sie lesen, falls Betatest-Version installiert ist
+ readme.eng Sollten Sie lesen (Englisch)
+ readme.ger Sollten Sie lesen (Deutsch)
+ unz512.exe Info-ZIPs UnZip fuer OS/2, selbstentpackend
+ unz512x3.exe Info-ZIPs UnZip fuer DOS, selbstentpackend
+
+ bibtex4b.zip BibTeX, Literaturverzeichnis-Manager fuer LaTeX
+ dvid16g1.zip Druckertreiber und Screen-Previewer, Teil 1 von 2
+ dvid16g2.zip Druckertreiber und Screen-Previewer, Teil 2 von 2
+ dvisp10b.zip Wandelt eine DVI-Datei in eine Textdatei um
+ emxrsx.zip emx und rsx Laufzeit-Paket (fuer tex386 usw.)
+ first.zip Doku und Programme, sollte zuerst installiert werden
+ fontams.zip Zeichensatz-Quellcode und TFM-Dateien: AMSFonts
+ fontcm.zip Zeichensatz-Quellcode und TFM-Dateien: Computer Modern
+ fontec.zip Zeichensatz-Quellcode und TFM-Dateien: EC & TC-Zeichensaetze
+ fontemsy.zip Zeichensatz-Quellcode und TFM-Dateien: `em's Symbole
+ fontltx.zip Zeichensatz-Quellcode und TFM-Dateien fuer LaTeX
+ german.zip Dateien, um deutschsprachige Dokumente zu setzen
+ l2base.zip Basis-Distributionsdateien von LaTeX2e
+ l2input.zip Ausgepackte Makrodateien von LaTeX2e
+ l2kurz.zip Kurze Einfuehrung in LaTeX2e (Deutsch)
+ l2tools.zip Zusaetzliche Pakete fuer LaTeX2e
+ latex209.zip LaTeX 2.09 Makropaket
+ lkurz.zip Kurze Einfuehrung in LaTeX 2.09 (Deutsch)
+ makeindx.zip MakeIndex: Sortiert Index fuer LaTeX-Dokumente
+ mf4b.zip METAFONT: berechnet Zeichensaetze
+ mfjob12d.zip MFjob: vereinfacht den Aufruf von METAFONT
+ mfware.zip Programme fuer Bearbeitung von Zeichensatzdateien
+ pictex.zip PiCTeX Makropaket
+ pkedit.zip Programm zum Editieren von Pixel-Zeichensatzdateien
+ srcmkidx.zip Quellcode von MakeIndex
+ srctcad.zip Quellcode von TeXcad
+ tex4b.zip emTeX-Satzprogramm
+ texcad.zip TeXcad: Interaktives Zeichenprogramm fuer LaTeX-Zeichnungen
+ texware.zip Programme fuer Bearbeitung von DVI- und TFM-Dateien usw.
+ web.zip WEB: `literate programming in Pascal'
+
+ bj_base.fli Zeichensaetze fuer den Canon BubbleJet (360 DPI)
+ dj_base.fli Zeichensaetze fuer den HP DeskJet (300 DPI)
+ fax_base.fli Zeichensaetze fuer Fax (204x196 DPI)
+ fx_base.fli Zeichensaetze fuer 9-Nadel-Drucker (240x216 DPI)
+ ito_base.fli Zeichensaetze fuer den C.ITOH 8510A (160x144 DPI)
+ ljh_base.fli Zeichensaetze fuer den HP LaserJet 4 (600 DPI)
+ lj_base.fli Zeichensaetze fuer den HP LaserJet (300 DPI)
+ p6h_base.fli Zeichensaetze fuer 24-Nadel-Drucker (360 DPI)
+ p6l_base.fli Zeichensaetze fuer 24-Nadel-Drucker (180 DPI)
+ p6m_base.fli Zeichensaetze fuer 24-Nadel-Drucker (360x180 DPI)
+ qj_base.fli Zeichensaetze fuer den HP QuietJet (192 DPI)
+ sty_base.fli Zeichensaetze fuer den EPSON Stylus 800 (360 DPI)
+
+Die Dateien *.eng und *.ger befinden sich auch in first.zip, wobei die
+*.ger-Dateien im emtex\doc\german-Verzeichnis von first.zip Umlaute
+enthalten, wogegen in den nicht eingepackten *.ger-Dateien die Umlaute
+ersetzt sein koennen.
+
+ljh_base.fli passt nicht auf eine 1200KB-Diskette (130mm, 5,25"). Nach
+Kompression mit Info-ZIPs Zip-Programm (das Gegenstueck zu UnZip) passt
+diese Datei auf eine solche Diskette.
+
+
+------------------------------------------------------------------------------
+5. Versionsnummern
+------------------------------------------------------------------------------
+
+ BibTeX 0.99c
+ dvidrv 1.6g
+ dvispell 1.0b
+ DVItype 3.5
+ fontlib 1.2b
+ GFtoDVI 3.0
+ GFtoPK 2.3
+ GFtype 3.1
+ METAFONT 2.718
+ MFT 2.0
+ MFjob 1.2d
+ makedot 1.2e
+ MakeIndex 2.12
+ maketcp 1.1d
+ PCLtoMSP 1.1a
+ pkedit 1.1h
+ pkeditpm 1.1a
+ PKtoGF 1.0
+ PKtype 2.3
+ PLtoTF 3.5
+ PXtoPK 2.2
+ TANGLE 4.4
+ TFtoPL 3.1
+ TeX 3.14159
+ TeXconv 1.2a
+ VFtoVP 1.2
+ VPtoVF 1.4
+ WEAVE 4.4
+
+ LaTeX 2.09 <25 March 1992>
+ LaTeX2e 1998/06/01
+ plain.tex 3.141592
+ plain.mf 2.71
+ german.sty 2.5d
+ AMSFonts 2.2
+ EC Fonts 1.0
+
+
+------------------------------------------------------------------------------
+6. Lizenz
+------------------------------------------------------------------------------
+
+Die von Eberhard Mattes geschriebene Software der emTeX-Distribution
+darf ohne Einschraenkungen benutzt werden.
+
+Die von Eberhard Mattes geschriebene Software der emTeX-Distribution
+darf nur in UNVERAENDERTER und VOLLSTAENDIGER Form mit allen im
+Abschnitt `Distributions-Dateien' von README.GER aufgefuehrten Dateien
+weitergegeben werden und nur, wenn dies KOSTENLOS geschieht (einige
+oder alle der *.fli-Dateien duerfen weggelassen werden).
+
+(Wenn Sie nur Teile von emTeX weitergeben wollen oder falls Sie eine
+Entschaedigung fuer das Kopieren verlangen wollen, muessen Sie sich
+vorher mit dem Autor in Verbindung setzen. Insbesondere ist
+kommerzielle Verbreitung auf CDROM oder Disketten ohne ausdrueckliche
+Erlaubnis verboten.)
+
+Fuer andere mit emTeX verbreitete Software ist die jeweils zugehoerige
+Lizenz zustaendig.
+
+(Im allgemeinen ist nicht-kommerzielle Benutzung dieser Software
+erlaubt. Anscheinend ist kommerzielle Benutzung nur fuer die deutschen
+Trennmuster (ghyph31.tex) eingeschraenkt. Im allgemeinen darf diese
+Software verbreitet werden, sofern die Dateien unveraendert und
+vollstaendig sind und die Benutzung und Verbreitung kostenlos ist.
+Insbesondere duerfen die Dateien in l2input.zip nicht ohne die Dateien
+in l2base.zip verbreitet werden.)
+
+Es wird keine Garantie fuer das Funktionieren der Software uebernommen.
+Es wird keine Haftung fuer Schaeden, die aus der Anwendung der Software
+resultieren, uebernommen.
+
+Statt einer Liste: Alle in dieser Anleitung und den anderen
+emTeX-Anleitungen verwendeten Warenzeichen sind Warenzeichen der
+jeweiligen Warenzeicheninhaber.
+
+
+------------------------------------------------------------------------------
+7. Woher bekomme ich emTeX?
+------------------------------------------------------------------------------
+
+- Anonymous ftp:
+
+ ftp.dante.de /tex-archive/systems/msdos/emtex
+ ftp.cdrom.com /pub/tex/ctan/systems/msdos/emtex
+ ftp.tex.ac.uk /tex-archive/systems/msdos/emtex
+
+- Mail-Server:
+
+ ftpmail@dante.de
+ ftpmail@ftp.SHSU.edu
+
+Beachten Sie bitte, dass BINARY Mode fuer alle Dateien verwendet werden
+muss!
+
+
+------------------------------------------------------------------------------
+8. Der Autor
+------------------------------------------------------------------------------
+
+Adresse:
+
+ Eberhard Mattes
+ Teckstrasse 81
+ D-71696 Moeglingen
+ Germany
+
+Anfragen nur schriftlich! Bitte keine Telefonate!
+Bitte adressierten und frankierten Rueckumschlag beilegen,
+sonst keine Antwort! Zuerst HELP.GER lesen!
+
+Elektronische Post (zur Zeit; kann sich aendern):
+
+ Internet: mattes@azu.informatik.uni-stuttgart.de
+
+Falls Sie telefonische Unterstuetzung wuenschen, sollten Sie sich eine
+kommerzielle TeX-Version kaufen.
+
+
+------------------------------------------------------------------------------
+9. Wohin melde ich Fehler?
+------------------------------------------------------------------------------
+
+Wenn Sie einen Fehler finden, informieren Sie bitte den Programmautor,
+damit er diesen beseitigen kann. Fuegen Sie bitte folgende Informationen
+bei:
+
+- Rechnertyp (XT, AT, 386 usw.), CPU, BIOS, Grafikkarte, Drucker
+ (Hersteller und Modell), Betriebssystem nebst Versionsnummer
+ (Anmerkung: Befehl `SYSLEVEL' unter OS/2). Beispiel:
+ AT-kompatibler, 286, Award, Paradise VGA, DeskJet+, IBM PC-DOS 3.3
+
+- den Inhalt der Dateien autoexec.bat und config.sys, die Sie
+ verwendeten, als der Fehler auftrat. Wenn moeglich, kommentieren
+ oder erklaeren Sie kurz die installierten Treiber, die nicht Teil
+ des Standard-Betriebssystems sind
+
+- emTeX Versionsnummer
+
+- noetige Informationen, um den Fehler zu reproduzieren. Wenn
+ moeglich, eine Diskette mit den entsprechenden Dateien (siehe auch
+ dvidrv.doc).
+
+- die DLG-Datei, wenn der Fehler in einem Treiber auftrat
+
+- wenn der Fehler in einem Druckertreiber auftrat, den Teil des
+ Ausdrucks, der den Fehler zeigt.
+
+Bitte legen Sie einen frankierten und adressierten Rueckumschlag bei, wenn
+Sie eine Anwort erwarten.
+
+
+------------------------------------------------------------------------------
+10. Verzeichnisse
+------------------------------------------------------------------------------
+
+Waehrend der Installation werden folgende Verzeichnisse angelegt:
+
+\emtex
+
+ Dies ist das Hauptverzeichnis des emTeX-Verzeichnisbaums. Es
+ sollte nur Unterverzeichnisse, aber keine Dateien enthalten. Die
+ Environment-Variable EMTEXDIR zeigt auf dieses Verzeichnis.
+
+\emtex\bibtex\bib
+
+ Literaturdatenbanken fuer BibTeX. Die (optionale)
+ Environment-Variable BIBINPUT zeigt auf dieses Verzeichnis.
+
+\emtex\bibtex\bst
+
+ Style Files fuer BibTeX. Die (optionale) Environment-Variable
+ BSTINPUT zeigt auf dieses Verzeichnis.
+
+\emtex\bin
+
+ Programme. Fuegen Sie dieses Verzeichnis zu Ihrem Suchpfad fuer
+ Programme (PATH) hinzu.
+
+\emtex\bmfbases
+
+ Base-Dateien (Makropakete wie `plain' in einem vorcompiliertem
+ Format, das schneller geladen wird) und mf.poo fuer bigMETAFONT und
+ mf386. Die (optionale) Environment-Variable BMFBAS zeigt auf
+ dieses Verzeichnis.
+
+\emtex\book
+
+ Online-Handbuecher fuer OS/2. Dieses Verzeichnis hat folgende
+ Unterverzeichnisse:
+
+ english Englische Handbuecher
+ german Deutsche Handbuecher
+
+ Um sich ein Online-Handbuch (wie z.B. dvidrv.inf) anzuschauen,
+ geben Sie folgendes Kommando ein:
+
+ view c:\emtex\book\german\dvidrv
+
+ Wenn Sie die Environment-Variable BOOKSHELF um das Verzeichnis
+ c:\emtex\book\german erweitert haben, koennen Sie auch folgendes
+ Kommando eingeben:
+
+ view dvidrv
+
+\emtex\btexfmts
+
+ Format-Dateien (Makropakete wie LaTeX in einem vorcompilierten
+ Format, das schneller geladen wird) und tex.poo fuer bigTeX und
+ tex386. Die (optionale) Environment-Variable BTEXFMT zeigt auf
+ dieses Verzeichnis.
+
+\emtex\data
+
+ Verschiedene Konfigurations-, Parameter- und Datendateien. Dieses
+ Verzeichnis wird ueber die EXTEXDIR-Variable gefunden.
+
+\emtex\dist\latex
+
+ Distributions-Dateien von LaTeX2e.
+
+\emtex\dll
+
+ Dynamic link libraries fuer OS/2. Dieses Verzeichnis sollte im Wert
+ des LIBPATH-Kommandos von config.sys aufgefuehrt werden.
+
+\emtex\doc
+
+ Dokumentation fuer die Programme. Die Texte in diesem Verzeichnis
+ sind nur in einer Sprache verfuegbar (Englisch oder Deutsch).
+
+\emtex\doc\english
+
+ Englischen Dokumentation.
+
+\emtex\doc\german
+
+ Deutsche Dokumentation.
+
+\emtex\doc\rsx
+
+ Dokumentation fuer den DOS-Extender rsx. (Die Dokumentation fuer emx
+ ist in \emx\doc.)
+
+\emtex\help
+
+ Online-Hilfedateien fuer OS/2. Presentation-Manager-Applikationen
+ benutzen die Dateien in diesem Verzeichnis, um Online-Hilfe
+ anzuzeigen. Dieses Verzeichnis sollte in der Environment-Variablen
+ HELP aufgefuehrt sein.
+
+\emtex\htexfmts
+
+ Format-Dateien (Makropakete wie LaTeX in einem vorcompilierten
+ Format, das schneller geladen wird) und tex.poo fuer htex386. Die
+ (optionale) Environment-Variable HTEXFMT zeigt auf dieses
+ Verzeichnis.
+
+\emtex\idxstyle
+
+ Style Files fuer MakeIndex. Um diese zu benutzen, muss die
+ Environment-Variable INDEXSTYLE auf dieses Verzeichnis zeigen, da
+ MakeIndex keine Voreinstellung fuer dieses Verzeichnis besitzt.
+
+\emtex\install
+
+ Dateien fuer das Installationsprogramm.
+
+\emtex\mfbases
+
+ Base-Dateien (Makropakete wie `plain' in einem vorcompiliertem
+ Format, das schneller geladen wird) und mf.poo. Die (optionale)
+ Environment-Variable MFBAS zeigt auf dieses Verzeichnis.
+
+\emtex\mfinput
+
+ Zeichensatzquelldateien (Textdateien), die von METAFONT gelesen
+ werden. Dieses Verzeichnis sollte nur Unterverzeichnisse, keine
+ Dateien enthalten. Die (optionale) Environment-Variable MFINPUT
+ zeigt auf dieses Verzeichnis.
+
+\emtex\mfjob
+
+ Job-Dateien fuer MFjob. Die (optionale) Environment-Variable MFJOB
+ zeigt auf dieses Verzeichnis.
+
+\emtex\mftstyle
+
+ Style Files fuer MFT. Der Dateiname, der MFT uebergeben wird, muss
+ dieses Verzeichnis explizit enthalten.
+
+\emtex\remove
+
+ Inhaltsverzeichnisse der Pakete fuer emremove.exe.
+
+\emtex\src
+
+ Quellcode fuer Pakete, die nicht ohne Quellcode vertrieben werden
+ duerfen.
+
+\emtex\texfmts
+
+ Format-Dateien (Makropakete wie LaTeX in einem vorcompilierten
+ Format, das schneller geladen wird) und tex.poo. Die (optionale)
+ Environment-Variable TEXFMT zeigt auf dieses Verzeichnis.
+
+\emtex\texinput
+
+ Makrodateien (Textdateien) fuer TeX. Es sollte nur
+ Unterverzeichnisse, keine Dateien enthalten. Die (optionale)
+ Environment-Variable TEXINPUT zeigt auf dieses Verzeichnis.
+
+\emtex\tfm
+
+ TFM-Dateien (TeX Font Metrics). Es sollte nur Unterverzeichnisse,
+ keine Dateien enthalten. Die (optionale) Environment-Variable
+ TEXTFM zeigt auf dieses Verzeichnisse.
+
+\emx\bin
+
+ Programme von emx. Dieses Verzeichnis muss in ihrem Ihrem Suchpfad
+ fuer Programme (PATH) aufgefuehrt sein.
+
+\emx\book
+
+ Online-Handbuecher fuer OS/2. Dieses Verzeichnis sollte in der
+ Environment-Variable BOOKSHELF aufgefuehrt sein.
+
+\emx\dll
+
+ Dynamic link libraries fuer OS/2. Dieses Verzeichnis sollte im Wert
+ des LIBPATH-Kommandos von config.sys aufgefuehrt werden.
+
+
+------------------------------------------------------------------------------
+11. Dateinamen im emTeX-System
+------------------------------------------------------------------------------
+
+ .aux Hilfsdatei, von LaTeX erzeugt und verwendet
+ .bak Sicherungskopie (fontlib, pkedit)
+ .bas Schnelladedatei fuer METAFONT (hat nichts mit BASIC zu tun)
+ .bat Batch-Datei (DOS)
+ .bbl Ausgabedatei von BibTeX
+ .bgi Grafiktreiber (werden von TeXcad benutzt)
+ .bib Literaturdatenbank fuer BibTeX
+ .blg Protokolldatei (BibTeX)
+ .bmp Bitmap-Datei (Grafik)
+ .bst Style File fuer BibTeX
+ .bug Fehlerliste
+ .cfg Konfigurationsdatei fuer LaTeX2e
+ .ch Aenderungsdatei (TANGLE, WEAVE und MFT)
+ .clo Dokumentklasse-Options-Datei (LaTeX2e)
+ .cls Dokumentklasse-Datei (LaTeX2e)
+ .cmd Batch-Datei (OS/2)
+ .cnf Konfigurationsdatei fuer dvidrv (Aufloesung und Zeichensaetze)
+ .dat Datendatei (fuer makefmt, makebas und install)
+ .def Definitionen (LaTeX2e)
+ .dlg Protokolldatei (dvidrv)
+ .dll OS/2 Dynamic link library
+ .doc Anleitung (Klartext) oder kommentierte sty-Datei
+ .dot Parameterdatei fuer dvidot
+ .dsb Binaere Parameterdatei fuer dvispell
+ .dsi dvisprep-Eingabedatei (dvispell-Parameterdatei)
+ .dtx Dokumentierter Quellcode (LaTeX2e)
+ .dvi Geraeteunabhaengige Ausgabe von TeX
+ .eng Englische Dokumentationsdatei
+ .err Fehlermeldungen und Warnungen (dvidrv); Errata fuer LaTeX-Buecher
+ .exe Ausfuehrbares Programm
+ .fd Zeichensatzdefinitionsdatei (LaTeX2e)
+ .fdd Dokumentierter Quellcode fuer .fd-Datei
+ .fli Zeichensatzbibliotheksdatei (dvidrv)
+ .fmt Schnelladedatei fuer TeX
+ .ger Deutsche Dokumentationsdatei
+ .gf Von METAFONT erzeugte Zeichensatzdatei (meistens .#gf)
+ .gft Standarderweiterung fuer die Ausgabedatei von GFtype
+ .glo Notizen von LaTeX fuer \glossary
+ .hlp Online-Hilfe
+ .ico OS/2-Icon
+ .idx Stichwortverzeichniseintraege (von LaTeX erzeugt)
+ .ilg MakeIndex-Protokolldatei
+ .ind Stichwortverzeichnis (von MakeIndex erzeugt)
+ .inf OS/2-Online-Handbuch
+ .ins Installationsskript (docstrip)
+ .ist Style File fuer MakeIndex
+ .lof Notizen von LaTeX fuer \listoffigures
+ .log Protokolldatei (TeX und METAFONT)
+ .lot Notizen von LaTeX fuer \listoftables
+ .ltx LaTeX-Makrodatei
+ .mac TeXcad-Makrodatei
+ .mf Quelltext fuer einen Zeichensatz
+ .mfj Job-Datei fuer MFjob
+ .mft Style File fuer MFT
+ .msp Bitmap-Datei (Grafik)
+ .mtc maketcp-Eingabedatei fuer eine .tcp-Datei
+ .opt TeXcad-Parameter
+ .ovl Overlay
+ .pas Pascal-Quelltext (TANGLE)
+ .pcx Bitmap-Datei (Graphik)
+ .pic Von TeXcad erzeugtes picture environment
+ .pk Komprimierte Zeichensatzdatei
+ .pkt Standarderweiterung fuer die Ausgabedatei von PKtype
+ .pl Lesbare Form einer TFM-Datei
+ .poo Zeichenketten fuer INITEX oder INIMF (Pool-Datei)
+ .pxl Zeichensatzdatei (veraltet)
+ .rem Dateiliste fuer `emremove' (Loeschen eines Pakets)
+ .sty Document Style oder Document Style Option fuer LaTeX
+ .sub Zeichensatzersetzungsdatei (ZE-Datei; dvidrv)
+ .tcp TeX Code Page (Zeichensatzumsetzung, Umsetzung in TeX-Kommandos)
+ .tex TeX-Text
+ .tfm Zeichenbreiten und andere Eigenschaften der Zeichensaetze
+ .toc Notizen von LaTeX fuer Inhaltsverzeichnis
+ .txt Dokumentationsdatei
+ .ver Liste der Programmversionen (TeXcad)
+ .vf Virtual Font (dvidrv, VFtoVP und VPtoVF)
+ .vpl Lesbare Form eines Virtual Fonts (VFtoVP und VPtoVF)
+ .web WEB-Quelltext (TANGLE und WEAVE)
+ .zip ZIP-Archivdatei (Sammlung von komprimierten Dateien)
+
+(Ohne Anspruch auf Vollstaendigkeit.)
+
+
+ -------- Ende von README.GER -------------
diff --git a/systems/msdos/emtex/bj_base.fli b/systems/msdos/emtex/bj_base.fli
new file mode 100644
index 0000000000..6b39b83dba
--- /dev/null
+++ b/systems/msdos/emtex/bj_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/dj_base.fli b/systems/msdos/emtex/dj_base.fli
new file mode 100644
index 0000000000..0b168268f2
--- /dev/null
+++ b/systems/msdos/emtex/dj_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/dvips b/systems/msdos/emtex/dvips
new file mode 120000
index 0000000000..41e721fd84
--- /dev/null
+++ b/systems/msdos/emtex/dvips
@@ -0,0 +1 @@
+../dviware/dvips \ No newline at end of file
diff --git a/systems/msdos/emtex/fax_base.fli b/systems/msdos/emtex/fax_base.fli
new file mode 100644
index 0000000000..8dfee6684e
--- /dev/null
+++ b/systems/msdos/emtex/fax_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/fx_base.fli b/systems/msdos/emtex/fx_base.fli
new file mode 100644
index 0000000000..f1f27d5fb0
--- /dev/null
+++ b/systems/msdos/emtex/fx_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/install.dat b/systems/msdos/emtex/install.dat
new file mode 100644
index 0000000000..6d23cff868
--- /dev/null
+++ b/systems/msdos/emtex/install.dat
Binary files differ
diff --git a/systems/msdos/emtex/install.ovl b/systems/msdos/emtex/install.ovl
new file mode 100644
index 0000000000..4e4c12b719
--- /dev/null
+++ b/systems/msdos/emtex/install.ovl
Binary files differ
diff --git a/systems/msdos/emtex/ito_base.fli b/systems/msdos/emtex/ito_base.fli
new file mode 100644
index 0000000000..28ea23212a
--- /dev/null
+++ b/systems/msdos/emtex/ito_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/lj_base.fli b/systems/msdos/emtex/lj_base.fli
new file mode 100644
index 0000000000..32844afe05
--- /dev/null
+++ b/systems/msdos/emtex/lj_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/ljh_base.fli b/systems/msdos/emtex/ljh_base.fli
new file mode 100644
index 0000000000..c6eb46bb8a
--- /dev/null
+++ b/systems/msdos/emtex/ljh_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/p6h_base.fli b/systems/msdos/emtex/p6h_base.fli
new file mode 100644
index 0000000000..5a2bf2672b
--- /dev/null
+++ b/systems/msdos/emtex/p6h_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/p6l_base.fli b/systems/msdos/emtex/p6l_base.fli
new file mode 100644
index 0000000000..06f956cc50
--- /dev/null
+++ b/systems/msdos/emtex/p6l_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/p6m_base.fli b/systems/msdos/emtex/p6m_base.fli
new file mode 100644
index 0000000000..4c971257bb
--- /dev/null
+++ b/systems/msdos/emtex/p6m_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/qj_base.fli b/systems/msdos/emtex/qj_base.fli
new file mode 100644
index 0000000000..e48525ea25
--- /dev/null
+++ b/systems/msdos/emtex/qj_base.fli
Binary files differ
diff --git a/systems/msdos/emtex/sty_base.fli b/systems/msdos/emtex/sty_base.fli
new file mode 100644
index 0000000000..7c839138d5
--- /dev/null
+++ b/systems/msdos/emtex/sty_base.fli
Binary files differ
diff --git a/systems/msdos/ergotex/read_me b/systems/msdos/ergotex/read_me
new file mode 100644
index 0000000000..03be9271ba
--- /dev/null
+++ b/systems/msdos/ergotex/read_me
@@ -0,0 +1,40 @@
+ ErgoTeX V1.0 (c) copyright 1990-1994 by Oliver Schnetz
+
+ ,--------------------------------,
+ | ErgoTeX --- more ergonomic TeX |
+ `--------------------------------'
+
+Bei ErgoTeX handelt es sich um ein Programmpaket, das die Eingabe von (La)TeX-
+Texten auf intelligente Weise erleichtern soll.
+Durch den Voruebersetzer ErgoTeX.exe wird die Benutzung von speziellen Bild-
+schirmzeichensaetzen, eleganten Abkuerzungen und vielen weiteren Erleichterun-
+gen moeglich. Sie werden mit ErgoTeX deutlich weniger Zeit zur Erstellung Ihrer
+LaTeX-Texte benoetigen.
+Eine Zusammenstellung der Moeglichkeiten mit ErgoTeX finden Sie in
+der Datei ErgoGer.doc.
+
+
+ErgoTeX is a software package, which makes it easier to compose (La)TeX-text
+files. It tries to assist the user in an intelligent manner.
+The pre-translating program ErgoTeX.exe enables the useage of special screen
+fonts, elegant abbreviations and many more optional details, assisting the
+user. Using ErgoTeX it will take considerably less time to compose a text in
+LaTeX.
+You will find a summary of the wide variety of options in using ErgoTeX
+in the (german) file ErgoGer.doc.
+
+
+ ----------------------------------
+
+
+Documentation and installation files:
+
+ Documentation (german) --> ErgoGer.Doc, ErgoGer.txt
+ (english) --> ErgoEng.Doc, ErgoEng.txt
+
+ Documentation tabular --> ErgoDoc.lst, ErgoDoc.txt
+
+ Installation --> Install.exe
+
+ Translation documentation.txt to documentation.dvi
+ --> Doc2Dvi.bat
diff --git a/systems/msdos/ftetx b/systems/msdos/ftetx
new file mode 120000
index 0000000000..f25d50419a
--- /dev/null
+++ b/systems/msdos/ftetx
@@ -0,0 +1 @@
+../os2/ftetx \ No newline at end of file
diff --git a/systems/msdos/gtexedit/readme.asc b/systems/msdos/gtexedit/readme.asc
new file mode 100644
index 0000000000..643d6d6588
--- /dev/null
+++ b/systems/msdos/gtexedit/readme.asc
@@ -0,0 +1,23 @@
+GTeX - Readme
+
+GTeX is a DOS-Editor for the emTeX-Package. It uses Borland DPMI and offers
+some features, especially for German users. The GTeX-Editor has commands to
+compile TeX-Files, View the DVI-Files, Print the DVI-Files, call MakeIndex
+and TeXCad (straight from the Editor). GTeX also supports amSpell, a
+spell-checker for TeX-Files. amSpell can be installed with the Install-
+Programm "GINSTALL.EXE" distributed with GTeX (only with the German
+dictionary).
+
+With GTeX comes "GREPLACE", a String-Replace Utility for the DOS-Command-
+Line. GReplace is used by GTeX to solve problems with amSpell, but may
+be handy for other stuff as well: GReplace is able to exchange given
+Strings (max 32.000 at a time) in (unlimited) files and subdirs (see the
+GReplace-Documentation, GREPLACE.DVI for more information).
+
+GTeX was created using Borland Pascal's Turbo-Vison and is Freeware.
+
+Any questions? eMail-me:
+Christian Grothoff
+eMail : ma0035@stud.uni-wuppertal.de
+Homepage: http://www.stud.uni-wuppertal.de/~ma0035/
+Download: http://www.stud.uni-wuppertal.de/~ma0035/GS/gs.htm
diff --git a/systems/msdos/jemtex2/fontable.c b/systems/msdos/jemtex2/fontable.c
new file mode 100644
index 0000000000..6868f6e3b6
--- /dev/null
+++ b/systems/msdos/jemtex2/fontable.c
@@ -0,0 +1,178 @@
+/* -mt -f -A -K -G -O -w */
+/* Compile with Turbo-C 2.0 */
+/*
+ This program generates Japanese font tables
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: April 1991
+
+ Version: 2.0
+
+ Modifications: - Added four kanjis.
+ - Run-time parameters now supplied.
+ - Extension is .JEM now.
+ - Page format changed slightly.
+ - Symbols now centered within tables.
+ - Switched to \clearpage since better for tables.
+*/
+
+#include <stdio.h>
+#ifdef __TURBOC__
+#include <process.h>
+#endif
+
+/* Highest Bitmap number in JIS24 */
+#define BitmapMax 7806
+/* Highest font number */
+#define FontMax 60
+/* Number of symbols in a font */
+#define SymbolMax 128
+#define SymbolMax1 127
+
+void FontTable(FILE *OutFile)
+{
+ int Bitmap;
+ int Font;
+ int Symbol;
+ unsigned char EUC1,EUC2;
+
+ fprintf(OutFile,"%%JEM2TEX /NoSpace /NoPercent /LaTeX /EUC /Extended /3.0\n");
+ fprintf(OutFile,"%%\n");
+ fprintf(OutFile,"\\documentstyle[12pt]{article}\n");
+ fprintf(OutFile,"\\pagestyle{plain}\n");
+ fprintf(OutFile,"\\setlength{\\oddsidemargin}{-0.5in} %%0.5in margin left-right\n");
+ fprintf(OutFile,"\\setlength{\\textwidth}{7.5in} %%8.5in-2*0.5in\n");
+ fprintf(OutFile,"\\setlength{\\topmargin}{-0.25in} %%0.75in margin top-bottom\n");
+ fprintf(OutFile,"\\setlength{\\textheight}{9.4in} %%11.0in-2*0.75in\n");
+ fprintf(OutFile,"\\setlength{\\footskip}{0.1in}\n");
+ fprintf(OutFile,"\\setlength{\\footheight}{0.1in}\n");
+ fprintf(OutFile,"\\setlength{\\headheight}{0pt}\n");
+ fprintf(OutFile,"\\setlength{\\headsep}{0pt}\n");
+ fprintf(OutFile,"\\setlength{\\topskip}{0pt}\n");
+ fprintf(OutFile,"\\setlength{\\parindent}{0pt}\n");
+ fprintf(OutFile,"\\setlength{\\tabcolsep}{4pt}\n");
+ fprintf(OutFile,"\\renewcommand{\\baselinestretch}{0.85}\n");
+ fprintf(OutFile,"\\begin{document}\n");
+ fprintf(OutFile,"\\begin{Large}\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"\\vspace*{\\fill}\n");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ for (Bitmap=0 ; Bitmap<=BitmapMax ; Bitmap++) {
+ Symbol=Bitmap % SymbolMax;
+ Font=Bitmap / SymbolMax;
+ EUC1=(unsigned char)((Bitmap-1)/94);
+ EUC2=(unsigned char)((Bitmap-1)-94*(int)EUC1);
+ EUC1=EUC1+(unsigned char)'\xA1';
+ EUC2=EUC2+(unsigned char)'\xA1';
+ if (!Symbol) {
+ fprintf(OutFile,"\\begin{table}[h]\n");
+ fprintf(OutFile," \\centering\n");
+ fprintf(OutFile," \\begin{tabular}{r|cccccccccccccccc|l}\n");
+ fprintf(OutFile,
+ " Code & \\multicolumn{16}{c|}{Characters} & EUC \\\\ \\hline\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ switch (Symbol % 16) {
+ case 0: fprintf(OutFile,"%6d ",Symbol);
+ if (ferror(OutFile)) exit(1);
+ break;
+ case 5: case 10: case 15: fprintf(OutFile," ");
+ if (ferror(OutFile)) exit(1);
+ break;
+ }
+ if (Bitmap) {
+ fprintf(OutFile,"&%c%c",EUC1,EUC2);
+ if (ferror(OutFile)) exit(1);
+ switch (Symbol % 16) {
+ case 4: case 9: case 14: fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ break;
+ default:if ((Symbol % 16)==15) {
+ fprintf(OutFile,"& %d,%d",EUC1,EUC2);
+ if ( (Symbol!=SymbolMax1) && (Bitmap!=BitmapMax) )
+ fprintf(OutFile," \\\\");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ else
+ if (Bitmap==BitmapMax) {
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ break;
+ }
+ }
+ else {
+ fprintf(OutFile,"& ");
+ if (ferror(OutFile)) exit(1);
+ }
+ if ( (Symbol==SymbolMax1) || (Bitmap==BitmapMax) ) {
+ fprintf(OutFile," \\end{tabular}\n");
+ fprintf(OutFile,"\\caption{Font {\\tt kanji%c%c} (%d--%d).}\n",
+ ('a'+(Font/8)),('a'+(Font % 8)),(Bitmap-Symbol),Bitmap);
+ fprintf(OutFile,"\\end{table}\n");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ if (Bitmap==BitmapMax) {
+ fprintf(OutFile,"\\vspace*{\\fill}\n");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ else
+ if ((Font % 3)==2) {
+ fprintf(OutFile,"\\vspace*{\\fill}\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"\\clearpage\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"\\vspace*{\\fill}\n");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ }
+ }
+ fprintf(OutFile,"\\end{Large}\n");
+ fprintf(OutFile,"\\end{document}\n");
+ if (ferror(OutFile)) exit(1);
+}
+
+main()
+{
+ FILE *OutFile;
+
+ printf("\n");
+ printf("Japanese Font Tables Generation Program.\n");/*To make Borland happy*/
+ printf("Version 2.0 Copyright F. Jalbert 1991.\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Creating Japanese file fontable.jem");
+ if ((OutFile=fopen("fontable.jem","wt"))==NULL) exit(1);
+ printf(".\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Generating font tables");
+ #ifndef __TURBOC__
+ printf("\n");
+ #endif
+ FontTable(OutFile);
+ printf(".\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Closing Japanese file fontable.jem");
+ if (fclose(OutFile)==EOF) exit(1);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Japanese font tables generation completed.\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ return(0);
+}
diff --git a/systems/msdos/jemtex2/fontable.pas b/systems/msdos/jemtex2/fontable.pas
new file mode 100644
index 0000000000..bdfa50c887
--- /dev/null
+++ b/systems/msdos/jemtex2/fontable.pas
@@ -0,0 +1,152 @@
+{$A-,B-,D-,E-,F-,I+,L-,N-,O-,R-,S-,V-}
+{Compile with Turbo-Pascal 5.0}
+Program Fontable(Input,Output);
+{
+ This program generates Japanese font tables
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: April 1991
+
+ Version: 2.0
+
+ Modifications: - Added four kanjis.
+ - Run-time parameters now supplied.
+ - Extension is .JEM now.
+ - Page format changed slightly.
+ - Symbols now centered within tables.
+ - Switched to \clearpage since better for tables.
+}
+Const
+ {Highest Bitmap number in JIS24}
+ BitmapMax=7806;
+ {Highest font number}
+ FontMax=60;
+ {Number of symbols in a font}
+ SymbolMax=128;
+ SymbolMax1=127;
+
+Type
+ Bitmap0Range=0..BitmapMax;
+ Font0Range=0..FontMax;
+ Symbol0Range=0..SymbolMax1;
+
+Var OutFile:Text;
+
+Procedure FontTable(Var OutFile:Text);
+Var
+ Bitmap:Bitmap0Range;
+ Font:Font0Range;
+ Symbol:Symbol0Range;
+ EUC1,EUC2:Integer;
+Begin
+Writeln(OutFile,'%JEM2TEX /NoSpace /NoPercent /LaTeX /EUC /Extended /3.0');
+Writeln(OutFile,'%');
+Writeln(OutFile,'\documentstyle[12pt]{article}');
+Writeln(OutFile,'\pagestyle{plain}');
+Writeln(OutFile,'\setlength{\oddsidemargin}{-0.5in} %0.5in margin left-right');
+Writeln(OutFile,'\setlength{\textwidth}{7.5in} %8.5in-2*0.5in');
+Writeln(OutFile,'\setlength{\topmargin}{-0.25in} %0.75in margin top-bottom');
+Writeln(OutFile,'\setlength{\textheight}{9.4in} %11.0in-2*0.75in');
+Writeln(OutFile,'\setlength{\footskip}{0.1in}');
+Writeln(OutFile,'\setlength{\footheight}{0.1in}');
+Writeln(OutFile,'\setlength{\headheight}{0pt}');
+Writeln(OutFile,'\setlength{\headsep}{0pt}');
+Writeln(OutFile,'\setlength{\topskip}{0pt}');
+Writeln(OutFile,'\setlength{\parindent}{0pt}');
+Writeln(OutFile,'\setlength{\tabcolsep}{4pt}');
+Writeln(OutFile,'\renewcommand{\baselinestretch}{0.85}');
+Writeln(OutFile,'\begin{document}');
+Writeln(OutFile,'\begin{Large}');
+Writeln(OutFile);
+Writeln(OutFile,'\vspace*{\fill}');
+Writeln(OutFile);
+For Bitmap:=0 To BitmapMax Do
+ Begin
+ Symbol:=Bitmap Mod SymbolMax;
+ Font:=Bitmap Div SymbolMax;
+ EUC1:=Trunc( (Bitmap-1) Div 94 );
+ EUC2:=(Bitmap-1)-94*EUC1;
+ EUC1:=EUC1+161;
+ EUC2:=EUC2+161;
+ If Symbol=0 Then
+ Begin
+ Writeln(OutFile,'\begin{table}[h]');
+ Writeln(OutFile,' \centering');
+ Writeln(OutFile,' \begin{tabular}{r|cccccccccccccccc|l}');
+ Writeln(OutFile,' Code & \multicolumn{16}{c|}{Characters} & EUC \\ \hline')
+ End;
+ If (Symbol Mod 16)=0 Then Write(OutFile,Symbol:6,' ')
+ Else
+ If (Symbol Mod 16) in [5,10,15] Then Write(OutFile,' ');
+ If Bitmap=0 Then Write(OutFile,'& ')
+ Else
+ Begin
+ Write(OutFile,'&'+Chr(EUC1)+Chr(EUC2));
+ If (Symbol Mod 16) in [4,9,14] Then Writeln(OutFile)
+ Else
+ If (Symbol Mod 16)=15 Then
+ Begin
+ Write(OutFile,'& ',EUC1,',',EUC2);
+ If (Symbol<>SymbolMax1) And (Bitmap<>BitmapMax) Then
+ Write(OutFile,' \\');
+ Writeln(OutFile)
+ End
+ Else
+ If Bitmap=BitmapMax Then Writeln(OutFile)
+ End;
+ If (Symbol=SymbolMax1) Or (Bitmap=BitmapMax) Then
+ Begin
+ Writeln(OutFile,' \end{tabular}');
+ Writeln(OutFile,'\caption{Font {\tt kanji'+Chr(Ord('a')+(Font Div 8))+
+ Chr(Ord('a')+(Font Mod 8))+'} (',(Bitmap-Symbol),'--',Bitmap,').}');
+ Writeln(OutFile,'\end{table}');
+ Writeln(OutFile);
+ If Bitmap=BitmapMax Then
+ Begin
+ Writeln(OutFile,'\vspace*{\fill}');
+ Writeln(OutFile)
+ End
+ Else
+ If (Font Mod 3)=2 Then
+ Begin
+ Writeln(OutFile,'\vspace*{\fill}');
+ Writeln(OutFile);
+ Writeln(OutFile,'\clearpage');
+ Writeln(OutFile);
+ Writeln(OutFile,'\vspace*{\fill}');
+ Writeln(OutFile)
+ End
+ End
+ End;
+Writeln(OutFile,'\end{Large}');
+Writeln(OutFile,'\end{document}')
+End;
+
+Begin
+Writeln;
+Writeln('Japanese Font Tables Generation Program.'); {To make Borland happy}
+Writeln('Version 2.0 Copyright F. Jalbert 1991.');
+Writeln;
+
+Write('Creating Japanese file fontable.jem');
+Assign(OutFile,'fontable.jem');
+Rewrite(OutFile);
+Writeln('.');
+
+Write('Generating font tables');
+FontTable(OutFile);
+Writeln('.');
+
+Write('Closing Japanese file fontable.jem');
+Close(OutFile);
+Writeln('.');
+Writeln;
+
+Writeln('Japanese font tables generation completed.');
+Writeln
+End.
diff --git a/systems/msdos/jemtex2/jem2tex.c b/systems/msdos/jemtex2/jem2tex.c
new file mode 100644
index 0000000000..9bc0dc296f
--- /dev/null
+++ b/systems/msdos/jemtex2/jem2tex.c
@@ -0,0 +1,1317 @@
+/* -mt -f -A -K -G -O -w */
+/* Compile with Turbo-C 2.0 */
+/*
+ This program translates a .JEM file into a .TeX file
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: January 1991
+
+ Version: 1.01
+
+ Modifications: - Added \hskip0pt plus0.1em between all Japanese symbols which
+ improved dramatically line breaks and inter-sentence spacing
+ since [La]TeX could only add glue between whole Japanese
+ sentences.
+ - Extra space after punctuation is now an option since it is
+ not desirable with MuTeX when the text is to go under the
+ staff.
+ - Font names now use only small letters to be compatible with
+ the fontlib program supplied with emTeX.
+ - Command line parameters now supported.
+ - Run-time parameters now supported.
+ - Updated and improved run-time messages.
+
+ Date: April 1991
+
+ Version: 2.00
+
+ Modifications: - Added four kanjis.
+ - If desired, only standard JIS '83 characters are allowed.
+ - If desired, a % is added at each Japanese end of line.
+ - Three file name extensions .JEM .JPN .JAP now supported.
+ - Default extension is .JEM and the program has been renamed.
+ - Three run-time parameter flags now supported.
+ - Japanese comments not translated anymore for reference.
+ - Hyphenation and glue handled separately for better control.
+ - More clever algorithm for Japanese hyphenation.
+ - Space after some punctuation now obtained with \eeee.
+ - Small space around some punctuation introduced with \eee.
+ - Tiny space between Japanese characters with \ee.
+ - Space between Japanese and Roman with \eeee and \eee.
+ - Symbols separated only by [La]TeX comments are now
+ recognized as consecutive.
+ - MS-kanji (Shift-JIS) now supported.
+
+ Error Levels: 0 - Normal termination.
+ 1 - Error.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef __TURBOC__
+#include <process.h>
+#endif
+
+#define True 1
+#define False 0
+/* Highest Bitmap number in JIS24 */
+#define BitmapMax 7806
+/* Highest font number */
+#define FontMax 60 /* Floor of 7806 Div 128 */
+/* Highest size number */
+#define SizeMax 7 /* magsteps are 0, 0.5, 1, 2, 3, 4, 5 */
+/* DOS file name length */
+#define FileNameDOS 250 /* includes path */
+#define ExtensionDOS 4 /* includes . */
+#define TotalNameDOS 254
+/* File name extensions in priority order */
+char Extension1[]=".jem";
+char Extension2[]=".jpn";
+char Extension3[]=".jap";
+/* Run-time flag of all the same length */
+char RunFlag1[]="JEM2TEX";
+char RunFlag2[]="JPN2TEX";
+char RunFlag3[]="JAP2TEX";
+/* Parameter flag */
+#define Flag1 '/' /* DOS style */
+#define Flag2 '-' /* UNIX style */
+/* Parameter keywords in approximate decreasing length order */
+#define ParamMax 12
+char Space1[]="EXTRASPACE";
+char Space2[]="EXTRA";
+char Space3[]="SPACE";
+char NoSpace1[]="NOEXTRASPACE";
+char NoSpace2[]="NOEXTRA";
+char NoSpace3[]="NOSPACE";
+char Percent1[]="COMMENT";
+char Percent2[]="PERCENT";
+char Percent3[]="EOL";
+char NoPercent1[]="NOCOMMENT";
+char NoPercent2[]="NOPERCENT";
+char NoPercent3[]="NOEOL";
+char EUC1[]="EUC";
+char NoEUC1[]="MSKANJI";
+char NoEUC2[]="SHIFTJIS";
+char Extended1[]="EXTENDED";
+char Standard1[]="STANDARD";
+char LaTeX1[]="LATEX";
+char TeX1[]="MUTEX";
+char TeX2[]="TEX";
+char One1[]="1000";
+char Two1[]="1095";
+char Three1[]="1200";
+char Four1[]="1440";
+char Five1[]="1728";
+char Six1[]="2074";
+char Seven1[]="2488";
+char One2[]="0.0";
+char Two2[]="0.5";
+char Three2[]="1.0";
+char Four2[]="2.0";
+char Five2[]="3.0";
+char Six2[]="4.0";
+char Seven2[]="5.0";
+char One3[]="0";
+char Three3[]="1";
+char Four3[]="2";
+char Five3[]="3";
+char Six3[]="4";
+char Seven3[]="5";
+/* Comment line maximum length */
+#define CommentLineMax 254
+
+typedef char FileNameType[FileNameDOS+1];
+typedef char ExtensionType[ExtensionDOS+1];
+typedef char TotalNameType[TotalNameDOS+1];
+typedef char ParamType[ParamMax+1];
+typedef int FontType[FontMax+1];
+typedef FontType FontsType[SizeMax+1];
+typedef char CommentLineType[CommentLineMax+2]; /* note the 2 used */
+/* Run time parameters */
+struct RunTimeType {
+ FileNameType FileName;
+ ExtensionType Extension;
+ int ExtraSpace,Percent,LaTeX,EUC,Extended;
+ int Size;
+};
+/* Japanese punctuation information */
+struct PunctuationType {
+ /* Indicates .,!? present */
+ int OldMajorEOL,NewMajorEOL;
+ /* Indicates :; present */
+ int OldMinorEOL,NewMinorEOL;
+ /* Indicates `"([< and other openings present */
+ int OldOpening,NewOpening;
+ /* Indicates '")]> and other closings present */
+ int OldClosing,NewClosing;
+ /* Indicates Japanese center dot present */
+ int OldCenterDot,NewCenterDot;
+ /* Indicates Hiragana, Katakana, or Kanji present */
+ int OldJapanese,NewJapanese;
+};
+/* Scanning Information */
+struct ScanningType {
+ /* Current pass terminated */
+ int Done;
+ /* Indicates the current pass must produce output */
+ int Echo;
+ /* Indicates the current line is a comment */
+ int Comment;
+ /* Indicates current Bitmap immediately followed previous one */
+ int Immediate;
+ /* Indicates the last Roman character was a letter or digit */
+ int WasLetter;
+ /* Used for glue after a bitmap and before a roman */
+ int RomanMajorEOL,RomanMinorEOL,RomanOpening;
+ /* Non-comment Bitmap found */
+ int Found;
+ /* Processing the first character on the line which could be % */
+ int First;
+ /* Comment line which may contain Bitmaps */
+ CommentLineType CommentLine;
+ /* Current JIS24 Bitmap number */
+ int Bitmap;
+ /* Roman or first part of Bitmap read */
+ unsigned char Data1;
+};
+
+void Delete(char *String, int Length)
+/* Delete the first Length characters of String */
+{
+ int Index;
+
+ Index=0;
+ do String[Index]=String[Index+Length];
+ while (String[++Index]!='\0');
+}
+
+/*----------------------------- EchoParameters ------------------------------*/
+
+void EchoParameters(FILE *EchoFile, struct RunTimeType *RunTime)
+/* Echoes the current parameters in EchoFile */
+{
+ fprintf(EchoFile,"File=%s",RunTime->FileName);
+ if (RunTime->ExtraSpace) fprintf(EchoFile," Space");
+ else fprintf(EchoFile," No Space");
+ if (RunTime->Percent) fprintf(EchoFile," Added %%");
+ else fprintf(EchoFile," No Added %%");
+ if (RunTime->LaTeX) fprintf(EchoFile," LaTeX");
+ else fprintf(EchoFile," TeX");
+ if (RunTime->EUC) fprintf(EchoFile," EUC");
+ else fprintf(EchoFile," MS-kanji");
+ if (RunTime->Extended) fprintf(EchoFile," Extended");
+ else fprintf(EchoFile," Standard");
+ fprintf(EchoFile," Font Size=");
+ switch (RunTime->Size) {
+ case 1:fprintf(EchoFile,"1000"); break;
+ case 2:fprintf(EchoFile,"1095"); break;
+ case 3:fprintf(EchoFile,"1200"); break;
+ case 4:fprintf(EchoFile,"1440"); break;
+ case 5:fprintf(EchoFile,"1728"); break;
+ case 6:fprintf(EchoFile,"2074"); break;
+ case 7:fprintf(EchoFile,"2488"); break;
+ }
+ fprintf(EchoFile,".\n");
+ if (ferror(EchoFile)) exit(1);
+}
+
+/*------------------------------ GetParameters ------------------------------*/
+
+void SimpleQuery(char Title[], char ChoiceA[], char ChoiceB[], int *Answer)
+{
+ char JChar[2];
+ int Valid;
+
+ do {
+ Valid=True;
+ printf("%s:\n",Title);
+ printf(" a) %s\n",ChoiceA);
+ printf(" b) %s\n",ChoiceB);
+ printf("Your choice? ");
+ if (ferror(stdout)) exit(1);
+ if (gets(JChar)==NULL) exit(1);
+ if (strlen(JChar)>1) exit(1);
+ JChar[0]=toupper(JChar[0]);
+ if (JChar[0]=='A') *Answer=True;
+ else
+ if (JChar[0]=='B') *Answer=False;
+ else {
+ Valid=False;
+ if (putchar('\7')==EOF) exit(1);
+ }
+ } while (!Valid);
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+}
+
+void SizeQuery(int *Size)
+{
+ char JChar[2];
+ int Valid;
+
+ do {
+ Valid=True;
+ printf("Japanese Font Size:\n");
+ printf(" a) 1000 magstep(0.0)\n");
+ printf(" b) 1095 magstep(0.5)\n");
+ printf(" c) 1200 magstep(1.0)\n");
+ printf(" d) 1440 magstep(2.0)\n");
+ printf(" e) 1728 magstep(3.0)\n");
+ printf(" f) 2074 magstep(4.5)\n");
+ printf(" g) 2488 magstep(5.0)\n");
+ printf("Your choice? ");
+ if (ferror(stdout)) exit(1);
+ if (gets(JChar)==NULL) exit(1);
+ if (strlen(JChar)>1) exit(1);
+ JChar[0]=toupper(JChar[0]);
+ if (('A'<=JChar[0]) && (JChar[0]<='G')) *Size=JChar[0]-'A'+1;
+ else {
+ Valid=False;
+ if (putchar('\7')==EOF) exit(1);
+ }
+ } while (!Valid);
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+}
+
+void Manual(struct RunTimeType *RunTime)
+/* Get parameters from user */
+{
+ printf("Japanese file name? ");
+ if (ferror(stdout)) exit(1);
+ if (gets(RunTime->FileName)==NULL) exit(1);
+ if (strlen(RunTime->FileName)>FileNameDOS) {
+ /* File name too long */
+ printf("\7File name too long: %s...",RunTime->FileName);
+ exit(1);
+ }
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+ SimpleQuery("Space around Japanese punctuation","Space","No space",
+ &RunTime->ExtraSpace);
+ SimpleQuery("Added % at Japanese end of lines","Added %","No added %",
+ &RunTime->Percent);
+ SimpleQuery("LaTeX or TeX (MuTeX) output","LaTeX","TeX",&RunTime->LaTeX);
+ SimpleQuery("EUC or MS-kanji (Shift-JIS) encoding","EUC","MS-kanji",
+ &RunTime->EUC);
+ SimpleQuery("Extended JIS '83 Bitmaps allowed","Extended","Standard",
+ &RunTime->Extended);
+ SizeQuery(&RunTime->Size);
+}
+
+void Automate(struct RunTimeType *RunTime, int argc, char *argv[])
+/* Get parameters from command line */
+{
+ int ParamIndex,ParamLength,Index;
+ ParamType Param;
+
+ /* Defaults */
+ strcpy(RunTime->FileName,"japanese");
+ RunTime->ExtraSpace=True;
+ RunTime->Percent=True;
+ RunTime->LaTeX=True;
+ RunTime->EUC=True;
+ RunTime->Extended=True;
+ RunTime->Size=4;
+ /* Scan command line parameters */
+ /* 0th is program's name, last is NULL */
+ for (ParamIndex=1 ; ParamIndex<argc ; ParamIndex++) {
+ ParamLength=strlen(argv[ParamIndex]);
+ if (ParamLength>ParamMax) {
+ /* Keyword too long */
+ printf("\7Invalid command line parameter: %s...",argv[ParamIndex]);
+ exit(1);
+ }
+ strcpy(Param,argv[ParamIndex]);
+ if ((Param[0]==Flag1) || (Param[0]==Flag2)) {
+ /* Not a filename */
+ /* Delete 1 char at the 1st position */
+ Delete(Param,1);
+ /* Convert to upper case */
+ for (Index=0 ; Index<ParamLength ; Index++)
+ Param[Index]=toupper(Param[Index]);
+ /* Scan known keywords */
+ if ( (!strcmp(Param,Space1)) || (!strcmp(Param,Space2)) ||
+ (!strcmp(Param,Space3)) ) RunTime->ExtraSpace=True;
+ else
+ if ( (!strcmp(Param,NoSpace1)) || (!strcmp(Param,NoSpace2)) ||
+ (!strcmp(Param,NoSpace3)) ) RunTime->ExtraSpace=False;
+ else
+ if ( (!strcmp(Param,Percent1)) || (!strcmp(Param,Percent2)) ||
+ (!strcmp(Param,Percent3)) ) RunTime->Percent=True;
+ else
+ if ( (!strcmp(Param,NoPercent1)) || (!strcmp(Param,NoPercent2)) ||
+ (!strcmp(Param,NoPercent3)) ) RunTime->Percent=False;
+ else
+ if (!strcmp(Param,EUC1)) RunTime->EUC=True;
+ else
+ if ((!strcmp(Param,NoEUC1))||(!strcmp(Param,NoEUC2))) RunTime->EUC=False;
+ else
+ if (!strcmp(Param,Extended1)) RunTime->Extended=True;
+ else
+ if (!strcmp(Param,Standard1)) RunTime->Extended=False;
+ else
+ if (!strcmp(Param,LaTeX1)) RunTime->LaTeX=True;
+ else
+ if ((!strcmp(Param,TeX1)) || (!strcmp(Param,TeX2))) RunTime->LaTeX=False;
+ else
+ if ( (!strcmp(Param,One1)) || (!strcmp(Param,One2)) ||
+ (!strcmp(Param,One3)) ) RunTime->Size=1;
+ else
+ if ( (!strcmp(Param,Two1)) || (!strcmp(Param,Two2)) ) RunTime->Size=2;
+ else
+ if ( (!strcmp(Param,Three1)) || (!strcmp(Param,Three2)) ||
+ (!strcmp(Param,Three3)) ) RunTime->Size=3;
+ else
+ if ( (!strcmp(Param,Four1)) || (!strcmp(Param,Four2)) ||
+ (!strcmp(Param,Four3)) ) RunTime->Size=4;
+ else
+ if ( (!strcmp(Param,Five1)) || (!strcmp(Param,Five2)) ||
+ (!strcmp(Param,Five3)) ) RunTime->Size=5;
+ else
+ if ( (!strcmp(Param,Six1)) || (!strcmp(Param,Six2)) ||
+ (!strcmp(Param,Six3)) ) RunTime->Size=6;
+ else
+ if ( (!strcmp(Param,Seven1)) || (!strcmp(Param,Seven2)) ||
+ (!strcmp(Param,Seven3)) ) RunTime->Size=7;
+ else {
+ /* Unknown keyword */
+ printf("\7Invalid command line parameter: %s...\n",Param);
+ exit(1);
+ }
+ }
+ else {
+ /* Must be a filename, we'll try to open it later */
+ if (ParamLength>FileNameDOS) {
+ /* File name too long */
+ printf("\7File name too long: %s...\n",Param);
+ exit(1);
+ }
+ strcpy(RunTime->FileName,Param);
+ }
+ }
+}
+
+void GetParameters(struct RunTimeType *RunTime, int argc, char *argv[])
+/* Get parameters from user or command line */
+/* Current parameter status is echoed on the console */
+{
+ /* 0th is program's name, last is NULL */
+ if (argc==1) Manual(RunTime);
+ else Automate(RunTime,argc,argv);
+ EchoParameters(stdout,RunTime);
+}
+
+/*------------------------------- OpenFile ----------------------------------*/
+
+int TryExtension(FILE *(*InFile), struct RunTimeType *RunTime,
+ ExtensionType TriedExtension)
+/* Tries to open FileName using TriedExtension */
+{
+ TotalNameType TotalName;
+
+ strcpy(RunTime->Extension,TriedExtension);
+ strcpy(TotalName,RunTime->FileName);
+ strcat(TotalName,TriedExtension);
+ *InFile=fopen(TotalName,"rt");
+ return(*InFile!=NULL);
+}
+
+void OpenFile(FILE *(*InFile), struct RunTimeType *RunTime)
+/* Tries to open FileName using all available extensions */
+{
+ if (TryExtension(InFile,RunTime,Extension1)) printf("%s",Extension1);
+ else
+ if (TryExtension(InFile,RunTime,Extension2)) printf("%s",Extension2);
+ else
+ if (TryExtension(InFile,RunTime,Extension3)) printf("%s",Extension3);
+ else {
+ printf(".\n");
+ printf("\7File not found...\n");
+ exit(1);
+ }
+}
+
+/*------------------------------- GetBitmap ---------------------------------*/
+
+void PerformScan(CommentLineType CommentLine, struct RunTimeType *RunTime,
+ int Echo, FILE *OutFile)
+/* Scans the comment line for run-time JEM2TEX parameters */
+/* Any Bitmap or unknown parameter stops the scan */
+/* Current parameter status is echoed in the .TeX file as a [La]TeX comment */
+{
+ int Index;
+
+ /* Delete 1 char at the 1st position which is % */
+ Delete(CommentLine,1);
+ /* Convert to upper case */
+ for (Index=0 ; Index<strlen(CommentLine) ; Index++)
+ CommentLine[Index]=toupper(CommentLine[Index]);
+ /* Add space at the line end to characterize premature termination */
+ /* Add sentinel at the line end to stop forthcoming loops */
+ strcat(CommentLine," %");
+ /* Delete leading blanks */
+ if (CommentLine[0]==' ')
+ do Delete(CommentLine,1);
+ while (CommentLine[0]==' ');
+ /* Look for run-time flag at the start of line */
+ if ( !strncmp(RunFlag1,CommentLine,strlen(RunFlag1)) ||
+ !strncmp(RunFlag2,CommentLine,strlen(RunFlag1)) ||
+ !strncmp(RunFlag3,CommentLine,strlen(RunFlag1)) ) {
+ /* Remove run-time flag */
+ Delete(CommentLine,strlen(RunFlag1));
+ /* Scan until sentinel reached */
+ do {
+ /* Delete leading blanks (inefficient) */
+ if (CommentLine[0]==' ')
+ do Delete(CommentLine,1);
+ while (CommentLine[0]==' ');
+ if ((CommentLine[0]==Flag1) || (CommentLine[0]==Flag2)) {
+ /* Valid run-time parameter flag */
+ /* Delete 1 char at the 1st position which is flag */
+ Delete(CommentLine,1);
+ /* Scan in decreasing length order */
+ if (!strncmp(Space1,CommentLine,strlen(Space1)))
+ { Delete(CommentLine,strlen(Space1)); RunTime->ExtraSpace=True; }
+ else
+ if (!strncmp(Space2,CommentLine,strlen(Space2)))
+ { Delete(CommentLine,strlen(Space2)); RunTime->ExtraSpace=True; }
+ else
+ if (!strncmp(Space3,CommentLine,strlen(Space3)))
+ { Delete(CommentLine,strlen(Space3)); RunTime->ExtraSpace=True; }
+ else
+ if (!strncmp(NoSpace1,CommentLine,strlen(NoSpace1)))
+ { Delete(CommentLine,strlen(NoSpace1)); RunTime->ExtraSpace=False; }
+ else
+ if (!strncmp(NoSpace2,CommentLine,strlen(NoSpace2)))
+ { Delete(CommentLine,strlen(NoSpace2)); RunTime->ExtraSpace=False; }
+ else
+ if (!strncmp(NoSpace3,CommentLine,strlen(NoSpace3)))
+ { Delete(CommentLine,strlen(NoSpace3)); RunTime->ExtraSpace=False; }
+ else
+ if (!strncmp(Percent1,CommentLine,strlen(Percent1)))
+ { Delete(CommentLine,strlen(Percent1)); RunTime->Percent=True; }
+ else
+ if (!strncmp(Percent2,CommentLine,strlen(Percent2)))
+ { Delete(CommentLine,strlen(Percent2)); RunTime->Percent=True; }
+ else
+ if (!strncmp(Percent3,CommentLine,strlen(Percent3)))
+ { Delete(CommentLine,strlen(Percent3)); RunTime->Percent=True; }
+ else
+ if (!strncmp(NoPercent1,CommentLine,strlen(NoPercent1)))
+ { Delete(CommentLine,strlen(NoPercent1)); RunTime->Percent=False; }
+ else
+ if (!strncmp(NoPercent2,CommentLine,strlen(NoPercent2)))
+ { Delete(CommentLine,strlen(NoPercent2)); RunTime->Percent=False; }
+ else
+ if (!strncmp(NoPercent3,CommentLine,strlen(NoPercent3)))
+ { Delete(CommentLine,strlen(NoPercent3)); RunTime->Percent=False; }
+ else
+ if (!strncmp(EUC1,CommentLine,strlen(EUC1)))
+ { Delete(CommentLine,strlen(EUC1)); RunTime->EUC=True; }
+ else
+ if (!strncmp(NoEUC1,CommentLine,strlen(NoEUC1)))
+ { Delete(CommentLine,strlen(NoEUC1)); RunTime->EUC=False; }
+ else
+ if (!strncmp(NoEUC2,CommentLine,strlen(NoEUC2)))
+ { Delete(CommentLine,strlen(NoEUC2)); RunTime->EUC=False; }
+ else
+ if (!strncmp(Extended1,CommentLine,strlen(Extended1)))
+ { Delete(CommentLine,strlen(Extended1)); RunTime->Extended=True; }
+ else
+ if (!strncmp(Standard1,CommentLine,strlen(Standard1)))
+ { Delete(CommentLine,strlen(Standard1)); RunTime->Extended=False; }
+ else
+ if (!strncmp(LaTeX1,CommentLine,strlen(LaTeX1)))
+ { Delete(CommentLine,strlen(LaTeX1)); RunTime->LaTeX=True; }
+ else
+ if (!strncmp(TeX1,CommentLine,strlen(TeX1)))
+ { Delete(CommentLine,strlen(TeX1)); RunTime->LaTeX=False; }
+ else
+ if (!strncmp(TeX2,CommentLine,strlen(TeX2)))
+ { Delete(CommentLine,strlen(TeX2)); RunTime->LaTeX=False; }
+ else
+ if (!strncmp(One1,CommentLine,strlen(One1)))
+ { Delete(CommentLine,strlen(One1)); RunTime->Size=1; }
+ else
+ if (!strncmp(Two1,CommentLine,strlen(Two1)))
+ { Delete(CommentLine,strlen(Two1)); RunTime->Size=2; }
+ else
+ if (!strncmp(Three1,CommentLine,strlen(Three1)))
+ { Delete(CommentLine,strlen(Three1)); RunTime->Size=3; }
+ else
+ if (!strncmp(Four1,CommentLine,strlen(Four1)))
+ { Delete(CommentLine,strlen(Four1)); RunTime->Size=4; }
+ else
+ if (!strncmp(Five1,CommentLine,strlen(Five1)))
+ { Delete(CommentLine,strlen(Five1)); RunTime->Size=5; }
+ else
+ if (!strncmp(Six1,CommentLine,strlen(Six1)))
+ { Delete(CommentLine,strlen(Six1)); RunTime->Size=6; }
+ else
+ if (!strncmp(Seven1,CommentLine,strlen(Seven1)))
+ { Delete(CommentLine,strlen(Seven1)); RunTime->Size=7; }
+ else
+ if (!strncmp(One2,CommentLine,strlen(One2)))
+ { Delete(CommentLine,strlen(One2)); RunTime->Size=1; }
+ else
+ if (!strncmp(Two2,CommentLine,strlen(Two2)))
+ { Delete(CommentLine,strlen(Two2)); RunTime->Size=2; }
+ else
+ if (!strncmp(Three2,CommentLine,strlen(Three2)))
+ { Delete(CommentLine,strlen(Three2)); RunTime->Size=3; }
+ else
+ if (!strncmp(Four2,CommentLine,strlen(Four2)))
+ { Delete(CommentLine,strlen(Four2)); RunTime->Size=4; }
+ else
+ if (!strncmp(Five2,CommentLine,strlen(Five2)))
+ { Delete(CommentLine,strlen(Five2)); RunTime->Size=5; }
+ else
+ if (!strncmp(Six2,CommentLine,strlen(Six2)))
+ { Delete(CommentLine,strlen(Six2)); RunTime->Size=6; }
+ else
+ if (!strncmp(Seven2,CommentLine,strlen(Seven2)))
+ { Delete(CommentLine,strlen(Seven2)); RunTime->Size=7; }
+ else
+ if (!strncmp(One3,CommentLine,strlen(One3)))
+ { Delete(CommentLine,strlen(One3)); RunTime->Size=1; }
+ else
+ if (!strncmp(Three3,CommentLine,strlen(Three3)))
+ { Delete(CommentLine,strlen(Three3)); RunTime->Size=3; }
+ else
+ if (!strncmp(Four3,CommentLine,strlen(Four3)))
+ { Delete(CommentLine,strlen(Four3)); RunTime->Size=4; }
+ else
+ if (!strncmp(Five3,CommentLine,strlen(Five3)))
+ { Delete(CommentLine,strlen(Five3)); RunTime->Size=5; }
+ else
+ if (!strncmp(Six3,CommentLine,strlen(Six3)))
+ { Delete(CommentLine,strlen(Six3)); RunTime->Size=6; }
+ else
+ if (!strncmp(Seven3,CommentLine,strlen(Seven3)))
+ { Delete(CommentLine,strlen(Seven3)); RunTime->Size=7; }
+ else
+ /* Unknown run-time parameter */
+ /* Terminate prematurely current scan */
+ strcpy(CommentLine,"%");
+ /* Echo status if allowed */
+ if ( Echo && strcmp(CommentLine,"%") ) {
+ fprintf(OutFile,"%");
+ if (ferror(OutFile)) exit(1);
+ EchoParameters(OutFile,RunTime);
+ }
+ }
+ else
+ /* Unknown run-time parameter flag */
+ /* Terminate prematurely current scan */
+ strcpy(CommentLine,"%");
+ } while (strlen(CommentLine)!=1);
+ }
+}
+
+void LineBreak(FILE *OutFile, int ExtraSpace, struct ScanningType *Scanning)
+/* The continuous chain of Bitmaps has just been interrupted by a line break */
+/* We know the next Roman character is equivalent to space, i.e. not a letter */
+/* A \eeee may be inserted if the previous Bitmap was a .,!? */
+/* A \eee may be inserted if the previous Bitmap was a :; center dot )]'" */
+/* If glue inserted make sure to leave a totally blank line as present before */
+{
+ Scanning->Immediate=False;
+ if (Scanning->Echo && ExtraSpace)
+ if (Scanning->RomanMajorEOL) {
+ fprintf(OutFile,"\\eeee\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ else
+ if (Scanning->RomanMinorEOL) {
+ fprintf(OutFile,"\\eee\n");
+ if (ferror(OutFile)) exit(1);
+ }
+}
+
+void RomanBreak(FILE *OutFile, int ExtraSpace, struct ScanningType *Scanning)
+/* The continuous chain of Bitmaps has just been interrupted by a Roman */
+/* The next Roman character may be a letter so a \eee is possible */
+/* A \eeee may be inserted if the previous Bitmap was a .,!? */
+/* A \eee may be inserted if the previous Bitmap was a :; center dot )]'" */
+/* Curly brackets are used in \eee and \eeee when the next Roman is a letter */
+{
+ Scanning->Immediate=False;
+ if (Scanning->Echo && ExtraSpace)
+ if (Scanning->RomanMajorEOL) {
+ if (Scanning->WasLetter) fprintf(OutFile,"\\eeee{}");
+ else fprintf(OutFile,"\\eeee");
+ if (ferror(OutFile)) exit(1);
+ }
+ else
+ if (Scanning->RomanMinorEOL) {
+ if (Scanning->WasLetter) fprintf(OutFile,"\\eee{}");
+ else fprintf(OutFile,"\\eee");
+ if (ferror(OutFile)) exit(1);
+ }
+ else
+ if (Scanning->WasLetter && !Scanning->RomanOpening) {
+ fprintf(OutFile,"\\eee{}");
+ if (ferror(OutFile)) exit(1);
+ }
+}
+
+void GotUNIX(FILE *OutFile, struct ScanningType *Scanning,
+ struct RunTimeType *RunTime)
+/* Handles UNIX EOL */
+/* May add glue after the previous Bitmap and before this Roman */
+{
+ if (Scanning->Immediate)
+ if (Scanning->First)
+ LineBreak(OutFile,RunTime->ExtraSpace,Scanning);
+ else
+ if (!Scanning->Comment)
+ if (RunTime->Percent)
+ if (Scanning->Echo) {
+ fprintf(OutFile,"%");
+ if (ferror(OutFile)) exit(1);
+ }
+ else ;
+ else
+ LineBreak(OutFile,RunTime->ExtraSpace,Scanning);
+ if (Scanning->Echo) {
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+ }
+ if (Scanning->Comment)
+ if (!Scanning->First)
+ PerformScan(Scanning->CommentLine,RunTime,Scanning->Echo,OutFile);
+ else ;
+ else
+ Scanning->WasLetter=False;
+ Scanning->First=True;
+ Scanning->Comment=True;
+ strcpy(Scanning->CommentLine,"");
+}
+
+void GotDOS(FILE *OutFile, struct ScanningType *Scanning,
+ struct RunTimeType *RunTime, FILE *InFile)
+/* Handles DOS EOL */
+/* May add glue after the previous Bitmap and before this Roman */
+/* An error only stops the current pass to help the user determine its cause */
+{
+ unsigned char Data2;
+
+ GotUNIX(OutFile,Scanning,RunTime);
+ /* Line Feed must follow immediately */
+ fscanf(InFile,"%c",&Data2);
+ if (ferror(InFile)) exit(1);
+ if (feof(InFile)) {
+ clearerr(InFile);
+ Scanning->Done=True;
+ }
+ else
+ if (Data2!=(unsigned char)'\xA') Scanning->Done=True;
+ if (Scanning->Done) {
+ printf(".\n");
+ printf("\7Abnormal DOS end of line..");
+ if (ferror(stdout)) exit(1);
+ }
+}
+
+void ValidateBitmap(int Bitmap)
+/* Prints a warning when an extended or an empty Bitmap is used */
+{
+ int Invalid;
+
+ Invalid=False;
+ if ((109<=Bitmap) && (Bitmap<=119) ) Invalid=True;
+ else
+ if ((128<=Bitmap) && (Bitmap<=135) ) Invalid=True;
+ else
+ if ((143<=Bitmap) && (Bitmap<=153) ) Invalid=True;
+ else
+ if ((169<=Bitmap) && (Bitmap<=175) ) Invalid=True;
+ else
+ if ((184<=Bitmap) && (Bitmap<=203) ) Invalid=True;
+ else
+ if ((214<=Bitmap) && (Bitmap<=220) ) Invalid=True;
+ else
+ if ((247<=Bitmap) && (Bitmap<=252) ) Invalid=True;
+ else
+ if ((279<=Bitmap) && (Bitmap<=282) ) Invalid=True;
+ else
+ if (Bitmap==366) Invalid=True;
+ else
+ if ((463<=Bitmap) && (Bitmap<=470) ) Invalid=True;
+ else
+ if ((495<=Bitmap) && (Bitmap<=502) ) Invalid=True;
+ else
+ if ((527<=Bitmap) && (Bitmap<=564) ) Invalid=True;
+ else
+ if ((598<=Bitmap) && (Bitmap<=612) ) Invalid=True;
+ else
+ if ((646<=Bitmap) && (Bitmap<=658) ) Invalid=True;
+ else
+ if ((691<=Bitmap) && (Bitmap<=1410) ) Invalid=True;
+ else
+ if ((4376<=Bitmap) && (Bitmap<=4418) ) Invalid=True;
+ if (Invalid) {
+ printf(".\n");
+ printf("Warning! The non-standard JIS '83 Bitmap %d encountered",Bitmap);
+ if (ferror(stdout)) exit(1);
+ }
+}
+
+void GotBitmap(FILE *OutFile, int EUC, int Extended, FILE *InFile,
+ struct ScanningType *Scanning)
+/* Handles Bitmap */
+/* An error only stops the current pass to help the user determine its cause */
+/* If desired, non-standard Bitmaps are pointed out in the first pass */
+{
+ unsigned char Data2;
+ int CommentLength;
+
+ if (Scanning->First) {
+ /* First character on line */
+ Scanning->First=False;
+ Scanning->Comment=False;
+ }
+ fscanf(InFile,"%c",&Data2);
+ if (ferror(InFile)) exit(1);
+ if (feof(InFile)) {
+ clearerr(InFile);
+ Scanning->Done=True;
+ printf(".\n");
+ if (EUC) printf("\7Incomplete EUC character pair..");
+ else printf("\7Incomplete MS-kanji character pair..");
+ if (ferror(stdout)) exit(1);
+ }
+ else {
+ if (EUC)
+ if (((unsigned char)'\xA0'<Data2) && (Data2<(unsigned char)'\xFF'))
+ Scanning->Bitmap=94*(int)(Scanning->Data1-(unsigned char)'\xA1')+
+ (int)(Data2-(unsigned char)'\xA1')+1;
+ else {
+ Scanning->Done=True;
+ printf(".\n");
+ printf("\7Invalid EUC character pair..");
+ if (ferror(stdout)) exit(1);
+ }
+ else
+ if ((((unsigned char)'\x40'<=Data2) && (Data2<=(unsigned char)'\x7E')) ||
+ (((unsigned char)'\x80'<=Data2) && (Data2<=(unsigned char)'\xFC'))) {
+ if (Scanning->Data1>=(unsigned char)'\xE0')
+ Scanning->Bitmap=1+188*(int)(Scanning->Data1-(unsigned char)'\xC1');
+ else
+ Scanning->Bitmap=1+188*(int)(Scanning->Data1-(unsigned char)'\x81');
+ if (Data2>=(unsigned char)'\x80')
+ Scanning->Bitmap+=(int)(Data2-(unsigned char)'\x41');
+ else
+ Scanning->Bitmap+=(int)(Data2-(unsigned char)'\x40');
+ }
+ else {
+ Scanning->Done=True;
+ printf(".\n");
+ printf("\7Invalid MS-kanji character pair..");
+ if (ferror(stdout)) exit(1);
+ }
+ if (!Scanning->Done)
+ /* Bitmaps in comment skipped */
+ if (Scanning->Comment) {
+ CommentLength=strlen(Scanning->CommentLine);
+ if ((CommentLength+1)>=CommentLineMax) {
+ /* Comment too long */
+ printf(".\n");
+ printf("\7Comment too long: %s...\n",Scanning->CommentLine);
+ exit(1);
+ }
+ Scanning->CommentLine[CommentLength]=(char)Scanning->Data1;
+ Scanning->CommentLine[CommentLength+1]=(char)Data2;
+ Scanning->CommentLine[CommentLength+2]=(char)'\0';
+ if (Scanning->Echo) {
+ fprintf(OutFile,"%c%c",Scanning->Data1,Data2);
+ if (ferror(OutFile)) exit(1);
+ }
+ }
+ else
+ if ( (1<=Scanning->Bitmap) && (Scanning->Bitmap<=BitmapMax) ) {
+ Scanning->Found=True;
+ /* Point out non-standard Bitmaps in first pass */
+ if (!Scanning->Echo && !Extended) ValidateBitmap(Scanning->Bitmap);
+ }
+ else {
+ Scanning->Done=True;
+ printf(".\n");
+ printf("\7Bitmap %d does not exist..",Scanning->Bitmap);
+ if (ferror(stdout)) exit(1);
+ }
+ }
+}
+
+void GotRoman(FILE *OutFile, int ExtraSpace,struct ScanningType *Scanning)
+/* Handles roman */
+/* May add glue after the previous Bitmap and before this Roman */
+{
+ int CommentLength;
+
+ if (Scanning->First) {
+ /* First character on line */
+ Scanning->First=False;
+ if (Scanning->Data1!=(unsigned char)'%') Scanning->Comment=False;
+ }
+ if (Scanning->Comment) {
+ CommentLength=strlen(Scanning->CommentLine);
+ if (CommentLength==CommentLineMax) {
+ /* Comment too long */
+ printf(".\n");
+ printf("\7Comment too long: %s...\n",Scanning->CommentLine);
+ exit(1);
+ }
+ Scanning->CommentLine[CommentLength]=(char)Scanning->Data1;
+ Scanning->CommentLine[CommentLength+1]=(char)'\0';
+ }
+ else {
+ /* Determine if this roman is a letter or a number */
+ Scanning->WasLetter=isalnum(Scanning->Data1);
+ if (Scanning->Immediate) RomanBreak(OutFile,ExtraSpace,Scanning);
+ }
+ if (Scanning->Echo) {
+ fprintf(OutFile,"%c",Scanning->Data1);
+ if (ferror(OutFile)) exit(1);
+ }
+}
+
+void GetBitmap(FILE *InFile, FILE *OutFile, struct ScanningType *Scanning,
+ struct RunTimeType *RunTime)
+/* Scans input file and stops when a Bitmap is met */
+/* An error only stops the current pass to help the user determine its cause */
+/* Accepts UNIX LF or DOS CR/LF as end of line indicator in input file */
+/* Updates JemTeX parameters with run-time parameters */
+/* Comment indicates the line is a comment line and does not break continuity */
+/* Immediate indicates current Bitmap immediately followed previous Bitmap */
+/* If the next character encountered is Roman, glue may be inserted */
+/* If desired, will add % at Japanese end of lines to preserve continuity */
+{
+ /* No Bitmap found initially */
+ Scanning->Found=False;
+ /* Assume the next character is a Bitmap */
+ Scanning->WasLetter=False;
+ Scanning->Immediate=True;
+ /* Some non-comment Bitmap was met before or it's the first call to GetBitmap */
+ strcpy(Scanning->CommentLine,"");
+ /* Comment holds; it's the first call ever to GetBitmap; it's first character */
+ /* Comment fails; some non-comment Bitmap was met before; it isnt first char */
+ Scanning->First=Scanning->Comment;
+ do {
+ fscanf(InFile,"%c",&Scanning->Data1);
+ if (ferror(InFile)) exit(1);
+ if (feof(InFile)) {
+ /* File just finished */
+ clearerr(InFile);
+ Scanning->Done=True;
+ }
+ else {
+ /* More file coming */
+ if (Scanning->Data1==(unsigned char)'\xA')
+ GotUNIX(OutFile,Scanning,RunTime);
+ else
+ if (Scanning->Data1==(unsigned char)'\xC')
+ GotDOS(OutFile,Scanning,RunTime,InFile);
+ else
+ if (RunTime->EUC)
+ if (((unsigned char)'\xA0'<Scanning->Data1) &&
+ (Scanning->Data1<(unsigned char)'\xFF'))
+ GotBitmap(OutFile,RunTime->EUC,RunTime->Extended,InFile,Scanning);
+ else
+ GotRoman(OutFile,RunTime->ExtraSpace,Scanning);
+ else
+ if ( (((unsigned char)'\x81'<=Scanning->Data1) &&
+ (Scanning->Data1<=(unsigned char)'\x9F')) ||
+ (((unsigned char)'\xE0'<=Scanning->Data1) &&
+ (Scanning->Data1<=(unsigned char)'\xEA')) )
+ GotBitmap(OutFile,RunTime->EUC,RunTime->Extended,InFile,Scanning);
+ else
+ GotRoman(OutFile,RunTime->ExtraSpace,Scanning);
+ }
+ } while (!Scanning->Done && !Scanning->Found);
+}
+
+/*--------------------------------- GetFont ---------------------------------*/
+
+void GetFont(FILE *InFile, FontsType Fonts,
+ struct RunTimeType *InitialRunTime)
+/* Finds the Japanese fonts needed */
+/* The last state of LaTeX will prevail for forthcoming header and 2nd pass */
+{
+ /* Run time parameters */
+ struct RunTimeType RunTime;
+ /* Current font number */
+ int FontPtr;
+ int SizePtr;
+ /* Scanning information */
+ struct ScanningType Scanning;
+ /* Dummy since no output in first pass */
+ FILE *DummyOutFile=NULL;
+
+ strcpy(RunTime.FileName,InitialRunTime->FileName);
+ strcpy(RunTime.Extension,InitialRunTime->Extension);
+ RunTime.ExtraSpace=InitialRunTime->ExtraSpace;
+ RunTime.Percent=InitialRunTime->Percent;
+ RunTime.LaTeX=InitialRunTime->LaTeX;
+ RunTime.EUC=InitialRunTime->EUC;
+ RunTime.Extended=InitialRunTime->Extended;
+ RunTime.Size=InitialRunTime->Size;
+ /* No Japanese font needed so far */
+ for (SizePtr=1 ; SizePtr<=SizeMax ; SizePtr++)
+ for (FontPtr=0 ; FontPtr<=FontMax ; FontPtr++)
+ Fonts[SizePtr][FontPtr]=False;
+ /* Not reached EOF yet */
+ Scanning.Done=False;
+ /* No echo in first pass */
+ Scanning.Echo=False;
+ /* Dummy since no output in first pass */
+ Scanning.Immediate=False;
+ Scanning.WasLetter=False;
+ Scanning.RomanMajorEOL=False;
+ Scanning.RomanMinorEOL=False;
+ Scanning.RomanOpening=False;
+ /* Tell indirectly to GetBitmap that this is the first time it is called */
+ Scanning.Comment=True;
+ do {
+ /* Get the next Bitmap skipping over [La]TeX comments */
+ GetBitmap(InFile,DummyOutFile,&Scanning,&RunTime);
+ if (!Scanning.Done) Fonts[RunTime.Size][Scanning.Bitmap/128]=True;
+ } while (!Scanning.Done);
+ /* Last state of LaTeX prevails for the second pass */
+ InitialRunTime->LaTeX=RunTime.LaTeX;
+}
+
+/*---------------------------------- Header ---------------------------------*/
+
+void Header(FILE *OutFile, FontsType Fonts, int LaTeX)
+/* Writes [La]TeX header */
+{
+ int FontPtr;
+ int SizePtr;
+ char C0,C1,C2;
+ int Scale;
+
+ fprintf(OutFile,"\\tracingstats=1\n");
+ if (ferror(OutFile)) exit(1);
+ for (SizePtr=1 ; SizePtr<=SizeMax ; SizePtr++) {
+ C0='a'+(char)(SizePtr-1);
+ switch (SizePtr)
+ {
+ case 1:Scale=1000; break;
+ case 2:Scale=1095; break;
+ case 3:Scale=1200; break;
+ case 4:Scale=1440; break;
+ case 5:Scale=1728; break;
+ case 6:Scale=2074; break;
+ case 7:Scale=2488; break;
+ }
+ for (FontPtr=0 ; FontPtr<=FontMax ; FontPtr++)
+ if (Fonts[SizePtr][FontPtr]) {
+ C1='a'+(char)(FontPtr / 8);
+ C2='a'+(char)(FontPtr % 8);
+ if (LaTeX)
+ fprintf(OutFile,"\\newfont{\\k%c%c%c}{kanji%c%c scaled %d}\n",
+ C0,C1,C2,C1,C2,Scale);
+ else
+ fprintf(OutFile,"\\font\\k%c%c%c=kanji%c%c scaled %d\n",
+ C0,C1,C2,C1,C2,Scale);
+ if (ferror(OutFile)) exit(1);
+ }
+ }
+ if (LaTeX) {
+ fprintf(OutFile,"\\newcommand{\\kk}[2]{{#1\\symbol{#2}}}\n");
+ fprintf(OutFile,"\\newcommand{\\hh}{\\discretionary{}{}{}}\n");
+ fprintf(OutFile,"\\newcommand{\\ee}{\\nobreak\\hskip0pt plus.1em\\relax}\n");
+ fprintf(OutFile,"\\newcommand{\\eee}{\\nobreak\\hskip.3em plus.1em\\relax}\n");
+ fprintf(OutFile,"\\newcommand{\\eeee}{\\nobreak\\hskip.9em plus.1em minus.1em}\n");
+ }
+ else {
+ fprintf(OutFile,"\\def\\kk#1#2{{#1\\char#2}}\n");
+ fprintf(OutFile,"\\def\\hh{\\discretionary{}{}{}}\n");
+ fprintf(OutFile,"\\def\\ee{\\nobreak\\hskip0pt plus.1em\\relax}\n");
+ fprintf(OutFile,"\\def\\eee{\\nobreak\\hskip.3em plus.1em\\relax}\n");
+ fprintf(OutFile,"\\def\\eeee{\\nobreak\\hskip.9em plus.1em minus.1em}\n");
+ }
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+}
+
+/*--------------------------------- Convert ---------------------------------*/
+
+void BitmapType(int Bitmap, struct PunctuationType *Punctuation)
+/* Finds characteristics of current Bitmap */
+{
+ Punctuation->OldMajorEOL=Punctuation->NewMajorEOL;
+ Punctuation->OldMinorEOL=Punctuation->NewMinorEOL;
+ Punctuation->OldOpening=Punctuation->NewOpening;
+ Punctuation->OldClosing=Punctuation->NewClosing;
+ Punctuation->OldCenterDot=Punctuation->NewCenterDot;
+ Punctuation->OldJapanese=Punctuation->NewJapanese;
+ Punctuation->NewMajorEOL=False;
+ Punctuation->NewMinorEOL=False;
+ Punctuation->NewOpening=False;
+ Punctuation->NewClosing=False;
+ Punctuation->NewCenterDot=False;
+ Punctuation->NewJapanese=False;
+ /* Full width .,!? */
+ if ((2<=Bitmap) && (Bitmap<=5)) Punctuation->NewMajorEOL=True;
+ else
+ if ((Bitmap==9) || (Bitmap==10)) Punctuation->NewMajorEOL=True;
+ else
+ /* Half width .,!? */
+ if ((Bitmap==691) || (Bitmap==720)) Punctuation->NewMajorEOL=True;
+ else
+ /* Full width :; */
+ if ((Bitmap==7) || (Bitmap==8)) Punctuation->NewMinorEOL=True;
+ else
+ /* Half width :; */
+ if ((Bitmap==692) || (Bitmap==693)) Punctuation->NewMinorEOL=True;
+ else
+ /* Full width `"([< and other openings */
+ if ((38<=Bitmap) && (Bitmap<=58) && !(Bitmap%2)) Punctuation->NewOpening=True;
+ else
+ /* Half width `"([< and other openings */
+ if ((696<=Bitmap)&& (Bitmap<=716)&& !(Bitmap%2)) Punctuation->NewOpening=True;
+ else
+ /* Full width '")]> and other closings */
+ if ((39<=Bitmap) && (Bitmap<=59) && (Bitmap%2)) Punctuation->NewClosing=True;
+ else
+ /* Half width '")]> and other closings */
+ if ((697<=Bitmap) && (Bitmap<=717)&& (Bitmap%2)) Punctuation->NewClosing=True;
+ else
+ /* Full width Japanese center dot */
+ if (Bitmap==6) Punctuation->NewCenterDot=True;
+ else
+ /* Half width Japanese center dot */
+ if (Bitmap==469) Punctuation->NewCenterDot=True;
+ else
+ /* Full width Hiragana */
+ if ((283<=Bitmap) && (Bitmap<=365)) Punctuation->NewJapanese=True;
+ else
+ /* Full width Katakana */
+ if ((377<=Bitmap) && (Bitmap<=462)) Punctuation->NewJapanese=True;
+ else
+ /* Full width Kanji level 1 */
+ if ((1411<=Bitmap) && (Bitmap<=4375)) Punctuation->NewJapanese=True;
+ else
+ /* Full width Kanji level 2 */
+ if ((4419<=Bitmap) && (Bitmap<=7806)) Punctuation->NewJapanese=True;
+ else
+ /* Script Hiragana */
+ if ((753<=Bitmap) && (Bitmap<=835)) Punctuation->NewJapanese=True;
+ else
+ /* Script Katakana */
+ if ((847<=Bitmap) && (Bitmap<=932)) Punctuation->NewJapanese=True;
+}
+
+void Hyphenate(FILE *OutFile, struct PunctuationType *Punctuation)
+/* Adds hyphenation between consecutive Bitmaps */
+{
+ /* No hyphenation between two odd symbols */
+ if (Punctuation->OldJapanese || Punctuation->NewJapanese)
+ /* No hyphenation before some symbols */
+ if (!Punctuation->NewMajorEOL && !Punctuation->NewMinorEOL &&
+ !Punctuation->NewCenterDot && !Punctuation->NewClosing)
+ /* No hyphenation after some symbols */
+ if (!Punctuation->OldOpening) {
+ fprintf(OutFile,"\\hh");
+ if (ferror(OutFile)) exit(1);
+ }
+}
+
+void Glue(FILE *OutFile, struct PunctuationType *Punctuation, int ExtraSpace)
+/* Adds glue between consecutive Bitmaps */
+{
+ int GlueAdded;
+
+ GlueAdded=False;
+ if (ExtraSpace) {
+ /* Trying to add big glue */
+ if (Punctuation->OldMajorEOL)
+ /* No big glue between identical symbols */
+ if (!Punctuation->NewMajorEOL)
+ /* No big glue before some symbols */
+ if (!Punctuation->NewClosing) {
+ GlueAdded=True;
+ fprintf(OutFile,"\\eeee");
+ if (ferror(OutFile)) exit(1);
+ }
+ if (!GlueAdded)
+ /* Trying to add medium glue based on old symbol */
+ if (Punctuation->OldMinorEOL || Punctuation->OldCenterDot ||
+ Punctuation->OldClosing)
+ /* No medium glue before some symbols */
+ if (!Punctuation->NewMajorEOL && !Punctuation->NewMinorEOL &&
+ !Punctuation->NewClosing) {
+ GlueAdded=True;
+ fprintf(OutFile,"\\eee");
+ if (ferror(OutFile)) exit(1);
+ }
+ if (!GlueAdded)
+ /* Trying to add medium glue based on new symbol */
+ if (Punctuation->NewCenterDot || Punctuation->NewOpening)
+ /* No medium glue after some symbols */
+ if (!Punctuation->OldOpening) {
+ GlueAdded=True;
+ fprintf(OutFile,"\\eee");
+ if (ferror(OutFile)) exit(1);
+ }
+ }
+ /* Always make sure to add some glue */
+ if (!GlueAdded) {
+ /* Adding small glue */
+ fprintf(OutFile,"\\ee");
+ if (ferror(OutFile)) exit(1);
+ }
+}
+
+void Convert(FILE *InFile, FILE *OutFile, struct RunTimeType *RunTime)
+/* Convert .JEM into .TeX by translating Bitmaps & adding hyphenation & glue */
+{
+ /* Japanese punctuation information */
+ struct PunctuationType Punctuation;
+ /* Scanning information */
+ struct ScanningType Scanning;
+ /* Current font number */
+ int FontPtr;
+ char C0,C1,C2;
+
+ /* Not reached EOF yet */
+ Scanning.Done=False;
+ /* Echo in second pass */
+ Scanning.Echo=True;
+ /* Nothing done yet */
+ Scanning.Immediate=False;
+ Scanning.WasLetter=False;
+ /* Tell indirectly to GetBitmap that this is the first time it is called */
+ Scanning.Comment=True;
+ /* Initial japanese punctuation information */
+ Punctuation.NewMajorEOL=False; Punctuation.NewMinorEOL=False;
+ Punctuation.NewOpening=False; Punctuation.NewClosing=False;
+ Punctuation.NewCenterDot=False; Punctuation.NewJapanese=False;
+ do {
+ /* Set up scanning information in case a roman letter follows immediately */
+ Scanning.RomanMajorEOL=Punctuation.NewMajorEOL;
+ Scanning.RomanMinorEOL=(Punctuation.NewMinorEOL ||
+ Punctuation.NewCenterDot ||
+ Punctuation.NewClosing);
+ Scanning.RomanOpening=Punctuation.NewOpening;
+ /* Get the next Bitmap skipping over [La]TeX comments */
+ /* May add glue between the old Bitmap and an hypothetical Roman */
+ GetBitmap(InFile,OutFile,&Scanning,RunTime);
+ if (!Scanning.Done) {
+ /* Find what kind of Bitmap it is */
+ BitmapType(Scanning.Bitmap,&Punctuation);
+ if (Scanning.Immediate) {
+ /* Add hyphenation and glue between consecutive Bitmaps */
+ Hyphenate(OutFile,&Punctuation);
+ Glue(OutFile,&Punctuation,RunTime->ExtraSpace);
+ }
+ else
+ /* Add glue after the old Roman and before this new Bitmap */
+ if (RunTime->ExtraSpace)
+ if (Punctuation.NewCenterDot || Punctuation.NewOpening) {
+ fprintf(OutFile,"\\eee");
+ if (ferror(OutFile)) exit(1);
+ }
+ else
+ if (Scanning.WasLetter)
+ /* No medium glue before some symbols */
+ if (!Punctuation.NewMajorEOL && !Punctuation.NewMinorEOL &&
+ !Punctuation.NewClosing) {
+ fprintf(OutFile,"\\eee");
+ if (ferror(OutFile)) exit(1);
+ }
+ /* Write the Bitmap */
+ C0='a'+(char)(RunTime->Size-1);
+ FontPtr=Scanning.Bitmap / 128;
+ C1='a'+(char)(FontPtr / 8);
+ C2='a'+(char)(FontPtr % 8);
+ fprintf(OutFile,"\\kk{\\k%c%c%c}{%d}",C0,C1,C2,(Scanning.Bitmap % 128));
+ if (ferror(OutFile)) exit(1);
+ /* The next character may be Roman, GetBitmap will handle the glue then */
+ }
+ } while (!Scanning.Done);
+}
+
+/*----------------------------------- Main ----------------------------------*/
+
+main(int argc, char *argv[])
+{
+ /* Input and Output file names */
+ TotalNameType TotalName;
+ FILE *InFile;
+ FILE *OutFile;
+ /* Run time parameters */
+ struct RunTimeType RunTime;
+ /* JemTeX fonts used */
+ FontsType Fonts;
+
+ printf("\n");
+ printf("Japanese to [La]TeX Conversion Program.\n"); /*To make Borland happy*/
+ printf("Version 2.00 Copyright F. Jalbert 1991.\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ GetParameters(&RunTime,argc,argv);
+ printf("\n");
+ printf("Opening Japanese file %s",RunTime.FileName);
+ OpenFile(&InFile,&RunTime);
+ printf(".\n");
+ if (RunTime.LaTeX) printf("Creating LaTeX file %s.tex",RunTime.FileName);
+ else printf("Creating TeX file %s.tex",RunTime.FileName);
+ strcpy(TotalName,RunTime.FileName);
+ strcat(TotalName,".tex");
+ OutFile=fopen(TotalName,"wt");
+ if (OutFile==NULL) exit(1);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Scanning Japanese file for fonts");
+ #ifndef __TURBOC__
+ printf("\n");
+ #endif
+ GetFont(InFile,Fonts,&RunTime);
+ rewind(InFile);
+ /* ferror now cleared */
+ printf(".\n");
+ if (RunTime.LaTeX) printf("Writing LaTeX header");
+ else printf("Writing TeX header");
+ #ifndef __TURBOC__
+ printf("\n");
+ #endif
+ Header(OutFile,Fonts,RunTime.LaTeX);
+ printf(".\n");
+ printf("Converting Japanese file");
+ #ifndef __TURBOC__
+ printf("\n");
+ #endif
+ Convert(InFile,OutFile,&RunTime);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Closing Japanese file %s%s",RunTime.FileName,RunTime.Extension);
+ if (fclose(InFile)==EOF) exit(1);
+ printf(".\n");
+ if (RunTime.LaTeX) printf("Closing LaTeX file %s.tex",RunTime.FileName);
+ else printf("Closing TeX file %s.tex",RunTime.FileName);
+ if (fclose(OutFile)==EOF) exit(1);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Japanese to [La]TeX conversion completed.\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ return(0);
+}
diff --git a/systems/msdos/jemtex2/jem2tex.pas b/systems/msdos/jemtex2/jem2tex.pas
new file mode 100644
index 0000000000..78d84ba295
--- /dev/null
+++ b/systems/msdos/jemtex2/jem2tex.pas
@@ -0,0 +1,1209 @@
+{$A-,B-,D-,E-,F-,I+,L-,N-,O-,R-,S-,V-}
+{Compile with Turbo-Pascal 5.0}
+Program Jem2TeX(Input,Output);
+{
+ This program translates a .JEM file into a .TeX file
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: January 1991
+
+ Version: 1.01
+
+ Modifications: - Added \hskip0pt plus0.1em between all Japanese symbols which
+ improved dramatically line breaks and inter-sentence spacing
+ since [La]TeX could only add glue between whole Japanese
+ sentences.
+ - Extra space after punctuation is now an option since it is
+ not desirable with MuTeX when the text is to go under the
+ staff.
+ - Font names now use only small letters to be compatible with
+ the fontlib program supplied with emTeX.
+ - Command line parameters now supported.
+ - Run-time parameters now supported.
+ - Updated and improved run-time messages.
+
+ Date: April 1991
+
+ Version: 2.00
+
+ Modifications: - Added four kanjis.
+ - If desired, only standard JIS '83 characters are allowed.
+ - If desired, a % is added at each Japanese end of line.
+ - Three file name extensions .JEM .JPN .JAP now supported.
+ - Default extension is .JEM and the program has been renamed.
+ - Three run-time parameter flags now supported.
+ - Japanese comments not translated anymore for reference.
+ - Hyphenation and glue handled separately for better control.
+ - More clever algorithm for Japanese hyphenation.
+ - Space after some punctuation now obtained with \eeee.
+ - Small space around some punctuation introduced with \eee.
+ - Tiny space between Japanese characters with \ee.
+ - Space between Japanese and Roman with \eeee and \eee.
+ - Symbols separated only by [La]TeX comments are now
+ recognized as consecutive.
+ - MS-kanji (Shift-JIS) now supported.
+
+ Error Levels: 0 - Normal termination.
+ 1 - Error.
+}
+Const
+ {Highest Bitmap number in JIS24}
+ BitmapMax=7806;
+ {Highest font number}
+ FontMax=60; {Floor of 7806 Div 128}
+ {Highest size number}
+ SizeMax=7; {magsteps are 0, 0.5, 1, 2, 3, 4, 5}
+ {File name extensions in priority order}
+ Extension1:String[4]='.jem';
+ Extension2:String[4]='.jpn';
+ Extension3:String[4]='.jap';
+ {Run-time flag of all the same length}
+ RunFlag1:String[7]='JEM2TEX';
+ RunFlag2:String[7]='JPN2TEX';
+ RunFlag3:String[7]='JAP2TEX';
+ {Parameter flag}
+ Flag1='/'; {DOS style}
+ Flag2='-'; {UNIX style}
+ {Parameter keywords in approximate decreasing length order}
+ Space1:String[10]='EXTRASPACE';
+ Space2:String[5]='EXTRA';
+ Space3:String[5]='SPACE';
+ NoSpace1:String[12]='NOEXTRASPACE';
+ NoSpace2:String[7]='NOEXTRA';
+ NoSpace3:String[7]='NOSPACE';
+ Percent1:String[7]='COMMENT';
+ Percent2:String[7]='PERCENT';
+ Percent3:String[3]='EOL';
+ NoPercent1:String[9]='NOCOMMENT';
+ NoPercent2:String[9]='NOPERCENT';
+ NoPercent3:String[5]='NOEOL';
+ EUC1:String[3]='EUC';
+ NoEUC1:String[7]='MSKANJI';
+ NoEUC2:String[8]='SHIFTJIS';
+ Extended1:String[8]='EXTENDED';
+ Standard1:String[8]='STANDARD';
+ LaTeX1:String[5]='LATEX';
+ TeX1:String[5]='MUTEX';
+ TeX2:String[3]='TEX';
+ One1:String[4]='1000';
+ Two1:String[4]='1095';
+ Three1:String[4]='1200';
+ Four1:String[4]='1440';
+ Five1:String[4]='1728';
+ Six1:String[4]='2074';
+ Seven1:String[4]='2488';
+ One2:String[3]='0.0';
+ Two2:String[3]='0.5';
+ Three2:String[3]='1.0';
+ Four2:String[3]='2.0';
+ Five2:String[3]='3.0';
+ Six2:String[3]='4.0';
+ Seven2:String[3]='5.0';
+ One3:String[1]='0';
+ Three3:String[1]='1';
+ Four3:String[1]='2';
+ Five3:String[1]='3';
+ Six3:String[1]='4';
+ Seven3:String[1]='5';
+
+Type
+ InFileType=File Of Byte;
+ OutFileType=Text;
+ BitmapRange=1..BitmapMax;
+ FontRange=0..FontMax;
+ FontType=Array [FontRange] Of Boolean;
+ SizeRange=1..SizeMax;
+ FontsType=Array [SizeRange] Of FontType;
+ {Run time parameters}
+ RunTimeType=Record
+ FileName,Extension:String;
+ ExtraSpace,Percent,LaTeX,EUC,Extended:Boolean;
+ Size:SizeRange;
+ End;
+ {Japanese punctuation information}
+ PunctuationType=Record
+ {Indicates .,!? present}
+ OldMajorEOL,NewMajorEOL:Boolean;
+ {Indicates :; present}
+ OldMinorEOL,NewMinorEOL:Boolean;
+ {Indicates `"([< and other openings present}
+ OldOpening,NewOpening:Boolean;
+ {Indicates '")]> and other closings present}
+ OldClosing,NewClosing:Boolean;
+ {Indicates Japanese center dot present}
+ OldCenterDot,NewCenterDot:Boolean;
+ {Indicates Hiragana, Katakana, or Kanji present}
+ OldJapanese,NewJapanese:Boolean
+ End;
+ {Scanning Information}
+ ScanningType=Record
+ {Current pass terminated}
+ Done:Boolean;
+ {Indicates the current pass must produce output}
+ Echo:Boolean;
+ {Indicates the current line is a comment}
+ Comment:Boolean;
+ {Indicates current Bitmap immediately followed previous one}
+ Immediate:Boolean;
+ {Indicates the last Roman character was a letter or digit}
+ WasLetter:Boolean;
+ {Used for glue after a bitmap and before a roman}
+ RomanMajorEOL,RomanMinorEOL,RomanOpening:Boolean;
+ {Non-comment Bitmap found}
+ Found:Boolean;
+ {Processing the first character on the line which could be %}
+ First:Boolean;
+ {Comment line which may contain Bitmaps}
+ CommentLine:String;
+ {Current JIS24 Bitmap number}
+ Bitmap:BitmapRange;
+ {Roman or first part of Bitmap read}
+ Data1:Byte
+ End;
+
+Var
+ {Input and Output file names}
+ InFile:InFileType;
+ OutFile:OutFileType;
+ {Run time parameters}
+ RunTime:RunTimeType;
+ {JemTeX fonts used}
+ Fonts:FontsType;
+
+{------------------------------ EchoParameters -------------------------------}
+
+Procedure EchoParameters(Var EchoFile:Text; Var RunTime:RunTimeType);
+{Echoes the current parameters in EchoFile}
+Begin
+With RunTime Do
+ Begin
+ Write(EchoFile,'File='+FileName);
+ If ExtraSpace Then Write(EchoFile,' Space')
+ Else Write(EchoFile,' No Space');
+ If Percent Then Write(EchoFile,' Added %')
+ Else Write(EchoFile,' No Added %');
+ If LaTeX Then Write(EchoFile,' LaTeX')
+ Else Write(EchoFile,' TeX');
+ If EUC Then Write(EchoFile,' EUC')
+ Else Write(EchoFile,' MS-kanji');
+ If Extended Then Write(EchoFile,' Extended')
+ Else Write(EchoFile,' Standard');
+ Write(EchoFile,' Font Size=');
+ Case Size Of
+ 1:Write(EchoFile,'1000');
+ 2:Write(EchoFile,'1095');
+ 3:Write(EchoFile,'1200');
+ 4:Write(EchoFile,'1440');
+ 5:Write(EchoFile,'1728');
+ 6:Write(EchoFile,'2074');
+ 7:Write(EchoFile,'2488')
+ End;
+ Writeln(EchoFile,'.')
+ End
+End;
+
+{------------------------------- GetParameters -------------------------------}
+
+Procedure SimpleQuery(Title,ChoiceA,ChoiceB:String; Var Answer:Boolean);
+Var
+ JChar:Char;
+ Valid:Boolean;
+Begin
+Repeat
+ Valid:=True;
+ Writeln(Title+':');
+ Writeln(' a) '+ChoiceA);
+ Writeln(' b) '+ChoiceB);
+ Write('Your choice? ');
+ Readln(JChar);
+ JChar:=UpCase(JChar);
+ If JChar='A' Then Answer:=True
+ Else
+ If JChar='B' Then Answer:=False
+ Else
+ Begin Valid:=False; Write(Chr(7)) End
+Until Valid;
+Writeln
+End;
+
+Procedure SizeQuery(Var Size:SizeRange);
+Var
+ JChar:Char;
+ Valid:Boolean;
+Begin
+Repeat
+ Valid:=True;
+ Writeln('Japanese Font Size:');
+ Writeln(' a) 1000 magstep(0.0)');
+ Writeln(' b) 1095 magstep(0.5)');
+ Writeln(' c) 1200 magstep(1.0)');
+ Writeln(' d) 1440 magstep(2.0)');
+ Writeln(' e) 1728 magstep(3.0)');
+ Writeln(' f) 2074 magstep(4.5)');
+ Writeln(' g) 2488 magstep(5.0)');
+ Write('Your choice? ');
+ Readln(JChar);
+ JChar:=UpCase(JChar);
+ If ('A'<=JChar) And (JChar<='G') Then
+ Size:=Ord(JChar)-Ord('A')+1
+ Else
+ Begin Valid:=False; Write(Chr(7)) End
+Until Valid;
+Writeln
+End;
+
+Procedure Manual(Var RunTime:RunTimeType);
+{Get parameters from user}
+Begin
+With RunTime Do
+ Begin
+ Write('Japanese file name? ');
+ Readln(FileName);
+ Writeln;
+ SimpleQuery('Space around Japanese punctuation','Space','No space',ExtraSpace);
+ SimpleQuery('Added % at Japanese end of lines','Added %','No added %',Percent);
+ SimpleQuery('LaTeX or TeX (MuTeX) output','LaTeX','TeX',LaTeX);
+ SimpleQuery('EUC or MS-kanji (Shift-JIS) encoding','EUC','MS-kanji',EUC);
+SimpleQuery('Extended JIS ''83 Bitmaps allowed','Extended','Standard',Extended);
+ SizeQuery(Size)
+ End
+End;
+
+Procedure Automate(Var RunTime:RunTimeType);
+{Get parameters from command line}
+Var
+ ParamIndex,Index:Integer;
+ Param:String;
+Begin
+With RunTime Do
+ Begin
+ {Defaults}
+ FileName:='japanese';
+ ExtraSpace:=True;
+ Percent:=True;
+ LaTeX:=True;
+ EUC:=True;
+ Extended:=True;
+ Size:=4;
+ {Scan command line parameters}
+ For ParamIndex:=1 To ParamCount Do
+ Begin
+ Param:=ParamStr(ParamIndex);
+ If (Param[1]=Flag1) Or (Param[1]=Flag2) Then
+ {Not a filename}
+ Begin
+ {Delete 1 char at the 1st position}
+ Delete(Param,1,1);
+ {Convert to upper case}
+ For Index:=1 To Length(Param) Do Param[Index]:=UpCase(Param[Index]);
+ {Scan known keywords}
+ If (Param=Space1) Or (Param=Space2) Or (Param=Space3)Then ExtraSpace:=True
+ Else
+ If (Param=NoSpace1) Or (Param=NoSpace2) Or (Param=NoSpace3) Then
+ ExtraSpace:=False
+ Else
+ If (Param=Percent1) Or (Param=Percent2) Or (Param=Percent3) Then
+ Percent:=True
+ Else
+ If (Param=NoPercent1) Or (Param=NoPercent2) Or (Param=NoPercent3) Then
+ Percent:=False
+ Else
+ If Param=EUC1 Then EUC:=True
+ Else
+ If (Param=NoEUC1) Or (Param=NoEUC2) Then EUC:=False
+ Else
+ If Param=Extended1 Then Extended:=True
+ Else
+ If Param=Standard1 Then Extended:=False
+ Else
+ If Param=LaTeX1 Then LaTeX:=True
+ Else
+ If (Param=TeX1) Or (Param=TeX2) Then LaTeX:=False
+ Else
+ If (Param=One1) Or (Param=One2) Or (Param=One3) Then Size:=1
+ Else
+ If (Param=Two1) Or (Param=Two2) Then Size:=2
+ Else
+ If (Param=Three1) Or (Param=Three2) Or (Param=Three3) Then Size:=3
+ Else
+ If (Param=Four1) Or (Param=Four2) Or (Param=Four3) Then Size:=4
+ Else
+ If (Param=Five1) Or (Param=Five2) Or (Param=Five3) Then Size:=5
+ Else
+ If (Param=Six1) Or (Param=Six2) Or (Param=Six3) Then Size:=6
+ Else
+ If (Param=Seven1) Or (Param=Seven2) Or (Param=Seven3) Then Size:=7
+ Else
+ {Unknown keyword}
+ Begin
+ Writeln(Chr(7)+'Invalid command line parameter: '+Param+'...');
+ Halt(1)
+ End
+ End
+ Else
+ {Must be a filename, we'll try to open it later}
+ FileName:=Param
+ End
+ End
+End;
+
+Procedure GetParameters(Var RunTime:RunTimeType);
+{Get parameters from user or command line}
+{Current parameter status is echoed on the console}
+Begin
+If ParamCount=0 Then Manual(RunTime)
+Else Automate(RunTime);
+EchoParameters(Output,RunTime)
+End;
+
+{-------------------------------- OpenFile -----------------------------------}
+
+Function TryExtension(Var InFile:InFileType; Var RunTime:RunTimeType;
+ TriedExtension:String):Boolean;
+{Tries to open FileName using TriedExtension}
+Begin
+With RunTime Do
+ Begin
+ Extension:=TriedExtension;
+ Assign(InFile,FileName+TriedExtension);
+ {$I-}Reset(InFile);{$I+}
+ {IOResult must be immediately used once only}
+ TryExtension:=(IOResult=0)
+ End
+End;
+
+Procedure OpenFile(Var InFile:InFileType; Var RunTime:RunTimeType);
+{Tries to open FileName using all available extensions}
+Begin
+If TryExtension(InFile,RunTime,Extension1) Then Write(Extension1)
+Else
+ If TryExtension(InFile,RunTime,Extension2) Then Write(Extension2)
+ Else
+ If TryExtension(InFile,RunTime,Extension3) Then Write(Extension3)
+ Else
+ Begin
+ Writeln('.');
+ Writeln(Chr(7)+'File not found'+'...');
+ Halt(1)
+ End
+End;
+
+{-------------------------------- GetBitmap ----------------------------------}
+
+Procedure PerformScan(Var CommentLine:String; Var RunTime:RunTimeType;
+ Echo:Boolean; Var OutFile:OutFileType);
+{Scans the comment line for run-time JEM2TEX parameters}
+{Any Bitmap or unknown parameter stops the scan}
+{Current parameter status is echoed in the .TeX file as a [La]TeX comment}
+Var Index:Integer;
+Begin
+{Delete 1 char at the 1st position which is %}
+Delete(CommentLine,1,1);
+{Convert to upper case}
+For Index:=1 To Length(CommentLine) Do
+ CommentLine[Index]:=UpCase(CommentLine[Index]);
+{Add space at the line end to characterize premature termination}
+{Add sentinel at the line end to stop forthcoming loops}
+CommentLine:=CommentLine+' %';
+{Delete leading blanks}
+If CommentLine[1]=' ' Then
+ Repeat Delete(CommentLine,1,1)
+ Until CommentLine[1]<>' ';
+{Look for run-time flag at the start of line}
+If ( RunFlag1=Copy(CommentLine,1,Length(RunFlag1)) ) Or
+ ( RunFlag2=Copy(CommentLine,1,Length(RunFlag1)) ) Or
+ ( RunFlag3=Copy(CommentLine,1,Length(RunFlag1)) )
+Then
+ Begin
+ {Remove run-time flag}
+ Delete(CommentLine,1,Length(RunFlag1));
+ {Scan until sentinel reached}
+ Repeat
+ {Delete leading blanks}
+ If CommentLine[1]=' ' Then
+ Repeat Delete(CommentLine,1,1)
+ Until CommentLine[1]<>' ';
+ If (CommentLine[1]=Flag1) Or (CommentLine[1]=Flag2) Then
+ {Valid run-time parameter flag}
+ Begin
+ {Delete 1 char at the 1st position which is flag}
+ Delete(CommentLine,1,1);
+ {Scan in decreasing length order}
+ With RunTime Do
+ Begin
+ If Space1=Copy(CommentLine,1,Length(Space1)) Then
+ Begin Delete(CommentLine,1,Length(Space1)); ExtraSpace:=True End
+ Else
+ If Space2=Copy(CommentLine,1,Length(Space2)) Then
+ Begin Delete(CommentLine,1,Length(Space2)); ExtraSpace:=True End
+ Else
+ If Space3=Copy(CommentLine,1,Length(Space3)) Then
+ Begin Delete(CommentLine,1,Length(Space3)); ExtraSpace:=True End
+ Else
+ If NoSpace1=Copy(CommentLine,1,Length(NoSpace1)) Then
+ Begin Delete(CommentLine,1,Length(NoSpace1)); ExtraSpace:=False End
+ Else
+ If NoSpace2=Copy(CommentLine,1,Length(NoSpace2)) Then
+ Begin Delete(CommentLine,1,Length(NoSpace2)); ExtraSpace:=False End
+ Else
+ If NoSpace3=Copy(CommentLine,1,Length(NoSpace3)) Then
+ Begin Delete(CommentLine,1,Length(NoSpace3)); ExtraSpace:=False End
+ Else
+ If Percent1=Copy(CommentLine,1,Length(Percent1)) Then
+ Begin Delete(CommentLine,1,Length(Percent1)); Percent:=True End
+ Else
+ If Percent2=Copy(CommentLine,1,Length(Percent2)) Then
+ Begin Delete(CommentLine,1,Length(Percent2)); Percent:=True End
+ Else
+ If Percent3=Copy(CommentLine,1,Length(Percent3)) Then
+ Begin Delete(CommentLine,1,Length(Percent3)); Percent:=True End
+ Else
+ If NoPercent1=Copy(CommentLine,1,Length(NoPercent1)) Then
+ Begin Delete(CommentLine,1,Length(NoPercent1)); Percent:=False End
+ Else
+ If NoPercent2=Copy(CommentLine,1,Length(NoPercent2)) Then
+ Begin Delete(CommentLine,1,Length(NoPercent2)); Percent:=False End
+ Else
+ If NoPercent3=Copy(CommentLine,1,Length(NoPercent3)) Then
+ Begin Delete(CommentLine,1,Length(NoPercent3)); Percent:=False End
+ Else
+ If EUC1=Copy(CommentLine,1,Length(EUC1)) Then
+ Begin Delete(CommentLine,1,Length(EUC1)); EUC:=True End
+ Else
+ If NoEUC1=Copy(CommentLine,1,Length(NoEUC1)) Then
+ Begin Delete(CommentLine,1,Length(NoEUC1)); EUC:=False End
+ Else
+ If NoEUC2=Copy(CommentLine,1,Length(NoEUC2)) Then
+ Begin Delete(CommentLine,1,Length(NoEUC2)); EUC:=False End
+ Else
+ If Extended1=Copy(CommentLine,1,Length(Extended1)) Then
+ Begin Delete(CommentLine,1,Length(Extended1)); Extended:=True End
+ Else
+ If Standard1=Copy(CommentLine,1,Length(Standard1)) Then
+ Begin Delete(CommentLine,1,Length(Standard1)); Extended:=False End
+ Else
+ If LaTeX1=Copy(CommentLine,1,Length(LaTeX1)) Then
+ Begin Delete(CommentLine,1,Length(LaTeX1)); LaTeX:=True End
+ Else
+ If TeX1=Copy(CommentLine,1,Length(TeX1)) Then
+ Begin Delete(CommentLine,1,Length(TeX1)); LaTeX:=False End
+ Else
+ If TeX2=Copy(CommentLine,1,Length(TeX2)) Then
+ Begin Delete(CommentLine,1,Length(TeX2)); LaTeX:=False End
+ Else
+ If One1=Copy(CommentLine,1,Length(One1)) Then
+ Begin Delete(CommentLine,1,Length(One1)); Size:=1 End
+ Else
+ If Two1=Copy(CommentLine,1,Length(Two1)) Then
+ Begin Delete(CommentLine,1,Length(Two1)); Size:=2 End
+ Else
+ If Three1=Copy(CommentLine,1,Length(Three1)) Then
+ Begin Delete(CommentLine,1,Length(Three1)); Size:=3 End
+ Else
+ If Four1=Copy(CommentLine,1,Length(Four1)) Then
+ Begin Delete(CommentLine,1,Length(Four1)); Size:=4 End
+ Else
+ If Five1=Copy(CommentLine,1,Length(Five1)) Then
+ Begin Delete(CommentLine,1,Length(Five1)); Size:=5 End
+ Else
+ If Six1=Copy(CommentLine,1,Length(Six1)) Then
+ Begin Delete(CommentLine,1,Length(Six1)); Size:=6 End
+ Else
+ If Seven1=Copy(CommentLine,1,Length(Seven1)) Then
+ Begin Delete(CommentLine,1,Length(Seven1)); Size:=7 End
+ Else
+ If One2=Copy(CommentLine,1,Length(One2)) Then
+ Begin Delete(CommentLine,1,Length(One2)); Size:=1 End
+ Else
+ If Two2=Copy(CommentLine,1,Length(Two2)) Then
+ Begin Delete(CommentLine,1,Length(Two2)); Size:=2 End
+ Else
+ If Three2=Copy(CommentLine,1,Length(Three2)) Then
+ Begin Delete(CommentLine,1,Length(Three2)); Size:=3 End
+ Else
+ If Four2=Copy(CommentLine,1,Length(Four2)) Then
+ Begin Delete(CommentLine,1,Length(Four2)); Size:=4 End
+ Else
+ If Five2=Copy(CommentLine,1,Length(Five2)) Then
+ Begin Delete(CommentLine,1,Length(Five2)); Size:=5 End
+ Else
+ If Six2=Copy(CommentLine,1,Length(Six2)) Then
+ Begin Delete(CommentLine,1,Length(Six2)); Size:=6 End
+ Else
+ If Seven2=Copy(CommentLine,1,Length(Seven2)) Then
+ Begin Delete(CommentLine,1,Length(Seven2)); Size:=7 End
+ Else
+ If One3=Copy(CommentLine,1,Length(One3)) Then
+ Begin Delete(CommentLine,1,Length(One3)); Size:=1 End
+ Else
+ If Three3=Copy(CommentLine,1,Length(Three3)) Then
+ Begin Delete(CommentLine,1,Length(Three3)); Size:=3 End
+ Else
+ If Four3=Copy(CommentLine,1,Length(Four3)) Then
+ Begin Delete(CommentLine,1,Length(Four3)); Size:=4 End
+ Else
+ If Five3=Copy(CommentLine,1,Length(Five3)) Then
+ Begin Delete(CommentLine,1,Length(Five3)); Size:=5 End
+ Else
+ If Six3=Copy(CommentLine,1,Length(Six3)) Then
+ Begin Delete(CommentLine,1,Length(Six3)); Size:=6 End
+ Else
+ If Seven3=Copy(CommentLine,1,Length(Seven3)) Then
+ Begin Delete(CommentLine,1,Length(Seven3)); Size:=7 End
+ Else
+ {Unknown run-time parameter}
+ {Terminate prematurely current scan}
+ CommentLine:='%'
+ End;
+ {Echo status if allowed}
+ If Echo And (CommentLine<>'%') Then
+ Begin
+ Write(OutFile,'%');
+ EchoParameters(OutFile,RunTime)
+ End
+ End
+ Else
+ {Unknown run-time parameter flag}
+ {Terminate prematurely current scan}
+ CommentLine:='%'
+ Until Length(CommentLine)=1
+ End
+End;
+
+Procedure LineBreak(Var OutFile:OutFileType; ExtraSpace:Boolean;
+ Var Scanning:ScanningType);
+{The continuous chain of Bitmaps has just been interrupted by a line break}
+{We know the next Roman character is equivalent to a space, i.e. not a letter}
+{A \eeee may be inserted if the previous Bitmap was a .,!?}
+{A \eee may be inserted if the previous Bitmap was a :; center dot )]'"}
+{If glue inserted, make sure to leave a totally blank line as present before}
+Begin
+With Scanning Do
+ Begin
+ Immediate:=False;
+ If Echo And ExtraSpace Then
+ If RomanMajorEOL Then Writeln(OutFile,'\eeee')
+ Else
+ If RomanMinorEOL Then Writeln(OutFile,'\eee')
+ End
+End;
+
+Procedure RomanBreak(Var OutFile:OutFileType; ExtraSpace:Boolean;
+ Var Scanning:ScanningType);
+{The continuous chain of Bitmaps has just been interrupted by a Roman}
+{The next Roman character may be a letter so a \eee is possible}
+{A \eeee may be inserted if the previous Bitmap was a .,!?}
+{A \eee may be inserted if the previous Bitmap was a :; center dot )]'"}
+{Curly brackets are used in \eee and \eeee when the next Roman is a letter}
+Begin
+With Scanning Do
+ Begin
+ Immediate:=False;
+ If Echo And ExtraSpace Then
+ If RomanMajorEOL Then
+ If WasLetter Then Write(OutFile,'\eeee{}')
+ Else Write(OutFile,'\eeee')
+ Else
+ If RomanMinorEOL Then
+ If WasLetter Then Write(OutFile,'\eee{}')
+ Else Write(OutFile,'\eee')
+ Else
+ If WasLetter And Not RomanOpening Then Write(OutFile,'\eee{}')
+ End
+End;
+
+Procedure GotUNIX(Var OutFile:OutFileType; Var Scanning:ScanningType;
+ Var RunTime:RunTimeType);
+{Handles UNIX EOL}
+{May add glue after the previous Bitmap and before this Roman}
+Begin
+With Scanning,RunTime Do
+ Begin
+ If Immediate Then
+ If First Then LineBreak(OutFile,ExtraSpace,Scanning)
+ Else
+ If Not Comment Then
+ If Percent Then
+ If Echo Then Write(OutFile,'%')
+ Else
+ Else
+ LineBreak(OutFile,ExtraSpace,Scanning);
+ If Echo Then Writeln(OutFile);
+ If Comment Then
+ If Not First Then PerformScan(CommentLine,RunTime,Echo,OutFile)
+ Else
+ Else
+ WasLetter:=False;
+ First:=True;
+ Comment:=True;
+ CommentLine:=''
+ End
+End;
+
+Procedure GotDOS(Var OutFile:OutFileType; Var Scanning:ScanningType;
+ Var RunTime:RunTimeType; Var InFile:InFileType);
+{Handles DOS EOL}
+{May add glue after the previous Bitmap and before this Roman}
+{An error only stops the current pass to help the user determine its cause}
+Var Data2:Byte;
+Begin
+With Scanning Do
+ Begin
+ GotUNIX(OutFile,Scanning,RunTime);
+ {Line Feed must follow immediately}
+ If EOF(InFile) Then Done:=True
+ Else
+ Begin
+ Read(InFile,Data2);
+ If Data2<>$0A Then Done:=True
+ End;
+ If Done Then
+ Begin
+ Writeln('.');
+ Write(Chr(7)+'Abnormal DOS end of line..')
+ End
+ End
+End;
+
+Procedure ValidateBitmap(Bitmap:BitmapRange);
+{Prints a warning when an extended or an empty Bitmap is used}
+Var Invalid:Boolean;
+Begin
+Invalid:=False;
+If (109<=Bitmap) And (Bitmap<=119) Then Invalid:=True
+Else
+If (128<=Bitmap) And (Bitmap<=135) Then Invalid:=True
+Else
+If (143<=Bitmap) And (Bitmap<=153) Then Invalid:=True
+Else
+If (169<=Bitmap) And (Bitmap<=175) Then Invalid:=True
+Else
+If (184<=Bitmap) And (Bitmap<=203) Then Invalid:=True
+Else
+If (214<=Bitmap) And (Bitmap<=220) Then Invalid:=True
+Else
+If (247<=Bitmap) And (Bitmap<=252) Then Invalid:=True
+Else
+If (279<=Bitmap) And (Bitmap<=282) Then Invalid:=True
+Else
+If Bitmap=366 Then Invalid:=True
+Else
+If (463<=Bitmap) And (Bitmap<=470) Then Invalid:=True
+Else
+If (495<=Bitmap) And (Bitmap<=502) Then Invalid:=True
+Else
+If (527<=Bitmap) And (Bitmap<=564) Then Invalid:=True
+Else
+If (598<=Bitmap) And (Bitmap<=612) Then Invalid:=True
+Else
+If (646<=Bitmap) And (Bitmap<=658) Then Invalid:=True
+Else
+If (691<=Bitmap) And (Bitmap<=1410) Then Invalid:=True
+Else
+If (4376<=Bitmap) And (Bitmap<=4418) Then Invalid:=True;
+If Invalid Then
+ Begin
+ Writeln('.');
+ Write('Warning! The non-standard JIS ''83 Bitmap ',Bitmap,' encountered')
+ End
+End;
+
+Procedure GotBitmap(Var OutFile:OutFileType; EUC,Extended:Boolean;
+ Var InFile:InFileType; Var Scanning:ScanningType);
+{Handles Bitmap}
+{An error only stops the current pass to help the user determine its cause}
+{If desired, non-standard Bitmaps are pointed out in the first pass}
+Var Data2:Byte;
+Begin
+With Scanning Do
+ Begin
+ If First Then
+ {First character on line}
+ Begin
+ First:=False;
+ Comment:=False
+ End;
+ If EOF(InFile) Then
+ Begin
+ Done:=True;
+ Writeln('.');
+ If EUC Then Write(Chr(7)+'Incomplete EUC character pair..')
+ Else Write(Chr(7)+'Incomplete MS-kanji character pair..')
+ End
+ Else
+ Begin
+ Read(InFile,Data2);
+ If EUC Then
+ If ($A0<Data2) And (Data2<$FF) Then
+ Bitmap:=94*(Data1-$A1)+(Data2-$A1)+1
+ Else
+ Begin
+ Done:=True;
+ Writeln('.');
+ Write(Chr(7)+'Invalid EUC character pair..')
+ End
+ Else
+ If ( ($40<=Data2) And (Data2<=$7E) ) Or
+ ( ($80<=Data2) And (Data2<=$FC) )
+ Then
+ Begin
+ If (Data1>=$E0) Then Bitmap:=1+188*(Data1-$C1)
+ Else Bitmap:=1+188*(Data1-$81);
+ If (Data2>=$80) Then Bitmap:=Bitmap+(Data2-$41)
+ Else Bitmap:=Bitmap+(Data2-$40)
+ End
+ Else
+ Begin
+ Done:=True;
+ Writeln('.');
+ Write(Chr(7)+'Invalid MS-kanji character pair..')
+ End;
+ If Not Done Then
+ {Bitmaps in comment skipped}
+ If Comment Then
+ Begin
+ CommentLine:=CommentLine+Chr(Data1)+Chr(Data2);
+ If Echo Then Write(OutFile,Chr(Data1)+Chr(Data2))
+ End
+ Else
+ If (1<=Bitmap) And (Bitmap<=BitmapMax) Then
+ Begin
+ Found:=True;
+ {Point out non-standard Bitmaps in first pass}
+ If Not Echo And Not Extended Then ValidateBitmap(Bitmap)
+ End
+ Else
+ Begin
+ Done:=True;
+ Writeln('.');
+ Write(Chr(7)+'Bitmap ',Bitmap,' does not exist..')
+ End
+ End
+ End
+End;
+
+Procedure GotRoman(Var OutFile:OutFileType; ExtraSpace:Boolean;
+ Var Scanning:ScanningType);
+{Handles roman}
+{May add glue after the previous Bitmap and before this Roman}
+Begin
+With Scanning Do
+ Begin
+ If First Then
+ {First character on line}
+ Begin
+ First:=False;
+ If Chr(Data1)<>'%' Then Comment:=False
+ End;
+ If Comment Then CommentLine:=CommentLine+Chr(Data1)
+ Else
+ Begin
+ {Determine if this roman is a letter or a number}
+ WasLetter:=( ('A'<=UpCase(Chr(Data1))) And (UpCase(Chr(Data1))<='Z') ) Or
+ ( ('0'<=Chr(Data1)) And (Chr(Data1)<='9') );
+ If Immediate Then RomanBreak(OutFile,ExtraSpace,Scanning)
+ End;
+ If Echo Then Write(OutFile,Chr(Data1))
+ End
+End;
+
+Procedure GetBitmap(Var InFile:InFileType; Var OutFile:OutFileType;
+ Var Scanning:ScanningType; Var RunTime:RunTimeType);
+{Scans input file and stops when a Bitmap is met}
+{An error only stops the current pass to help the user determine its cause}
+{Accepts UNIX LF or DOS CR/LF as end of line indicator in input file}
+{Updates JemTeX parameters with run-time parameters}
+{Comment indicates the line is a comment line and does not break continuity}
+{Immediate indicates the current Bitmap immediately followed previous Bitmap}
+{If the next character encountered is Roman, glue may be inserted}
+{If desired, will add % at Japanese end of lines to preserve continuity}
+Begin
+With Scanning,RunTime Do
+ Begin
+ {No Bitmap found initially}
+ Found:=False;
+ {Assume the next character is a Bitmap}
+ WasLetter:=False;
+ Immediate:=True;
+ {Some non-comment Bitmap was met before or it's the first call to GetBitmap}
+ CommentLine:='';
+ {Comment holds; it's the first call ever to GetBitmap; it's first character}
+ {Comment fails; some non-comment Bitmap was met before; it isnt 1st character}
+ First:=Comment;
+ Repeat
+ {Check if file just finished}
+ If EOF(InFile) Then Done:=True
+ Else
+ {More file coming}
+ Begin
+ Read(InFile,Data1);
+ If Data1=$0A Then GotUNIX(OutFile,Scanning,RunTime)
+ Else
+ If Data1=$0D Then GotDOS(OutFile,Scanning,RunTime,InFile)
+ Else
+ If EUC Then
+ If ($A0<Data1) And (Data1<$FF) Then
+ GotBitmap(OutFile,EUC,Extended,InFile,Scanning)
+ Else
+ GotRoman(OutFile,ExtraSpace,Scanning)
+ Else
+ If ( ($81<=Data1) And (Data1<=$9F) ) Or
+ ( ($E0<=Data1) And (Data1<=$EA) )
+ Then
+ GotBitmap(OutFile,EUC,Extended,InFile,Scanning)
+ Else
+ GotRoman(OutFile,ExtraSpace,Scanning)
+ End
+ Until Done Or Found
+ End
+End;
+
+{---------------------------------- GetFont ----------------------------------}
+
+Procedure GetFont(Var InFile:InFileType; Var Fonts:FontsType;
+ Var InitialRunTime:RunTimeType);
+{Finds the Japanese fonts needed}
+Var
+ {Run time parameters}
+ RunTime:RunTimeType;
+ {Current font number}
+ FontPtr:FontRange;
+ SizePtr:SizeRange;
+ {Scanning information}
+ Scanning:ScanningType;
+ {Dummy since no output in first pass}
+ DummyOutFile:OutFileType;
+Begin
+RunTime:=InitialRunTime;
+{No Japanese font needed so far}
+For SizePtr:=1 To SizeMax Do
+ For FontPtr:=0 To FontMax Do
+ Fonts[SizePtr,FontPtr]:=False;
+With Scanning Do
+ Begin
+ {Not reached EOF yet}
+ Done:=False;
+ {No echo in first pass}
+ Echo:=False;
+ {Dummy since no output in first pass}
+ Immediate:=False;
+ WasLetter:=False;
+ RomanMajorEOL:=False;
+ RomanMinorEOL:=False;
+ RomanOpening:=False;
+ {Tell indirectly to GetBitmap that this is the first time it is called}
+ Comment:=True;
+ Repeat
+ {Get the next Bitmap skipping over [La]TeX comments}
+ GetBitmap(InFile,DummyOutFile,Scanning,RunTime);
+ If Not Done Then Fonts[RunTime.Size,Bitmap Div 128]:=True
+ Until Done
+ End;
+{Last state of LaTeX prevails for the second pass}
+InitialRunTime.LaTeX:=RunTime.LaTeX
+End;
+
+{----------------------------------- Header ----------------------------------}
+
+Procedure Header(Var OutFile:OutFileType; Var Fonts:FontsType; LaTeX:Boolean);
+{Writes [La]TeX header}
+{Fonts declared global for speed, even if never actually modified here}
+Var
+ FontPtr:FontRange;
+ SizePtr:SizeRange;
+ C0,C1,C2:Char;
+ Scale:Integer;
+Begin
+Writeln(OutFile,'\tracingstats=1');
+For SizePtr:=1 To SizeMax Do
+ Begin
+ C0:=Chr( Ord('a')+SizePtr-1 );
+ Case SizePtr Of
+ 1:Scale:=1000;
+ 2:Scale:=1095;
+ 3:Scale:=1200;
+ 4:Scale:=1440;
+ 5:Scale:=1728;
+ 6:Scale:=2074;
+ 7:Scale:=2488
+ End;
+ For FontPtr:=0 To FontMax Do
+ If Fonts[SizePtr,FontPtr] Then
+ Begin
+ C1:=Chr( Ord('a')+(FontPtr Div 8) );
+ C2:=Chr( Ord('a')+(FontPtr Mod 8) );
+ If LaTeX Then
+ Writeln(OutFile,'\newfont{\k'+C0+C1+C2+'}{kanji'+C1+C2+' scaled ',
+ Scale,'}')
+ Else
+ Writeln(OutFile,'\font\k'+C0+C1+C2+'=kanji'+C1+C2+' scaled ',Scale)
+ End
+ End;
+If LaTeX Then
+ Begin
+ Writeln(OutFile,'\newcommand{\kk}[2]{{#1\symbol{#2}}}');
+ Writeln(OutFile,'\newcommand{\hh}{\discretionary{}{}{}}');
+ Writeln(OutFile,'\newcommand{\ee}{\nobreak\hskip0pt plus.1em\relax}');
+ Writeln(OutFile,'\newcommand{\eee}{\nobreak\hskip.3em plus.1em\relax}');
+ Writeln(OutFile,'\newcommand{\eeee}{\nobreak\hskip.9em plus.1em minus.1em}')
+ End
+Else
+ Begin
+ Writeln(OutFile,'\def\kk#1#2{{#1\char#2}}');
+ Writeln(OutFile,'\def\hh{\discretionary{}{}{}}');
+ Writeln(OutFile,'\def\ee{\nobreak\hskip0pt plus.1em\relax}');
+ Writeln(OutFile,'\def\eee{\nobreak\hskip.3em plus.1em\relax}');
+ Writeln(OutFile,'\def\eeee{\nobreak\hskip.9em plus.1em minus.1em}')
+ End;
+Writeln(OutFile)
+End;
+
+{---------------------------------- Convert ----------------------------------}
+
+Procedure BitmapType(Bitmap:BitmapRange; Var Punctuation:PunctuationType);
+{Finds characteristics of current Bitmap}
+Begin
+With Punctuation Do
+ Begin
+ OldMajorEOL:=NewMajorEOL;
+ OldMinorEOL:=NewMinorEOL;
+ OldOpening:=NewOpening;
+ OldClosing:=NewClosing;
+ OldCenterDot:=NewCenterDot;
+ OldJapanese:=NewJapanese;
+ NewMajorEOL:=False;
+ NewMinorEOL:=False;
+ NewOpening:=False;
+ NewClosing:=False;
+ NewCenterDot:=False;
+ NewJapanese:=False;
+ {Full width .,!?}
+ If (2<=Bitmap) And (Bitmap<=5) Then NewMajorEOL:=True
+ Else
+ If (Bitmap=9) Or (Bitmap=10) Then NewMajorEOL:=True
+ Else
+ {Half width .,!?}
+ If (Bitmap=691) Or (Bitmap=720) Then NewMajorEOL:=True
+ Else
+ {Full width :;}
+ If (Bitmap=7) Or (Bitmap=8) Then NewMinorEOL:=True
+ Else
+ {Half width :;}
+ If (Bitmap=692) Or (Bitmap=693) Then NewMinorEOL:=True
+ Else
+ {Full width `"([< and other openings}
+ If (38<=Bitmap) And (Bitmap<=58) And Not Odd(Bitmap) Then NewOpening:=True
+ Else
+ {Half width `"([< and other openings}
+ If (696<=Bitmap)And(Bitmap<=716) And Not Odd(Bitmap) Then NewOpening:=True
+ Else
+ {Full width '")]> and other closings}
+ If (39<=Bitmap) And (Bitmap<=59) And Odd(Bitmap) Then NewClosing:=True
+ Else
+ {Half width '")]> and other closings}
+ If (697<=Bitmap) And (Bitmap<=717) And Odd(Bitmap) Then NewClosing:=True
+ Else
+ {Full width Japanese center dot}
+ If (Bitmap=6) Then NewCenterDot:=True
+ Else
+ {Half width Japanese center dot}
+ If (Bitmap=469) Then NewCenterDot:=True
+ Else
+ {Full width Hiragana}
+ If (283<=Bitmap) And (Bitmap<=365) Then NewJapanese:=True
+ Else
+ {Full width Katakana}
+ If (377<=Bitmap) And (Bitmap<=462) Then NewJapanese:=True
+ Else
+ {Full width Kanji level 1}
+ If (1411<=Bitmap) And (Bitmap<=4375) Then NewJapanese:=True
+ Else
+ {Full width Kanji level 2}
+ If (4419<=Bitmap) And (Bitmap<=7806) Then NewJapanese:=True
+ Else
+ {Script Hiragana}
+ If (753<=Bitmap) And (Bitmap<=835) Then NewJapanese:=True
+ Else
+ {Script Katakana}
+ If (847<=Bitmap) And (Bitmap<=932) Then NewJapanese:=True
+ End
+End;
+
+Procedure Hyphenate(Var OutFile:OutFileType; Var Punctuation:PunctuationType);
+{Adds hyphenation between consecutive Bitmaps}
+Begin
+With Punctuation Do
+ {No hyphenation between two odd symbols}
+ If OldJapanese Or NewJapanese Then
+ {No hyphenation before some symbols}
+ If Not NewMajorEOL And Not NewMinorEOL And Not NewCenterDot And
+ Not NewClosing
+ Then
+ {No hyphenation after some symbols}
+ If Not OldOpening Then Write(OutFile,'\hh')
+End;
+
+Procedure Glue(Var OutFile:OutFileType; Var Punctuation:PunctuationType;
+ ExtraSpace:Boolean);
+{Adds glue between consecutive Bitmaps}
+Var GlueAdded:Boolean;
+Begin
+With Punctuation Do
+ Begin
+ GlueAdded:=False;
+ If ExtraSpace Then
+ Begin
+ {Trying to add big glue}
+ If OldMajorEOL Then
+ {No big glue between identical symbols}
+ If Not NewMajorEOL Then
+ {No big glue before some symbols}
+ If Not NewClosing Then
+ Begin
+ GlueAdded:=True;
+ Write(OutFile,'\eeee')
+ End;
+ If Not GlueAdded Then
+ {Trying to add medium glue based on old symbol}
+ If OldMinorEOL Or OldCenterDot Or OldClosing Then
+ {No medium glue before some symbols}
+ If Not NewMajorEOL And Not NewMinorEOL And Not NewClosing Then
+ Begin
+ GlueAdded:=True;
+ Write(OutFile,'\eee')
+ End;
+ If Not GlueAdded Then
+ {Trying to add medium glue based on new symbol}
+ If NewCenterDot Or NewOpening Then
+ {No medium glue after some symbols}
+ If Not OldOpening Then
+ Begin
+ GlueAdded:=True;
+ Write(OutFile,'\eee')
+ End
+ End;
+ {Always make sure to add some glue}
+ If Not GlueAdded Then Write(OutFile,'\ee')
+ End
+End;
+
+Procedure Convert(Var InFile:InFileType; Var OutFile:OutFileType;
+ Var RunTime:RunTimeType);
+{Convert .JEM into .TeX by translating Bitmaps and adding hyphenation and glue}
+Var
+ {Japanese punctuation information}
+ Punctuation:PunctuationType;
+ {Scanning information}
+ Scanning:ScanningType;
+ {Current font number}
+ FontPtr:FontRange;
+ C0,C1,C2:Char;
+Begin
+With Punctuation,Scanning,RunTime Do
+ Begin
+ {Not reached EOF yet}
+ Done:=False;
+ {Echo in second pass}
+ Echo:=True;
+ {Nothing done yet}
+ Immediate:=False;
+ WasLetter:=False;
+ {Tell indirectly to GetBitmap that this is the first time it is called}
+ Comment:=True;
+ {Initial japanese punctuation information}
+ NewMajorEOL:=False; NewMinorEOL:=False;
+ NewOpening:=False; NewClosing:=False;
+ NewCenterDot:=False; NewJapanese:=False;
+ Repeat
+ {Set up scanning information in case a roman letter follows immediately}
+ RomanMajorEOL:=NewMajorEOL;
+ RomanMinorEOL:=NewMinorEOL Or NewCenterDot Or NewClosing;
+ RomanOpening:=NewOpening;
+ {Get the next Bitmap skipping over [La]TeX comments}
+ {May add glue between the old Bitmap and an hypothetical Roman}
+ GetBitmap(InFile,OutFile,Scanning,RunTime);
+ If Not Done Then
+ Begin
+ {Find what kind of Bitmap it is}
+ BitmapType(Bitmap,Punctuation);
+ If Immediate Then
+ {Add hyphenation and glue between consecutive Bitmaps}
+ Begin
+ Hyphenate(OutFile,Punctuation);
+ Glue(OutFile,Punctuation,ExtraSpace)
+ End
+ Else
+ {Add glue after the old Roman and before this new Bitmap}
+ If ExtraSpace Then
+ If NewCenterDot Or NewOpening Then Write(OutFile,'\eee')
+ Else
+ If WasLetter Then
+ {No medium glue before some symbols}
+ If Not NewMajorEOL And Not NewMinorEOL And Not NewClosing Then
+ Write(OutFile,'\eee');
+ {Write the Bitmap}
+ C0:=Chr( Ord('a')+Size-1 );
+ FontPtr:=Bitmap Div 128;
+ C1:=Chr( Ord('a')+(FontPtr Div 8) );
+ C2:=Chr( Ord('a')+(FontPtr Mod 8) );
+ Write(OutFile,'\kk{\k'+C0+C1+C2+'}{',Bitmap Mod 128,'}')
+ {The next character may be Roman, GetBitmap will handle the glue then}
+ End
+ Until Done
+ End
+End;
+
+{------------------------------------ Main -----------------------------------}
+
+Begin
+Writeln;
+Writeln('Japanese to [La]TeX Conversion Program.'); {To make Borland happy}
+Writeln('Version 2.00 Copyright F. Jalbert 1991.');
+Writeln;
+
+
+GetParameters(RunTime);
+Writeln;
+Write('Opening Japanese file '+RunTime.FileName);
+OpenFile(InFile,RunTime);
+Writeln('.');
+If RunTime.LaTeX Then Write('Creating LaTeX file '+RunTime.FileName+'.tex')
+Else Write('Creating TeX file '+RunTime.FileName+'.tex');
+Assign(OutFile,RunTime.FileName+'.tex');
+Rewrite(OutFile);
+Writeln('.');
+Writeln;
+
+
+Write('Scanning Japanese file for fonts');
+GetFont(InFile,Fonts,RunTime);
+Reset(InFile);
+Writeln('.');
+If RunTime.LaTeX Then Write('Writing LaTeX header')
+Else Write('Writing TeX header');
+Header(OutFile,Fonts,RunTime.LaTeX);
+Writeln('.');
+Write('Converting Japanese file');
+Convert(InFile,OutFile,RunTime);
+Writeln('.');
+Writeln;
+
+
+Write('Closing Japanese file '+RunTime.FileName+RunTime.Extension);
+Close(InFile);
+Writeln('.');
+If RunTime.LaTeX Then Write('Closing LaTeX file '+RunTime.FileName+'.tex')
+Else Write('Closing TeX file '+RunTime.FileName+'.tex');
+Close(OutFile);
+Writeln('.');
+Writeln;
+
+
+Writeln('Japanese to [La]TeX conversion completed.');
+Writeln
+End.
diff --git a/systems/msdos/jemtex2/jguide.tex b/systems/msdos/jemtex2/jguide.tex
new file mode 100644
index 0000000000..7a8b848213
--- /dev/null
+++ b/systems/msdos/jemtex2/jguide.tex
@@ -0,0 +1,3660 @@
+%
+% Process this file twice with big LaTeX. Does not rely on any japanese font.
+%
+\typeout{}
+\typeout{Japanese [La]TeX for DOS User's Guide Version 2.00 <14 April 1991>}
+\typeout{Note: Run big LaTeX two times to resolve cross-references.}
+\typeout{Warning: This guide requires approximately 120Kb of memory to process.}
+\typeout{}
+
+\hyphenation{jap-a-nese}
+
+\def\LLaTeX{{\rm \raise.2ex\hbox{[}\kern-.05em L\kern-.38em\raise.35ex%
+\hbox{\lowercase{a}}\kern-.05em\raise.2ex\hbox{]}\kern-.1em T%
+\kern-.1667em\lower.7ex\hbox{E}\kern-.125em X}}
+\def\MuTeX{{\rm M\kern-.15em\raise.2ex\hbox{\lowercase{u}}\kern-.32em T%
+\kern-.1667em\lower.5ex\hbox{E}\kern-.125em X}}
+\def\emTeX{{\rm {\it{em}}\kern-.15em T%
+\kern-.1667em\lower.5ex\hbox{E}\kern-.125em X}}
+\def\JemTeX{{\rm J\kern-.2em {\it{em}}\kern-.15em T%
+\kern-.1667em\lower.5ex\hbox{E}\kern-.125em X}}
+\def\MFT{{\small\rm METAFONT}}
+
+\documentstyle[12pt]{article}
+\pagestyle{plain}
+\begin{document}
+
+\title{Japanese \LLaTeX\ for DOS \\
+ - User's Guide - \\
+ {\small (Version 2.00)}}
+\author{Fran\c cois Jalbert}
+\date{14 April 1991}
+\maketitle
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Introduction}
+\typeout{1 Introduction}
+\label{introduction}
+
+Welcome to \JemTeX\ Version~2.00, a simple system to typeset japanese using any
+standard version of \TeX\ running under DOS. All you need to create your own
+japanese fonts using \MFT\ is included. A preprocessor is also supplied which
+will turn the output of your favorite japanese text editor into a standard
+\TeX\ document ready for processing.
+
+This guide is divided into four main sections:
+\begin{description}
+ \item[Introduction:] Preliminary remarks (page~\pageref{introduction}).
+ \item[Japanese Fonts:] The \JemTeX\ fonts (page~\pageref{japanesefonts}).
+ \item[The \LLaTeX\ Interface:] The \JemTeX\ preprocessor
+ (page~\pageref{thelatexinterface}).
+ \item[JemTeX Quick Reference:] Items often referred to
+ (page~\pageref{jemtexquickreference}).
+\end{description}
+
+\subsection{Why \JemTeX}
+\label{whyjemtex}
+
+Shortly after adopting japanese as my new hobby, I felt the need to compile my
+own small dictionaries and to keep a computer record of all the letters I sent
+to my friends in Japan. These japanese documents would, of course, be produced
+on my DOS computer. I was also typesetting japanese music with \MuTeX, and I
+really wanted to write the lyrics using japanese characters rather than the
+roman ones I was currently constrained to use.
+
+Luckily I had \mbox{USENET} access, and in early 1990 I came across Mr.\ Mark
+Edward's MOKE~(1.1+) japanese text editor. It supported the most popular
+graphics displays, it had all the japanese characters a novice like me would
+ever need, it had extensive indexes to find the correct kanjis for any given
+word, and it even supported my \mbox{EPSON} printer. I FTP'ed a copy for
+myself and arranged to have it made available in T\=oky\=o at utsun
+(133.11.11.11) for FTP as well.
+
+Unfortunately, MOKE's quality of output left much to be desired on my
+\mbox{9-pin} printer, and MOKE did not have the fancy capabilities of \LaTeX. I
+decided to look into public domain japanese versions of \LaTeX\ for DOS
+computers. A query on \mbox{USENET} news triggered a long series of
+\mbox{e-mail} exchanges. In a nutshell, the news was bad.
+
+First, I could not locate any \MFT\ code to generate the 240~DPI by 216~DPI
+fonts needed by my previewing and printing devices. It was out of the question
+for me to even think about writing my own \MFT\ code for the thousands of
+characters involved in japanese. I did find some 300~DPI public domain fonts,
+but they were useless to me. I was told many japanese printers have built-in
+fonts, which could explain the lack of public domain external ones.
+
+There was also a serious possibility that loading many fonts might cause any
+small implementation of \TeX\ to run out of memory. This was a problem
+especially for DOS machines limited for historical reasons to 640~Kb of main
+memory. I needed a \TeX\ with some sort of memory paging system for my big
+RAM~disk. This problem was solved with Mr.\ Eberhard Mattes' \emTeX\ for DOS.
+Its capacity seemed limited solely by \TeX's internal design.
+
+I could not find any macros to enter japanese using standard \LaTeX. I did
+come across J\TeX\ and \mbox{ASCII-j\TeX}. However, both required that I build
+my own \TeX\ source in C, using exotic tools like WEB and \mbox{TANGLE}. Even
+if I ever managed eventually to get some usable C~code, it would not compile
+into something very useful because of the 640~Kb main memory limitation of DOS.
+It would be necessary to modify the C~code by adding the paging system to it. I
+knew nothing of \TeX's internal working. How could I decide correctly which
+information should be paged and which should remain in memory at all time? I
+decided that adapting J\TeX\ or \mbox{ASCII-j\TeX}\ to DOS appeared too
+uncertain and time-consuming.
+
+My situation could be summarized as follows. I had a simple japanese text
+editor I could use to enter both english and japanese, and I had a big
+implementation of \TeX\ which would not crash if I remained reasonable. But I
+lacked japanese fonts and macros to put it all together. The remainder of this
+brief guide explains how I solved these two problems.
+
+I call my japanese system \JemTeX. Anybody with a japanese text editor and
+\emTeX, or any equivalent implementation of \TeX\ and \MFT, can now produce
+simple, but acceptable japanese documents with his DOS computer. Following the
+release of the first two versions, people from all over the world expressed
+their satisfaction. There is no doubt in my mind that there was a real need for
+\JemTeX.
+
+\begin{quote}
+ \begin{em}
+ \JemTeX\ is free for all to use and modify. Please feel free to distribute
+ unmodified copies of it. If you should use parts of\/ \JemTeX, or some of my
+ ideas in your work, a reference to \JemTeX\ would be appreciated.
+ \end{em}
+\end{quote}
+
+\subsection{\JemTeX\ Files}
+\label{jemtexfiles}
+
+\JemTeX\ is distributed compressed with Version~1.1 of the \verb"PKZIP"
+utility of PKWARE Inc. You should have received the following file:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+JEMTEX2 ZIP 440435 4-14-91 12:00p
+\end{verbatim}
+\end{quote}
+
+Unpacking should yield the following files:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+JIS24 562032 4-14-91 12:00p
+JIS2MF C 37598 4-14-91 12:00p
+JIS2MF PAS 33242 4-14-91 12:00p
+JIS2MF EXE 12181 4-14-91 12:00p
+JEM2TEX C 47627 4-14-91 12:00p
+JEM2TEX PAS 40635 4-14-91 12:00p
+JEM2TEX EXE 14203 4-14-91 12:00p
+FONTABLE C 5814 4-14-91 12:00p
+FONTABLE PAS 4475 4-14-91 12:00p
+FONTABLE EXE 4905 4-14-91 12:00p
+JGUIDE TEX 175442 4-14-91 12:00p
+\end{verbatim}
+\end{quote}
+All these files will be covered in time in this brief guide.
+
+I supply you with the fastest utilities possible at the moment, which are
+sometime C versions, sometime Pascal versions. The programs compile fine with
+recent DOS turbo compilers and UNIX gcc. Note that the executables are also
+compressed with the \verb"LZEXE" utility of Mr.\ Fabrice Bellard. The
+decompression automatically occurs at runtime.
+
+\subsection{Author's Address}
+\label{authorsaddress}
+
+There is still a lot I do not understand about \LLaTeX\ and, especially,
+japanese. I apologize in advance for my errors. If you have any comments, or
+simply wish to be put on my mailing list, do not hesitate to contact the
+author:
+
+\begin{quote}
+Fran\c cois Jalbert \\
+220 Forest \\
+Ch\^ateauguay, QC \\
+CANADA \\
+J6J 1R1 \\
+\verb"jalbert@CS.UBC.CA" \\
+\verb"jalbert@IRO.UMontreal.CA"
+\end{quote}
+
+\subsection{Acknowledgments}
+\label{acknowledgments}
+
+I would like to take this opportunity to thank all the people who helped me in
+this quest for knowledge, especially Mr.\ Takafumi Sakurai who is very familiar
+with J\TeX. Finally, I must also thank all the users who helped to improve this
+package with their comments. Keep them coming! In fact, Version~2.00 would not
+have been possible without Mr.\ Masatoshi Watanabe, the author of JaWa\TeX. I
+am greatly grateful to him for his contribution to my \verb"JIS2MF" program.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{Japanese Fonts}
+\typeout{2 Japanese Fonts}
+\label{japanesefonts}
+
+In this section, I describe how I solved the font problem. I first introduce
+the JIS~24 dot font which is the key behind the \JemTeX\ fonts. A discussion of
+horizontal and vertical writing styles then becomes essential since writing
+style influences the ideal characteristics of a font. I conclude the first part
+of this section by explaining how to run my \verb"JIS2MF" \MFT\ code generation
+program and \MFT\ itself.
+
+I include a few more technical details in the second part of this section.
+Strictly speaking, this information is not mandatory and the reader in a hurry
+will do well to simply skip it. But the inquiring one will have a chance to
+take a closer look at the \MFT\ code generated and at the underlying algorithm.
+
+\subsection{The JIS~24 Dot Font}
+\label{thejis24dotfont}
+
+The font problem is solved using the JIS~24 dot font of Mr.\ Yasuki Saito. It
+is a series of 24~by~24 bitmaps organized sequentially. There is room for
+7806~bitmaps in the file \verb"JIS24", but several bitmaps are simply left
+empty in the current version.
+
+\label{standard}
+
+The JIS~'83 standard states which characters are defined in the JIS~24 dot font
+and what position they occupy. However, several computer manufacturers have
+taken the liberty of defining their own additional 24~by~24 bitmaps which they
+place here and there at locations currently left empty by JIS~'83. The
+resulting {\em extended\/} JIS~24 dot fonts exist in many different
+incompatible versions.
+
+\label{extended}
+
+\JemTeX\ uses such an extended JIS~24 dot font. I do not know who is
+responsible for its extension, but I certainly welcome the extra characters.
+Besides a wealth of miscellaneous characters, a complete half-width roman and
+japanese character set is available. You may choose to use them, or to restrict
+yourself to standard JIS~'83 characters only.
+
+No doubt one can mechanize the creation of fonts from such bitmaps. There seems
+to be two ways of handling the problem. First, one could generate fonts
+directly from the bitmaps without using \MFT\ at all. Indeed, I know that
+several fonts in J\TeX\ were created just that way. However, I suspect that it
+might be difficult to scale fonts using non-integer factors. To further
+complicate the scaling problem, my devices do not have the same horizontal and
+vertical resolution. Besides, I feel that \MFT\ can deal with such scaling
+issues better than I probably can in a mere few days of work.
+
+Consequently, I prefer to create \MFT\ code out of the bitmaps. A good example
+of such an approach is the \verb"ega2mf" program of Mr.\ Thomas B.\ Ridgeway.
+This program reads bitmaps and creates \MFT\ code where each character is a
+small matrix of dots. The purpose of such fonts is to mimic the looks of
+CRT~screens on paper. This is does so well that in fact, I find that the
+japanese characters look too much like bitmaps! I want these dots to disappear
+and a continuous outline to replace them. Nevertheless, \verb"ega2mf" clearly
+demonstrates that the goal can be reached.
+
+I started from scratch, using a \MFT\ book and came up with my own \MFT\ code
+generation program \verb"JIS2MF". It reads bitmaps from \verb"JIS24", and it
+then constructs continuous characters, using squares, triangles, and quarter
+circles. My program has been substantially improved by Mr.\ Masatoshi Watanabe.
+A complete description is found in Subsections~\ref{themetafontcode}
+and~\ref{algorithm}.
+
+\subsection{Writing Styles}
+\label{writingstyles}
+
+It is clear from the lack of a vertical baseline in \MFT\ that \TeX\ was solely
+designed for horizontal use. Indeed, \TeX\ can typeset japanese horizontally as
+well as it does for english. This does not imply that vertical use of \TeX\ is
+impossible, but it merely suggests that extra care will be required. In this
+subsection, I would like to discuss and compare both writing styles. The
+appropriate font properties can then be determined.
+
+\label{widthheight}
+
+The first features of interest in this subsection are character width,
+character height, and distance from the baseline. Consider first a few roman
+characters and their horizontal baseline:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(80,30)
+ \thinlines
+ \put(0,5){\line(1,0){80}}
+ \put(0,0){\makebox(80,30){dip}}
+ \end{picture}
+\end{center}
+
+The width of each character is minimized and this is important in english
+writing. However, the height of each character is unimportant. It is the
+vertical relationship between the character and its horizontal baseline which
+matters.
+
+Consider now a few japanese characters and their horizontal baseline:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \newsavebox{\watashi}
+ \sbox{\watashi}{%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 2512
+ \put(0.5,4.5){\circle*{1}}\put(0.5,15.5){\circle*{1}}
+ \put(0.5,19.5){\circle*{1}}\put(1.5,5.5){\circle*{1}}
+ \put(1.5,15.5){\circle*{1}}\put(1.5,19.5){\circle*{1}}
+ \put(2.5,6.5){\circle*{1}}\put(2.5,7.5){\circle*{1}}
+ \put(2.5,15.5){\circle*{1}}\put(2.5,19.5){\circle*{1}}
+ \put(3.5,7.5){\circle*{1}}\put(3.5,8.5){\circle*{1}}
+ \put(3.5,9.5){\circle*{1}}\put(3.5,15.5){\circle*{1}}
+ \put(3.5,20.5){\circle*{1}}\put(4.5,9.5){\circle*{1}}
+ \put(4.5,10.5){\circle*{1}}\put(4.5,11.5){\circle*{1}}
+ \put(4.5,12.5){\circle*{1}}\put(4.5,15.5){\circle*{1}}
+ \put(4.5,20.5){\circle*{1}}\put(5.5,0.5){\circle*{1}}
+ \put(5.5,1.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,3.5){\circle*{1}}\put(5.5,4.5){\circle*{1}}
+ \put(5.5,5.5){\circle*{1}}\put(5.5,6.5){\circle*{1}}
+ \put(5.5,7.5){\circle*{1}}\put(5.5,8.5){\circle*{1}}
+ \put(5.5,9.5){\circle*{1}}\put(5.5,10.5){\circle*{1}}
+ \put(5.5,11.5){\circle*{1}}\put(5.5,12.5){\circle*{1}}
+ \put(5.5,13.5){\circle*{1}}\put(5.5,14.5){\circle*{1}}
+ \put(5.5,15.5){\circle*{1}}\put(5.5,16.5){\circle*{1}}
+ \put(5.5,17.5){\circle*{1}}\put(5.5,18.5){\circle*{1}}
+ \put(5.5,19.5){\circle*{1}}\put(5.5,20.5){\circle*{1}}
+ \put(6.5,0.5){\circle*{1}}\put(6.5,1.5){\circle*{1}}
+ \put(6.5,2.5){\circle*{1}}\put(6.5,3.5){\circle*{1}}
+ \put(6.5,4.5){\circle*{1}}\put(6.5,5.5){\circle*{1}}
+ \put(6.5,6.5){\circle*{1}}\put(6.5,7.5){\circle*{1}}
+ \put(6.5,8.5){\circle*{1}}\put(6.5,9.5){\circle*{1}}
+ \put(6.5,10.5){\circle*{1}}\put(6.5,11.5){\circle*{1}}
+ \put(6.5,12.5){\circle*{1}}\put(6.5,13.5){\circle*{1}}
+ \put(6.5,14.5){\circle*{1}}\put(6.5,15.5){\circle*{1}}
+ \put(6.5,16.5){\circle*{1}}\put(6.5,17.5){\circle*{1}}
+ \put(6.5,18.5){\circle*{1}}\put(6.5,19.5){\circle*{1}}
+ \put(6.5,20.5){\circle*{1}}\put(6.5,21.5){\circle*{1}}
+ \put(7.5,11.5){\circle*{1}}\put(7.5,15.5){\circle*{1}}
+ \put(7.5,21.5){\circle*{1}}\put(8.5,11.5){\circle*{1}}
+ \put(8.5,15.5){\circle*{1}}\put(8.5,21.5){\circle*{1}}
+ \put(8.5,22.5){\circle*{1}}\put(9.5,2.5){\circle*{1}}
+ \put(9.5,10.5){\circle*{1}}\put(9.5,15.5){\circle*{1}}
+ \put(9.5,16.5){\circle*{1}}\put(9.5,22.5){\circle*{1}}
+ \put(9.5,23.5){\circle*{1}}\put(10.5,0.5){\circle*{1}}
+ \put(10.5,1.5){\circle*{1}}\put(10.5,2.5){\circle*{1}}
+ \put(10.5,8.5){\circle*{1}}\put(10.5,9.5){\circle*{1}}
+ \put(10.5,10.5){\circle*{1}}\put(10.5,15.5){\circle*{1}}
+ \put(10.5,16.5){\circle*{1}}\put(10.5,22.5){\circle*{1}}
+ \put(10.5,23.5){\circle*{1}}\put(11.5,1.5){\circle*{1}}
+ \put(11.5,2.5){\circle*{1}}\put(11.5,8.5){\circle*{1}}
+ \put(11.5,9.5){\circle*{1}}\put(11.5,15.5){\circle*{1}}
+ \put(11.5,22.5){\circle*{1}}\put(12.5,1.5){\circle*{1}}
+ \put(12.5,2.5){\circle*{1}}\put(13.5,1.5){\circle*{1}}
+ \put(13.5,2.5){\circle*{1}}\put(13.5,3.5){\circle*{1}}
+ \put(13.5,4.5){\circle*{1}}\put(14.5,2.5){\circle*{1}}
+ \put(14.5,5.5){\circle*{1}}\put(14.5,6.5){\circle*{1}}
+ \put(14.5,7.5){\circle*{1}}\put(14.5,8.5){\circle*{1}}
+ \put(15.5,2.5){\circle*{1}}\put(15.5,7.5){\circle*{1}}
+ \put(15.5,8.5){\circle*{1}}\put(15.5,9.5){\circle*{1}}
+ \put(15.5,10.5){\circle*{1}}\put(15.5,11.5){\circle*{1}}
+ \put(15.5,12.5){\circle*{1}}\put(15.5,13.5){\circle*{1}}
+ \put(15.5,14.5){\circle*{1}}\put(15.5,15.5){\circle*{1}}
+ \put(16.5,2.5){\circle*{1}}\put(16.5,11.5){\circle*{1}}
+ \put(16.5,12.5){\circle*{1}}\put(16.5,13.5){\circle*{1}}
+ \put(16.5,14.5){\circle*{1}}\put(16.5,15.5){\circle*{1}}
+ \put(16.5,16.5){\circle*{1}}\put(16.5,17.5){\circle*{1}}
+ \put(16.5,18.5){\circle*{1}}\put(16.5,19.5){\circle*{1}}
+ \put(16.5,20.5){\circle*{1}}\put(16.5,21.5){\circle*{1}}
+ \put(16.5,22.5){\circle*{1}}\put(16.5,23.5){\circle*{1}}
+ \put(17.5,2.5){\circle*{1}}\put(17.5,16.5){\circle*{1}}
+ \put(17.5,17.5){\circle*{1}}\put(17.5,18.5){\circle*{1}}
+ \put(17.5,19.5){\circle*{1}}\put(17.5,20.5){\circle*{1}}
+ \put(17.5,21.5){\circle*{1}}\put(17.5,22.5){\circle*{1}}
+ \put(18.5,3.5){\circle*{1}}\put(18.5,22.5){\circle*{1}}
+ \put(19.5,3.5){\circle*{1}}\put(19.5,7.5){\circle*{1}}
+ \put(20.5,3.5){\circle*{1}}\put(20.5,5.5){\circle*{1}}
+ \put(20.5,6.5){\circle*{1}}\put(21.5,3.5){\circle*{1}}
+ \put(21.5,4.5){\circle*{1}}\put(21.5,5.5){\circle*{1}}
+ \put(22.5,0.5){\circle*{1}}\put(22.5,1.5){\circle*{1}}
+ \put(22.5,2.5){\circle*{1}}\put(22.5,3.5){\circle*{1}}
+ \put(22.5,4.5){\circle*{1}}\put(23.5,0.5){\circle*{1}}
+ \put(23.5,1.5){\circle*{1}}\put(23.5,2.5){\circle*{1}}
+ \end{picture}}
+ \begin{picture}(250,28)
+ \thinlines
+ \put(0,0){\line(1,0){250}}
+ \put(20,0){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 288
+ \put(5.5,15.5){\circle*{1}}\put(6.5,13.5){\circle*{1}}
+ \put(6.5,14.5){\circle*{1}}\put(7.5,13.5){\circle*{1}}
+ \put(7.5,14.5){\circle*{1}}\put(8.5,1.5){\circle*{1}}
+ \put(8.5,14.5){\circle*{1}}\put(9.5,1.5){\circle*{1}}
+ \put(9.5,14.5){\circle*{1}}\put(9.5,15.5){\circle*{1}}
+ \put(9.5,23.5){\circle*{1}}\put(10.5,1.5){\circle*{1}}
+ \put(10.5,15.5){\circle*{1}}\put(10.5,23.5){\circle*{1}}
+ \put(11.5,2.5){\circle*{1}}\put(11.5,15.5){\circle*{1}}
+ \put(11.5,16.5){\circle*{1}}\put(11.5,22.5){\circle*{1}}
+ \put(12.5,2.5){\circle*{1}}\put(12.5,16.5){\circle*{1}}
+ \put(12.5,22.5){\circle*{1}}\put(13.5,3.5){\circle*{1}}
+ \put(13.5,16.5){\circle*{1}}\put(13.5,21.5){\circle*{1}}
+ \put(13.5,22.5){\circle*{1}}\put(14.5,3.5){\circle*{1}}
+ \put(14.5,4.5){\circle*{1}}\put(14.5,16.5){\circle*{1}}
+ \put(14.5,20.5){\circle*{1}}\put(14.5,21.5){\circle*{1}}
+ \put(15.5,4.5){\circle*{1}}\put(15.5,5.5){\circle*{1}}
+ \put(15.5,6.5){\circle*{1}}\put(15.5,15.5){\circle*{1}}
+ \put(15.5,20.5){\circle*{1}}\put(15.5,21.5){\circle*{1}}
+ \put(16.5,5.5){\circle*{1}}\put(16.5,6.5){\circle*{1}}
+ \put(16.5,7.5){\circle*{1}}\put(16.5,8.5){\circle*{1}}
+ \put(16.5,9.5){\circle*{1}}\put(16.5,10.5){\circle*{1}}
+ \put(16.5,11.5){\circle*{1}}\put(16.5,12.5){\circle*{1}}
+ \put(16.5,13.5){\circle*{1}}\put(16.5,14.5){\circle*{1}}
+ \put(17.5,7.5){\circle*{1}}\put(17.5,8.5){\circle*{1}}
+ \put(17.5,9.5){\circle*{1}}\put(17.5,10.5){\circle*{1}}
+ \put(17.5,11.5){\circle*{1}}\put(17.5,12.5){\circle*{1}}
+ \put(17.5,13.5){\circle*{1}}
+ \end{picture}}
+ \put(50,0){\usebox{\watashi}}
+ \put(80,0){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 356
+ \put(6.5,10.5){\circle*{1}}\put(6.5,11.5){\circle*{1}}
+ \put(6.5,12.5){\circle*{1}}\put(6.5,13.5){\circle*{1}}
+ \put(6.5,14.5){\circle*{1}}\put(6.5,15.5){\circle*{1}}
+ \put(6.5,16.5){\circle*{1}}\put(6.5,17.5){\circle*{1}}
+ \put(6.5,22.5){\circle*{1}}\put(6.5,23.5){\circle*{1}}
+ \put(7.5,9.5){\circle*{1}}\put(7.5,10.5){\circle*{1}}
+ \put(7.5,11.5){\circle*{1}}\put(7.5,12.5){\circle*{1}}
+ \put(7.5,13.5){\circle*{1}}\put(7.5,14.5){\circle*{1}}
+ \put(7.5,15.5){\circle*{1}}\put(7.5,16.5){\circle*{1}}
+ \put(7.5,17.5){\circle*{1}}\put(7.5,18.5){\circle*{1}}
+ \put(7.5,19.5){\circle*{1}}\put(7.5,20.5){\circle*{1}}
+ \put(7.5,21.5){\circle*{1}}\put(7.5,22.5){\circle*{1}}
+ \put(8.5,14.5){\circle*{1}}\put(8.5,15.5){\circle*{1}}
+ \put(9.5,16.5){\circle*{1}}\put(9.5,17.5){\circle*{1}}
+ \put(10.5,0.5){\circle*{1}}\put(10.5,18.5){\circle*{1}}
+ \put(10.5,19.5){\circle*{1}}\put(11.5,0.5){\circle*{1}}
+ \put(11.5,20.5){\circle*{1}}\put(12.5,1.5){\circle*{1}}
+ \put(12.5,21.5){\circle*{1}}\put(13.5,1.5){\circle*{1}}
+ \put(13.5,2.5){\circle*{1}}\put(13.5,21.5){\circle*{1}}
+ \put(14.5,2.5){\circle*{1}}\put(14.5,3.5){\circle*{1}}
+ \put(14.5,21.5){\circle*{1}}\put(15.5,3.5){\circle*{1}}
+ \put(15.5,4.5){\circle*{1}}\put(15.5,5.5){\circle*{1}}
+ \put(15.5,20.5){\circle*{1}}\put(15.5,21.5){\circle*{1}}
+ \put(16.5,4.5){\circle*{1}}\put(16.5,5.5){\circle*{1}}
+ \put(16.5,6.5){\circle*{1}}\put(16.5,7.5){\circle*{1}}
+ \put(16.5,8.5){\circle*{1}}\put(16.5,18.5){\circle*{1}}
+ \put(16.5,19.5){\circle*{1}}\put(16.5,20.5){\circle*{1}}
+ \put(17.5,6.5){\circle*{1}}\put(17.5,7.5){\circle*{1}}
+ \put(17.5,8.5){\circle*{1}}\put(17.5,9.5){\circle*{1}}
+ \put(17.5,10.5){\circle*{1}}\put(17.5,11.5){\circle*{1}}
+ \put(17.5,12.5){\circle*{1}}\put(17.5,13.5){\circle*{1}}
+ \put(17.5,14.5){\circle*{1}}\put(17.5,15.5){\circle*{1}}
+ \put(17.5,16.5){\circle*{1}}\put(17.5,17.5){\circle*{1}}
+ \put(17.5,18.5){\circle*{1}}\put(17.5,19.5){\circle*{1}}
+ \put(18.5,9.5){\circle*{1}}\put(18.5,10.5){\circle*{1}}
+ \put(18.5,11.5){\circle*{1}}\put(18.5,12.5){\circle*{1}}
+ \put(18.5,13.5){\circle*{1}}\put(18.5,14.5){\circle*{1}}
+ \put(18.5,15.5){\circle*{1}}\put(18.5,16.5){\circle*{1}}
+ \put(18.5,17.5){\circle*{1}}
+ \end{picture}}
+ \put(110,0){\usebox{\watashi}}
+ \put(140,0){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 2146
+ \put(1.5,0.5){\circle*{1}}\put(2.5,0.5){\circle*{1}}
+ \put(3.5,1.5){\circle*{1}}\put(4.5,2.5){\circle*{1}}
+ \put(4.5,3.5){\circle*{1}}\put(5.5,3.5){\circle*{1}}
+ \put(5.5,4.5){\circle*{1}}\put(5.5,5.5){\circle*{1}}
+ \put(5.5,6.5){\circle*{1}}\put(6.5,5.5){\circle*{1}}
+ \put(6.5,6.5){\circle*{1}}\put(6.5,7.5){\circle*{1}}
+ \put(6.5,8.5){\circle*{1}}\put(6.5,9.5){\circle*{1}}
+ \put(6.5,10.5){\circle*{1}}\put(6.5,11.5){\circle*{1}}
+ \put(6.5,12.5){\circle*{1}}\put(6.5,13.5){\circle*{1}}
+ \put(6.5,14.5){\circle*{1}}\put(6.5,15.5){\circle*{1}}
+ \put(6.5,16.5){\circle*{1}}\put(6.5,17.5){\circle*{1}}
+ \put(6.5,18.5){\circle*{1}}\put(6.5,19.5){\circle*{1}}
+ \put(6.5,20.5){\circle*{1}}\put(6.5,21.5){\circle*{1}}
+ \put(6.5,22.5){\circle*{1}}\put(6.5,23.5){\circle*{1}}
+ \put(7.5,7.5){\circle*{1}}\put(7.5,8.5){\circle*{1}}
+ \put(7.5,9.5){\circle*{1}}\put(7.5,10.5){\circle*{1}}
+ \put(7.5,11.5){\circle*{1}}\put(7.5,12.5){\circle*{1}}
+ \put(7.5,13.5){\circle*{1}}\put(7.5,14.5){\circle*{1}}
+ \put(7.5,15.5){\circle*{1}}\put(7.5,16.5){\circle*{1}}
+ \put(7.5,17.5){\circle*{1}}\put(7.5,18.5){\circle*{1}}
+ \put(7.5,19.5){\circle*{1}}\put(7.5,20.5){\circle*{1}}
+ \put(7.5,21.5){\circle*{1}}\put(7.5,22.5){\circle*{1}}
+ \put(8.5,10.5){\circle*{1}}\put(8.5,16.5){\circle*{1}}
+ \put(8.5,22.5){\circle*{1}}\put(9.5,10.5){\circle*{1}}
+ \put(9.5,16.5){\circle*{1}}\put(9.5,22.5){\circle*{1}}
+ \put(10.5,10.5){\circle*{1}}\put(10.5,16.5){\circle*{1}}
+ \put(10.5,22.5){\circle*{1}}\put(11.5,10.5){\circle*{1}}
+ \put(11.5,16.5){\circle*{1}}\put(11.5,22.5){\circle*{1}}
+ \put(12.5,10.5){\circle*{1}}\put(12.5,16.5){\circle*{1}}
+ \put(12.5,22.5){\circle*{1}}\put(13.5,10.5){\circle*{1}}
+ \put(13.5,16.5){\circle*{1}}\put(13.5,22.5){\circle*{1}}
+ \put(14.5,1.5){\circle*{1}}\put(14.5,10.5){\circle*{1}}
+ \put(14.5,16.5){\circle*{1}}\put(14.5,22.5){\circle*{1}}
+ \put(15.5,1.5){\circle*{1}}\put(15.5,10.5){\circle*{1}}
+ \put(15.5,16.5){\circle*{1}}\put(15.5,22.5){\circle*{1}}
+ \put(16.5,0.5){\circle*{1}}\put(16.5,1.5){\circle*{1}}
+ \put(16.5,10.5){\circle*{1}}\put(16.5,16.5){\circle*{1}}
+ \put(16.5,22.5){\circle*{1}}\put(17.5,0.5){\circle*{1}}
+ \put(17.5,1.5){\circle*{1}}\put(17.5,2.5){\circle*{1}}
+ \put(17.5,3.5){\circle*{1}}\put(17.5,4.5){\circle*{1}}
+ \put(17.5,5.5){\circle*{1}}\put(17.5,6.5){\circle*{1}}
+ \put(17.5,7.5){\circle*{1}}\put(17.5,8.5){\circle*{1}}
+ \put(17.5,9.5){\circle*{1}}\put(17.5,10.5){\circle*{1}}
+ \put(17.5,11.5){\circle*{1}}\put(17.5,12.5){\circle*{1}}
+ \put(17.5,13.5){\circle*{1}}\put(17.5,14.5){\circle*{1}}
+ \put(17.5,15.5){\circle*{1}}\put(17.5,16.5){\circle*{1}}
+ \put(17.5,17.5){\circle*{1}}\put(17.5,18.5){\circle*{1}}
+ \put(17.5,19.5){\circle*{1}}\put(17.5,20.5){\circle*{1}}
+ \put(17.5,21.5){\circle*{1}}\put(17.5,22.5){\circle*{1}}
+ \put(17.5,23.5){\circle*{1}}\put(18.5,1.5){\circle*{1}}
+ \put(18.5,2.5){\circle*{1}}\put(18.5,3.5){\circle*{1}}
+ \put(18.5,4.5){\circle*{1}}\put(18.5,5.5){\circle*{1}}
+ \put(18.5,6.5){\circle*{1}}\put(18.5,7.5){\circle*{1}}
+ \put(18.5,8.5){\circle*{1}}\put(18.5,9.5){\circle*{1}}
+ \put(18.5,10.5){\circle*{1}}\put(18.5,11.5){\circle*{1}}
+ \put(18.5,12.5){\circle*{1}}\put(18.5,13.5){\circle*{1}}
+ \put(18.5,14.5){\circle*{1}}\put(18.5,15.5){\circle*{1}}
+ \put(18.5,16.5){\circle*{1}}\put(18.5,17.5){\circle*{1}}
+ \put(18.5,18.5){\circle*{1}}\put(18.5,19.5){\circle*{1}}
+ \put(18.5,20.5){\circle*{1}}\put(18.5,21.5){\circle*{1}}
+ \put(18.5,22.5){\circle*{1}}\put(18.5,23.5){\circle*{1}}
+ \put(19.5,22.5){\circle*{1}}
+ \end{picture}}
+ \put(170,0){\usebox{\watashi}}
+ \put(200,0){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 2549
+ \put(4.5,0.5){\circle*{1}}\put(4.5,1.5){\circle*{1}}
+ \put(4.5,2.5){\circle*{1}}\put(4.5,3.5){\circle*{1}}
+ \put(4.5,4.5){\circle*{1}}\put(4.5,5.5){\circle*{1}}
+ \put(4.5,6.5){\circle*{1}}\put(4.5,7.5){\circle*{1}}
+ \put(4.5,8.5){\circle*{1}}\put(4.5,9.5){\circle*{1}}
+ \put(4.5,10.5){\circle*{1}}\put(4.5,11.5){\circle*{1}}
+ \put(4.5,12.5){\circle*{1}}\put(4.5,13.5){\circle*{1}}
+ \put(4.5,14.5){\circle*{1}}\put(4.5,15.5){\circle*{1}}
+ \put(4.5,16.5){\circle*{1}}\put(4.5,17.5){\circle*{1}}
+ \put(4.5,18.5){\circle*{1}}\put(4.5,19.5){\circle*{1}}
+ \put(4.5,20.5){\circle*{1}}\put(5.5,0.5){\circle*{1}}
+ \put(5.5,1.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,3.5){\circle*{1}}\put(5.5,4.5){\circle*{1}}
+ \put(5.5,5.5){\circle*{1}}\put(5.5,6.5){\circle*{1}}
+ \put(5.5,7.5){\circle*{1}}\put(5.5,8.5){\circle*{1}}
+ \put(5.5,9.5){\circle*{1}}\put(5.5,10.5){\circle*{1}}
+ \put(5.5,11.5){\circle*{1}}\put(5.5,12.5){\circle*{1}}
+ \put(5.5,13.5){\circle*{1}}\put(5.5,14.5){\circle*{1}}
+ \put(5.5,15.5){\circle*{1}}\put(5.5,16.5){\circle*{1}}
+ \put(5.5,17.5){\circle*{1}}\put(5.5,18.5){\circle*{1}}
+ \put(5.5,19.5){\circle*{1}}\put(6.5,1.5){\circle*{1}}
+ \put(6.5,7.5){\circle*{1}}\put(6.5,13.5){\circle*{1}}
+ \put(6.5,19.5){\circle*{1}}\put(7.5,1.5){\circle*{1}}
+ \put(7.5,7.5){\circle*{1}}\put(7.5,13.5){\circle*{1}}
+ \put(7.5,19.5){\circle*{1}}\put(8.5,1.5){\circle*{1}}
+ \put(8.5,7.5){\circle*{1}}\put(8.5,13.5){\circle*{1}}
+ \put(8.5,19.5){\circle*{1}}\put(9.5,1.5){\circle*{1}}
+ \put(9.5,7.5){\circle*{1}}\put(9.5,13.5){\circle*{1}}
+ \put(9.5,19.5){\circle*{1}}\put(10.5,1.5){\circle*{1}}
+ \put(10.5,7.5){\circle*{1}}\put(10.5,13.5){\circle*{1}}
+ \put(10.5,19.5){\circle*{1}}\put(10.5,20.5){\circle*{1}}
+ \put(10.5,21.5){\circle*{1}}\put(10.5,22.5){\circle*{1}}
+ \put(10.5,23.5){\circle*{1}}\put(11.5,1.5){\circle*{1}}
+ \put(11.5,7.5){\circle*{1}}\put(11.5,13.5){\circle*{1}}
+ \put(11.5,19.5){\circle*{1}}\put(11.5,21.5){\circle*{1}}
+ \put(11.5,22.5){\circle*{1}}\put(12.5,1.5){\circle*{1}}
+ \put(12.5,7.5){\circle*{1}}\put(12.5,13.5){\circle*{1}}
+ \put(12.5,19.5){\circle*{1}}\put(12.5,22.5){\circle*{1}}
+ \put(13.5,1.5){\circle*{1}}\put(13.5,7.5){\circle*{1}}
+ \put(13.5,13.5){\circle*{1}}\put(13.5,19.5){\circle*{1}}
+ \put(14.5,1.5){\circle*{1}}\put(14.5,7.5){\circle*{1}}
+ \put(14.5,13.5){\circle*{1}}\put(14.5,19.5){\circle*{1}}
+ \put(15.5,1.5){\circle*{1}}\put(15.5,7.5){\circle*{1}}
+ \put(15.5,13.5){\circle*{1}}\put(15.5,19.5){\circle*{1}}
+ \put(16.5,1.5){\circle*{1}}\put(16.5,7.5){\circle*{1}}
+ \put(16.5,13.5){\circle*{1}}\put(16.5,19.5){\circle*{1}}
+ \put(17.5,1.5){\circle*{1}}\put(17.5,7.5){\circle*{1}}
+ \put(17.5,13.5){\circle*{1}}\put(17.5,19.5){\circle*{1}}
+ \put(18.5,0.5){\circle*{1}}\put(18.5,1.5){\circle*{1}}
+ \put(18.5,2.5){\circle*{1}}\put(18.5,3.5){\circle*{1}}
+ \put(18.5,4.5){\circle*{1}}\put(18.5,5.5){\circle*{1}}
+ \put(18.5,6.5){\circle*{1}}\put(18.5,7.5){\circle*{1}}
+ \put(18.5,8.5){\circle*{1}}\put(18.5,9.5){\circle*{1}}
+ \put(18.5,10.5){\circle*{1}}\put(18.5,11.5){\circle*{1}}
+ \put(18.5,12.5){\circle*{1}}\put(18.5,13.5){\circle*{1}}
+ \put(18.5,14.5){\circle*{1}}\put(18.5,15.5){\circle*{1}}
+ \put(18.5,16.5){\circle*{1}}\put(18.5,17.5){\circle*{1}}
+ \put(18.5,18.5){\circle*{1}}\put(18.5,19.5){\circle*{1}}
+ \put(18.5,20.5){\circle*{1}}\put(19.5,0.5){\circle*{1}}
+ \put(19.5,1.5){\circle*{1}}\put(19.5,2.5){\circle*{1}}
+ \put(19.5,3.5){\circle*{1}}\put(19.5,4.5){\circle*{1}}
+ \put(19.5,5.5){\circle*{1}}\put(19.5,6.5){\circle*{1}}
+ \put(19.5,7.5){\circle*{1}}\put(19.5,8.5){\circle*{1}}
+ \put(19.5,9.5){\circle*{1}}\put(19.5,10.5){\circle*{1}}
+ \put(19.5,11.5){\circle*{1}}\put(19.5,12.5){\circle*{1}}
+ \put(19.5,13.5){\circle*{1}}\put(19.5,14.5){\circle*{1}}
+ \put(19.5,15.5){\circle*{1}}\put(19.5,16.5){\circle*{1}}
+ \put(19.5,17.5){\circle*{1}}\put(19.5,18.5){\circle*{1}}
+ \put(19.5,19.5){\circle*{1}}\put(19.5,20.5){\circle*{1}}
+ \put(20.5,19.5){\circle*{1}}
+ \end{picture}}
+ \end{picture}
+ \hspace{1cm}
+ \begin{picture}(250,28)
+ \thinlines
+ \put(0,0){\line(1,0){250}}
+ \put(38,0){%
+ \begin{picture}(22,26)(-2,-2)%Bitmap 2988
+ \put(0.5,0.5){\circle*{1}}\put(0.5,1.5){\circle*{1}}
+ \put(0.5,2.5){\circle*{1}}\put(0.5,3.5){\circle*{1}}
+ \put(0.5,4.5){\circle*{1}}\put(0.5,5.5){\circle*{1}}
+ \put(0.5,6.5){\circle*{1}}\put(0.5,7.5){\circle*{1}}
+ \put(0.5,8.5){\circle*{1}}\put(0.5,9.5){\circle*{1}}
+ \put(0.5,10.5){\circle*{1}}\put(0.5,11.5){\circle*{1}}
+ \put(1.5,0.5){\circle*{1}}\put(1.5,1.5){\circle*{1}}
+ \put(1.5,2.5){\circle*{1}}\put(1.5,3.5){\circle*{1}}
+ \put(1.5,4.5){\circle*{1}}\put(1.5,5.5){\circle*{1}}
+ \put(1.5,6.5){\circle*{1}}\put(1.5,7.5){\circle*{1}}
+ \put(1.5,8.5){\circle*{1}}\put(1.5,9.5){\circle*{1}}
+ \put(1.5,10.5){\circle*{1}}\put(2.5,2.5){\circle*{1}}
+ \put(2.5,10.5){\circle*{1}}\put(3.5,2.5){\circle*{1}}
+ \put(3.5,10.5){\circle*{1}}\put(4.5,2.5){\circle*{1}}
+ \put(4.5,10.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,10.5){\circle*{1}}\put(6.5,2.5){\circle*{1}}
+ \put(6.5,10.5){\circle*{1}}\put(7.5,2.5){\circle*{1}}
+ \put(7.5,10.5){\circle*{1}}\put(7.5,11.5){\circle*{1}}
+ \put(7.5,12.5){\circle*{1}}\put(7.5,13.5){\circle*{1}}
+ \put(7.5,14.5){\circle*{1}}\put(7.5,15.5){\circle*{1}}
+ \put(7.5,16.5){\circle*{1}}\put(7.5,17.5){\circle*{1}}
+ \put(7.5,18.5){\circle*{1}}\put(7.5,19.5){\circle*{1}}
+ \put(7.5,20.5){\circle*{1}}\put(7.5,21.5){\circle*{1}}
+ \put(7.5,22.5){\circle*{1}}\put(7.5,23.5){\circle*{1}}
+ \put(8.5,2.5){\circle*{1}}\put(8.5,10.5){\circle*{1}}
+ \put(8.5,11.5){\circle*{1}}\put(8.5,12.5){\circle*{1}}
+ \put(8.5,13.5){\circle*{1}}\put(8.5,14.5){\circle*{1}}
+ \put(8.5,15.5){\circle*{1}}\put(8.5,16.5){\circle*{1}}
+ \put(8.5,17.5){\circle*{1}}\put(8.5,18.5){\circle*{1}}
+ \put(8.5,19.5){\circle*{1}}\put(8.5,20.5){\circle*{1}}
+ \put(8.5,21.5){\circle*{1}}\put(8.5,22.5){\circle*{1}}
+ \put(8.5,23.5){\circle*{1}}\put(9.5,2.5){\circle*{1}}
+ \put(9.5,10.5){\circle*{1}}\put(9.5,17.5){\circle*{1}}
+ \put(9.5,23.5){\circle*{1}}\put(10.5,2.5){\circle*{1}}
+ \put(10.5,10.5){\circle*{1}}\put(10.5,17.5){\circle*{1}}
+ \put(11.5,2.5){\circle*{1}}\put(11.5,10.5){\circle*{1}}
+ \put(11.5,17.5){\circle*{1}}\put(12.5,2.5){\circle*{1}}
+ \put(12.5,10.5){\circle*{1}}\put(12.5,17.5){\circle*{1}}
+ \put(13.5,2.5){\circle*{1}}\put(13.5,10.5){\circle*{1}}
+ \put(13.5,17.5){\circle*{1}}\put(14.5,0.5){\circle*{1}}
+ \put(14.5,1.5){\circle*{1}}\put(14.5,2.5){\circle*{1}}
+ \put(14.5,3.5){\circle*{1}}\put(14.5,4.5){\circle*{1}}
+ \put(14.5,5.5){\circle*{1}}\put(14.5,6.5){\circle*{1}}
+ \put(14.5,7.5){\circle*{1}}\put(14.5,8.5){\circle*{1}}
+ \put(14.5,9.5){\circle*{1}}\put(14.5,10.5){\circle*{1}}
+ \put(14.5,11.5){\circle*{1}}\put(14.5,17.5){\circle*{1}}
+ \put(15.5,0.5){\circle*{1}}\put(15.5,1.5){\circle*{1}}
+ \put(15.5,2.5){\circle*{1}}\put(15.5,3.5){\circle*{1}}
+ \put(15.5,4.5){\circle*{1}}\put(15.5,5.5){\circle*{1}}
+ \put(15.5,6.5){\circle*{1}}\put(15.5,7.5){\circle*{1}}
+ \put(15.5,8.5){\circle*{1}}\put(15.5,9.5){\circle*{1}}
+ \put(15.5,10.5){\circle*{1}}\put(15.5,11.5){\circle*{1}}
+ \put(15.5,17.5){\circle*{1}}\put(15.5,18.5){\circle*{1}}
+ \put(16.5,10.5){\circle*{1}}\put(16.5,17.5){\circle*{1}}
+ \put(16.5,18.5){\circle*{1}}\put(17.5,17.5){\circle*{1}}
+ \end{picture}}
+ \put(62,0){\usebox{\watashi}}
+ \put(92,0){%
+ \begin{picture}(21,26)(-2,-2)%Bitmap 3570
+ \put(0.5,0.5){\circle*{1}}\put(0.5,1.5){\circle*{1}}
+ \put(0.5,2.5){\circle*{1}}\put(0.5,3.5){\circle*{1}}
+ \put(0.5,4.5){\circle*{1}}\put(0.5,5.5){\circle*{1}}
+ \put(0.5,6.5){\circle*{1}}\put(0.5,7.5){\circle*{1}}
+ \put(0.5,8.5){\circle*{1}}\put(0.5,9.5){\circle*{1}}
+ \put(0.5,10.5){\circle*{1}}\put(0.5,11.5){\circle*{1}}
+ \put(0.5,12.5){\circle*{1}}\put(0.5,13.5){\circle*{1}}
+ \put(0.5,14.5){\circle*{1}}\put(0.5,15.5){\circle*{1}}
+ \put(0.5,16.5){\circle*{1}}\put(0.5,17.5){\circle*{1}}
+ \put(0.5,18.5){\circle*{1}}\put(0.5,19.5){\circle*{1}}
+ \put(0.5,20.5){\circle*{1}}\put(0.5,21.5){\circle*{1}}
+ \put(0.5,22.5){\circle*{1}}\put(1.5,0.5){\circle*{1}}
+ \put(1.5,1.5){\circle*{1}}\put(1.5,2.5){\circle*{1}}
+ \put(1.5,3.5){\circle*{1}}\put(1.5,4.5){\circle*{1}}
+ \put(1.5,5.5){\circle*{1}}\put(1.5,6.5){\circle*{1}}
+ \put(1.5,7.5){\circle*{1}}\put(1.5,8.5){\circle*{1}}
+ \put(1.5,9.5){\circle*{1}}\put(1.5,10.5){\circle*{1}}
+ \put(1.5,11.5){\circle*{1}}\put(1.5,12.5){\circle*{1}}
+ \put(1.5,13.5){\circle*{1}}\put(1.5,14.5){\circle*{1}}
+ \put(1.5,15.5){\circle*{1}}\put(1.5,16.5){\circle*{1}}
+ \put(1.5,17.5){\circle*{1}}\put(1.5,18.5){\circle*{1}}
+ \put(1.5,19.5){\circle*{1}}\put(1.5,20.5){\circle*{1}}
+ \put(1.5,21.5){\circle*{1}}\put(2.5,2.5){\circle*{1}}
+ \put(2.5,12.5){\circle*{1}}\put(2.5,21.5){\circle*{1}}
+ \put(3.5,2.5){\circle*{1}}\put(3.5,12.5){\circle*{1}}
+ \put(3.5,21.5){\circle*{1}}\put(4.5,2.5){\circle*{1}}
+ \put(4.5,12.5){\circle*{1}}\put(4.5,21.5){\circle*{1}}
+ \put(5.5,2.5){\circle*{1}}\put(5.5,12.5){\circle*{1}}
+ \put(5.5,21.5){\circle*{1}}\put(6.5,2.5){\circle*{1}}
+ \put(6.5,12.5){\circle*{1}}\put(6.5,21.5){\circle*{1}}
+ \put(7.5,2.5){\circle*{1}}\put(7.5,12.5){\circle*{1}}
+ \put(7.5,21.5){\circle*{1}}\put(8.5,2.5){\circle*{1}}
+ \put(8.5,12.5){\circle*{1}}\put(8.5,21.5){\circle*{1}}
+ \put(9.5,2.5){\circle*{1}}\put(9.5,12.5){\circle*{1}}
+ \put(9.5,21.5){\circle*{1}}\put(10.5,2.5){\circle*{1}}
+ \put(10.5,12.5){\circle*{1}}\put(10.5,21.5){\circle*{1}}
+ \put(11.5,2.5){\circle*{1}}\put(11.5,12.5){\circle*{1}}
+ \put(11.5,21.5){\circle*{1}}\put(12.5,2.5){\circle*{1}}
+ \put(12.5,12.5){\circle*{1}}\put(12.5,21.5){\circle*{1}}
+ \put(13.5,2.5){\circle*{1}}\put(13.5,12.5){\circle*{1}}
+ \put(13.5,21.5){\circle*{1}}\put(14.5,0.5){\circle*{1}}
+ \put(14.5,1.5){\circle*{1}}\put(14.5,2.5){\circle*{1}}
+ \put(14.5,3.5){\circle*{1}}\put(14.5,4.5){\circle*{1}}
+ \put(14.5,5.5){\circle*{1}}\put(14.5,6.5){\circle*{1}}
+ \put(14.5,7.5){\circle*{1}}\put(14.5,8.5){\circle*{1}}
+ \put(14.5,9.5){\circle*{1}}\put(14.5,10.5){\circle*{1}}
+ \put(14.5,11.5){\circle*{1}}\put(14.5,12.5){\circle*{1}}
+ \put(14.5,13.5){\circle*{1}}\put(14.5,14.5){\circle*{1}}
+ \put(14.5,15.5){\circle*{1}}\put(14.5,16.5){\circle*{1}}
+ \put(14.5,17.5){\circle*{1}}\put(14.5,18.5){\circle*{1}}
+ \put(14.5,19.5){\circle*{1}}\put(14.5,20.5){\circle*{1}}
+ \put(14.5,21.5){\circle*{1}}\put(14.5,22.5){\circle*{1}}
+ \put(15.5,0.5){\circle*{1}}\put(15.5,1.5){\circle*{1}}
+ \put(15.5,2.5){\circle*{1}}\put(15.5,3.5){\circle*{1}}
+ \put(15.5,4.5){\circle*{1}}\put(15.5,5.5){\circle*{1}}
+ \put(15.5,6.5){\circle*{1}}\put(15.5,7.5){\circle*{1}}
+ \put(15.5,8.5){\circle*{1}}\put(15.5,9.5){\circle*{1}}
+ \put(15.5,10.5){\circle*{1}}\put(15.5,11.5){\circle*{1}}
+ \put(15.5,12.5){\circle*{1}}\put(15.5,13.5){\circle*{1}}
+ \put(15.5,14.5){\circle*{1}}\put(15.5,15.5){\circle*{1}}
+ \put(15.5,16.5){\circle*{1}}\put(15.5,17.5){\circle*{1}}
+ \put(15.5,18.5){\circle*{1}}\put(15.5,19.5){\circle*{1}}
+ \put(15.5,20.5){\circle*{1}}\put(15.5,21.5){\circle*{1}}
+ \put(15.5,22.5){\circle*{1}}\put(16.5,21.5){\circle*{1}}
+ \end{picture}}
+ \put(115,0){\usebox{\watashi}}
+ \put(145,0){%
+ \begin{picture}(16,26)(-2,-2)%Bitmap 3994
+ \put(0.5,0.5){\circle*{1}}\put(0.5,1.5){\circle*{1}}
+ \put(0.5,2.5){\circle*{1}}\put(0.5,3.5){\circle*{1}}
+ \put(0.5,4.5){\circle*{1}}\put(0.5,5.5){\circle*{1}}
+ \put(0.5,6.5){\circle*{1}}\put(0.5,7.5){\circle*{1}}
+ \put(0.5,8.5){\circle*{1}}\put(0.5,9.5){\circle*{1}}
+ \put(0.5,10.5){\circle*{1}}\put(0.5,11.5){\circle*{1}}
+ \put(0.5,12.5){\circle*{1}}\put(0.5,13.5){\circle*{1}}
+ \put(0.5,14.5){\circle*{1}}\put(0.5,15.5){\circle*{1}}
+ \put(0.5,16.5){\circle*{1}}\put(0.5,17.5){\circle*{1}}
+ \put(0.5,18.5){\circle*{1}}\put(0.5,19.5){\circle*{1}}
+ \put(0.5,20.5){\circle*{1}}\put(0.5,21.5){\circle*{1}}
+ \put(0.5,22.5){\circle*{1}}\put(0.5,23.5){\circle*{1}}
+ \put(1.5,0.5){\circle*{1}}\put(1.5,1.5){\circle*{1}}
+ \put(1.5,2.5){\circle*{1}}\put(1.5,3.5){\circle*{1}}
+ \put(1.5,4.5){\circle*{1}}\put(1.5,5.5){\circle*{1}}
+ \put(1.5,6.5){\circle*{1}}\put(1.5,7.5){\circle*{1}}
+ \put(1.5,8.5){\circle*{1}}\put(1.5,9.5){\circle*{1}}
+ \put(1.5,10.5){\circle*{1}}\put(1.5,11.5){\circle*{1}}
+ \put(1.5,12.5){\circle*{1}}\put(1.5,13.5){\circle*{1}}
+ \put(1.5,14.5){\circle*{1}}\put(1.5,15.5){\circle*{1}}
+ \put(1.5,16.5){\circle*{1}}\put(1.5,17.5){\circle*{1}}
+ \put(1.5,18.5){\circle*{1}}\put(1.5,19.5){\circle*{1}}
+ \put(1.5,20.5){\circle*{1}}\put(1.5,21.5){\circle*{1}}
+ \put(1.5,22.5){\circle*{1}}\put(1.5,23.5){\circle*{1}}
+ \put(2.5,15.5){\circle*{1}}\put(2.5,23.5){\circle*{1}}
+ \put(3.5,15.5){\circle*{1}}\put(4.5,14.5){\circle*{1}}
+ \put(5.5,14.5){\circle*{1}}\put(6.5,13.5){\circle*{1}}
+ \put(7.5,12.5){\circle*{1}}\put(7.5,13.5){\circle*{1}}
+ \put(8.5,11.5){\circle*{1}}\put(8.5,12.5){\circle*{1}}
+ \put(9.5,10.5){\circle*{1}}\put(9.5,11.5){\circle*{1}}
+ \put(9.5,12.5){\circle*{1}}\put(10.5,9.5){\circle*{1}}
+ \put(10.5,10.5){\circle*{1}}\put(10.5,11.5){\circle*{1}}
+ \put(11.5,9.5){\circle*{1}}\put(11.5,10.5){\circle*{1}}
+ \end{picture}}
+ \put(163,0){\usebox{\watashi}}
+ \put(193,0){%
+ \begin{picture}(17,26)(-2,-2)%Bitmap 4645
+ \put(0.5,0.5){\circle*{1}}\put(0.5,1.5){\circle*{1}}
+ \put(0.5,2.5){\circle*{1}}\put(0.5,3.5){\circle*{1}}
+ \put(0.5,4.5){\circle*{1}}\put(0.5,5.5){\circle*{1}}
+ \put(0.5,6.5){\circle*{1}}\put(0.5,7.5){\circle*{1}}
+ \put(0.5,8.5){\circle*{1}}\put(0.5,9.5){\circle*{1}}
+ \put(0.5,10.5){\circle*{1}}\put(0.5,11.5){\circle*{1}}
+ \put(0.5,12.5){\circle*{1}}\put(0.5,13.5){\circle*{1}}
+ \put(0.5,14.5){\circle*{1}}\put(0.5,15.5){\circle*{1}}
+ \put(0.5,16.5){\circle*{1}}\put(0.5,17.5){\circle*{1}}
+ \put(0.5,18.5){\circle*{1}}\put(0.5,19.5){\circle*{1}}
+ \put(0.5,20.5){\circle*{1}}\put(0.5,21.5){\circle*{1}}
+ \put(0.5,22.5){\circle*{1}}\put(1.5,0.5){\circle*{1}}
+ \put(1.5,1.5){\circle*{1}}\put(1.5,2.5){\circle*{1}}
+ \put(1.5,3.5){\circle*{1}}\put(1.5,4.5){\circle*{1}}
+ \put(1.5,5.5){\circle*{1}}\put(1.5,6.5){\circle*{1}}
+ \put(1.5,7.5){\circle*{1}}\put(1.5,8.5){\circle*{1}}
+ \put(1.5,9.5){\circle*{1}}\put(1.5,10.5){\circle*{1}}
+ \put(1.5,11.5){\circle*{1}}\put(1.5,12.5){\circle*{1}}
+ \put(1.5,13.5){\circle*{1}}\put(1.5,14.5){\circle*{1}}
+ \put(1.5,15.5){\circle*{1}}\put(1.5,16.5){\circle*{1}}
+ \put(1.5,17.5){\circle*{1}}\put(1.5,18.5){\circle*{1}}
+ \put(1.5,19.5){\circle*{1}}\put(1.5,20.5){\circle*{1}}
+ \put(1.5,21.5){\circle*{1}}\put(2.5,21.5){\circle*{1}}
+ \put(3.5,21.5){\circle*{1}}\put(4.5,21.5){\circle*{1}}
+ \put(5.5,21.5){\circle*{1}}\put(6.5,7.5){\circle*{1}}
+ \put(6.5,21.5){\circle*{1}}\put(7.5,7.5){\circle*{1}}
+ \put(7.5,21.5){\circle*{1}}\put(8.5,6.5){\circle*{1}}
+ \put(8.5,7.5){\circle*{1}}\put(8.5,21.5){\circle*{1}}
+ \put(9.5,6.5){\circle*{1}}\put(9.5,7.5){\circle*{1}}
+ \put(9.5,21.5){\circle*{1}}\put(10.5,6.5){\circle*{1}}
+ \put(10.5,7.5){\circle*{1}}\put(10.5,8.5){\circle*{1}}
+ \put(10.5,9.5){\circle*{1}}\put(10.5,10.5){\circle*{1}}
+ \put(10.5,11.5){\circle*{1}}\put(10.5,12.5){\circle*{1}}
+ \put(10.5,13.5){\circle*{1}}\put(10.5,14.5){\circle*{1}}
+ \put(10.5,15.5){\circle*{1}}\put(10.5,16.5){\circle*{1}}
+ \put(10.5,17.5){\circle*{1}}\put(10.5,18.5){\circle*{1}}
+ \put(10.5,19.5){\circle*{1}}\put(10.5,20.5){\circle*{1}}
+ \put(10.5,21.5){\circle*{1}}\put(10.5,22.5){\circle*{1}}
+ \put(11.5,7.5){\circle*{1}}\put(11.5,8.5){\circle*{1}}
+ \put(11.5,9.5){\circle*{1}}\put(11.5,10.5){\circle*{1}}
+ \put(11.5,11.5){\circle*{1}}\put(11.5,12.5){\circle*{1}}
+ \put(11.5,13.5){\circle*{1}}\put(11.5,14.5){\circle*{1}}
+ \put(11.5,15.5){\circle*{1}}\put(11.5,16.5){\circle*{1}}
+ \put(11.5,17.5){\circle*{1}}\put(11.5,18.5){\circle*{1}}
+ \put(11.5,19.5){\circle*{1}}\put(11.5,20.5){\circle*{1}}
+ \put(11.5,21.5){\circle*{1}}\put(11.5,22.5){\circle*{1}}
+ \put(12.5,21.5){\circle*{1}}
+ \end{picture}}
+ \end{picture}
+ \sbox{\watashi}{}
+\end{center}
+
+The japanese characters on the left have a fixed width. The characters on the
+right have a minimized width, just like ordinary english characters.
+Personally, I find that minimized width is desirable when writing japanese
+horizontally. Also note that although this is not visible in these two
+examples, the japanese characters are as short as possible while respecting the
+vertical relationship with their horizontal baseline.
+
+Let us now consider vertical roman writing. If one was to simply reverse the
+previous argument regarding roman characters and their horizontal baseline, one
+would conclude that it is important to minimize the height of each roman
+character. However, the width of each character would be unimportant. It is the
+horizontal relationship between the roman character and the vertical baseline
+that would appear crucial.
+
+That reasoning could be correct if there was such a thing as vertical roman
+writing, but it fails in the japanese case for two good reasons. First of all,
+there is no vertical baseline available in \MFT. That implies that the concept
+of an horizontal relationship between a japanese character and its vertical
+baseline is undefined. The next best thing available to us is to use fixed
+width japanese characters. In such a case, the sought horizontal relationship
+is implied in the bitmap itself.
+
+Secondly, some japanese characters can be constructed by piling up other
+characters on top of one another. For example, consider the characters two,
+one, and three:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(30,94)(0,-10)
+ \thinlines
+ \put(0,-10){\line(0,1){104}}
+ \put(0,56){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 3561 ni
+ \put(0.5,2.5){\circle*{1}}\put(1.5,2.5){\circle*{1}}
+ \put(2.5,2.5){\circle*{1}}\put(3.5,2.5){\circle*{1}}
+ \put(3.5,20.5){\circle*{1}}\put(4.5,2.5){\circle*{1}}
+ \put(4.5,20.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,20.5){\circle*{1}}\put(6.5,2.5){\circle*{1}}
+ \put(6.5,20.5){\circle*{1}}\put(7.5,2.5){\circle*{1}}
+ \put(7.5,20.5){\circle*{1}}\put(8.5,2.5){\circle*{1}}
+ \put(8.5,20.5){\circle*{1}}\put(9.5,2.5){\circle*{1}}
+ \put(9.5,20.5){\circle*{1}}\put(10.5,2.5){\circle*{1}}
+ \put(10.5,20.5){\circle*{1}}\put(11.5,2.5){\circle*{1}}
+ \put(11.5,20.5){\circle*{1}}\put(12.5,2.5){\circle*{1}}
+ \put(12.5,20.5){\circle*{1}}\put(13.5,2.5){\circle*{1}}
+ \put(13.5,20.5){\circle*{1}}\put(14.5,2.5){\circle*{1}}
+ \put(14.5,20.5){\circle*{1}}\put(15.5,2.5){\circle*{1}}
+ \put(15.5,20.5){\circle*{1}}\put(16.5,2.5){\circle*{1}}
+ \put(16.5,20.5){\circle*{1}}\put(17.5,2.5){\circle*{1}}
+ \put(17.5,20.5){\circle*{1}}\put(18.5,2.5){\circle*{1}}
+ \put(18.5,20.5){\circle*{1}}\put(18.5,21.5){\circle*{1}}
+ \put(19.5,2.5){\circle*{1}}\put(19.5,20.5){\circle*{1}}
+ \put(19.5,21.5){\circle*{1}}\put(20.5,2.5){\circle*{1}}
+ \put(20.5,20.5){\circle*{1}}\put(21.5,2.5){\circle*{1}}
+ \put(21.5,3.5){\circle*{1}}\put(22.5,2.5){\circle*{1}}
+ \put(22.5,3.5){\circle*{1}}\put(23.5,2.5){\circle*{1}}
+ \end{picture}}
+ \put(0,28){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 1486 ichi
+ \put(0.5,12.5){\circle*{1}}\put(1.5,12.5){\circle*{1}}
+ \put(2.5,12.5){\circle*{1}}\put(3.5,12.5){\circle*{1}}
+ \put(4.5,12.5){\circle*{1}}\put(5.5,12.5){\circle*{1}}
+ \put(6.5,12.5){\circle*{1}}\put(7.5,12.5){\circle*{1}}
+ \put(8.5,12.5){\circle*{1}}\put(9.5,12.5){\circle*{1}}
+ \put(10.5,12.5){\circle*{1}}\put(11.5,12.5){\circle*{1}}
+ \put(12.5,12.5){\circle*{1}}\put(13.5,12.5){\circle*{1}}
+ \put(14.5,12.5){\circle*{1}}\put(15.5,12.5){\circle*{1}}
+ \put(16.5,12.5){\circle*{1}}\put(17.5,12.5){\circle*{1}}
+ \put(18.5,12.5){\circle*{1}}\put(19.5,12.5){\circle*{1}}
+ \put(20.5,12.5){\circle*{1}}\put(20.5,13.5){\circle*{1}}
+ \put(21.5,12.5){\circle*{1}}\put(21.5,13.5){\circle*{1}}
+ \put(21.5,14.5){\circle*{1}}\put(22.5,12.5){\circle*{1}}
+ \put(22.5,13.5){\circle*{1}}\put(23.5,12.5){\circle*{1}}
+ \end{picture}}
+ \put(0,0){%
+ \begin{picture}(28,26)(-2,-2)%Bitmap 2460 san
+ \put(0.5,2.5){\circle*{1}}\put(1.5,2.5){\circle*{1}}
+ \put(2.5,2.5){\circle*{1}}\put(2.5,21.5){\circle*{1}}
+ \put(3.5,2.5){\circle*{1}}\put(3.5,21.5){\circle*{1}}
+ \put(4.5,2.5){\circle*{1}}\put(4.5,12.5){\circle*{1}}
+ \put(4.5,21.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,12.5){\circle*{1}}\put(5.5,21.5){\circle*{1}}
+ \put(6.5,2.5){\circle*{1}}\put(6.5,12.5){\circle*{1}}
+ \put(6.5,21.5){\circle*{1}}\put(7.5,2.5){\circle*{1}}
+ \put(7.5,12.5){\circle*{1}}\put(7.5,21.5){\circle*{1}}
+ \put(8.5,2.5){\circle*{1}}\put(8.5,12.5){\circle*{1}}
+ \put(8.5,21.5){\circle*{1}}\put(9.5,2.5){\circle*{1}}
+ \put(9.5,12.5){\circle*{1}}\put(9.5,21.5){\circle*{1}}
+ \put(10.5,2.5){\circle*{1}}\put(10.5,12.5){\circle*{1}}
+ \put(10.5,21.5){\circle*{1}}\put(11.5,2.5){\circle*{1}}
+ \put(11.5,12.5){\circle*{1}}\put(11.5,21.5){\circle*{1}}
+ \put(12.5,2.5){\circle*{1}}\put(12.5,12.5){\circle*{1}}
+ \put(12.5,21.5){\circle*{1}}\put(13.5,2.5){\circle*{1}}
+ \put(13.5,12.5){\circle*{1}}\put(13.5,21.5){\circle*{1}}
+ \put(14.5,2.5){\circle*{1}}\put(14.5,12.5){\circle*{1}}
+ \put(14.5,21.5){\circle*{1}}\put(15.5,2.5){\circle*{1}}
+ \put(15.5,12.5){\circle*{1}}\put(15.5,21.5){\circle*{1}}
+ \put(16.5,2.5){\circle*{1}}\put(16.5,12.5){\circle*{1}}
+ \put(16.5,21.5){\circle*{1}}\put(17.5,2.5){\circle*{1}}
+ \put(17.5,12.5){\circle*{1}}\put(17.5,13.5){\circle*{1}}
+ \put(17.5,21.5){\circle*{1}}\put(18.5,2.5){\circle*{1}}
+ \put(18.5,12.5){\circle*{1}}\put(18.5,13.5){\circle*{1}}
+ \put(18.5,21.5){\circle*{1}}\put(19.5,2.5){\circle*{1}}
+ \put(19.5,12.5){\circle*{1}}\put(19.5,21.5){\circle*{1}}
+ \put(19.5,22.5){\circle*{1}}\put(20.5,2.5){\circle*{1}}
+ \put(20.5,21.5){\circle*{1}}\put(20.5,22.5){\circle*{1}}
+ \put(21.5,2.5){\circle*{1}}\put(21.5,3.5){\circle*{1}}
+ \put(21.5,21.5){\circle*{1}}\put(22.5,2.5){\circle*{1}}
+ \put(22.5,3.5){\circle*{1}}\put(23.5,2.5){\circle*{1}}
+ \end{picture}}
+ \end{picture}
+ \hspace{1cm}
+ \begin{picture}(30,94)(0,-10)
+ \thinlines
+ \put(0,-10){\line(0,1){104}}
+ \put(0,45.5){%
+ \begin{picture}(28,23)(-2,0)%Bitmap 3561 ni
+ \put(0.5,2.5){\circle*{1}}\put(1.5,2.5){\circle*{1}}
+ \put(2.5,2.5){\circle*{1}}\put(3.5,2.5){\circle*{1}}
+ \put(3.5,20.5){\circle*{1}}\put(4.5,2.5){\circle*{1}}
+ \put(4.5,20.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,20.5){\circle*{1}}\put(6.5,2.5){\circle*{1}}
+ \put(6.5,20.5){\circle*{1}}\put(7.5,2.5){\circle*{1}}
+ \put(7.5,20.5){\circle*{1}}\put(8.5,2.5){\circle*{1}}
+ \put(8.5,20.5){\circle*{1}}\put(9.5,2.5){\circle*{1}}
+ \put(9.5,20.5){\circle*{1}}\put(10.5,2.5){\circle*{1}}
+ \put(10.5,20.5){\circle*{1}}\put(11.5,2.5){\circle*{1}}
+ \put(11.5,20.5){\circle*{1}}\put(12.5,2.5){\circle*{1}}
+ \put(12.5,20.5){\circle*{1}}\put(13.5,2.5){\circle*{1}}
+ \put(13.5,20.5){\circle*{1}}\put(14.5,2.5){\circle*{1}}
+ \put(14.5,20.5){\circle*{1}}\put(15.5,2.5){\circle*{1}}
+ \put(15.5,20.5){\circle*{1}}\put(16.5,2.5){\circle*{1}}
+ \put(16.5,20.5){\circle*{1}}\put(17.5,2.5){\circle*{1}}
+ \put(17.5,20.5){\circle*{1}}\put(18.5,2.5){\circle*{1}}
+ \put(18.5,20.5){\circle*{1}}\put(18.5,21.5){\circle*{1}}
+ \put(19.5,2.5){\circle*{1}}\put(19.5,20.5){\circle*{1}}
+ \put(19.5,21.5){\circle*{1}}\put(20.5,2.5){\circle*{1}}
+ \put(20.5,20.5){\circle*{1}}\put(21.5,2.5){\circle*{1}}
+ \put(21.5,3.5){\circle*{1}}\put(22.5,2.5){\circle*{1}}
+ \put(22.5,3.5){\circle*{1}}\put(23.5,2.5){\circle*{1}}
+ \end{picture}}
+ \put(0,39.5){%
+ \begin{picture}(28,16)(-2,10)%Bitmap 1486 ichi
+ \put(0.5,12.5){\circle*{1}}\put(1.5,12.5){\circle*{1}}
+ \put(2.5,12.5){\circle*{1}}\put(3.5,12.5){\circle*{1}}
+ \put(4.5,12.5){\circle*{1}}\put(5.5,12.5){\circle*{1}}
+ \put(6.5,12.5){\circle*{1}}\put(7.5,12.5){\circle*{1}}
+ \put(8.5,12.5){\circle*{1}}\put(9.5,12.5){\circle*{1}}
+ \put(10.5,12.5){\circle*{1}}\put(11.5,12.5){\circle*{1}}
+ \put(12.5,12.5){\circle*{1}}\put(13.5,12.5){\circle*{1}}
+ \put(14.5,12.5){\circle*{1}}\put(15.5,12.5){\circle*{1}}
+ \put(16.5,12.5){\circle*{1}}\put(17.5,12.5){\circle*{1}}
+ \put(18.5,12.5){\circle*{1}}\put(19.5,12.5){\circle*{1}}
+ \put(20.5,12.5){\circle*{1}}\put(20.5,13.5){\circle*{1}}
+ \put(21.5,12.5){\circle*{1}}\put(21.5,13.5){\circle*{1}}
+ \put(21.5,14.5){\circle*{1}}\put(22.5,12.5){\circle*{1}}
+ \put(22.5,13.5){\circle*{1}}\put(23.5,12.5){\circle*{1}}
+ \end{picture}}
+ \put(0,15.5){%
+ \begin{picture}(28,24)(-2,0)%Bitmap 2460 san
+ \put(0.5,2.5){\circle*{1}}\put(1.5,2.5){\circle*{1}}
+ \put(2.5,2.5){\circle*{1}}\put(2.5,21.5){\circle*{1}}
+ \put(3.5,2.5){\circle*{1}}\put(3.5,21.5){\circle*{1}}
+ \put(4.5,2.5){\circle*{1}}\put(4.5,12.5){\circle*{1}}
+ \put(4.5,21.5){\circle*{1}}\put(5.5,2.5){\circle*{1}}
+ \put(5.5,12.5){\circle*{1}}\put(5.5,21.5){\circle*{1}}
+ \put(6.5,2.5){\circle*{1}}\put(6.5,12.5){\circle*{1}}
+ \put(6.5,21.5){\circle*{1}}\put(7.5,2.5){\circle*{1}}
+ \put(7.5,12.5){\circle*{1}}\put(7.5,21.5){\circle*{1}}
+ \put(8.5,2.5){\circle*{1}}\put(8.5,12.5){\circle*{1}}
+ \put(8.5,21.5){\circle*{1}}\put(9.5,2.5){\circle*{1}}
+ \put(9.5,12.5){\circle*{1}}\put(9.5,21.5){\circle*{1}}
+ \put(10.5,2.5){\circle*{1}}\put(10.5,12.5){\circle*{1}}
+ \put(10.5,21.5){\circle*{1}}\put(11.5,2.5){\circle*{1}}
+ \put(11.5,12.5){\circle*{1}}\put(11.5,21.5){\circle*{1}}
+ \put(12.5,2.5){\circle*{1}}\put(12.5,12.5){\circle*{1}}
+ \put(12.5,21.5){\circle*{1}}\put(13.5,2.5){\circle*{1}}
+ \put(13.5,12.5){\circle*{1}}\put(13.5,21.5){\circle*{1}}
+ \put(14.5,2.5){\circle*{1}}\put(14.5,12.5){\circle*{1}}
+ \put(14.5,21.5){\circle*{1}}\put(15.5,2.5){\circle*{1}}
+ \put(15.5,12.5){\circle*{1}}\put(15.5,21.5){\circle*{1}}
+ \put(16.5,2.5){\circle*{1}}\put(16.5,12.5){\circle*{1}}
+ \put(16.5,21.5){\circle*{1}}\put(17.5,2.5){\circle*{1}}
+ \put(17.5,12.5){\circle*{1}}\put(17.5,13.5){\circle*{1}}
+ \put(17.5,21.5){\circle*{1}}\put(18.5,2.5){\circle*{1}}
+ \put(18.5,12.5){\circle*{1}}\put(18.5,13.5){\circle*{1}}
+ \put(18.5,21.5){\circle*{1}}\put(19.5,2.5){\circle*{1}}
+ \put(19.5,12.5){\circle*{1}}\put(19.5,21.5){\circle*{1}}
+ \put(19.5,22.5){\circle*{1}}\put(20.5,2.5){\circle*{1}}
+ \put(20.5,21.5){\circle*{1}}\put(20.5,22.5){\circle*{1}}
+ \put(21.5,2.5){\circle*{1}}\put(21.5,3.5){\circle*{1}}
+ \put(21.5,21.5){\circle*{1}}\put(22.5,2.5){\circle*{1}}
+ \put(22.5,3.5){\circle*{1}}\put(23.5,2.5){\circle*{1}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+The japanese characters on the right are harder to read than the ones on the
+left. This problem is partly alleviated if one uses vertically, characters with
+minimized height that have been created for horizontal use. As discussed
+before, the vertical distance between such characters and their horizontal
+baseline is respected. This space could occasionally act as breathing space if
+such horizontal characters were to be used vertically. But this is nevertheless
+not satisfactory since an incomplete and unnatural solution. The only way to
+avoid this problem altogether is to use fixed height characters when writing
+japanese vertically, just as was done in the left column.
+
+The conclusion seems clear. If you intend to use your \JemTeX\ fonts vertically
+with some vertical writing style unknown to me, you should definitely create
+fixed width and fixed height fonts. This is the only natural choice available.
+If you will use your fonts only horizontally, then you probably want minimized
+width fonts. Personally, I also minimized their height since the resulting
+fonts are slightly smaller in size.
+
+\label{positioning}
+
+The second topic I would like to discuss here is relevant primarily for
+horizontal writing. Given intermixed roman and japanese characters, how should
+they relate to one another. More precisely, how tall should japanese characters
+be with respect to capital roman ones, and what vertical relationship should
+they have with their horizontal baseline.
+
+It is a fact that most japanese characters are far more complex than any given
+roman one. Therefore, japanese character should be relatively big. On the other
+hand, tall centered japanese characters will lie lower on the horizontal
+baseline than capital roman characters do, and will extend vertically more than
+capital roman ones do. Consequently, the reader's eyes might have to go up and
+down as they look over the text horizontally. A compromise is clearly called
+for.
+
+The first writing style considered here will be referred to as a {\em
+dictionary\/} style since usually used in japanese dictionaries. In this style,
+japanese characters are substantially taller than capital roman ones. This
+makes it possible to use small japanese characters along with even smaller
+roman ones to save space while maintaining readability. The japanese characters
+also lie quite low on the horizontal baseline and extend vertically exactly the
+same as capital roman characters do. Take a close look at your favorite
+japanese dictionary.
+
+I will refer to a more conventional japanese font as a {\em standard\/} style.
+In this one, the japanese characters are still taller than capital roman ones,
+but by a smaller amount than before. The japanese characters lie a little bit
+lower on the horizontal baseline than capital roman characters do, and also
+extend a little bit more vertically than capital roman ones do. They are
+vertically centered as well as possible with respect to capital roman letter.
+Many users of \JemTeX\ requested such a font style.
+
+Here again, you will have to decide which style you prefer. In the first two
+releases of \JemTeX, I used my japanese dictionaries to derive ideal font
+characteristics. Since then, numerous people taught me that dictionary fonts
+are quite specialized. Chances are you will want to use the standard style.
+Personally, I am now permanently switching to it.
+
+\subsection{The {\tt JIS2MF} Code Generator}
+\label{thejis2mfcodegenerator}
+
+Given a bitmap, my program \verb"JIS2MF" can construct an equivalent continuous
+character and generate \MFT\ code for it. The \MFT\ program can then use this
+code to generate a standard \TeX\ font. You have been supplied with the source
+and the compressed compiled version of this Pascal program. Note that the file
+\verb"JIS24" should be available in the current directory to run \verb"JIS2MF".
+This fairly big file contains all the bitmaps making up the JIS~24 dot font.
+
+The first practical problem is to decide on font names and their content. Not
+everybody is running newer versions of \TeX\ and its drivers, allowing for
+256~characters in a font. This includes me! Therefore, I put only
+128~characters in my fonts. Unfortunately, this implies that I cannot use the
+same scheme as J\TeX\ since the latter uses 256~characters per font. However, I
+keep my new standard simple by organizing characters sequentially. I also leave
+character~0 of the first font empty so that character~$x$ of the first font
+corresponds to bitmap~$x$ of the JIS~24 dot font.
+
+\TeX\ does not allow numbers in font names. Therefore, the names \verb"kanji00"
+all the way to \verb"kanji60" are not possible. Table~\ref{thejemtexfonts}
+lists the names I am using.
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{footnotesize}
+ \begin{tabular}{cccccccc}
+ \verb"kanjiaa" & \verb"kanjiab" & \verb"kanjiac" & \verb"kanjiad" &
+ \verb"kanjiae" & \verb"kanjiaf" & \verb"kanjiag" & \verb"kanjiah" \\
+ $\vdots$ & $\vdots$ & $\vdots$ & $\vdots$ &
+ $\vdots$ & $\vdots$ & $\vdots$ & $\vdots$ \\
+ \verb"kanjiga" & \verb"kanjigb" & \verb"kanjigc" & \verb"kanjigd" &
+ \verb"kanjige" & \verb"kanjigf" & \verb"kanjigg" & \verb"kanjigh" \\
+ \verb"kanjiha" & \verb"kanjihb" & \verb"kanjihc" & \verb"kanjihd" &
+ \verb"kanjihe"
+ \end{tabular}
+ \end{footnotesize}
+ \end{center}
+ \caption{The \JemTeX\ Fonts.}
+ \label{thejemtexfonts}
+\end{table}
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{minipage}{\textwidth}
+ \begin{small}
+ \begin{tabbing}
+ \verb"kanjiaa": Beginning of common english and japanese characters. \\
+ \verb"kanjiae": Most foreign characters. \\
+ \verb"kanjiaf": Beginning of most extended characters. \\
+ \verb"kanjiba": First of three empty fonts. \\
+ \verb"kanjibd": Beginning of level~1 kanjis. \\
+ \verb"kanjiec": Transition between level~1 and level~2 kanjis. \\
+ \verb"kanjihe": End of level~2 kanjis.
+ \end{tabbing}
+ \end{small}
+ \end{minipage}
+ \end{center}
+ \caption{Description of the \JemTeX\ Fonts.}
+ \label{descriptionofthejemtexfonts}
+\end{table}
+
+Several users complained about the time necessary to generate these fonts,
+especially on the original 4.77~MHz IBM-PC. To help them decide which \JemTeX\
+fonts they are likely to need, Table~\ref{descriptionofthejemtexfonts} contains
+a brief description of all of them. I found through daily use that I almost
+never use level~2 fonts. However, a typical 4~page document uses every level~1
+font.
+
+The last remaining preliminary detail is the question of bitmap numbering. The
+bitmaps in \verb"JIS24" are numbered consecutively from~1 to~7806. The first
+bitmap is empty, since it is the japanese space character. Many other
+characters in the \JemTeX\ extended JIS~24 dot font are also left empty.
+\verb"JIS2MF" ignores such characters altogether and will leave an undefined
+character when it encounters one. This can be quite handy for somebody wishing
+to create fonts using some other standard, like J\TeX. Suppose you wish to
+leave some characters undefined in the font you are currently building. By
+specifying bitmap~1 at the right places, the corresponding characters will be
+left undefined.
+
+My utility \verb"JIS2MF" requires the following information to operate:
+\begin{description}
+ \item[Font Name:] The name of the font you are creating. \verb"JIS2MF" will
+ add for you the extension \verb".mf", so do not specify it.
+ The program also acts differently depending on whether or
+ not the font name you supply is a \JemTeX\ font name, like
+ \verb"kanjidf".
+ \item[Writing Style:] The characteristics of your font, essentially fixed
+ versus proportional dimensions and dictionary versus
+ standard positioning of the japanese characters.
+ \item[Bitmap Numbers:] The number of all the bitmaps making up the current
+ font. Specifying bitmap~0 terminates the process.
+\end{description}
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{tabular}{l|cccc}
+ {\tt JIS2MF} & Command Line & Font & Writing & Bitmap \\
+ Mode & Parameters & Name & Style & Numbers \\
+ \hline
+ Manual & $\times$ & $\surd$ & $\surd$ & $\surd$ \\
+ Semi-Automatic & $\surd$ & (other) & Optional & $\surd$ \\
+ Automatic & $\surd$ & (\JemTeX) & Optional & $\times$ \\
+ Batch & $\surd$ & $\times$ & Optional & $\times$
+ \end{tabular}
+ \end{center}
+ \caption{The {\tt JIS2MF} Modes.}
+ \label{thejis2mfmodes}
+\end{table}
+
+How much and what information you must supply depends on which mode
+\verb"JIS2MF" is in when you run it. Table~\ref{thejis2mfmodes} shows all the
+modes currently available.
+
+If you simply start \verb"JIS2MF" without any command line information, it will
+run in manual mode where you must answer questions interactively throughout the
+operation. In Table~\ref{thejis2mfmodes}, a $\surd$ indicates information that
+will be required of you interactively. A $\times$ indicates information
+irrelevant, or that you will not be asked for interactively.
+
+The other three more advanced modes can only be accessed by specifying some
+additional command line information. First, you can specify on the command line
+the name of the font to be built. For example, here is how I would generate the
+first \JemTeX\ font:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+JIS2MF kanjiaa
+\end{verbatim}
+\end{quote}
+You can also add to such a command some \verb"JIS2MF" parameters. These always
+begin with a \verb"/" or a \verb"-", and any combination or small and capital
+letters is acceptable.
+
+For the last three modes listed in Table~\ref{thejis2mfmodes}, proportional
+width, proportional height, and standard positioning are assumed as default
+writing styles. However, you may override or confirm any of these default
+values with the appropriate command line parameter. The recognized ones are
+listed in Tables~\ref{widthparameters}, \ref{heightparameters},
+and~\ref{positioningparameters}.
+
+\vspace*{\fill}
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{tabular}{ll}
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/FixedWidth" \\
+ \verb"/FixedX" \\
+ \verb"/NoProportionalWidth" \\
+ \verb"/NoProportionalX"}\right\}$} & Fixed width. \\[8mm]
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/NoFixedWidth" \\
+ \verb"/NoFixedX" \\
+ \verb"/ProportionalWidth" \\
+ \verb"/ProportionalX"}\right\}$} & Minimized width.
+ \end{tabular}
+ \end{center}
+ \caption{Width Parameters.}
+ \label{widthparameters}
+\end{table}
+
+\vspace*{\fill}
+
+\newpage %improve a bad page break
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{tabular}{ll}
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/FixedHeight" \\
+ \verb"/FixedY" \\
+ \verb"/NoProportionalHeight" \\
+ \verb"/NoProportionalY"}\right\}$} & Fixed height. \\[8mm]
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/NoFixedHeight" \\
+ \verb"/NoFixedY" \\
+ \verb"/ProportionalHeight" \\
+ \verb"/ProportionalY"}\right\}$} & Minimized height.
+ \end{tabular}
+ \end{center}
+ \caption{Height Parameters.}
+ \label{heightparameters}
+ \begin{center}
+ \begin{tabular}{ll}
+ \verb"/Standard" & Standard positioning. \\
+ \verb"/Dictionary" & Dictionary positioning.
+ \end{tabular}
+ \end{center}
+ \caption{Positioning Parameters.}
+ \label{positioningparameters}
+\end{table}
+
+Here is how I would generate a \JemTeX\ font to be used vertically:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+JIS2MF kanjiaa /FixedWidth /FixedHeight
+\end{verbatim}
+\end{quote}
+In the last two examples, since the font names specified are \JemTeX\ font
+names, \verb"JIS2MF" supplies all the bitmap numbers for you; that's the
+automatic mode. If the font name is not a \JemTeX\ one, then you are asked
+interactively for the bitmap numbers; that's the semi-automatic mode. If you
+plan on using a lot \verb"JIS2MF" semi-automatically, you may find piping
+advantageous.
+
+\label{batch}
+
+The remaining mode is the batch mode. As its name implies, it is designed for
+people using batch files. To trigger this mode, use the \verb"/batch" command
+line parameter. In this mode, \verb"JIS2MF" looks in the current directory to
+determine the latest \JemTeX\ font generated. It then generates the next one,
+if possible.
+
+There are two ways of using this feature. The simplest one is to generate the
+\MFT\ code for all the \JemTeX\ fonts. To do so, create and execute the
+following \verb"SIMPLE.BAT" batch file:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+JIS2MF /NoFixedWidth /NoFixedHeight /Standard /Batch
+IF NOT ERRORLEVEL 1 SIMPLE
+\end{verbatim}
+\end{quote}
+
+In this example, the code for the font \verb"kanjiaa" is first created. If all
+went well, \verb"SIMPLE" executes again. It finds the file \verb"kanjiaa.mf"
+in the current directory and therefore generates \verb"kanjiab.mf". Eventually,
+the code for the font \verb"kanjihe" will be produced. When called once more,
+\verb"JIS2MF" realizes that there is no such thing as a \JemTeX\ font
+\verb"kanjihf" and stops with an error. The current batch file \verb"SIMPLE"
+then terminates.
+
+Although this procedure is correct, it also requires 36~Mb of disk space! To
+avoid this, I use a more involved procedure. Here is the batch file
+\verb"COMPLEX.BAT":
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+JIS2MF /NoFixedWidth /NoFixedHeight /Standard /Batch
+IF ERRORLEVEL 1 GOTO TERMINATE
+FOR %%1 IN (kanji??.mf) DO CALL METAFONT %%1
+ERASE kanji??.mf
+COMPLEX
+:TERMINATE
+\end{verbatim}
+\end{quote}
+
+As in the previous example, \verb"JIS2MF" first creates the file
+\verb"kanjiaa.mf". The batch file \verb"METAFONT.BAT" is then called with the
+parameter \verb"kanjiaa.mf". \MFT\ is to be discussed in
+Subsection~\ref{runningmetafont}, but suffice to say that the files
+\verb"kanjiaa.tfm" and \verb"kanjiaa.pk" are created by the subroutine
+\verb"METAFONT". To save disk space, the file \verb"kanjiaa.mf" is then
+deleted. Finally, this cycle starts all over again. This procedure works fine
+because \verb"JIS2MF" looks for \verb"*.mf" {\em and\/} \verb"*.tfm" files when
+trying to decide which font should be handled next.
+
+\subsection{Running METAFONT}
+\label{runningmetafont}
+
+The \MFT\ program comes in two versions; a small one with a 64~Kb work space,
+and a big one with a 256~Kb work space. Although the big version is more
+capable, the small one is preferred whenever possible since it runs faster.
+Here is a list of the \emTeX\ files necessary for the small 80286 version:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+MF EXE 197840 8-04-90 10:29p
+MF POO 23028 8-04-90 9:42p
+CM BAS 107412 9-19-90 11:13a
+\end{verbatim}
+\end{quote}
+
+\newpage %improve a bad page break
+
+The files for the big 80286 version are:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+MF EXE 238996 8-04-90 11:15p
+MF POO 23028 8-04-90 10:32p
+CM BAS 215128 9-19-90 11:13a
+\end{verbatim}
+\end{quote}
+
+The program to compress the forthcoming fonts is:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+GFTOPK EXE 52825 9-15-90 1:13a
+\end{verbatim}
+\end{quote}
+
+Finally, you also need a small file, describing the characteristics of the
+device for which the fonts are intended. I use the file \verb"epsonfx.mf",
+which is given below. Several such files are included in the file
+\verb"local.mf" supplied with \emTeX, and there are small libraries of them in
+\TeX\ circles.
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+mode_def epsonfx = % Epson FX-80 (240x216)
+ proofing:=0; % no, we're not making proofs
+ fontmaking:=1; % yes, we are making a font
+ tracingtitles:=0; % no, don't show titles in the log
+ pixels_per_inch:=240; % 240 dots/inch horizontally
+ blacker:=0; % don't make the pens any blacker
+ fillin:=0; % and don't compensate for fillin
+ o_correction:=.2; % but suppress most overshoots
+ aspect_ratio:=9/10; % 216 dots/inch vertically
+ enddef;
+\end{verbatim}
+\end{quote}
+
+Font sizes are measured in magsteps. Typical magsteps are~$0.0$, $0.5$, $1.0$,
+$2.0$, $3.0$, $4.0$, and~$5.0$. I find that most kanjis look acceptable on my
+\mbox{9-pin} printer starting at magstep~$2.0$, and all kanjis are acceptable
+starting at magstep~$3.0$. Hiraganas and katakanas are fairly simple
+characters, and they look good at any magsteps. Table~\ref{12ptfontsizes} on
+page~\pageref{12ptfontsizes} lists common font sizes.
+
+\label{mftproof}
+
+You can run big \MFT\ in proof mode where each character is displayed
+graphically, but no font useful for us is created. The command I use is:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+MF &cm kanjiaa >NUL:
+\end{verbatim}
+\end{quote}
+
+\newpage %improve a bad page break
+
+\label{mftstandard}
+
+You can run small \MFT\ in standard mode, which will generate usable fonts.
+Here are the commands to create \verb"kanjiaa.tfm" and \verb"kanjiaa.pk":
+\begin{quote}
+\begin{small}%Don't put spaces after the next line!
+\begin{verbatim}
+MF &cm \mode:=epsonfx; \mag:=magstep(0.0); \input kanjiaa.mf
+GFTOPK kanjiaa.240
+\end{verbatim}
+\end{small}
+\end{quote}
+
+The file name extension \verb".240" refers to the resolution of my printer,
+resolution specified in the file \verb"epsonfx.mf". It may be different in your
+case. Finally, note that this extension also changes with the magstep used. For
+magstep~$5.0$, it becomes in my case $240 \times 1.2^{5.0} \approx 597$.
+
+Here is my batch file \verb"METAFONT.BAT":
+\begin{quote}
+\begin{small}%Don't put spaces after the next line!
+\begin{verbatim}
+MF &cm \mode:=epsonfx; \mag:=magstep(5.0); \input %1
+FOR %%1 IN (kanji??.597) DO GFTOPK %%1
+ERASE kanji??.597
+ERASE kanji??.log
+\end{verbatim}
+\end{small}
+\end{quote}
+
+\subsection{The METAFONT Code}
+\label{themetafontcode}
+
+In this subsection, I will briefly go over the \MFT\ code produced by my
+program for a typical standard style font. This code can be crudely divided
+into four parts:
+\begin{itemize}
+ \item Initial Header.
+ \item Macro Definitions.
+ \item Character Definitions.
+ \item Final Header.
+\end{itemize}
+
+The header begins with the following command requesting memory usage statistics
+in the \verb".log" file produced along with each font by \MFT:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+tracingstats:=1;
+\end{verbatim}
+\end{quote}
+
+In proof mode, \MFT\ displays the characters in graphics mode provided it knows
+the resolution of your device. I use the following, which you may decide to
+change according to your hardware:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+screen_cols:=640; %VGA
+screen_rows:=480; %VGA
+\end{verbatim}
+\end{quote}
+
+The font design size, a fundamental unit of measurement, and character
+positioning are then supplied. I use the following for standard \JemTeX\ fonts:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+font_size 10pt#;
+u#:=12.7/36pt#;
+body_height#:=23.25u#;
+desc_depth#:=4.75u#;
+\end{verbatim}
+\end{quote}
+
+Each underlying bitmap is $24u$~by~$24u$, and an empty border of $2u$ is left
+around every japanese characters. In a standard style, each character can
+extend vertically potentially by as much as $23.25u$ above its horizontal
+baseline, and $4.75u$ below it, for a total of $28u$. Note that these are the
+biggest values that can occur. In practice, the actual values are supplied for
+each character when they are defined. For a fixed height font, the actual
+values are always equal to these extreme values. Finally, the width is handled
+differently by \MFT\ since only the actual width needs to be specified for each
+character.
+
+At this point, a whole series of parameters is necessary for the Computer
+Modern base. The minimum set of them is set to~\verb"0pt" whenever possible. I
+solve the few occurring overflows by setting the right parameters
+to~\verb"1pt". None of these parameters appears useful since my japanese
+characters use only very primitive \MFT\ operators. But \MFT\ insists on all
+its parameters to be set anyway.
+
+\MFT\ is then initialized with:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+mode_setup;
+font_setup;
+\end{verbatim}
+\end{quote}
+
+The macros to be used in drawing the characters follow. Each dot making up the
+current bitmap lies in a square which I refer to by its lower left $z=(x,y)$
+coordinates. I declare that variable $z$ with:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+pair z;
+\end{verbatim}
+\end{quote}
+
+A number of macros to draw squares, triangles, reverse triangles, and quarter
+circles are then included. All these have only one parameter; $z$. They are
+illustrated in Figures~\ref{shortpatches} and~\ref{longpatches}.
+
+\newpage %improve a bad page break
+
+\begin{figure}[htb]
+ \begin{center}
+ \setlength{\unitlength}{0.38pt}
+ \begin{picture}(900,900)
+ \put(0,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,90){\framebox(90,90){}}
+ \put(0,90){\makebox(90,90){sul}}
+ \end{picture}}
+ \put(240,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\framebox(90,90){}}
+ \put(90,90){\makebox(90,90){sur}}
+ \end{picture}}
+ \put(480,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,0){\framebox(90,90){}}
+ \put(90,0){\makebox(90,90){sbr}}
+ \end{picture}}
+ \put(720,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,0){\framebox(90,90){}}
+ \put(0,0){\makebox(90,90){sbl}}
+ \end{picture}}
+ \put(0,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(-1,0){90}}
+ \put(90,90){\line(0,1){90}}
+ \put(90.0,180.0){\circle*{1}}\put(88.7,180.0){\circle*{1}}
+ \put(87.5,180.0){\circle*{1}}\put(86.2,179.9){\circle*{1}}
+ \put(84.9,179.9){\circle*{1}}\put(83.6,179.8){\circle*{1}}
+ \put(82.4,179.7){\circle*{1}}\put(81.1,179.6){\circle*{1}}
+ \put(79.8,179.4){\circle*{1}}\put(78.5,179.3){\circle*{1}}
+ \put(77.3,179.1){\circle*{1}}\put(76.0,178.9){\circle*{1}}
+ \put(74.7,178.7){\circle*{1}}\put(73.5,178.5){\circle*{1}}
+ \put(72.2,178.2){\circle*{1}}\put(70.9,178.0){\circle*{1}}
+ \put(69.6,177.7){\circle*{1}}\put(68.4,177.4){\circle*{1}}
+ \put(67.1,177.0){\circle*{1}}\put(65.8,176.7){\circle*{1}}
+ \put(64.5,176.3){\circle*{1}}\put(63.3,175.9){\circle*{1}}
+ \put(62.0,175.5){\circle*{1}}\put(60.7,175.1){\circle*{1}}
+ \put(59.5,174.7){\circle*{1}}\put(58.2,174.2){\circle*{1}}
+ \put(56.9,173.7){\circle*{1}}\put(55.6,173.2){\circle*{1}}
+ \put(54.4,172.6){\circle*{1}}\put(53.1,172.1){\circle*{1}}
+ \put(51.8,171.5){\circle*{1}}\put(50.5,170.9){\circle*{1}}
+ \put(49.3,170.3){\circle*{1}}\put(48.0,169.6){\circle*{1}}
+ \put(46.7,168.9){\circle*{1}}\put(45.5,168.2){\circle*{1}}
+ \put(44.2,167.5){\circle*{1}}\put(42.9,166.7){\circle*{1}}
+ \put(41.6,165.9){\circle*{1}}\put(40.4,165.1){\circle*{1}}
+ \put(39.1,164.2){\circle*{1}}\put(37.8,163.3){\circle*{1}}
+ \put(36.5,162.4){\circle*{1}}\put(35.3,161.4){\circle*{1}}
+ \put(34.0,160.5){\circle*{1}}\put(32.7,159.4){\circle*{1}}
+ \put(31.5,158.4){\circle*{1}}\put(30.2,157.2){\circle*{1}}
+ \put(28.9,156.1){\circle*{1}}\put(27.6,154.9){\circle*{1}}
+ \put(26.4,153.6){\circle*{1}}\put(0.0,90.0){\circle*{1}}
+ \put(0.0,91.3){\circle*{1}}\put(0.0,92.5){\circle*{1}}
+ \put(0.1,93.8){\circle*{1}}\put(0.1,95.1){\circle*{1}}
+ \put(0.2,96.4){\circle*{1}}\put(0.3,97.6){\circle*{1}}
+ \put(0.4,98.9){\circle*{1}}\put(0.6,100.2){\circle*{1}}
+ \put(0.7,101.5){\circle*{1}}\put(0.9,102.7){\circle*{1}}
+ \put(1.1,104.0){\circle*{1}}\put(1.3,105.3){\circle*{1}}
+ \put(1.5,106.5){\circle*{1}}\put(1.8,107.8){\circle*{1}}
+ \put(2.0,109.1){\circle*{1}}\put(2.3,110.4){\circle*{1}}
+ \put(2.6,111.6){\circle*{1}}\put(3.0,112.9){\circle*{1}}
+ \put(3.3,114.2){\circle*{1}}\put(3.7,115.5){\circle*{1}}
+ \put(4.1,116.7){\circle*{1}}\put(4.5,118.0){\circle*{1}}
+ \put(4.9,119.3){\circle*{1}}\put(5.3,120.5){\circle*{1}}
+ \put(5.8,121.8){\circle*{1}}\put(6.3,123.1){\circle*{1}}
+ \put(6.8,124.4){\circle*{1}}\put(7.4,125.6){\circle*{1}}
+ \put(7.9,126.9){\circle*{1}}\put(8.5,128.2){\circle*{1}}
+ \put(9.1,129.5){\circle*{1}}\put(9.7,130.7){\circle*{1}}
+ \put(10.4,132.0){\circle*{1}}\put(11.1,133.3){\circle*{1}}
+ \put(11.8,134.5){\circle*{1}}\put(12.5,135.8){\circle*{1}}
+ \put(13.3,137.1){\circle*{1}}\put(14.1,138.4){\circle*{1}}
+ \put(14.9,139.6){\circle*{1}}\put(15.8,140.9){\circle*{1}}
+ \put(16.7,142.2){\circle*{1}}\put(17.6,143.5){\circle*{1}}
+ \put(18.6,144.7){\circle*{1}}\put(19.5,146.0){\circle*{1}}
+ \put(20.6,147.3){\circle*{1}}\put(21.6,148.5){\circle*{1}}
+ \put(22.8,149.8){\circle*{1}}\put(23.9,151.1){\circle*{1}}
+ \put(25.1,152.4){\circle*{1}}
+ \put(30,90){\makebox(60,60){cul}}
+ \end{picture}}
+ \put(240,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(1,0){90}}
+ \put(90,90){\line(0,1){90}}
+ \put(90.0,180.0){\circle*{1}}\put(91.3,180.0){\circle*{1}}
+ \put(92.5,180.0){\circle*{1}}\put(93.8,179.9){\circle*{1}}
+ \put(95.1,179.9){\circle*{1}}\put(96.4,179.8){\circle*{1}}
+ \put(97.6,179.7){\circle*{1}}\put(98.9,179.6){\circle*{1}}
+ \put(100.2,179.4){\circle*{1}}\put(101.5,179.3){\circle*{1}}
+ \put(102.7,179.1){\circle*{1}}\put(104.0,178.9){\circle*{1}}
+ \put(105.3,178.7){\circle*{1}}\put(106.5,178.5){\circle*{1}}
+ \put(107.8,178.2){\circle*{1}}\put(109.1,178.0){\circle*{1}}
+ \put(110.4,177.7){\circle*{1}}\put(111.6,177.4){\circle*{1}}
+ \put(112.9,177.0){\circle*{1}}\put(114.2,176.7){\circle*{1}}
+ \put(115.5,176.3){\circle*{1}}\put(116.7,175.9){\circle*{1}}
+ \put(118.0,175.5){\circle*{1}}\put(119.3,175.1){\circle*{1}}
+ \put(120.5,174.7){\circle*{1}}\put(121.8,174.2){\circle*{1}}
+ \put(123.1,173.7){\circle*{1}}\put(124.4,173.2){\circle*{1}}
+ \put(125.6,172.6){\circle*{1}}\put(126.9,172.1){\circle*{1}}
+ \put(128.2,171.5){\circle*{1}}\put(129.5,170.9){\circle*{1}}
+ \put(130.7,170.3){\circle*{1}}\put(132.0,169.6){\circle*{1}}
+ \put(133.3,168.9){\circle*{1}}\put(134.5,168.2){\circle*{1}}
+ \put(135.8,167.5){\circle*{1}}\put(137.1,166.7){\circle*{1}}
+ \put(138.4,165.9){\circle*{1}}\put(139.6,165.1){\circle*{1}}
+ \put(140.9,164.2){\circle*{1}}\put(142.2,163.3){\circle*{1}}
+ \put(143.5,162.4){\circle*{1}}\put(144.7,161.4){\circle*{1}}
+ \put(146.0,160.5){\circle*{1}}\put(147.3,159.4){\circle*{1}}
+ \put(148.5,158.4){\circle*{1}}\put(149.8,157.2){\circle*{1}}
+ \put(151.1,156.1){\circle*{1}}\put(152.4,154.9){\circle*{1}}
+ \put(153.6,153.6){\circle*{1}}\put(180.0,90.0){\circle*{1}}
+ \put(180.0,91.3){\circle*{1}}\put(180.0,92.5){\circle*{1}}
+ \put(179.9,93.8){\circle*{1}}\put(179.9,95.1){\circle*{1}}
+ \put(179.8,96.4){\circle*{1}}\put(179.7,97.6){\circle*{1}}
+ \put(179.6,98.9){\circle*{1}}\put(179.4,100.2){\circle*{1}}
+ \put(179.3,101.5){\circle*{1}}\put(179.1,102.7){\circle*{1}}
+ \put(178.9,104.0){\circle*{1}}\put(178.7,105.3){\circle*{1}}
+ \put(178.5,106.5){\circle*{1}}\put(178.2,107.8){\circle*{1}}
+ \put(178.0,109.1){\circle*{1}}\put(177.7,110.4){\circle*{1}}
+ \put(177.4,111.6){\circle*{1}}\put(177.0,112.9){\circle*{1}}
+ \put(176.7,114.2){\circle*{1}}\put(176.3,115.5){\circle*{1}}
+ \put(175.9,116.7){\circle*{1}}\put(175.5,118.0){\circle*{1}}
+ \put(175.1,119.3){\circle*{1}}\put(174.7,120.5){\circle*{1}}
+ \put(174.2,121.8){\circle*{1}}\put(173.7,123.1){\circle*{1}}
+ \put(173.2,124.4){\circle*{1}}\put(172.6,125.6){\circle*{1}}
+ \put(172.1,126.9){\circle*{1}}\put(171.5,128.2){\circle*{1}}
+ \put(170.9,129.5){\circle*{1}}\put(170.3,130.7){\circle*{1}}
+ \put(169.6,132.0){\circle*{1}}\put(168.9,133.3){\circle*{1}}
+ \put(168.2,134.5){\circle*{1}}\put(167.5,135.8){\circle*{1}}
+ \put(166.7,137.1){\circle*{1}}\put(165.9,138.4){\circle*{1}}
+ \put(165.1,139.6){\circle*{1}}\put(164.2,140.9){\circle*{1}}
+ \put(163.3,142.2){\circle*{1}}\put(162.4,143.5){\circle*{1}}
+ \put(161.4,144.7){\circle*{1}}\put(160.5,146.0){\circle*{1}}
+ \put(159.4,147.3){\circle*{1}}\put(158.4,148.5){\circle*{1}}
+ \put(157.2,149.8){\circle*{1}}\put(156.1,151.1){\circle*{1}}
+ \put(154.9,152.4){\circle*{1}}
+ \put(90,90){\makebox(60,60){cur}}
+ \end{picture}}
+ \put(480,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(1,0){90}}
+ \put(90,90){\line(0,-1){90}}
+ \put(90.0,0.0){\circle*{1}}\put(91.3,0.0){\circle*{1}}
+ \put(92.5,0.0){\circle*{1}}\put(93.8,0.1){\circle*{1}}
+ \put(95.1,0.1){\circle*{1}}\put(96.4,0.2){\circle*{1}}
+ \put(97.6,0.3){\circle*{1}}\put(98.9,0.4){\circle*{1}}
+ \put(100.2,0.6){\circle*{1}}\put(101.5,0.7){\circle*{1}}
+ \put(102.7,0.9){\circle*{1}}\put(104.0,1.1){\circle*{1}}
+ \put(105.3,1.3){\circle*{1}}\put(106.5,1.5){\circle*{1}}
+ \put(107.8,1.8){\circle*{1}}\put(109.1,2.0){\circle*{1}}
+ \put(110.4,2.3){\circle*{1}}\put(111.6,2.6){\circle*{1}}
+ \put(112.9,3.0){\circle*{1}}\put(114.2,3.3){\circle*{1}}
+ \put(115.5,3.7){\circle*{1}}\put(116.7,4.1){\circle*{1}}
+ \put(118.0,4.5){\circle*{1}}\put(119.3,4.9){\circle*{1}}
+ \put(120.5,5.3){\circle*{1}}\put(121.8,5.8){\circle*{1}}
+ \put(123.1,6.3){\circle*{1}}\put(124.4,6.8){\circle*{1}}
+ \put(125.6,7.4){\circle*{1}}\put(126.9,7.9){\circle*{1}}
+ \put(128.2,8.5){\circle*{1}}\put(129.5,9.1){\circle*{1}}
+ \put(130.7,9.7){\circle*{1}}\put(132.0,10.4){\circle*{1}}
+ \put(133.3,11.1){\circle*{1}}\put(134.5,11.8){\circle*{1}}
+ \put(135.8,12.5){\circle*{1}}\put(137.1,13.3){\circle*{1}}
+ \put(138.4,14.1){\circle*{1}}\put(139.6,14.9){\circle*{1}}
+ \put(140.9,15.8){\circle*{1}}\put(142.2,16.7){\circle*{1}}
+ \put(143.5,17.6){\circle*{1}}\put(144.7,18.6){\circle*{1}}
+ \put(146.0,19.5){\circle*{1}}\put(147.3,20.6){\circle*{1}}
+ \put(148.5,21.6){\circle*{1}}\put(149.8,22.8){\circle*{1}}
+ \put(151.1,23.9){\circle*{1}}\put(152.4,25.1){\circle*{1}}
+ \put(153.6,26.4){\circle*{1}}\put(180.0,90.0){\circle*{1}}
+ \put(180.0,88.7){\circle*{1}}\put(180.0,87.5){\circle*{1}}
+ \put(179.9,86.2){\circle*{1}}\put(179.9,84.9){\circle*{1}}
+ \put(179.8,83.6){\circle*{1}}\put(179.7,82.4){\circle*{1}}
+ \put(179.6,81.1){\circle*{1}}\put(179.4,79.8){\circle*{1}}
+ \put(179.3,78.5){\circle*{1}}\put(179.1,77.3){\circle*{1}}
+ \put(178.9,76.0){\circle*{1}}\put(178.7,74.7){\circle*{1}}
+ \put(178.5,73.5){\circle*{1}}\put(178.2,72.2){\circle*{1}}
+ \put(178.0,70.9){\circle*{1}}\put(177.7,69.6){\circle*{1}}
+ \put(177.4,68.4){\circle*{1}}\put(177.0,67.1){\circle*{1}}
+ \put(176.7,65.8){\circle*{1}}\put(176.3,64.5){\circle*{1}}
+ \put(175.9,63.3){\circle*{1}}\put(175.5,62.0){\circle*{1}}
+ \put(175.1,60.7){\circle*{1}}\put(174.7,59.5){\circle*{1}}
+ \put(174.2,58.2){\circle*{1}}\put(173.7,56.9){\circle*{1}}
+ \put(173.2,55.6){\circle*{1}}\put(172.6,54.4){\circle*{1}}
+ \put(172.1,53.1){\circle*{1}}\put(171.5,51.8){\circle*{1}}
+ \put(170.9,50.5){\circle*{1}}\put(170.3,49.3){\circle*{1}}
+ \put(169.6,48.0){\circle*{1}}\put(168.9,46.7){\circle*{1}}
+ \put(168.2,45.5){\circle*{1}}\put(167.5,44.2){\circle*{1}}
+ \put(166.7,42.9){\circle*{1}}\put(165.9,41.6){\circle*{1}}
+ \put(165.1,40.4){\circle*{1}}\put(164.2,39.1){\circle*{1}}
+ \put(163.3,37.8){\circle*{1}}\put(162.4,36.5){\circle*{1}}
+ \put(161.4,35.3){\circle*{1}}\put(160.5,34.0){\circle*{1}}
+ \put(159.4,32.7){\circle*{1}}\put(158.4,31.5){\circle*{1}}
+ \put(157.2,30.2){\circle*{1}}\put(156.1,28.9){\circle*{1}}
+ \put(154.9,27.6){\circle*{1}}
+ \put(90,30){\makebox(60,60){cbr}}
+ \end{picture}}
+ \put(720,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(-1,0){90}}
+ \put(90,90){\line(0,-1){90}}
+ \put(90.0,0.0){\circle*{1}}\put(88.7,0.0){\circle*{1}}
+ \put(87.5,0.0){\circle*{1}}\put(86.2,0.1){\circle*{1}}
+ \put(84.9,0.1){\circle*{1}}\put(83.6,0.2){\circle*{1}}
+ \put(82.4,0.3){\circle*{1}}\put(81.1,0.4){\circle*{1}}
+ \put(79.8,0.6){\circle*{1}}\put(78.5,0.7){\circle*{1}}
+ \put(77.3,0.9){\circle*{1}}\put(76.0,1.1){\circle*{1}}
+ \put(74.7,1.3){\circle*{1}}\put(73.5,1.5){\circle*{1}}
+ \put(72.2,1.8){\circle*{1}}\put(70.9,2.0){\circle*{1}}
+ \put(69.6,2.3){\circle*{1}}\put(68.4,2.6){\circle*{1}}
+ \put(67.1,3.0){\circle*{1}}\put(65.8,3.3){\circle*{1}}
+ \put(64.5,3.7){\circle*{1}}\put(63.3,4.1){\circle*{1}}
+ \put(62.0,4.5){\circle*{1}}\put(60.7,4.9){\circle*{1}}
+ \put(59.5,5.3){\circle*{1}}\put(58.2,5.8){\circle*{1}}
+ \put(56.9,6.3){\circle*{1}}\put(55.6,6.8){\circle*{1}}
+ \put(54.4,7.4){\circle*{1}}\put(53.1,7.9){\circle*{1}}
+ \put(51.8,8.5){\circle*{1}}\put(50.5,9.1){\circle*{1}}
+ \put(49.3,9.7){\circle*{1}}\put(48.0,10.4){\circle*{1}}
+ \put(46.7,11.1){\circle*{1}}\put(45.5,11.8){\circle*{1}}
+ \put(44.2,12.5){\circle*{1}}\put(42.9,13.3){\circle*{1}}
+ \put(41.6,14.1){\circle*{1}}\put(40.4,14.9){\circle*{1}}
+ \put(39.1,15.8){\circle*{1}}\put(37.8,16.7){\circle*{1}}
+ \put(36.5,17.6){\circle*{1}}\put(35.3,18.6){\circle*{1}}
+ \put(34.0,19.5){\circle*{1}}\put(32.7,20.6){\circle*{1}}
+ \put(31.5,21.6){\circle*{1}}\put(30.2,22.8){\circle*{1}}
+ \put(28.9,23.9){\circle*{1}}\put(27.6,25.1){\circle*{1}}
+ \put(26.4,26.4){\circle*{1}}\put(0.0,90.0){\circle*{1}}
+ \put(0.0,88.7){\circle*{1}}\put(0.0,87.5){\circle*{1}}
+ \put(0.1,86.2){\circle*{1}}\put(0.1,84.9){\circle*{1}}
+ \put(0.2,83.6){\circle*{1}}\put(0.3,82.4){\circle*{1}}
+ \put(0.4,81.1){\circle*{1}}\put(0.6,79.8){\circle*{1}}
+ \put(0.7,78.5){\circle*{1}}\put(0.9,77.3){\circle*{1}}
+ \put(1.1,76.0){\circle*{1}}\put(1.3,74.7){\circle*{1}}
+ \put(1.5,73.5){\circle*{1}}\put(1.8,72.2){\circle*{1}}
+ \put(2.0,70.9){\circle*{1}}\put(2.3,69.6){\circle*{1}}
+ \put(2.6,68.4){\circle*{1}}\put(3.0,67.1){\circle*{1}}
+ \put(3.3,65.8){\circle*{1}}\put(3.7,64.5){\circle*{1}}
+ \put(4.1,63.3){\circle*{1}}\put(4.5,62.0){\circle*{1}}
+ \put(4.9,60.7){\circle*{1}}\put(5.3,59.5){\circle*{1}}
+ \put(5.8,58.2){\circle*{1}}\put(6.3,56.9){\circle*{1}}
+ \put(6.8,55.6){\circle*{1}}\put(7.4,54.4){\circle*{1}}
+ \put(7.9,53.1){\circle*{1}}\put(8.5,51.8){\circle*{1}}
+ \put(9.1,50.5){\circle*{1}}\put(9.7,49.3){\circle*{1}}
+ \put(10.4,48.0){\circle*{1}}\put(11.1,46.7){\circle*{1}}
+ \put(11.8,45.5){\circle*{1}}\put(12.5,44.2){\circle*{1}}
+ \put(13.3,42.9){\circle*{1}}\put(14.1,41.6){\circle*{1}}
+ \put(14.9,40.4){\circle*{1}}\put(15.8,39.1){\circle*{1}}
+ \put(16.7,37.8){\circle*{1}}\put(17.6,36.5){\circle*{1}}
+ \put(18.6,35.3){\circle*{1}}\put(19.5,34.0){\circle*{1}}
+ \put(20.6,32.7){\circle*{1}}\put(21.6,31.5){\circle*{1}}
+ \put(22.8,30.2){\circle*{1}}\put(23.9,28.9){\circle*{1}}
+ \put(25.1,27.6){\circle*{1}}
+ \put(30,30){\makebox(60,60){cbl}}
+ \end{picture}}
+ \put(0,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(-1,0){90}}
+ \put(90,90){\line(0,1){90}}
+ \put(0,90){\line(1,1){90}}
+ \put(45,90){\makebox(45,45){tul}}
+ \end{picture}}
+ \put(240,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(1,0){90}}
+ \put(90,90){\line(0,1){90}}
+ \put(90,180){\line(1,-1){90}}
+ \put(90,90){\makebox(45,45){tur}}
+ \end{picture}}
+ \put(480,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(1,0){90}}
+ \put(90,90){\line(0,-1){90}}
+ \put(90,0){\line(1,1){90}}
+ \put(90,45){\makebox(45,45){tbr}}
+ \end{picture}}
+ \put(720,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,90){\line(-1,0){90}}
+ \put(90,90){\line(0,-1){90}}
+ \put(0,90){\line(1,-1){90}}
+ \put(45,45){\makebox(45,45){tbl}}
+ \end{picture}}
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,180){\line(1,0){90}}
+ \put(0,90){\line(0,1){90}}
+ \put(0,90){\line(1,1){90}}
+ \put(0,135){\makebox(45,45){rul}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,180){\line(1,0){90}}
+ \put(180,90){\line(0,1){90}}
+ \put(90,180){\line(1,-1){90}}
+ \put(135,135){\makebox(45,45){rur}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,0){\line(1,0){90}}
+ \put(180,0){\line(0,1){90}}
+ \put(90,0){\line(1,1){90}}
+ \put(135,0){\makebox(45,45){rbr}}
+ \end{picture}}
+ \put(720,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,0){\line(1,0){90}}
+ \put(0,0){\line(0,1){90}}
+ \put(0,90){\line(1,-1){90}}
+ \put(0,0){\makebox(45,45){rbl}}
+ \end{picture}}
+ \end{picture}
+ \end{center}
+ \caption{Short Patches.}
+ \label{shortpatches}
+\end{figure}
+
+The definitions of each japanese character follow sequentially. The template
+for such a definition is:
+\begin{quote}
+\tt beginchar(0,\em width \tt\#,\em body\_height \tt\#,\em desc\_depth \tt\#);\\
+\verb"normal_adjust_fit(2u#,2u#);"\\
+$\vdots$\\
+\verb"endchar;"
+\end{quote}
+
+\newpage %improve a bad page break
+
+\begin{figure}[htb]
+ \begin{center}
+ \setlength{\unitlength}{0.38pt}
+ \begin{picture}(900,900)
+ \put(0,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,90){\line(1,0){180}}
+ \put(180,90){\line(0,1){90}}
+ \put(0,90){\line(2,1){180}}
+ \put(90,90){\makebox(90,45){tuul}}
+ \end{picture}}
+ \put(240,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,0){\line(0,1){180}}
+ \put(0,0){\line(1,0){90}}
+ \put(0,0){\line(1,2){90}}
+ \put(30,0){\makebox(60,60){tull}}
+ \end{picture}}
+ \put(480,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,90){\line(1,0){180}}
+ \put(0,90){\line(0,1){90}}
+ \put(0,180){\line(2,-1){180}}
+ \put(0,90){\makebox(90,45){tuur}}
+ \end{picture}}
+ \put(720,720){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,0){\line(0,1){180}}
+ \put(90,0){\line(1,0){90}}
+ \put(90,180){\line(1,-2){90}}
+ \put(90,0){\makebox(60,60){turr}}
+ \end{picture}}
+ \put(0,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,90){\line(1,0){180}}
+ \put(0,0){\line(0,1){90}}
+ \put(0,0){\line(2,1){180}}
+ \put(0,45){\makebox(90,45){tbbr}}
+ \end{picture}}
+ \put(240,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,0){\line(0,1){180}}
+ \put(90,180){\line(1,0){90}}
+ \put(90,0){\line(1,2){90}}
+ \put(90,120){\makebox(60,60){tbrr}}
+ \end{picture}}
+ \put(480,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,90){\line(1,0){180}}
+ \put(180,0){\line(0,1){90}}
+ \put(0,90){\line(2,-1){180}}
+ \put(90,45){\makebox(90,45){tbbl}}
+ \end{picture}}
+ \put(720,480){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(90,0){\line(0,1){180}}
+ \put(0,180){\line(1,0){90}}
+ \put(0,180){\line(1,-2){90}}
+ \put(30,120){\makebox(60,60){tbll}}
+ \end{picture}}
+ \put(0,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,0){\line(0,1){180}}
+ \put(0,180){\line(1,0){90}}
+ \put(0,0){\line(1,2){90}}
+ \put(0,120){\makebox(60,60){ruul}}
+ \end{picture}}
+ \put(240,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,180){\line(1,0){180}}
+ \put(0,90){\line(0,1){90}}
+ \put(0,90){\line(2,1){180}}
+ \put(0,135){\makebox(90,45){rull}}
+ \end{picture}}
+ \put(480,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(180,0){\line(0,1){180}}
+ \put(90,180){\line(1,0){90}}
+ \put(90,180){\line(1,-2){90}}
+ \put(120,120){\makebox(60,60){ruur}}
+ \end{picture}}
+ \put(720,240){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,180){\line(1,0){180}}
+ \put(180,90){\line(0,1){90}}
+ \put(0,180){\line(2,-1){180}}
+ \put(90,135){\makebox(90,45){rurr}}
+ \end{picture}}
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(180,0){\line(0,1){180}}
+ \put(90,0){\line(1,0){90}}
+ \put(90,0){\line(1,2){90}}
+ \put(120,0){\makebox(60,60){rbbr}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,0){\line(1,0){180}}
+ \put(180,0){\line(0,1){90}}
+ \put(0,0){\line(2,1){180}}
+ \put(90,0){\makebox(90,45){rbrr}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,0){\line(0,1){180}}
+ \put(0,0){\line(1,0){90}}
+ \put(0,180){\line(1,-2){90}}
+ \put(0,0){\makebox(60,60){rbbl}}
+ \end{picture}}
+ \put(720,0){%
+ \begin{picture}(180,180)
+ \put(0,0){\dashbox{5}(180,180){}}
+ \put(0,0){\line(1,0){180}}
+ \put(0,0){\line(0,1){90}}
+ \put(0,90){\line(2,-1){180}}
+ \put(0,0){\makebox(90,45){rbll}}
+ \end{picture}}
+ \end{picture}
+ \end{center}
+ \caption{Long Patches.}
+ \label{longpatches}
+\end{figure}
+
+All sizes are given in terms of the fundamental unit of measurement $u$. The
+quantities {\em body\_height\/} and {\em desc\_depth\/} must include the border
+which is $2u$ thick. However, {\em width\/} does not need to include this
+border because the statement \verb"normal_adjust_fit" is equivalent to it
+horizontally. \MFT\ is somewhat more flexible in the horizontal direction by
+design and intent. The body of a character definition is simply a series of
+macro calls. Each line contains the macros for a given pixel in the bitmap.
+Consequently, each line is reasonably short.
+
+\newpage %improve a bad page break
+
+The \MFT\ code ends with a final header containing a few pieces of information
+for the \TeX\ Font Metric (\verb".tfm") files. The following are the most
+interesting items:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+font_normal_space 8u#;
+font_normal_stretch 4u#;
+font_normal_shrink 3u#;
+font_x_height 24u#; %ex
+font_quad 24u#; %em
+\end{verbatim}
+\end{quote}
+
+I set the normal inter-word spacing to a third of the maximum width of a
+character. This seems comparable to the scheme used in several Computer Modern
+fonts. Stretching and shrinking are set to values also comparable to what is
+used elsewhere. I set the typical character height and width to the maximum
+size of a bitmap.
+
+\subsection{Algorithm}
+\label{algorithm}
+
+Given a bitmap, it is straightforward to determine its width and height, either
+fixed or minimized, while making sure that the vertical relationship with the
+horizontal baseline is respected. The bulk of the problem lies in determining
+the proper combination of squares, triangles, and quarter circles to be used.
+This subsection describes an algorithm developed jointly by Mr. Masatoshi
+Watanabe and me. I find that it produces good enough results for my need. But
+perhaps somebody will not share my opinion, and in that case, the following
+will no doubt prove helpful.
+
+The current bitmap is read into a 24~by~24 array of boolean variables. In what
+follows, I will say that a cell is {\em active\/} if the bitmap dictates that a
+dot should lie in it, otherwise it is {\em inactive}. Each cell is subdivided
+in four, and each subcell is examined with respect to the neighboring cells.
+The current algorithm is very local in that only neighboring cells in direct
+contact with the current cell are examined. A more global algorithm should
+perform better and that is certainly an area worth investigating for future
+releases.
+
+From now on, I will concentrate on the upper left subcell. The other three
+subcells are handled in a similar fashion. In the following diagrams, a
+$\bullet$ indicates an active cell and a $\times$ indicates an inactive cell.
+Unlabeled neighboring cells are simply irrelevant.
+
+The simplest case occurs when the current cell is inactive. Although the center
+of that cell should remain empty, it is possible to use its border to smooth a
+nearby painted area. The algorithm always tries to use long shapes first,
+before falling back to shorter shapes.
+
+First, the following cases clearly require that the upper left subcell not
+be painted:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(660,180)
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,0){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,90){\makebox(30,30){\large$\times$}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,0){\makebox(60,60){\Huge$\times$}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(120,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,90){\makebox(30,30){\large$\times$}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(120,60){\makebox(60,60){\Huge$\times$}}
+ \put(60,90){\makebox(30,30){\large$\times$}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+These three cases require reverse triangles involving the upper left subcell:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(660,180)
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,60){\line(0,1){60}}
+ \put(60,120){\line(1,0){30}}
+ \put(60,60){\line(1,2){30}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(120,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,0){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\line(1,0){60}}
+ \put(60,90){\line(0,1){30}}
+ \put(60,90){\line(2,1){60}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,120){\makebox(60,60){\Huge$\times$}}
+ \put(0,0){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\line(1,0){30}}
+ \put(60,90){\line(0,1){30}}
+ \put(60,90){\line(1,1){30}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+There are two possible ways of handling the remaining case:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(420,180)
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,90){\makebox(30,30){\large$\times$}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\line(1,0){30}}
+ \put(60,90){\line(0,1){30}}
+ \put(60,90){\line(1,1){30}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+The technique on the left has the advantage of producing clean crossings of
+$+$ strokes, but experimentation shows that it often yields bad crossings of
+$\times$ strokes. The technique on the right produces good crossings of
+$\times$ strokes, but it also generates crossings of $+$ strokes with
+unnecessarily round corners. I examined both alternatives with \MFT\ in proof
+mode, and I found that it is preferable to have characters occasionally
+slightly too smooth, rather than sharp ones occasionally rough. Therefore, the
+approach on the right is the one used in \verb"JIS2MF".
+
+\newpage %improve a bad page break
+
+The most complex situation occurs when the center cell is active. Each of its
+subcells will be filled by a square, a triangle, or a quarter circle. No
+reverse triangle is used in such instances since I insist that the interior of
+the cell be filled. As always, long triangles are tried first. The possible
+four cases involving the upper left subcell are:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(900,180)
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(120,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,90){\line(1,0){60}}
+ \put(120,90){\line(0,1){30}}
+ \put(60,90){\line(2,1){60}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(60,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,0){\makebox(60,60){\Huge$\times$}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(90,60){\line(0,1){60}}
+ \put(60,60){\line(1,0){30}}
+ \put(60,60){\line(1,2){30}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(120,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(120,120){\makebox(60,60){\Huge$\times$}}
+ \put(120,60){\makebox(60,60){\Huge$\times$}}
+ \put(60,90){\line(1,0){60}}
+ \put(60,90){\line(0,1){30}}
+ \put(60,120){\line(2,-1){60}}
+ \end{picture}}
+ \put(720,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(120,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(0,0){\makebox(60,60){\Huge$\times$}}
+ \put(60,0){\makebox(60,60){\Huge$\times$}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(90,60){\line(0,1){60}}
+ \put(60,120){\line(1,0){30}}
+ \put(60,120){\line(1,-2){30}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+If none of these cases can be applied, the following three cases are tried out:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(660,180)
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,60){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,90){\framebox(30,30){}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,90){\framebox(30,30){}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(60,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(60,90){\framebox(30,30){}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+If neither of these is relevant, I always resort to one of these three final
+cases:
+\begin{center}
+ \setlength{\unitlength}{0.4pt}
+ \begin{picture}(660,180)
+ \put(0,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(120,120){\makebox(60,60){\Huge$\bullet$}}
+ \put(90,90){\line(-1,0){30}}
+ \put(90,90){\line(0,1){30}}
+ \put(60,90){\line(1,1){30}}
+ \end{picture}}
+ \put(240,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(0,0){\makebox(60,60){\Huge$\bullet$}}
+ \put(90,90){\line(-1,0){30}}
+ \put(90,90){\line(0,1){30}}
+ \put(60,90){\line(1,1){30}}
+ \end{picture}}
+ \put(480,0){%
+ \begin{picture}(180,180)
+ \multiput(0,0)(60,0){4}{\dashbox{5}(0,180){}}
+ \multiput(0,0)(0,60){4}{\dashbox{5}(180,0){}}
+ \put(0,60){\makebox(60,60){\Huge$\times$}}
+ \put(0,120){\makebox(60,60){\Huge$\times$}}
+ \put(60,120){\makebox(60,60){\Huge$\times$}}
+ \put(0,0){\makebox(60,60){\Huge$\times$}}
+ \put(120,120){\makebox(60,60){\Huge$\times$}}
+ \put(90,90){\line(-1,0){30}}
+ \put(90,90){\line(0,1){30}}
+ \put(90.0,120.0){\circle*{1}}\put(89.3,120.0){\circle*{1}}
+ \put(88.6,120.0){\circle*{1}}\put(87.9,119.9){\circle*{1}}
+ \put(87.2,119.9){\circle*{1}}\put(86.5,119.8){\circle*{1}}
+ \put(85.8,119.7){\circle*{1}}\put(85.1,119.6){\circle*{1}}
+ \put(84.3,119.5){\circle*{1}}\put(83.6,119.3){\circle*{1}}
+ \put(82.9,119.2){\circle*{1}}\put(82.2,119.0){\circle*{1}}
+ \put(81.5,118.8){\circle*{1}}\put(80.8,118.6){\circle*{1}}
+ \put(80.1,118.3){\circle*{1}}\put(79.4,118.1){\circle*{1}}
+ \put(78.7,117.8){\circle*{1}}\put(78.0,117.5){\circle*{1}}
+ \put(77.3,117.2){\circle*{1}}\put(76.6,116.8){\circle*{1}}
+ \put(75.9,116.5){\circle*{1}}\put(75.2,116.1){\circle*{1}}
+ \put(74.4,115.7){\circle*{1}}\put(73.7,115.2){\circle*{1}}
+ \put(73.0,114.7){\circle*{1}}\put(72.3,114.2){\circle*{1}}
+ \put(71.6,113.7){\circle*{1}}\put(70.9,113.1){\circle*{1}}
+ \put(70.2,112.5){\circle*{1}}\put(69.5,111.9){\circle*{1}}
+ \put(68.8,111.2){\circle*{1}}\put(60.0,90.0){\circle*{1}}
+ \put(60.0,90.7){\circle*{1}}\put(60.0,91.4){\circle*{1}}
+ \put(60.1,92.1){\circle*{1}}\put(60.1,92.8){\circle*{1}}
+ \put(60.2,93.5){\circle*{1}}\put(60.3,94.2){\circle*{1}}
+ \put(60.4,94.9){\circle*{1}}\put(60.5,95.7){\circle*{1}}
+ \put(60.7,96.4){\circle*{1}}\put(60.8,97.1){\circle*{1}}
+ \put(61.0,97.8){\circle*{1}}\put(61.2,98.5){\circle*{1}}
+ \put(61.4,99.2){\circle*{1}}\put(61.7,99.9){\circle*{1}}
+ \put(61.9,100.6){\circle*{1}}\put(62.2,101.3){\circle*{1}}
+ \put(62.5,102.0){\circle*{1}}\put(62.8,102.7){\circle*{1}}
+ \put(63.2,103.4){\circle*{1}}\put(63.5,104.1){\circle*{1}}
+ \put(63.9,104.8){\circle*{1}}\put(64.3,105.6){\circle*{1}}
+ \put(64.8,106.3){\circle*{1}}\put(65.3,107.0){\circle*{1}}
+ \put(65.8,107.7){\circle*{1}}\put(66.3,108.4){\circle*{1}}
+ \put(66.9,109.1){\circle*{1}}\put(67.5,109.8){\circle*{1}}
+ \put(68.1,110.5){\circle*{1}}
+ \end{picture}}
+ \end{picture}
+\end{center}
+
+Note that an active cell surrounded by inactive ones is always eventually
+filled by four quarter circles; the original bitmap pixel remains unchanged. In
+that case, rather than using four quarter circle macro calls, I use one call to
+another macro which paints one complete circle. The case of four squares is
+handled similarly with one big square. These two additional macros complete the
+collection of painting macros used by \verb"JIS2MF".
+
+\newpage %improve a bad page break
+
+Figure~\ref{bitmapandcontinuouscharacter} illustrates typical results obtained
+with this algorithm using bitmap~2512 of the JIS~24 dot font.
+
+\begin{figure}[htb]
+ \begin{center}
+ \setlength{\unitlength}{6pt}
+ \begin{picture}(56,24)
+ \put(0,0){%
+ \begin{picture}(25,25)(1,1)
+ \put(1,1){\dashbox{0.25}(24,24){}}
+ \put(1,5){\makebox(1,1){$\bullet$}}\put(1,16){\makebox(1,1){$\bullet$}}
+ \put(1,20){\makebox(1,1){$\bullet$}}\put(2,6){\makebox(1,1){$\bullet$}}
+ \put(2,16){\makebox(1,1){$\bullet$}}\put(2,20){\makebox(1,1){$\bullet$}}
+ \put(3,7){\makebox(1,1){$\bullet$}}\put(3,8){\makebox(1,1){$\bullet$}}
+ \put(3,16){\makebox(1,1){$\bullet$}}\put(3,20){\makebox(1,1){$\bullet$}}
+ \put(4,8){\makebox(1,1){$\bullet$}}\put(4,9){\makebox(1,1){$\bullet$}}
+ \put(4,10){\makebox(1,1){$\bullet$}}\put(4,16){\makebox(1,1){$\bullet$}}
+ \put(4,21){\makebox(1,1){$\bullet$}}\put(5,10){\makebox(1,1){$\bullet$}}
+ \put(5,11){\makebox(1,1){$\bullet$}}\put(5,12){\makebox(1,1){$\bullet$}}
+ \put(5,13){\makebox(1,1){$\bullet$}}\put(5,16){\makebox(1,1){$\bullet$}}
+ \put(5,21){\makebox(1,1){$\bullet$}}\put(6,1){\makebox(1,1){$\bullet$}}
+ \put(6,2){\makebox(1,1){$\bullet$}}\put(6,3){\makebox(1,1){$\bullet$}}
+ \put(6,4){\makebox(1,1){$\bullet$}}\put(6,5){\makebox(1,1){$\bullet$}}
+ \put(6,6){\makebox(1,1){$\bullet$}}\put(6,7){\makebox(1,1){$\bullet$}}
+ \put(6,8){\makebox(1,1){$\bullet$}}\put(6,9){\makebox(1,1){$\bullet$}}
+ \put(6,10){\makebox(1,1){$\bullet$}}\put(6,11){\makebox(1,1){$\bullet$}}
+ \put(6,12){\makebox(1,1){$\bullet$}}\put(6,13){\makebox(1,1){$\bullet$}}
+ \put(6,14){\makebox(1,1){$\bullet$}}\put(6,15){\makebox(1,1){$\bullet$}}
+ \put(6,16){\makebox(1,1){$\bullet$}}\put(6,17){\makebox(1,1){$\bullet$}}
+ \put(6,18){\makebox(1,1){$\bullet$}}\put(6,19){\makebox(1,1){$\bullet$}}
+ \put(6,20){\makebox(1,1){$\bullet$}}\put(6,21){\makebox(1,1){$\bullet$}}
+ \put(7,1){\makebox(1,1){$\bullet$}}\put(7,2){\makebox(1,1){$\bullet$}}
+ \put(7,3){\makebox(1,1){$\bullet$}}\put(7,4){\makebox(1,1){$\bullet$}}
+ \put(7,5){\makebox(1,1){$\bullet$}}\put(7,6){\makebox(1,1){$\bullet$}}
+ \put(7,7){\makebox(1,1){$\bullet$}}\put(7,8){\makebox(1,1){$\bullet$}}
+ \put(7,9){\makebox(1,1){$\bullet$}}\put(7,10){\makebox(1,1){$\bullet$}}
+ \put(7,11){\makebox(1,1){$\bullet$}}\put(7,12){\makebox(1,1){$\bullet$}}
+ \put(7,13){\makebox(1,1){$\bullet$}}\put(7,14){\makebox(1,1){$\bullet$}}
+ \put(7,15){\makebox(1,1){$\bullet$}}\put(7,16){\makebox(1,1){$\bullet$}}
+ \put(7,17){\makebox(1,1){$\bullet$}}\put(7,18){\makebox(1,1){$\bullet$}}
+ \put(7,19){\makebox(1,1){$\bullet$}}\put(7,20){\makebox(1,1){$\bullet$}}
+ \put(7,21){\makebox(1,1){$\bullet$}}\put(7,22){\makebox(1,1){$\bullet$}}
+ \put(8,12){\makebox(1,1){$\bullet$}}\put(8,16){\makebox(1,1){$\bullet$}}
+ \put(8,22){\makebox(1,1){$\bullet$}}\put(9,12){\makebox(1,1){$\bullet$}}
+ \put(9,16){\makebox(1,1){$\bullet$}}\put(9,22){\makebox(1,1){$\bullet$}}
+ \put(9,23){\makebox(1,1){$\bullet$}}\put(10,3){\makebox(1,1){$\bullet$}}
+ \put(10,11){\makebox(1,1){$\bullet$}}\put(10,16){\makebox(1,1){$\bullet$}}
+ \put(10,17){\makebox(1,1){$\bullet$}}\put(10,23){\makebox(1,1){$\bullet$}}
+ \put(10,24){\makebox(1,1){$\bullet$}}\put(11,1){\makebox(1,1){$\bullet$}}
+ \put(11,2){\makebox(1,1){$\bullet$}}\put(11,3){\makebox(1,1){$\bullet$}}
+ \put(11,9){\makebox(1,1){$\bullet$}}\put(11,10){\makebox(1,1){$\bullet$}}
+ \put(11,11){\makebox(1,1){$\bullet$}}\put(11,16){\makebox(1,1){$\bullet$}}
+ \put(11,17){\makebox(1,1){$\bullet$}}\put(11,23){\makebox(1,1){$\bullet$}}
+ \put(11,24){\makebox(1,1){$\bullet$}}\put(12,2){\makebox(1,1){$\bullet$}}
+ \put(12,3){\makebox(1,1){$\bullet$}}\put(12,9){\makebox(1,1){$\bullet$}}
+ \put(12,10){\makebox(1,1){$\bullet$}}\put(12,16){\makebox(1,1){$\bullet$}}
+ \put(12,23){\makebox(1,1){$\bullet$}}\put(13,2){\makebox(1,1){$\bullet$}}
+ \put(13,3){\makebox(1,1){$\bullet$}}\put(14,2){\makebox(1,1){$\bullet$}}
+ \put(14,3){\makebox(1,1){$\bullet$}}\put(14,4){\makebox(1,1){$\bullet$}}
+ \put(14,5){\makebox(1,1){$\bullet$}}\put(15,3){\makebox(1,1){$\bullet$}}
+ \put(15,6){\makebox(1,1){$\bullet$}}\put(15,7){\makebox(1,1){$\bullet$}}
+ \put(15,8){\makebox(1,1){$\bullet$}}\put(15,9){\makebox(1,1){$\bullet$}}
+ \put(16,3){\makebox(1,1){$\bullet$}}\put(16,8){\makebox(1,1){$\bullet$}}
+ \put(16,9){\makebox(1,1){$\bullet$}}\put(16,10){\makebox(1,1){$\bullet$}}
+ \put(16,11){\makebox(1,1){$\bullet$}}\put(16,12){\makebox(1,1){$\bullet$}}
+ \put(16,13){\makebox(1,1){$\bullet$}}\put(16,14){\makebox(1,1){$\bullet$}}
+ \put(16,15){\makebox(1,1){$\bullet$}}\put(16,16){\makebox(1,1){$\bullet$}}
+ \put(17,3){\makebox(1,1){$\bullet$}}\put(17,12){\makebox(1,1){$\bullet$}}
+ \put(17,13){\makebox(1,1){$\bullet$}}\put(17,14){\makebox(1,1){$\bullet$}}
+ \put(17,15){\makebox(1,1){$\bullet$}}\put(17,16){\makebox(1,1){$\bullet$}}
+ \put(17,17){\makebox(1,1){$\bullet$}}\put(17,18){\makebox(1,1){$\bullet$}}
+ \put(17,19){\makebox(1,1){$\bullet$}}\put(17,20){\makebox(1,1){$\bullet$}}
+ \put(17,21){\makebox(1,1){$\bullet$}}\put(17,22){\makebox(1,1){$\bullet$}}
+ \put(17,23){\makebox(1,1){$\bullet$}}\put(17,24){\makebox(1,1){$\bullet$}}
+ \put(18,3){\makebox(1,1){$\bullet$}}\put(18,17){\makebox(1,1){$\bullet$}}
+ \put(18,18){\makebox(1,1){$\bullet$}}\put(18,19){\makebox(1,1){$\bullet$}}
+ \put(18,20){\makebox(1,1){$\bullet$}}\put(18,21){\makebox(1,1){$\bullet$}}
+ \put(18,22){\makebox(1,1){$\bullet$}}\put(18,23){\makebox(1,1){$\bullet$}}
+ \put(19,4){\makebox(1,1){$\bullet$}}\put(19,23){\makebox(1,1){$\bullet$}}
+ \put(20,4){\makebox(1,1){$\bullet$}}\put(20,8){\makebox(1,1){$\bullet$}}
+ \put(21,4){\makebox(1,1){$\bullet$}}\put(21,6){\makebox(1,1){$\bullet$}}
+ \put(21,7){\makebox(1,1){$\bullet$}}\put(22,4){\makebox(1,1){$\bullet$}}
+ \put(22,5){\makebox(1,1){$\bullet$}}\put(22,6){\makebox(1,1){$\bullet$}}
+ \put(23,1){\makebox(1,1){$\bullet$}}\put(23,2){\makebox(1,1){$\bullet$}}
+ \put(23,3){\makebox(1,1){$\bullet$}}\put(23,4){\makebox(1,1){$\bullet$}}
+ \put(23,5){\makebox(1,1){$\bullet$}}\put(24,1){\makebox(1,1){$\bullet$}}
+ \put(24,2){\makebox(1,1){$\bullet$}}\put(24,3){\makebox(1,1){$\bullet$}}
+ \end{picture}}
+ \put(32,0){%
+ \begin{picture}(24,21.25)(0,-2.75)
+ \newsavebox{\sss}
+ \sbox{\sss}{%
+ \begin{picture}(1,1)
+ \put(0,0){\framebox(1,1){}}
+ \end{picture}}
+ \newsavebox{\sul}
+ \sbox{\sul}{%
+ \begin{picture}(1,1)
+ \put(0,0.5){\framebox(0.5,0.5){}}
+ \end{picture}}
+ \newsavebox{\sur}
+ \sbox{\sur}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\framebox(0.5,0.5){}}
+ \end{picture}}
+ \newsavebox{\sbr}
+ \sbox{\sbr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\framebox(0.5,0.5){}}
+ \end{picture}}
+ \newsavebox{\sbl}
+ \sbox{\sbl}{%
+ \begin{picture}(1,1)
+ \put(0,0){\framebox(0.5,0.5){}}
+ \end{picture}}
+ \newsavebox{\cul}
+ \sbox{\cul}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(-1,0){0.5}}
+ \put(0.5,0.5){\line(0,1){0.5}}
+ \put(0.50,1.00){\circle*{0.05}}\put(0.43,0.99){\circle*{0.05}}
+ \put(0.36,0.98){\circle*{0.05}}\put(0.29,0.95){\circle*{0.05}}
+ \put(0.22,0.91){\circle*{0.05}}\put(0.15,0.85){\circle*{0.05}}
+ \put(0.00,0.50){\circle*{0.05}}\put(0.01,0.57){\circle*{0.05}}
+ \put(0.02,0.64){\circle*{0.05}}\put(0.05,0.71){\circle*{0.05}}
+ \put(0.09,0.78){\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\cur}
+ \sbox{\cur}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(1,0){0.5}}
+ \put(0.5,0.5){\line(0,1){0.5}}
+ \put(0.50,1.00){\circle*{0.05}}\put(0.57,0.99){\circle*{0.05}}
+ \put(0.64,0.98){\circle*{0.05}}\put(0.71,0.95){\circle*{0.05}}
+ \put(0.78,0.91){\circle*{0.05}}\put(0.85,0.85){\circle*{0.05}}
+ \put(1.00,0.50){\circle*{0.05}}\put(0.99,0.57){\circle*{0.05}}
+ \put(0.98,0.64){\circle*{0.05}}\put(0.95,0.71){\circle*{0.05}}
+ \put(0.91,0.78){\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\cbr}
+ \sbox{\cbr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(1,0){0.5}}
+ \put(0.5,0.5){\line(0,-1){0.5}}
+ \put(0.50,0.00){\circle*{0.05}}\put(0.57,0.01){\circle*{0.05}}
+ \put(0.64,0.02){\circle*{0.05}}\put(0.71,0.05){\circle*{0.05}}
+ \put(0.78,0.09){\circle*{0.05}}\put(0.85,0.15){\circle*{0.05}}
+ \put(1.00,0.50){\circle*{0.05}}\put(0.99,0.43){\circle*{0.05}}
+ \put(0.98,0.36){\circle*{0.05}}\put(0.95,0.29){\circle*{0.05}}
+ \put(0.91,0.22){\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\cbl}
+ \sbox{\cbl}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(-1,0){0.5}}
+ \put(0.5,0.5){\line(0,-1){0.5}}
+ \put(0.50,0.00){\circle*{0.05}}\put(0.43,0.01){\circle*{0.05}}
+ \put(0.36,0.02){\circle*{0.05}}\put(0.29,0.05){\circle*{0.05}}
+ \put(0.22,0.09){\circle*{0.05}}\put(0.15,0.15){\circle*{0.05}}
+ \put(0.00,0.50){\circle*{0.05}}\put(0.01,0.43){\circle*{0.05}}
+ \put(0.02,0.36){\circle*{0.05}}\put(0.05,0.29){\circle*{0.05}}
+ \put(0.09,0.22){\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tul}
+ \sbox{\tul}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(-1,0){0.5}}
+ \put(0.5,0.5){\line(0,1){0.5}}
+ \multiput(0,0.5)(0.05,0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tur}
+ \sbox{\tur}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(1,0){0.5}}
+ \put(0.5,0.5){\line(0,1){0.5}}
+ \put(0.5,1){\line(1,-1){0.5}}
+ \multiput(0.5,1)(0.05,-0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tbr}
+ \sbox{\tbr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(1,0){0.5}}
+ \put(0.5,0.5){\line(0,-1){0.5}}
+ \put(0.5,0){\line(1,1){0.5}}
+ \multiput(0.5,0)(0.05,0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tbl}
+ \sbox{\tbl}{%
+ \begin{picture}(1,1)
+ \put(0.5,0.5){\line(-1,0){0.5}}
+ \put(0.5,0.5){\line(0,-1){0.5}}
+ \put(0,0.5){\line(1,-1){0.5}}
+ \multiput(0,0.5)(0.05,-0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rul}
+ \sbox{\rul}{%
+ \begin{picture}(1,1)
+ \put(0,1){\line(1,0){0.5}}
+ \put(0,0.5){\line(0,1){0.5}}
+ \put(0,0.5){\line(1,1){0.5}}
+ \multiput(0,0.5)(0.05,0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rur}
+ \sbox{\rur}{%
+ \begin{picture}(1,1)
+ \put(0.5,1){\line(1,0){0.5}}
+ \put(1,0.5){\line(0,1){0.5}}
+ \put(0.5,1){\line(1,-1){0.5}}
+ \multiput(0.5,1)(0.05,-0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rbr}
+ \sbox{\rbr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\line(1,0){0.5}}
+ \put(1,0){\line(0,1){0.5}}
+ \put(0.5,0){\line(1,1){0.5}}
+ \multiput(0.5,0)(0.05,0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rbl}
+ \sbox{\rbl}{%
+ \begin{picture}(1,1)
+ \put(0,0){\line(1,0){0.5}}
+ \put(0,0){\line(0,1){0.5}}
+ \put(0,0.5){\line(1,-1){0.5}}
+ \multiput(0,0.5)(0.05,-0.05){11}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tuul}
+ \sbox{\tuul}{%
+ \begin{picture}(1,1)
+ \put(0,0.5){\line(1,0){1}}
+ \put(1,0.5){\line(0,1){0.5}}
+ \multiput(0,0.5)(0.05,0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tuur}
+ \sbox{\tuur}{%
+ \begin{picture}(1,1)
+ \put(0,0.5){\line(1,0){1}}
+ \put(0,0.5){\line(0,1){0.5}}
+ \multiput(0,1)(0.05,-0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tbbl}
+ \sbox{\tbbl}{%
+ \begin{picture}(1,1)
+ \put(0,0.5){\line(1,0){1}}
+ \put(1,0){\line(0,1){0.5}}
+ \multiput(0,0.5)(0.05,-0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tbbr}
+ \sbox{\tbbr}{%
+ \begin{picture}(1,1)
+ \put(0,0.5){\line(1,0){1}}
+ \put(0,0){\line(0,1){0.5}}
+ \multiput(0,0)(0.05,0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tull}
+ \sbox{\tull}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\line(0,1){1}}
+ \put(0,0){\line(1,0){0.5}}
+ \multiput(0,0)(0.025,0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\turr}
+ \sbox{\turr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\line(0,1){1}}
+ \put(0.5,0){\line(1,0){0.5}}
+ \multiput(0.5,1)(0.025,-0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tbll}
+ \sbox{\tbll}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\line(0,1){1}}
+ \put(0,1){\line(1,0){0.5}}
+ \multiput(0,1)(0.025,-0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\tbrr}
+ \sbox{\tbrr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\line(0,1){1}}
+ \put(0.5,1){\line(1,0){0.5}}
+ \multiput(0.5,0)(0.025,0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\ruul}
+ \sbox{\ruul}{%
+ \begin{picture}(1,1)
+ \put(0,1){\line(1,0){0.5}}
+ \put(0,0){\line(0,1){1}}
+ \multiput(0,0)(0.025,0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\ruur}
+ \sbox{\ruur}{%
+ \begin{picture}(1,1)
+ \put(0.5,1){\line(1,0){0.5}}
+ \put(1,0){\line(0,1){1}}
+ \multiput(0.5,1)(0.025,-0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rbbl}
+ \sbox{\rbbl}{%
+ \begin{picture}(1,1)
+ \put(0,0){\line(1,0){0.5}}
+ \put(0,0){\line(0,1){1}}
+ \multiput(0,1)(0.025,-0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rbbr}
+ \sbox{\rbbr}{%
+ \begin{picture}(1,1)
+ \put(0.5,0){\line(1,0){0.5}}
+ \put(1,0){\line(0,1){1}}
+ \multiput(0.5,0)(0.025,0.05){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rull}
+ \sbox{\rull}{%
+ \begin{picture}(1,1)
+ \put(0,1){\line(1,0){1}}
+ \put(0,0.5){\line(0,1){0.5}}
+ \multiput(0,0.5)(0.05,0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rurr}
+ \sbox{\rurr}{%
+ \begin{picture}(1,1)
+ \put(0,1){\line(1,0){1}}
+ \put(1,0.5){\line(0,1){0.5}}
+ \multiput(0,1)(0.05,-0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rbll}
+ \sbox{\rbll}{%
+ \begin{picture}(1,1)
+ \put(0,0){\line(1,0){1}}
+ \put(0,0){\line(0,1){0.5}}
+ \multiput(0,0.5)(0.05,-0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \newsavebox{\rbrr}
+ \sbox{\rbrr}{%
+ \begin{picture}(1,1)
+ \put(0,0){\line(1,0){1}}
+ \put(1,0){\line(0,1){0.5}}
+ \multiput(0,0)(0.05,0.025){21}{\circle*{0.05}}
+ \end{picture}}
+ \put(0,-2.75){\dashbox{0.25}(24,24){}}
+ \put(0,0){\line(1,0){24}}
+ \put(0,1.25){\usebox{\tul}}\put(0,1.25){\usebox{\sur}}
+ \put(0,1.25){\usebox{\cbl}}\put(0,1.25){\usebox{\tbr}}
+ \put(0,2.25){\usebox{\rbr}}\put(0,12.25){\usebox{\cul}}
+ \put(0,12.25){\usebox{\sur}}\put(0,12.25){\usebox{\cbl}}
+ \put(0,12.25){\usebox{\sbr}}\put(0,16.25){\usebox{\cul}}
+ \put(0,16.25){\usebox{\sur}}\put(0,16.25){\usebox{\cbl}}
+ \put(0,16.25){\usebox{\sbr}}\put(1,1.25){\usebox{\rul}}
+ \put(1,2.25){\usebox{\tul}}\put(1,2.25){\usebox{\sur}}
+ \put(1,2.25){\usebox{\sbl}}\put(1,2.25){\usebox{\tbr}}
+ \put(1,3.25){\usebox{\rbbr}}\put(1,12.25){\usebox{\sss}}
+ \put(1,16.25){\usebox{\sss}}\put(2,2.25){\usebox{\rul}}
+ \put(2,3.25){\usebox{\sul}}\put(2,3.25){\usebox{\sur}}
+ \put(2,3.25){\usebox{\sbl}}\put(2,3.25){\usebox{\tbr}}
+ \put(2,4.25){\usebox{\tull}}\put(2,4.25){\usebox{\sur}}
+ \put(2,4.25){\usebox{\sbr}}\put(2,5.25){\usebox{\rbbr}}
+ \put(2,12.25){\usebox{\sss}}\put(2,16.25){\usebox{\tbbr}}
+ \put(2,16.25){\usebox{\sul}}\put(2,16.25){\usebox{\sur}}
+ \put(2,17.25){\usebox{\rbrr}}\put(3,3.25){\usebox{\rul}}
+ \put(3,4.25){\usebox{\tbrr}}\put(3,4.25){\usebox{\sul}}
+ \put(3,4.25){\usebox{\sbl}}\put(3,5.25){\usebox{\sss}}
+ \put(3,6.25){\usebox{\tull}}\put(3,6.25){\usebox{\sur}}
+ \put(3,6.25){\usebox{\sbr}}\put(3,7.25){\usebox{\rbbr}}
+ \put(3,12.25){\usebox{\sss}}\put(3,16.25){\usebox{\rull}}
+ \put(3,17.25){\usebox{\tuul}}\put(3,17.25){\usebox{\sbl}}
+ \put(3,17.25){\usebox{\sbr}}\put(4,5.25){\usebox{\rul}}
+ \put(4,5.25){\usebox{\rur}}\put(4,6.25){\usebox{\sss}}
+ \put(4,7.25){\usebox{\sss}}\put(4,8.25){\usebox{\sss}}
+ \put(4,9.25){\usebox{\tull}}\put(4,9.25){\usebox{\sur}}
+ \put(4,9.25){\usebox{\sbr}}\put(4,10.25){\usebox{\rbbr}}
+ \put(4,11.25){\usebox{\rur}}\put(4,12.25){\usebox{\sss}}
+ \put(4,13.25){\usebox{\rbr}}\put(4,16.25){\usebox{\rur}}
+ \put(4,17.25){\usebox{\sss}}\put(5,-2.75){\usebox{\sul}}
+ \put(5,-2.75){\usebox{\sur}}\put(5,-2.75){\usebox{\cbl}}
+ \put(5,-2.75){\usebox{\sbr}}\put(5,-1.75){\usebox{\sss}}
+ \put(5,-0.75){\usebox{\sss}}\put(5,0.25){\usebox{\sss}}
+ \put(5,1.25){\usebox{\sss}}\put(5,2.25){\usebox{\sss}}
+ \put(5,3.25){\usebox{\sss}}\put(5,4.25){\usebox{\sss}}
+ \put(5,5.25){\usebox{\sss}}\put(5,6.25){\usebox{\sss}}
+ \put(5,7.25){\usebox{\sss}}\put(5,8.25){\usebox{\sss}}
+ \put(5,9.25){\usebox{\sss}}\put(5,10.25){\usebox{\sss}}
+ \put(5,11.25){\usebox{\sss}}\put(5,12.25){\usebox{\sss}}
+ \put(5,13.25){\usebox{\sss}}\put(5,14.25){\usebox{\sss}}
+ \put(5,15.25){\usebox{\sss}}\put(5,16.25){\usebox{\sss}}
+ \put(5,17.25){\usebox{\sss}}\put(5,18.25){\usebox{\rbrr}}
+ \put(6,-2.75){\usebox{\sul}}\put(6,-2.75){\usebox{\sur}}
+ \put(6,-2.75){\usebox{\sbl}}\put(6,-2.75){\usebox{\cbr}}
+ \put(6,-1.75){\usebox{\sss}}\put(6,-0.75){\usebox{\sss}}
+ \put(6,0.25){\usebox{\sss}}\put(6,1.25){\usebox{\sss}}
+ \put(6,2.25){\usebox{\sss}}\put(6,3.25){\usebox{\sss}}
+ \put(6,4.25){\usebox{\sss}}\put(6,5.25){\usebox{\sss}}
+ \put(6,6.25){\usebox{\sss}}\put(6,7.25){\usebox{\sss}}
+ \put(6,8.25){\usebox{\sss}}\put(6,9.25){\usebox{\sss}}
+ \put(6,10.25){\usebox{\sss}}\put(6,11.25){\usebox{\sss}}
+ \put(6,12.25){\usebox{\sss}}\put(6,13.25){\usebox{\sss}}
+ \put(6,14.25){\usebox{\sss}}\put(6,15.25){\usebox{\sss}}
+ \put(6,16.25){\usebox{\sss}}\put(6,17.25){\usebox{\sss}}
+ \put(6,18.25){\usebox{\tuul}}\put(6,18.25){\usebox{\sbl}}
+ \put(6,18.25){\usebox{\sbr}}\put(7,7.25){\usebox{\rul}}
+ \put(7,8.25){\usebox{\sss}}\put(7,9.25){\usebox{\rbl}}
+ \put(7,11.25){\usebox{\rul}}\put(7,12.25){\usebox{\sss}}
+ \put(7,13.25){\usebox{\rbl}}\put(7,17.25){\usebox{\rul}}
+ \put(7,18.25){\usebox{\sss}}\put(7,19.25){\usebox{\rbrr}}
+ \put(8,7.25){\usebox{\rurr}}\put(8,8.25){\usebox{\tuur}}
+ \put(8,8.25){\usebox{\sbl}}\put(8,8.25){\usebox{\sbr}}
+ \put(8,12.25){\usebox{\sss}}\put(8,13.25){\usebox{\rbrr}}
+ \put(8,18.25){\usebox{\tbbr}}\put(8,18.25){\usebox{\sul}}
+ \put(8,18.25){\usebox{\sur}}\put(8,19.25){\usebox{\tul}}
+ \put(8,19.25){\usebox{\sur}}\put(8,19.25){\usebox{\sbl}}
+ \put(8,19.25){\usebox{\sbr}}\put(8,20.25){\usebox{\rbr}}
+ \put(9,-1.75){\usebox{\ruur}}\put(9,-0.75){\usebox{\cul}}
+ \put(9,-0.75){\usebox{\sur}}\put(9,-0.75){\usebox{\tbl}}
+ \put(9,-0.75){\usebox{\sbr}}\put(9,6.25){\usebox{\ruur}}
+ \put(9,7.25){\usebox{\sul}}\put(9,7.25){\usebox{\sur}}
+ \put(9,7.25){\usebox{\tbl}}\put(9,7.25){\usebox{\sbr}}
+ \put(9,8.25){\usebox{\rbll}}\put(9,12.25){\usebox{\sss}}
+ \put(9,13.25){\usebox{\tuul}}\put(9,13.25){\usebox{\sbl}}
+ \put(9,13.25){\usebox{\sbr}}\put(9,18.25){\usebox{\rull}}
+ \put(9,19.25){\usebox{\sss}}\put(9,20.25){\usebox{\tuul}}
+ \put(9,20.25){\usebox{\sbl}}\put(9,20.25){\usebox{\sbr}}
+ \put(10,-2.75){\usebox{\sul}}\put(10,-2.75){\usebox{\sur}}
+ \put(10,-2.75){\usebox{\cbl}}\put(10,-2.75){\usebox{\tbr}}
+ \put(10,-1.75){\usebox{\sss}}\put(10,-0.75){\usebox{\sss}}
+ \put(10,5.25){\usebox{\sul}}\put(10,5.25){\usebox{\sur}}
+ \put(10,5.25){\usebox{\cbl}}\put(10,5.25){\usebox{\sbr}}
+ \put(10,6.25){\usebox{\sss}}\put(10,7.25){\usebox{\tuur}}
+ \put(10,7.25){\usebox{\sbl}}\put(10,7.25){\usebox{\sbr}}
+ \put(10,12.25){\usebox{\sss}}\put(10,13.25){\usebox{\tuur}}
+ \put(10,13.25){\usebox{\sbl}}\put(10,13.25){\usebox{\sbr}}
+ \put(10,19.25){\usebox{\sss}}\put(10,20.25){\usebox{\tuur}}
+ \put(10,20.25){\usebox{\sbl}}\put(10,20.25){\usebox{\sbr}}
+ \put(11,-2.75){\usebox{\rull}}\put(11,-1.75){\usebox{\sss}}
+ \put(11,-0.75){\usebox{\sss}}\put(11,5.25){\usebox{\sul}}
+ \put(11,5.25){\usebox{\sur}}\put(11,5.25){\usebox{\sbl}}
+ \put(11,5.25){\usebox{\cbr}}\put(11,6.25){\usebox{\turr}}
+ \put(11,6.25){\usebox{\sul}}\put(11,6.25){\usebox{\sbl}}
+ \put(11,7.25){\usebox{\rbl}}\put(11,12.25){\usebox{\sul}}
+ \put(11,12.25){\usebox{\tur}}\put(11,12.25){\usebox{\sbl}}
+ \put(11,12.25){\usebox{\cbr}}\put(11,13.25){\usebox{\rbl}}
+ \put(11,19.25){\usebox{\sul}}\put(11,19.25){\usebox{\tur}}
+ \put(11,19.25){\usebox{\sbl}}\put(11,19.25){\usebox{\cbr}}
+ \put(11,20.25){\usebox{\rbl}}\put(12,-1.75){\usebox{\sss}}
+ \put(12,-0.75){\usebox{\sss}}\put(12,0.25){\usebox{\rbr}}
+ \put(13,-1.75){\usebox{\tbbr}}\put(13,-1.75){\usebox{\sul}}
+ \put(13,-1.75){\usebox{\sur}}\put(13,-0.75){\usebox{\sss}}
+ \put(13,0.25){\usebox{\sss}}\put(13,1.25){\usebox{\tull}}
+ \put(13,1.25){\usebox{\sur}}\put(13,1.25){\usebox{\sbr}}
+ \put(13,2.25){\usebox{\rbbr}}\put(14,-1.75){\usebox{\rull}}
+ \put(14,-0.75){\usebox{\sss}}\put(14,0.25){\usebox{\rbl}}
+ \put(14,1.25){\usebox{\ruul}}\put(14,2.25){\usebox{\tbrr}}
+ \put(14,2.25){\usebox{\sul}}\put(14,2.25){\usebox{\sbl}}
+ \put(14,3.25){\usebox{\sss}}\put(14,4.25){\usebox{\sss}}
+ \put(14,5.25){\usebox{\tull}}\put(14,5.25){\usebox{\sur}}
+ \put(14,5.25){\usebox{\sbr}}\put(14,6.25){\usebox{\rbbr}}
+ \put(15,-0.75){\usebox{\sss}}\put(15,3.25){\usebox{\ruul}}
+ \put(15,4.25){\usebox{\tbrr}}\put(15,4.25){\usebox{\sul}}
+ \put(15,4.25){\usebox{\sbl}}\put(15,5.25){\usebox{\sss}}
+ \put(15,6.25){\usebox{\sss}}\put(15,7.25){\usebox{\sss}}
+ \put(15,8.25){\usebox{\sss}}\put(15,9.25){\usebox{\sss}}
+ \put(15,10.25){\usebox{\sss}}\put(15,11.25){\usebox{\sss}}
+ \put(15,12.25){\usebox{\tull}}\put(15,12.25){\usebox{\sur}}
+ \put(15,12.25){\usebox{\sbr}}\put(15,13.25){\usebox{\rbbr}}
+ \put(16,-0.75){\usebox{\sss}}\put(16,7.25){\usebox{\ruul}}
+ \put(16,8.25){\usebox{\tbrr}}\put(16,8.25){\usebox{\sul}}
+ \put(16,8.25){\usebox{\sbl}}\put(16,9.25){\usebox{\sss}}
+ \put(16,10.25){\usebox{\sss}}\put(16,11.25){\usebox{\sss}}
+ \put(16,12.25){\usebox{\sss}}\put(16,13.25){\usebox{\sss}}
+ \put(16,14.25){\usebox{\sss}}\put(16,15.25){\usebox{\sss}}
+ \put(16,16.25){\usebox{\sss}}\put(16,17.25){\usebox{\sss}}
+ \put(16,18.25){\usebox{\sss}}\put(16,19.25){\usebox{\sss}}
+ \put(16,20.25){\usebox{\cul}}\put(16,20.25){\usebox{\tur}}
+ \put(16,20.25){\usebox{\sbl}}\put(16,20.25){\usebox{\sbr}}
+ \put(17,-0.75){\usebox{\tbbr}}\put(17,-0.75){\usebox{\sul}}
+ \put(17,-0.75){\usebox{\sur}}\put(17,0.25){\usebox{\rbrr}}
+ \put(17,12.25){\usebox{\ruul}}\put(17,13.25){\usebox{\tbrr}}
+ \put(17,13.25){\usebox{\sul}}\put(17,13.25){\usebox{\sbl}}
+ \put(17,14.25){\usebox{\sss}}\put(17,15.25){\usebox{\sss}}
+ \put(17,16.25){\usebox{\sss}}\put(17,17.25){\usebox{\sss}}
+ \put(17,18.25){\usebox{\sss}}\put(17,19.25){\usebox{\sss}}
+ \put(17,20.25){\usebox{\rbll}}\put(18,-0.75){\usebox{\rull}}
+ \put(18,0.25){\usebox{\tuul}}\put(18,0.25){\usebox{\sbl}}
+ \put(18,0.25){\usebox{\sbr}}\put(18,18.25){\usebox{\ruul}}
+ \put(18,19.25){\usebox{\sul}}\put(18,19.25){\usebox{\cur}}
+ \put(18,19.25){\usebox{\sbl}}\put(18,19.25){\usebox{\tbr}}
+ \put(19,0.25){\usebox{\sss}}\put(19,3.25){\usebox{\ruur}}
+ \put(19,4.25){\usebox{\cul}}\put(19,4.25){\usebox{\tur}}
+ \put(19,4.25){\usebox{\tbl}}\put(19,4.25){\usebox{\sbr}}
+ \put(20,0.25){\usebox{\sss}}\put(20,1.25){\usebox{\ruur}}
+ \put(20,1.25){\usebox{\rbr}}\put(20,2.25){\usebox{\tbll}}
+ \put(20,2.25){\usebox{\sur}}\put(20,2.25){\usebox{\sbr}}
+ \put(20,3.25){\usebox{\sul}}\put(20,3.25){\usebox{\tur}}
+ \put(20,3.25){\usebox{\sbl}}\put(20,3.25){\usebox{\sbr}}
+ \put(20,4.25){\usebox{\rbl}}\put(21,-0.75){\usebox{\rur}}
+ \put(21,0.25){\usebox{\sss}}\put(21,1.25){\usebox{\sss}}
+ \put(21,2.25){\usebox{\sul}}\put(21,2.25){\usebox{\tur}}
+ \put(21,2.25){\usebox{\sbl}}\put(21,2.25){\usebox{\sbr}}
+ \put(21,3.25){\usebox{\rbl}}\put(22,-2.75){\usebox{\sul}}
+ \put(22,-2.75){\usebox{\sur}}\put(22,-2.75){\usebox{\cbl}}
+ \put(22,-2.75){\usebox{\sbr}}\put(22,-1.75){\usebox{\sss}}
+ \put(22,-0.75){\usebox{\sss}}\put(22,0.25){\usebox{\sss}}
+ \put(22,1.25){\usebox{\turr}}\put(22,1.25){\usebox{\sul}}
+ \put(22,1.25){\usebox{\sbl}}\put(22,2.25){\usebox{\rbl}}
+ \put(23,-2.75){\usebox{\sul}}\put(23,-2.75){\usebox{\sur}}
+ \put(23,-2.75){\usebox{\sbl}}\put(23,-2.75){\usebox{\cbr}}
+ \put(23,-1.75){\usebox{\sss}}\put(23,-0.75){\usebox{\turr}}
+ \put(23,-0.75){\usebox{\sul}}\put(23,-0.75){\usebox{\sbl}}
+ \put(23,0.25){\usebox{\rbbl}}
+ \sbox{\sss}{}
+ \sbox{\sul}{}\sbox{\sur}{}\sbox{\sbr}{}\sbox{\sbl}{}
+ \sbox{\cul}{}\sbox{\cur}{}\sbox{\cbr}{}\sbox{\cbl}{}
+ \sbox{\tul}{}\sbox{\tur}{}\sbox{\tbr}{}\sbox{\tbl}{}
+ \sbox{\rul}{}\sbox{\rur}{}\sbox{\rbr}{}\sbox{\rbl}{}
+ \sbox{\tuul}{}\sbox{\tuur}{}\sbox{\tbbl}{}\sbox{\tbbr}{}
+ \sbox{\tull}{}\sbox{\turr}{}\sbox{\tbll}{}\sbox{\tbrr}{}
+ \sbox{\ruul}{}\sbox{\ruur}{}\sbox{\rbbl}{}\sbox{\rbbr}{}
+ \sbox{\rull}{}\sbox{\rurr}{}\sbox{\rbll}{}\sbox{\rbrr}{}
+ \end{picture}}
+ \end{picture}
+ \end{center}
+ \caption{Bitmap and Continuous Character.}
+ \label{bitmapandcontinuouscharacter}
+\end{figure}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{The \LLaTeX\ Interface}
+\typeout{3 The [La]TeX Interface}
+\label{thelatexinterface}
+
+The next challenge is to make \LLaTeX\ understand the output of a japanese text
+editor. There seems to be three ways of achieving this. First, one can modify
+the input routines of \TeX\ and recompile it. This is the approach used by
+J\TeX\ and \mbox{ASCII-j\TeX}. For the reasons mentioned in
+Subsection~\ref{whyjemtex}, I do not want to get into rebuilding \TeX.
+A second possibility is to write macros to have \TeX\ understand japanese.
+Unfortunately, I do not have the expertise to do that.
+
+The third possibility is to write a preprocessor to transform any japanese
+document into a standard \LLaTeX\ one. And I do know enough about japanese and
+\TeX\ to accomplish this. This important decision has several consequences. If
+I am to have the power of any programming language available somewhere in the
+chain from a japanese text to a final \LLaTeX\ document, I might as well fully
+exploit that power. As much as possible of the work should be done by the
+compiled preprocessor, keeping the necessary interpreted \LLaTeX\ macros simple
+and fast. This philosophy is present in many aspects of my work.
+
+\newpage %improve a bad page break
+
+The \JemTeX\ preprocessor deals with the following issues:
+\begin{itemize}
+ \item Loading and calling \JemTeX\ fonts.
+ \item Japanese hyphenation.
+ \item Japanese spacing.
+\end{itemize}
+
+The next subsections will discuss these topics and related subjects, before
+eventually taking up the actual operation of the preprocessor.
+
+\subsection{Japanese Encodings}
+\label{japaneseencodings}
+
+The reasonable thing to do at this point is to look into how japanese is
+represented by a japanese text editor. The first method I came across is the
+Japanese Industrial Standard (JIS). Unfortunately, my japanese text editor is
+very unreliable in JIS mode and this is why I never use it in this mode. I also
+do not know exactly how JIS works, but I do know that it involves escape
+sequences. I will be happy to support it in future versions of \JemTeX\, if
+users express that need and if somebody gives me more information about it.
+
+\label{euc}
+
+The second method is the Extended UNIX Code (EUC). I like it because it is the
+only encoding that my japanese text editor handles reliably. Each japanese
+character is represented by a pair of ASCII characters in the range
+$[161,\ldots,254]$. Given an EUC character $(x,y)$, its position in the JIS~24
+dot font is simply:
+ \[ 94 \times ( x - 161 ) + ( y - 161 ) + 1 \]
+
+\label{mskanji}
+
+A third method is the \mbox{MS-kanji} (\mbox{Shift-JIS}) code which is very
+popular in the DOS world. As for EUC, each japanese character is represented by
+a pair of ASCII characters. The first character is always in the range
+$[129,\ldots,159,224,\ldots,234]$ and the second character is always in the
+range $[64,\ldots,126,128,\ldots,252]$. Given an \mbox{MS-kanji} character,
+consider the coordinates $(x,y)$ obtained by shifting the upper subranges so
+that they are consecutive to the lower subranges, the position of the character
+in the JIS~24 dot font then is:
+ \[ 188 \times ( x - 129 ) + ( y - 64 ) + 1 \]
+
+The preprocessor supports EUC and \mbox{MS-kanji}. You may freely use both in
+any \JemTeX\ document.
+
+\subsection{Using Fonts}
+\label{usingfonts}
+
+This subsection covers all the details having to do with \JemTeX\ fonts.
+
+One of the operation carried out by the preprocessor is the replacement of any
+EUC or \mbox{MS-kanji} character pair by the appropriate font name and symbol
+number. However, all \JemTeX\ fonts must first be declared in a \LLaTeX\ header
+before they can be used.
+
+\label{header}
+
+In \LaTeX, a \JemTeX\ font at magstep~$3.0$, say, is loaded with the following
+command:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+\newfont{\keac}{kanjiac scaled 1728}
+\end{verbatim}
+\end{quote}
+In \TeX, it is loaded with:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+\font\keac=kanjiac scaled 1728
+\end{verbatim}
+\end{quote}
+The \JemTeX\ font is referred to by \verb"\keac", which is a convenient short
+name. The number $1728$ comes from $1728 = 1000 \times 1.2^{3.0}$.
+
+The preprocessor scans the input file in a first pass and determines the
+\JemTeX\ fonts needed. It then writes a \LLaTeX\ header to load these fonts,
+and finally appends the translation obtained by a second pass of the input
+file.
+
+There are at most 128~symbols numbered from~0 to~127 in a \JemTeX\ font. A
+japanese symbol can be produced in \TeX\ and in \LaTeX\ with the following
+command:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+\kk{\keac}{65}
+\end{verbatim}
+\end{quote}
+The preprocessor will supply these automatically for you.
+
+\subsection{Hyphenation}
+\label{hyphenation}
+
+In order to produce a right margin which is even, \TeX\ occasionally needs to
+hyphenate some words. Although it is pretty good at this in english, \TeX\ is
+incapable of doing it in japanese. Therefore, the preprocessor must supply
+explicitly all possible hyphenation locations for \TeX. This subsection
+describes the rules governing this process.
+
+\label{hyphen}
+
+Hyphenation is relevant only between two consecutive characters. Hyphenation in
+english is obtained with a \verb"\-" command. In japanese, it is obtained with
+a \verb"\hh" command. The preprocessor will never allow japanese hyphenation
+between two characters when one or both are roman. But if the two characters
+are japanese, it may insert a \verb"\hh" command in between. Contrary to
+english, no - gets appended at the end of a line hyphenated by a \verb"\hh"
+command.
+
+All japanese characters encountered are classified as {\em alphabetical\/} or
+{\em symbolic}. The alphabetical japanese characters are hiraganas, katakanas,
+and kanjis. All other japanese characters found in the JIS~24 dot font are
+symbolic, they include punctuation signs, english, greek, and russian
+characters.
+
+This classification is important because it is difficult for the \JemTeX\
+preprocessor to automatically decide where to allow hyphenation when
+mathematics or foreign languages are concerned. Consequently, the preprocessor
+never allows hyphenation between two japanese characters when both are
+symbolic. But if one or both japanese characters are alphabetical, hyphenation
+may be allowed since one can hyphenate anywhere in japanese, except possibly
+when punctuation signs are involved. This is not too difficult to handle for
+the preprocessor.
+
+More precisely, the preprocessor will not allow hyphenation before the
+following japanese punctuation signs .,!?:;$\cdot)]\}\rfloor\rangle$'\,'' and
+other related closing characters. It will not allow hyphenation either after
+$([\{\lceil\langle$`\,`` and other related opening characters.
+
+\label{preventh}
+
+If you would like to allow japanese hyphenation where the preprocessor would
+not allow it, simply put a \verb"\hh" command at the right place in your
+source file. If the next character is a roman letter, you have to use instead
+\verb"\hh{}" to prevent confusion. If you would like to prevent the
+preprocessor from allowing japanese hyphenation, put a \verb"{}" to separate
+the two consecutive japanese characters in your source file. The preprocessor
+will not realize that the japanese characters are consecutive anymore, and it
+will not allow hyphenation.
+
+\subsection{Spacing}
+\label{spacing}
+
+In addition to explicitly telling \TeX\ where japanese hyphenation is allowed,
+it is also necessary to add space around some japanese characters. For example,
+this occurs around japanese punctuation signs or at transitions from japanese
+to roman. Indeed, when \TeX\ comes across the command \verb"\kk{\kaaa}{3}", it
+has no idea that this is a japanese period. The preprocessor has to give \TeX\
+a hand in these cases. Such space must always be added after any hyphenation
+command \verb"\hh" that may already have been inserted. Otherwise, you risk
+compromising the flush right margin.
+
+\TeX\ normally introduces extra space after a roman period only if a roman
+space follows it. My japanese text editor does not support spaces while in
+japanese mode. After all, there are no spaces between words in japanese. This
+implies that one would have to enter, say, a japanese period, then switch to
+roman mode, enter a space, and finally switch back to japanese mode. I think
+this is too cumbersome. Therefore, the preprocessor handles japanese spacing
+issues without expecting roman spaces anywhere.
+
+\label{bigmedium}
+
+The preprocessor uses three types of space to achieve its goal; a big space
+with a \verb"\eeee" command, a medium space with a \verb"\eee" command, and a
+tiny space with a \verb"\ee" command. Only one space is added at one place. For
+example, if logic calls for a big, a medium, and a medium space between two
+consecutive characters, only a big one will be inserted by the preprocessor.
+
+No space is ever added between two consecutive roman characters, but as soon as
+one or both characters are japanese, space may become necessary. Let us first
+look at the mixed case where one japanese character is involved with a roman
+one. A big space is inserted after all japanese punctuation signs .,!?\
+followed by a roman character. A medium space is inserted after all japanese
+punctuation signs :;$\cdot)]\}\rfloor\rangle$'\,'' followed by a roman
+character. A medium space is also inserted after all roman characters followed
+by any of the japanese punctuation signs $\cdot([\{\lceil\langle$`\,``.
+
+This takes care of the japanese punctuation spaces. Space is also added for
+transitions as follows. A medium space is inserted after all roman letters and
+all roman digits followed by a japanese character, except if that japanese
+character is any of the following punctuation signs
+.,!?:;$)]\}\rfloor\rangle$'\,''. A medium space is also inserted after a
+japanese character followed by a roman letter or a roman digit, except if that
+japanese character is any of the following punctuation signs
+$([\{\lceil\langle$`\,``.
+
+The case of two consecutive japanese characters is more precise since more
+information is known. It is also closely related to the previous mixed case.
+A big space is inserted after all japanese punctuation signs .,!? but not
+before any of the japanese punctuation signs .,!?$)]\}\rfloor\rangle$'\,''.
+A medium space is inserted after all japanese punctuation signs
+:;$\cdot)]\}\rfloor\rangle$'\,'' but not before any of the japanese punctuation
+signs .,!?:;$)]\}\rfloor\rangle$'\,''. A medium space is also inserted before
+all the japanese punctuation signs $\cdot([\{\lceil\langle$`\,`` but not after
+any of the japanese punctuation signs $([\{\lceil\langle$`\,``.
+
+This covers all cases of big and medium spaces. If you would like to add space
+where the preprocessor would not, simply put a \verb"\eeee" command or a
+\verb"\eee" command at the right place in your source file. Remember to do that
+only after any hyphenation \verb"\hh" command that you may already have added.
+If the next character is a roman letter, you have to use instead \verb"\eeee{}"
+and \verb"\eee{}" to prevent confusion.
+
+\label{prevents}
+
+There are cases where it is preferable to have no extra space after a japanese
+punctuation sign. For example, when typesetting music with \MuTeX, one does not
+want extra space if the japanese text is going under the staff. This affects
+adversary its centering under notes. If you would like to prevent the
+preprocessor from adding space, try to put a \verb"{}" at the right place to
+separate the two consecutive japanese characters, or the japanese character
+from the roman letter or the roman digit. In the few remaining cases where this
+cannot work, you have to temporarily disable the preprocessor's ability to add
+spaces. Subsection~\ref{thejem2texpreprocessor} explains how to do this.
+
+Tiny space has to do with line breaking, and it is very important. \TeX\
+creates a flush right margin by adding extra space between words. However,
+\TeX\ does not add extra space between characters making up words. Since words
+in japanese are not separated by spaces, the only opportunity \TeX\ has to add
+extra space is where big and medium spaces have been added by the preprocessor.
+Some long japanese sentence may span several lines without any added space.
+\TeX\ then has no opportunity at all to stretch space in order to generate a
+flush right margin.
+
+To solve this serious problem, a tiny space is added between all consecutive
+japanese characters, unless some big or medium space has already been inserted.
+If you should ever want to disable this feature, proceed as before by inserting
+a \verb"{}" at the right place. This will always work.
+
+\subsection{\LLaTeX\ Comments}
+\label{llatexcomments}
+
+It is quite clear from the previous two subsections that the concept of
+consecutive characters is very important for the preprocessor. This notion is
+closely related to \LLaTeX\ comments and end of lines. Let us first discuss the
+english case before moving on to the japanese one.
+
+\newpage %improve a bad page break
+
+In most circumstances, the character \verb"%" tells \TeX\ to consider the
+remainder of the current line as a comment and to simply ignore it. Consider
+the following example:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+A% Here is a TeX comment.
+% Here is a TeX comment.
+B% Here is a TeX comment.
+\end{verbatim}
+\end{quote}
+Even though \verb"A" and \verb"B" are not at all consecutive in the source file
+because of the comments separating them, they are consecutive as far as \TeX\
+is concerned. One could equally well have entered instead \verb"AB" without any
+comments in between.
+
+Consider now another example:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+A
+B
+\end{verbatim}
+\end{quote}
+The characters \verb"A" and \verb"B" are not consecutive because they are
+separated by an invisible end of line character. \TeX\ treats an end of line
+character just like if a space was present between \verb"A" and \verb"B".
+
+These remarks apply equally well if \verb"A" and \verb"B" were japanese
+characters. To distinguish both types of end of line, I will say that an end of
+line is roman if the last character on that line is a roman character. A
+similar definition holds for japanese end of lines. It is important for the
+preprocessor to determine if japanese characters are consecutive in order to
+allow hyphenation and add space correctly. The remainder of this subsection
+explains how this is achieved.
+
+In english, any given input line usually terminates just after a word. The end
+of line character after that word is replaced by a space by \TeX, which is
+perfectly acceptable since a space should separate english words. In japanese,
+there is no space between words, so this end of line character must be removed
+to prevent \TeX\ from adding space. There are two ways of doing this while
+using \JemTeX.
+
+\label{eol}
+
+First, you can explicitly put a \verb"%" after all japanese end of lines. This
+will always work, but it is also tedious. Second, you can let the preprocessor
+do that for you. However, you should make sure your input lines do end with a
+japanese character, not a roman space character. This can be a problem because
+some text editors insist on putting some space characters at the end of each
+line. You should make sure that your text editor does not do so. Then, the
+\JemTeX\ preprocessor will have no problem in detecting japanese end of lines
+and will add all the \verb"%" characters for you.
+
+It is also important for the preprocessor to detect \TeX\ comments. The
+preprocessor recognizes a comment if it starts in the first column of the input
+file, or if it's a comment that the processor had to insert itself, i.e.\ after
+a japanese end of line. Therefore, when typing the japanese parts of your
+source file, you should always use comments starting in the first column and
+let the preprocessor handle japanese end of lines. This makes it almost certain
+that the preprocessor will handle hyphenation and spacing correctly.
+
+\subsection{\LLaTeX\ Limitations}
+\label{llatexlimitations}
+
+The previous subsections introduced the different operations that the \JemTeX\
+preprocessor must perform in order to produce an acceptable \LLaTeX\ document
+from a japanese one. Each japanese character is replaced by a command like
+\verb"\kk{\kaaa}{109}" potentially followed by an hyphenation command
+\verb"\hh" and potentially followed by a spacing command like \verb"\eeee{}".
+In the worst case, the two characters representing the original japanese one
+are replaced by approximately 25~roman characters.
+
+This expansion of the source file could cause some problems because there is a
+limit to the maximum length of an input line that \TeX\ can accept. Here are
+typical statistics for one big \emTeX\ run:
+\begin{small}%Don't put spaces after the next line!
+\begin{verbatim}
+Here is how much of TeX's memory you used:
+ 181 strings out of 6937
+ 1607 string characters out of 28560
+ 83907 words of memory out of 262142
+ 2145 multiletter control sequences out of 5000
+ 20585 words of font info for 79 fonts, out of 81920 for 254
+ 15 hyphenation exceptions out of 607
+ 13i,8n,21p,321b,309s positions out of 300i,100n,60p,3000b,1000s
+\end{verbatim}
+\end{small}
+
+The last line (\verb"3000b") tells us that big \emTeX\ can accept input lines
+of 3000~roman characters. Therefore, big \emTeX\ can handle lines of
+approximately 120~japanese characters. Most monitors support only~40, 80, or
+132~characters per line, that should be enough. However, some japanese text
+editors display text on separate lines while whole paragraphs are actually kept
+on one single line internally. You should make sure that your japanese text
+editor does split its paragraphs into lines of a reasonable size.
+
+The only potential remaining problem has to do with the \verb".toc" and
+\verb".aux" files. These files are created by \LaTeX\ for its personal use and
+contain such things as chapter names, cross-references, etc. These are always
+formatted one item per line. If you have a chapter name which is longer than
+120~japanese characters, you can split it on several lines in your source file.
+Then, \LaTeX\ will have no problem with the title itself. But in its first
+pass, it will create the \verb".toc" and \verb".aux" files which will have a
+very long line. When \LaTeX\ starts to read the resulting \verb".aux" file on
+its second pass, it will complain that the line is too long and stop. I think
+it is unlikely that you will ever have such a long chapter name. But if you do,
+here is my solution.
+
+Suppose your \verb".aux" file contains one long line of japanese text:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+\@writefile{toc}{Very long japanese text.}
+\end{verbatim}
+\end{quote}
+Edit the \verb".aux" file and replace the troublesome line by:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+\@writefile{toc}{\texta \textb \textc \textd}
+\end{verbatim}
+\end{quote}
+And add the following macros to your \LaTeX\ source file:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+\newcommand{\texta}{Very}
+\newcommand{\textb}{long}
+\newcommand{\textc}{japanese}
+\newcommand{\textd}{text.}
+\end{verbatim}
+\end{quote}
+Having done all that, you may now successfully run \LaTeX\ once.
+
+Unfortunately, this run will modify your \verb".aux" file again. There are two
+ways around this. First, you could use the \LaTeX\ command \verb"\nofiles".
+Secondly, you could edit your \verb".aux" once again. As I already mentioned,
+it is unlikely that you will ever need to resort to this trick since the
+current limit of 120~japanese characters is quite reasonable. But if you are
+curious, that's how you can avoid the problem.
+
+\subsection{The {\tt JEM2TEX} Preprocessor}
+\label{thejem2texpreprocessor}
+
+Given a japanese source file, my program \verb"JEM2TEX" can generate an
+equivalent \LLaTeX\ source file. You have been supplied with the source and the
+compressed compiled version of this C program. The only information necessary
+is the source file name and some parameters. \verb"JEM2TEX" will try the file
+name extensions \verb".jem", \verb".jpn", and \verb".jap" for you so you do not
+need to specify them.
+
+If you simply start \verb"JEM2TEX" without any command line information, it
+will run in manual mode where you must answer questions interactively
+throughout the operation. If you specify any command line information, the
+preprocessor then runs in automatic mode. In addition to specifying the source
+file name on the command line, you can also supply command line parameters on
+it. These always begin with a \verb"/" or a \verb"-", and any combination of
+small and capital letters is acceptable.
+
+In automatic mode, a \LaTeX\ document \verb"japanese.jem" with japanese
+extended EUC characters at magstep~$3.0$, and with spaces to add, and with
+\verb"%" to add at japanese end of lines is assumed as default. However, you
+may override or confirm any of these default values with the appropriate
+command line parameters. The recognized ones are listed in
+Tables~\ref{spaceparameters}, \ref{japaneseeolparameters},
+\ref{encodingparameters}, \ref{fontsizeparameters}, and~\ref{headerparameters}.
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{tabular}{ll}
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/Space" \\
+ \verb"/Extra" \\
+ \verb"/ExtraSpace"}\right\}$} & Spaces added. \\[5.5mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/NoSpace" \\
+ \verb"/NoExtra" \\
+ \verb"/NoExtraSpace"}\right\}$} & No spaces added.
+ \end{tabular}
+ \end{center}
+ \caption{Space Parameters.}
+ \label{spaceparameters}
+ \begin{center}
+ \begin{tabular}{ll}
+ \mbox{$\left.\parbox{2.3cm}{%
+ \verb"/EOL" \\
+ \verb"/Percent" \\
+ \verb"/Comment"}\right\}$} & \verb"%" added. \\[6.5mm]
+ \mbox{$\left.\parbox{2.3cm}{%
+ \verb"/NoEOL" \\
+ \verb"/NoPercent" \\
+ \verb"/NoComment"}\right\}$} & No \verb"%" added.
+ \end{tabular}
+ \end{center}
+ \caption{Japanese EOL Parameters.}
+ \label{japaneseeolparameters}
+\end{table}
+
+\newpage %improve a bad page break
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{tabular}{ll}
+ \parbox{2.2cm}{\verb"/EUC"} & Extended UNIX code. \\[1.5mm]
+ \mbox{$\left.\parbox{2.2cm}{%
+ \verb"/MSkanji" \\
+ \verb"/ShiftJIS"}\right\}$} & MS-kanji code. \\[2.5mm]
+ \parbox{2.2cm}{\verb"/Extended"} & Extended characters. \\
+ \parbox{2.2cm}{\verb"/Standard"} & Standard characters.
+ \end{tabular}
+ \end{center}
+ \caption{Encoding Parameters.}
+ \label{encodingparameters}
+ \begin{center}
+ \begin{tabular}{ll}
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/1000 /0.0 /0" \\
+ \verb"/1095 /0.5" \\
+ \verb"/1200 /1.0 /1" \\
+ \verb"/1440 /2.0 /2" \\
+ \verb"/1728 /3.0 /3" \\
+ \verb"/2074 /4.0 /4" \\
+ \verb"/2488 /5.0 /5"}\right\}$} & Initial japanese font size.
+ \end{tabular}
+ \end{center}
+ \caption{Font Size Parameters.}
+ \label{fontsizeparameters}
+ \begin{center}
+ \begin{tabular}{ll}
+ \parbox{1.5cm}{\verb"/LaTeX"} & \LaTeX\ header. \\[1mm]
+ \mbox{$\left.\parbox{1.5cm}{%
+ \verb"/TeX" \\
+ \verb"/MuTeX"}\right\}$} & \TeX\ header.
+ \end{tabular}
+ \end{center}
+ \caption{Header Parameters.}
+ \label{headerparameters}
+\end{table}
+
+For music, I usually use only hiraganas and katakanas. The following is
+appropriate since these japanese characters are simple:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+jem2tex anri /MuTeX /NoEOL /NoSpace /Standard /EUC /0.5
+\end{verbatim}
+\end{quote}
+For a letter with complicated kanjis, I would rather use:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+jem2tex yuka /LaTeX /EOL /Space /Extended /EUC /2
+\end{verbatim}
+\end{quote}
+It is also possible to change these parameters at run-time with \TeX\ comments.
+Here is an example:
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+% jem2tex /LaTeX /Space /EOL /MSkanji /1440
+\end{verbatim}
+\end{quote}
+
+The preprocessor expects the \verb"%" to be the first character of the line as
+explained in Subsection~\ref{llatexcomments}. Then one of the keywords
+\verb"jem2tex", \verb"jpn2tex", or~\verb"jap2tex" must follow immediately, or
+after some spaces. Valid parameters are then scanned. The preprocessor will
+produce comments in the \LLaTeX\ file as its status is changed. An invalid
+parameter stops the current scan for parameters, but does not terminate the
+preprocessor's operation.
+
+\label{nospaces}
+\label{fonts}
+
+Run-time parameters can be used to change japanese font sizes according to
+environments and to temporarily disable space insertion. I also always put in
+the first line of my \verb".jem" files the initial parameters. Here is an
+example:
+\begin{quote}
+\verb"%JEM2TEX /Space /EOL /Extended /EUC /LaTeX" \\
+\verb"\documentstyle[12pt]{tegami}" \\
+\verb"\begin{document}" \\
+\verb"\begin{large}" \\
+\verb"%JEM2TEX /1440" \\
+$\vdots$ \\
+\verb"Here is some japanese text" \\
+\verb"%JEM2TEX /1000" \\
+\verb"\footnote{Japanese footnote.}%" \\
+\verb"%JEM2TEX /1440" \\
+\verb"with a footnote showing the font size change." \\
+$\vdots$ \\
+\verb"\end{large}" \\
+\verb"\end{document}"
+\end{quote}
+
+\label{12points}
+
+As mentioned in the \LaTeX\ book about loading fonts, using a japanese font
+doesn't change style parameters like \verb"\baselineskip". Make sure the
+appropriate size changing command is active when a japanese font is used. In
+the previous example, the \verb"/1440" indicates that magstep~$2.0$ is desired
+for the japanese fonts. The command \verb"large" insures that \LaTeX\ is aware
+of the proper line spacing needed while processing these japanese characters.
+The command \verb"large" also tells \LaTeX\ to use roman characters of a size
+comparable to the japanese ones. I usually use \verb"12pt" document styles and
+Table~\ref{12ptfontsizes} shows the appropriate font sizes for them.
+
+\begin{table}[htb]
+ \begin{center}
+ \begin{tabular}{l|l}
+ \verb"\footnotesize" & \verb"/1000" \\
+ \verb"\small" & \verb"/1095" \\
+ \verb"\normalsize" & \verb"/1200" \\
+ \verb"\large" & \verb"/1440" \\
+ \verb"\Large" & \verb"/1728" \\
+ \verb"\LARGE" & \verb"/2074" \\
+ \verb"\huge" & \verb"/2488"
+ \end{tabular}
+ \end{center}
+ \caption{{\tt 12pt} Font Sizes.}
+ \label{12ptfontsizes}
+\end{table}
+
+Finally, note the \verb"%" at the end of the \verb"\footnote" line in the last
+example. The filter will not append it for you since this is a roman end of the
+line. But this \verb"%" is essential to prevent \LLaTeX\ from inserting some
+inter-word space between the footnote number and the following japanese
+character.
+
+\subsection{Font Tables}
+\label{fonttables}
+
+I occasionally come across a japanese character that my japanese text editor
+cannot insert in the text for me. This is usually the result of an incomplete
+kanji lookup dictionary or a consequence of wanting to use extended JIS~24
+characters. In such cases, one has to enter the character by hand. There are a
+number of ways to do that.
+
+Your japanese text editor may support character entry by \mbox{MS-kanji} or EUC
+numbers. That is certainly the most preferable solution. If not, you could use
+\mbox{Alt-Combinations} under a word processor to enter the arbitrary
+characters in your text. Modifying the source file in these fashions is the
+best approach.
+
+You could also choose to leave a few blank spaces at the right places in the
+source file, process it with \verb"JEM2TEX", and then insert a few \verb"\kk"
+macros with the proper kanji fonts and symbol numbers. Unfortunately, such a
+patch must be performed every time the original source file is modified and
+processed by \verb"JEM2TEX". This is why I never proceed this way.
+
+Because of this foreseeable occasional need, I thought it would be useful to
+create font tables like the ones found in Appendix~F of the {\TeX}book. They
+would have to mention the JIS~24 dot font numbers along with the EUC number
+pairs. I designed such tables at magstep~$3.0$ and managed to squeeze three
+\JemTeX\ fonts per page.
+
+My Pascal program \verb"FONTABLE" creates a 60~Kb japanese file
+\verb"fontable.jem" for you in the current directory. Then, simply process
+that file with \verb"JEM2TEX" in automatic mode to eventually obtain
+\verb"fontable.tex". Finally, complete the process with big \LaTeX\, which
+should yield a twenty page document ready for previewing and printing.
+
+You may have to divide and process this document in smaller pieces for several
+reasons. Perhaps you only have a small version of \TeX. Perhaps your printer
+driver has difficulty processing it. This can be caused by your computer
+lacking memory, but is more likely nowadays to be caused by a primitive printer
+driver lacking a decent memory management system. Perhaps you are using a laser
+printer with only 1~Mb of memory. Note that dot matrix printers do not suffer
+from such lack of memory problems since they have very little memory. Their
+language is very verbose since the fonts are explicitly supplied each time they
+are used.
+
+If needed, you should divide the file \verb"fontable.jem", but not the file
+\verb"fontable.tex" unless you also modify the individual headers to avoid
+loading a lot of fonts for nothing. I think the former approach is easier and
+less error prone. If splitting \verb"fontable.jem" still does not work for you,
+talk to me!
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{\JemTeX\ Quick Reference}
+\typeout{4 JemTeX Quick Reference}
+\label{jemtexquickreference}
+\vspace{1cm}
+\begin{quote}%Don't put spaces after the next line!
+\begin{verbatim}
+MF &cm kanjiaa >NUL:
+\end{verbatim}
+\end{quote}
+\begin{center}
+ METAFONT Proof Mode (page~\pageref{mftproof})
+\end{center}
+\vspace{1cm}
+\begin{quote}
+\begin{small}%Don't put spaces after the next line!
+\begin{verbatim}
+MF &cm \mode:=epsonfx; \mag:=magstep(0.0); \input kanjiaa.mf
+\end{verbatim}
+\end{small}
+\end{quote}
+\begin{center}
+ METAFONT Standard Mode (page~\pageref{mftstandard})
+\end{center}
+\vspace{1cm}
+\begin{center}
+ \begin{tabular}{l|ccccccc}
+ Font Size & 1000 & 1095 & 1200 & 1440 & 1728 & 2074 & 2488 \\ \hline
+ Disk Space & 558 & 622 & 680 & 819 & 1008 & 1228 & 1530
+ \end{tabular}
+\end{center}
+\begin{center}
+ Space Requirements (240DPI)
+\end{center}
+\newpage
+\vspace*{\fill}
+\begin{center}
+ \begin{tabular}{ll}
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/FixedWidth" \\
+ \verb"/FixedX" \\
+ \verb"/NoProportionalWidth" \\
+ \verb"/NoProportionalX"}\right\}$} &
+ Fixed width (page~\pageref{widthheight}). \\[8mm]
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/NoFixedWidth" \\
+ \verb"/NoFixedX" \\
+ \verb"/ProportionalWidth" \\
+ \verb"/ProportionalX"}\right\}$} &
+ Minimized width (page~\pageref{widthheight}). \\[8mm]
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/FixedHeight" \\
+ \verb"/FixedY" \\
+ \verb"/NoProportionalHeight" \\
+ \verb"/NoProportionalY"}\right\}$} &
+ Fixed height (page~\pageref{widthheight}). \\[8mm]
+ \mbox{$\left.\parbox{4.6cm}{%
+ \verb"/NoFixedHeight" \\
+ \verb"/NoFixedY" \\
+ \verb"/ProportionalHeight" \\
+ \verb"/ProportionalY"}\right\}$} &
+ Minimized height (page~\pageref{widthheight}). \\[8mm]
+ \parbox{4.6cm}{\verb"/Standard"} &
+ Standard positioning (page~\pageref{positioning}). \\
+ \parbox{4.6cm}{\verb"/Dictionary"} &
+ Dictionary positioning (page~\pageref{positioning}). \\
+ \parbox{4.6cm}{\verb"/Batch"} &
+ Batch mode (page~\pageref{batch}).
+ \end{tabular}
+\end{center}
+\vspace{3mm}
+\begin{center}
+ \verb"JIS2MF" Parameters
+\end{center}
+\vspace*{\fill}
+\newpage
+\vspace*{\fill}
+\begin{center}
+ \begin{tabular}{ll}
+ \parbox{3cm}{\verb"/EUC"} &
+ Extended UNIX code (page~\pageref{euc}). \\[1mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/MSkanji" \\
+ \verb"/ShiftJIS"}\right\}$} &
+ MS-kanji code (page~\pageref{mskanji}). \\[3mm]
+ \parbox{3cm}{\verb"/Extended"} &
+ Extended characters (page~\pageref{extended}). \\
+ \parbox{3cm}{\verb"/Standard"} &
+ Standard characters (page~\pageref{standard}). \\
+ \parbox{3cm}{\verb"/LaTeX"} &
+ \LaTeX\ header (page~\pageref{header}). \\[1.5mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/TeX" \\
+ \verb"/MuTeX"}\right\}$} &
+ \TeX\ header (page~\pageref{header}). \\[4mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/Space" \\
+ \verb"/Extra" \\
+ \verb"/ExtraSpace"}\right\}$} &
+ Spaces added (page~\pageref{spacing}). \\[6mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/NoSpace" \\
+ \verb"/NoExtra" \\
+ \verb"/NoExtraSpace"}\right\}$} &
+ No spaces added (page~\pageref{nospaces}). \\[6mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/EOL" \\
+ \verb"/Percent" \\
+ \verb"/Comment"}\right\}$} &
+ \verb"%" added (page~\pageref{eol}). \\[6mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/NoEOL" \\
+ \verb"/NoPercent" \\
+ \verb"/NoComment"}\right\}$} &
+ No \verb"%" added (page~\pageref{eol}). \\[6mm]
+ \mbox{$\left.\parbox{3cm}{%
+ \verb"/1000 /0.0 /0" \\
+ \verb"/1095 /0.5" \\
+ \verb"/1200 /1.0 /1" \\
+ \verb"/1440 /2.0 /2" \\
+ \verb"/1728 /3.0 /3" \\
+ \verb"/2074 /4.0 /4" \\
+ \verb"/2488 /5.0 /5"}\right\}$} &
+ Initial japanese font size (page~\pageref{fonts}).
+ \end{tabular}
+\end{center}
+\vspace{3mm}
+\begin{center}
+ \verb"JEM2TEX" Parameters
+\end{center}
+\vspace*{\fill}
+\newpage
+\vspace*{\fill}
+\begin{center}
+ \begin{tabular}{l|l}
+ \verb"\hh" & Allow japanese hyphenation (page~\pageref{hyphen}). \\
+ \verb"\eeee" & Insert big space (page~\pageref{bigmedium}). \\
+ \verb"\eee" & Insert medium space (page~\pageref{bigmedium}). \\
+ \verb"{}" & Prevent hyphenation (page~\pageref{preventh}) and space
+ insertion (page~\pageref{prevents}).
+ \end{tabular}
+\end{center}
+\begin{center}
+ Quick Fixes
+\end{center}
+\vspace{1cm}
+\begin{center}
+ \begin{tabular}{l|l}
+ \verb"\footnotesize" & \verb"/1000" \\
+ \verb"\small" & \verb"/1095" \\
+ \verb"\normalsize" & \verb"/1200" \\
+ \verb"\large" & \verb"/1440" \\
+ \verb"\Large" & \verb"/1728" \\
+ \verb"\LARGE" & \verb"/2074" \\
+ \verb"\huge" & \verb"/2488"
+ \end{tabular}
+\end{center}
+\begin{center}
+ \verb"12pt" Font Sizes (page~\pageref{12points})
+\end{center}
+\vspace*{\fill}
+\end{document}
diff --git a/systems/msdos/jemtex2/jis24 b/systems/msdos/jemtex2/jis24
new file mode 100644
index 0000000000..2a3ed9d2e1
--- /dev/null
+++ b/systems/msdos/jemtex2/jis24
Binary files differ
diff --git a/systems/msdos/jemtex2/jis2mf.c b/systems/msdos/jemtex2/jis2mf.c
new file mode 100644
index 0000000000..083fe59e0d
--- /dev/null
+++ b/systems/msdos/jemtex2/jis2mf.c
@@ -0,0 +1,996 @@
+/* -mt -f -A -K -G -O -w */
+/* Compile with Turbo-C 2.0 */
+/*
+ This program generates METAFONT code from a Bitmaps file JIS24
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: April 1991
+
+ Version: 2.00
+
+ Modifications: - Added four kanjis.
+ - Fixed incorrect VGA resolution.
+ - Command line parameter now supported.
+ - Added automatic mode.
+ - Added batch mode.
+ - Updated and improved run-time messages.
+ - Long triangles added by Mr. Masatoshi Watanabe. Fantastic!
+ - Fixed and proportional parameters added.
+ - Standard and dictionary parameters added.
+ - JIS24 now accessed through low-level I/O channel for speed.
+
+ Error Levels: 0 - Normal termination.
+ 1 - Error.
+ 2 - All fonts generated (batch).
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#ifdef __TURBOC__
+#include <process.h>
+#endif
+
+#define True 1
+#define False 0
+/* Number of Bitmaps in JIS24 */
+#define BitmapMax 7806
+/* Size of each square Bitmap */
+#define SizeMax 24
+#define SizeMax1 25
+/* DOS file name length */
+#define FileNameDOS 250 /* includes path */
+#define TotalNameDOS 254
+/* DOS Record Size */
+#define RecSize 72 /* SizeMax*SizeMax/8 */
+/* Parameter flag */
+#define Flag1 '/' /* DOS style */
+#define Flag2 '-' /* UNIX style */
+/* Parameter keywords */
+#define ParamMax 20
+char FixedX1[]="FIXEDWIDTH";
+char FixedX2[]="FIXEDX";
+char FixedX3[]="NOPROPORTIONALWIDTH";
+char FixedX4[]="NOPROPORTIONALX";
+char NoFixedX1[]="NOFIXEDWIDTH";
+char NoFixedX2[]="NOFIXEDX";
+char NoFixedX3[]="PROPORTIONALWIDTH";
+char NoFixedX4[]="PROPORTIONALX";
+char FixedY1[]="FIXEDHEIGHT";
+char FixedY2[]="FIXEDY";
+char FixedY3[]="NOPROPORTIONALHEIGHT";
+char FixedY4[]="NOPROPORTIONALY";
+char NoFixedY1[]="NOFIXEDHEIGHT";
+char NoFixedY2[]="NOFIXEDY";
+char NoFixedY3[]="PROPORTIONALHEIGHT";
+char NoFixedY4[]="PROPORTIONALY";
+char Standard1[]="STANDARD";
+char NoStandard1[]="DICTIONARY";
+char Batch1[]="BATCH";
+/* Answer maximum length */
+#define AnswerMax 254
+
+typedef char FileNameType[FileNameDOS+1];
+typedef char TotalNameType[TotalNameDOS+1];
+typedef char ParamType[ParamMax+1];
+typedef char AnswerType[AnswerMax+1];
+/* Buffer for the Bitmap Data */
+struct ColumnType {
+ unsigned char Data1,Data2,Data3;
+};
+typedef struct ColumnType BufferType[SizeMax]; /* start at 0 because of fread */
+/* The Bitmap array is defined larger to simplify the forthcoming code */
+typedef int BitmapType[SizeMax1+1][SizeMax1+1];
+struct BitmapsType {
+ BitmapType Bitmap;
+ int XMin,XMax,YMin,YMax;
+};
+/* Run time parameters */
+struct RunTimeType {
+ FileNameType FileName;
+ /* Batch mode */
+ int Batch;
+ /* Automatic mode for JemTeX fonts only */
+ int Automatic;
+ /* Fixed or proportional fonts */
+ int FixedX,FixedY;
+ /* Standard or dictionary fonts */
+ int Standard;
+};
+
+void Delete(char *String, int Length)
+/* Delete the first Length characters of String */
+{
+ int Index;
+
+ Index=0;
+ do String[Index]=String[Index+Length];
+ while (String[++Index]!='\0');
+}
+
+/*------------------------------- GetParameters -----------------------------*/
+
+void SimpleQuery(char Title[], char ChoiceA[], char ChoiceB[], int *Answer)
+{
+ char JChar[2];
+ int Valid;
+
+ do {
+ Valid=True;
+ printf("%s:\n",Title);
+ printf(" a) %s\n",ChoiceA);
+ printf(" b) %s\n",ChoiceB);
+ printf("Your choice? ");
+ if (ferror(stdout)) exit(1);
+ if (gets(JChar)==NULL) exit(1);
+ if (strlen(JChar)>1) exit(1);
+ JChar[0]=toupper(JChar[0]);
+ if (JChar[0]=='A') *Answer=True;
+ else
+ if (JChar[0]=='B') *Answer=False;
+ else {
+ Valid=False;
+ if (putchar('\7')==EOF) exit(1);
+ }
+ } while (!Valid);
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+}
+
+void GetMode(struct RunTimeType *RunTime)
+/* Determines if the desired font is a JemTeX font */
+{
+ RunTime->Automatic=False;
+ if (toupper(RunTime->FileName[0])=='K')
+ if (toupper(RunTime->FileName[1])=='A')
+ if (toupper(RunTime->FileName[2])=='N')
+ if (toupper(RunTime->FileName[3])=='J')
+ if (toupper(RunTime->FileName[4])=='I')
+ if(('A'<=toupper(RunTime->FileName[5]))&&(toupper(RunTime->FileName[5])<='H'))
+ if(('A'<=toupper(RunTime->FileName[6]))&&(toupper(RunTime->FileName[6])<='H'))
+ if (strlen(RunTime->FileName)==7)
+ if (toupper(RunTime->FileName[5])<='G') RunTime->Automatic=True;
+ else
+ if (toupper(RunTime->FileName[6])<='E') RunTime->Automatic=True;
+}
+
+void EchoParameters(struct RunTimeType *RunTime)
+/* Echoes the current parameters */
+{
+ printf("Font=%s",RunTime->FileName);
+ if (RunTime->FixedX) printf(" Fixed Width");
+ else printf(" Prop. Width");
+ if (RunTime->FixedY) printf(" Fixed Height");
+ else printf(" Prop. Height");
+ if (RunTime->Standard) printf(" Standard");
+ else printf(" Dictionary");
+ if (RunTime->Automatic) printf(" Automatic");
+ else printf(" Manual");
+ if (RunTime->Batch) printf(" Batch");
+ printf(".\n");
+ if (ferror(stdout)) exit(1);
+}
+
+void Manual(struct RunTimeType *RunTime)
+/* Get parameters from user */
+{
+ printf("METAFONT file name? ");
+ if (ferror(stdout)) exit(1);
+ if (gets(RunTime->FileName)==NULL) exit(1);
+ if (strlen(RunTime->FileName)>FileNameDOS) {
+ /* File name too long */
+ printf("\7File name too long: %s...",RunTime->FileName);
+ exit(1);
+ }
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+ SimpleQuery("Fixed or proportional font width","Fixed","Proportional",
+ &RunTime->FixedX);
+ SimpleQuery("Fixed or proportional font height","Fixed","Proportional",
+ &RunTime->FixedY);
+ SimpleQuery("Standard or dictionary font","Standard","Dictionary",
+ &RunTime->Standard);
+ /* Batch mode intrinsically isn't manual */
+ RunTime->Batch=False;
+}
+
+void FindBefore(FileNameType FileName)
+/* No check for before kanjiaa */
+{
+ if (FileName[6]=='a') {
+ FileName[6]='h';
+ FileName[5]--;
+ }
+ else
+ FileName[6]--;
+}
+
+void FindAfter(FileNameType FileName)
+/* No check for above kanjihe */
+{
+ if (FileName[6]=='h') {
+ FileName[6]='a';
+ FileName[5]++;
+ }
+ else
+ FileName[6]++;
+}
+
+void ScanMF(FileNameType FileName)
+/* Scans backwards for the last JemTeX font generated */
+/* Looks first for a .TFM and then for an .MF */
+/* If no more fonts to generate, stops with error level 2 */
+{
+ FILE *TestFile;
+ TotalNameType TotalName;
+ int Found;
+
+ strcpy(FileName,"kanjihf");
+ do {
+ FindBefore(FileName);
+ strcpy(TotalName,FileName);
+ strcat(TotalName,".tfm");
+ TestFile=fopen(TotalName,"r");
+ Found=(TestFile!=NULL);
+ if (!Found) {
+ strcpy(TotalName,FileName);
+ strcat(TotalName,".mf");
+ TestFile=fopen(TotalName,"r");
+ Found=(TestFile!=NULL);
+ }
+ } while (!Found && strcmp(FileName,"kanjiaa"));
+ if (Found) {
+ if (fclose(TestFile)==EOF) exit(1);
+ if (strcmp(FileName,"kanjihe")) FindAfter(FileName);
+ else {
+ printf("\7All JemTeX fonts generated!\n");
+ exit(2);
+ }
+ }
+}
+
+void Automate(struct RunTimeType *RunTime, int argc, char *argv[])
+/* Get parameters from command line */
+/* Finds the next font to be generated if in batch mode */
+{
+ int ParamIndex,ParamLength,Index;
+ ParamType Param;
+
+ /* Defaults */
+ strcpy(RunTime->FileName,"kanjiaa");
+ RunTime->FixedX=False;
+ RunTime->FixedY=False;
+ RunTime->Standard=True;
+ RunTime->Batch=False;
+ /* Scan command line parameters */
+ /* 0th is program's name, last is NULL */
+ for (ParamIndex=1 ; ParamIndex<argc ; ParamIndex++) {
+ ParamLength=strlen(argv[ParamIndex]);
+ if (ParamLength>ParamMax) {
+ /* Keyword too long */
+ printf("\7Invalid command line parameter: %s...",argv[ParamIndex]);
+ exit(1);
+ }
+ strcpy(Param,argv[ParamIndex]);
+ if ((Param[0]==Flag1) || (Param[0]==Flag2)) {
+ /* Not a font name */
+ /* Delete 1 char at the 1st position */
+ Delete(Param,1);
+ /* Convert to upper case */
+ for (Index=0 ; Index<ParamLength ; Index++)
+ Param[Index]=toupper(Param[Index]);
+ /* Scan known keywords */
+ if ((!strcmp(Param,FixedX1)) || (!strcmp(Param,FixedX2)) ||
+ (!strcmp(Param,FixedX3)) || (!strcmp(Param,FixedX4)))
+ RunTime->FixedX=True;
+ else
+ if ((!strcmp(Param,NoFixedX1)) || (!strcmp(Param,NoFixedX2)) ||
+ (!strcmp(Param,NoFixedX3)) || (!strcmp(Param,NoFixedX4)))
+ RunTime->FixedX=False;
+ else
+ if ((!strcmp(Param,FixedY1)) || (!strcmp(Param,FixedY2)) ||
+ (!strcmp(Param,FixedY3)) || (!strcmp(Param,FixedY4)))
+ RunTime->FixedY=True;
+ else
+ if ((!strcmp(Param,NoFixedY1)) || (!strcmp(Param,NoFixedY2)) ||
+ (!strcmp(Param,NoFixedY3)) || (!strcmp(Param,NoFixedY4)))
+ RunTime->FixedY=False;
+ else
+ if (!strcmp(Param,Standard1))
+ RunTime->Standard=True;
+ else
+ if (!strcmp(Param,NoStandard1))
+ RunTime->Standard=False;
+ else
+ if (!strcmp(Param,Batch1))
+ RunTime->Batch=True;
+ else {
+ /* Unknown keyword */
+ printf("\7Invalid command line parameter: %s...\n",Param);
+ exit(1);
+ }
+ }
+ else {
+ /* Must be a font name */
+ if (ParamLength>FileNameDOS) {
+ /* File name too long */
+ printf("\7File name too long: %s...\n",Param);
+ exit(1);
+ }
+ strcpy(RunTime->FileName,Param);
+ }
+ }
+ if (RunTime->Batch) ScanMF(RunTime->FileName);
+}
+
+void GetParameters(struct RunTimeType *RunTime, int argc, char *argv[])
+/* Get parameters from user or command line */
+{
+ /* 0th is program's name, last is NULL */
+ if (argc==1) Manual(RunTime);
+ else Automate(RunTime,argc,argv);
+ GetMode(RunTime);
+ EchoParameters(RunTime);
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+}
+
+/*---------------------------------- Output ---------------------------------*/
+
+void BeginOut(FILE *OutFile, struct RunTimeType *RunTime)
+/* Writes initial METAFONT header */
+/* Co-author is Mr. Masatoshi Watanabe */
+{
+ fprintf(OutFile,"%%JIS2MF Version 2.00 of 14 April 1991.\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"%% Font=%s\n",RunTime->FileName);
+ if (RunTime->FixedX) fprintf(OutFile,"%% Fixed Width\n");
+ else fprintf(OutFile,"%% Proportional Width\n");
+ if (RunTime->FixedY) fprintf(OutFile,"%% Fixed Height\n");
+ else fprintf(OutFile,"%% Proportional Height\n");
+ if (RunTime->Standard) fprintf(OutFile,"%% Standard Positioning\n");
+ else fprintf(OutFile,"%% Dictionary Positioning\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"tracingstats:=1;\n");
+ fprintf(OutFile,"screen_cols:=640; %%VGA\n");
+ fprintf(OutFile,"screen_rows:=480; %%VGA\n");
+ fprintf(OutFile,"font_size 10pt#;\n");
+ if (RunTime->Standard) {
+ fprintf(OutFile,"u#:=12.7/36pt#;\n");
+ fprintf(OutFile,"body_height#:=23.25u#;\n");
+ fprintf(OutFile,"desc_depth#:=4.75u#;\n");
+ }
+ else {
+ fprintf(OutFile,"u#:=13/36pt#;\n");
+ fprintf(OutFile,"body_height#:=21u#;\n");
+ fprintf(OutFile,"desc_depth#:=7u#;\n");
+ }
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"letter_fit#:=0pt#;\n");
+ fprintf(OutFile,"asc_height#:=0pt#;\n");
+ fprintf(OutFile,"cap_height#:=0pt#;\n");
+ fprintf(OutFile,"fig_height#:=0pt#;\n");
+ fprintf(OutFile,"x_height#:=0pt#;\n");
+ fprintf(OutFile,"math_axis#:=0pt#;\n");
+ fprintf(OutFile,"bar_height#:=0pt#;\n");
+ fprintf(OutFile,"comma_depth#:=0pt#;\n");
+ fprintf(OutFile,"crisp#:=0pt#;\n");
+ fprintf(OutFile,"tiny#:=0pt#;\n");
+ fprintf(OutFile,"fine#:=0pt#;\n");
+ fprintf(OutFile,"thin_join#:=0pt#;\n");
+ fprintf(OutFile,"hair#:=1pt#;\n");
+ fprintf(OutFile,"stem#:=1pt#;\n");
+ fprintf(OutFile,"curve#:=1pt#;\n");
+ fprintf(OutFile,"flare#:=1pt#;\n");
+ fprintf(OutFile,"dot_size#:=0pt#;\n");
+ fprintf(OutFile,"cap_hair#:=1pt#;\n");
+ fprintf(OutFile,"cap_stem#:=1pt#;\n");
+ fprintf(OutFile,"cap_curve#:=1pt#;\n");
+ fprintf(OutFile,"rule_thickness#:=0pt#;\n");
+ fprintf(OutFile,"vair#:=0pt#;\n");
+ fprintf(OutFile,"notch_cut#:=0pt#;\n");
+ fprintf(OutFile,"bar#:=1pt#;\n");
+ fprintf(OutFile,"slab#:=1pt#;\n");
+ fprintf(OutFile,"cap_bar#:=1pt#;\n");
+ fprintf(OutFile,"cap_band#:=1pt#;\n");
+ fprintf(OutFile,"cap_notch_cut#:=0pt#;\n");
+ fprintf(OutFile,"serif_drop#:=0pt#;\n");
+ fprintf(OutFile,"stem_corr#:=0pt#;\n");
+ fprintf(OutFile,"vair_corr#:=0pt#;\n");
+ fprintf(OutFile,"o#:=0pt#;\n");
+ fprintf(OutFile,"apex_o#:=0pt#;\n");
+ fprintf(OutFile,"hefty:=true;\n");
+ fprintf(OutFile,"serifs:=true;\n");
+ fprintf(OutFile,"monospace:=false;\n");
+ fprintf(OutFile,"math_fitting:=false;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"mode_setup;\n");
+ fprintf(OutFile,"font_setup;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"pair z;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"def s(expr col,row)= %%square\n");
+ fprintf(OutFile," z:=((col*u),(row*u));\n");
+ fprintf(OutFile," fill unitsquare scaled u shifted z;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def sul(expr col,row)= %%upper left square\n");
+ fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n");
+ fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def sur(expr col,row)= %%upper right square\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def sbr(expr col,row)= %%bottom right square\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n");
+ fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def sbl(expr col,row)= %%bottom left square\n");
+ fprintf(OutFile," z:=((col*u),(row*u));\n");
+ fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"def c(expr col,row)= %%circle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill fullcircle scaled u shifted z;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def cul(expr col,row)= %%upper left circle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--quartercircle rotated 90 scaled u shifted z--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def cur(expr col,row)= %%upper right circle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--quartercircle scaled u shifted z--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def cbr(expr col,row)= %%bottom right circle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--quartercircle rotated 270 scaled u shifted z--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def cbl(expr col,row)= %%bottom left circle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--quartercircle rotated 180 scaled u shifted z--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"def tul(expr col,row)= %%upper left triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tur(expr col,row)= %%upper right triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tbr(expr col,row)= %%bottom right triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tbl(expr col,row)= %%bottom left triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"def rul(expr col,row)= %%upper left reverse triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rur(expr col,row)= %%upper right reverse triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rbr(expr col,row)= %%bottom right reverse triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rbl(expr col,row)= %%bottom left reverse triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"def tuul(expr col,row)= %%upper left long triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z-(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tull(expr col,row)= %%upper left long triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tuur(expr col,row)= %%upper right long triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z+(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def turr(expr col,row)= %%upper right long triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tbbr(expr col,row)= %%bottom right long triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z+(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tbrr(expr col,row)= %%bottom right long triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tbbl(expr col,row)= %%bottom left long triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u)+.5u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z-(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def tbll(expr col,row)= %%bottom left long triangle\n");
+ fprintf(OutFile," z:=((col*u)+.5u,(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"\n");
+ fprintf(OutFile,"def ruul(expr col,row)= %%upper left reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rull(expr col,row)= %%upper left reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z+(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def ruur(expr col,row)= %%upper right reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rurr(expr col,row)= %%upper right reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n");
+ fprintf(OutFile," fill z--z-(0,.5u)--z-(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rbbr(expr col,row)= %%bottom right reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,u)--z-(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rbrr(expr col,row)= %%bottom right reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u)+u,(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z-(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rbbl(expr col,row)= %%bottom left reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,u)--z+(.5u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"def rbll(expr col,row)= %%bottom left reverse long triangle\n");
+ fprintf(OutFile," z:=((col*u),(row*u));\n");
+ fprintf(OutFile," fill z--z+(0,.5u)--z+(u,0)--cycle;\n");
+ fprintf(OutFile,"enddef;\n");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+}
+
+void ActiveBitmap(FILE *OutFile, BitmapType Bitmap, int X, int Y, int XX,
+ float YY)
+/* Writes METAFONT code for an active cell */
+/* Co-author is Mr. Masatoshi Watanabe */
+{
+ int SquareUR,SquareUL,SquareBR,SquareBL;
+ int CircleUR,CircleUL,CircleBR,CircleBL;
+ int LTryUUR,LTryURR,LTryUUL,LTryULL;
+ int LTryBBR,LTryBRR,LTryBBL,LTryBLL;
+
+ SquareUL=(Bitmap[X-1][Y] || Bitmap[X-1][Y+1] || Bitmap[X][Y+1]);
+ SquareUR=(Bitmap[X+1][Y] || Bitmap[X+1][Y+1] || Bitmap[X][Y+1]);
+ SquareBL=(Bitmap[X-1][Y] || Bitmap[X-1][Y-1] || Bitmap[X][Y-1]);
+ SquareBR=(Bitmap[X+1][Y] || Bitmap[X+1][Y-1] || Bitmap[X][Y-1]);
+ CircleUL=(!Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] &&
+ !Bitmap[X][Y+1] && !Bitmap[X+1][Y+1]);
+ CircleUR=(!Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] &&
+ !Bitmap[X][Y+1] && !Bitmap[X-1][Y+1]);
+ CircleBL=(!Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] &&
+ !Bitmap[X][Y-1] && !Bitmap[X+1][Y-1]);
+ CircleBR=(!Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] &&
+ !Bitmap[X][Y-1] && !Bitmap[X-1][Y-1]);
+ LTryUUL=(Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] &&
+ !Bitmap[X][Y+1] && !Bitmap[X+1][Y+1] && Bitmap[X+1][Y]);
+ LTryUUR=(Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] &&
+ !Bitmap[X][Y+1] && !Bitmap[X-1][Y+1] && Bitmap[X-1][Y]);
+ LTryBBL=(Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] &&
+ !Bitmap[X][Y-1] && !Bitmap[X+1][Y-1] && Bitmap[X+1][Y]);
+ LTryBBR=(Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] &&
+ !Bitmap[X][Y-1] && !Bitmap[X-1][Y-1] && Bitmap[X-1][Y]);
+ LTryULL=(!Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] &&
+ !Bitmap[X][Y+1] && Bitmap[X+1][Y+1] && Bitmap[X][Y-1]);
+ LTryURR=(!Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] &&
+ !Bitmap[X][Y+1] && Bitmap[X-1][Y+1] && Bitmap[X][Y-1]);
+ LTryBLL=(!Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] &&
+ !Bitmap[X][Y-1] && Bitmap[X+1][Y-1] && Bitmap[X][Y+1]);
+ LTryBRR=(!Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] &&
+ !Bitmap[X][Y-1] && Bitmap[X-1][Y-1] && Bitmap[X][Y+1]);
+ if (LTryUUL) fprintf(OutFile,"tuul(%d,%4.2f);",XX,YY);
+ if (LTryULL) fprintf(OutFile,"tull(%d,%4.2f);",XX,YY);
+ if (LTryUUR) fprintf(OutFile,"tuur(%d,%4.2f);",XX,YY);
+ if (LTryURR) fprintf(OutFile,"turr(%d,%4.2f);",XX,YY);
+ if (LTryBBL) fprintf(OutFile,"tbbl(%d,%4.2f);",XX,YY);
+ if (LTryBLL) fprintf(OutFile,"tbll(%d,%4.2f);",XX,YY);
+ if (LTryBBR) fprintf(OutFile,"tbbr(%d,%4.2f);",XX,YY);
+ if (LTryBRR) fprintf(OutFile,"tbrr(%d,%4.2f);",XX,YY);
+ if (SquareUL && SquareUR && SquareBL && SquareBR)
+ fprintf(OutFile,"s(%d,%4.2f);",XX,YY);
+ else
+ if (CircleUL && CircleUR && CircleBL && CircleBR)
+ fprintf(OutFile,"c(%d,%4.2f);",XX,YY);
+ else {
+ if (!LTryUUL && !LTryULL && !LTryUUR && !LTryBLL)
+ if (SquareUL) fprintf(OutFile,"sul(%d,%4.2f);",XX,YY);
+ else
+ if (CircleUL) fprintf(OutFile,"cul(%d,%4.2f);",XX,YY);
+ else fprintf(OutFile,"tul(%d,%4.2f);",XX,YY);
+ if (!LTryUUL && !LTryURR && !LTryUUR && !LTryBRR)
+ if (SquareUR) fprintf(OutFile,"sur(%d,%4.2f);",XX,YY);
+ else
+ if (CircleUR) fprintf(OutFile,"cur(%d,%4.2f);",XX,YY);
+ else fprintf(OutFile,"tur(%d,%4.2f);",XX,YY);
+ if (!LTryBBL && !LTryULL && !LTryBBR && !LTryBLL)
+ if (SquareBL) fprintf(OutFile,"sbl(%d,%4.2f);",XX,YY);
+ else
+ if (CircleBL) fprintf(OutFile,"cbl(%d,%4.2f);",XX,YY);
+ else fprintf(OutFile,"tbl(%d,%4.2f);",XX,YY);
+ if (!LTryBBL && !LTryURR && !LTryBBR && !LTryBRR)
+ if (SquareBR) fprintf(OutFile,"sbr(%d,%4.2f);",XX,YY);
+ else
+ if (CircleBR) fprintf(OutFile,"cbr(%d,%4.2f);",XX,YY);
+ else fprintf(OutFile,"tbr(%d,%4.2f);",XX,YY);
+ }
+ if (ferror(OutFile)) exit(1);
+}
+
+void InactiveBitmap(FILE *OutFile, BitmapType Bitmap, int X, int Y, int XX,
+ float YY, int *Active)
+/* Writes METAFONT code for an inactive cell */
+/* Co-author is Mr. Masatoshi Watanabe */
+{
+ if (Bitmap[X-1][Y] && Bitmap[X][Y+1])
+ if (Bitmap[X-1][Y-1] && !Bitmap[X+1][Y+1])
+ { *Active=True; fprintf(OutFile,"ruul(%d,%4.2f);",XX,YY); }
+ else
+ if (Bitmap[X+1][Y+1] && !Bitmap[X-1][Y-1])
+ { *Active=True; fprintf(OutFile,"rull(%d,%4.2f);",XX,YY); }
+ else
+ { *Active=True; fprintf(OutFile,"rul(%d,%4.2f);",XX,YY); }
+ if (Bitmap[X+1][Y] && Bitmap[X][Y+1])
+ if (Bitmap[X+1][Y-1] && !Bitmap[X-1][Y+1])
+ { *Active=True; fprintf(OutFile,"ruur(%d,%4.2f);",XX,YY); }
+ else
+ if (Bitmap[X-1][Y+1] && !Bitmap[X+1][Y-1])
+ { *Active=True; fprintf(OutFile,"rurr(%d,%4.2f);",XX,YY); }
+ else
+ { *Active=True; fprintf(OutFile,"rur(%d,%4.2f);",XX,YY); }
+ if (Bitmap[X-1][Y] && Bitmap[X][Y-1])
+ if (Bitmap[X-1][Y+1] && !Bitmap[X+1][Y-1])
+ { *Active=True; fprintf(OutFile,"rbbl(%d,%4.2f);",XX,YY); }
+ else
+ if (Bitmap[X+1][Y-1] && !Bitmap[X-1][Y+1])
+ { *Active=True; fprintf(OutFile,"rbll(%d,%4.2f);",XX,YY); }
+ else
+ { *Active=True; fprintf(OutFile,"rbl(%d,%4.2f);",XX,YY); }
+ if (Bitmap[X+1][Y] && Bitmap[X][Y-1])
+ if (Bitmap[X+1][Y+1] && !Bitmap[X-1][Y-1])
+ { *Active=True; fprintf(OutFile,"rbbr(%d,%4.2f);",XX,YY); }
+ else
+ if (Bitmap[X-1][Y-1] && !Bitmap[X+1][Y+1])
+ { *Active=True; fprintf(OutFile,"rbrr(%d,%4.2f);",XX,YY); }
+ else
+ { *Active=True; fprintf(OutFile,"rbr(%d,%4.2f);",XX,YY); }
+ if (ferror(OutFile)) exit(1);
+}
+
+void MiddleOut(FILE *OutFile, struct BitmapsType *Bitmaps, int Number,
+ int Standard)
+/* Writes METAFONT code for a given Bitmap */
+{
+ int X,Y;
+ int Active;
+
+ fprintf(OutFile,"beginchar(%d,%du#,",Number,Bitmaps->XMax-Bitmaps->XMin+1);
+ if (Standard) {
+ if (Bitmaps->YMax>0.75) fprintf(OutFile,"%4.2fu#,",Bitmaps->YMax-0.75);
+ else fprintf(OutFile,"0,");
+ if (5.75>Bitmaps->YMin) fprintf(OutFile,"%4.2fu#);\n",5.75-Bitmaps->YMin);
+ else fprintf(OutFile,"0);\n");
+ }
+ else {
+ if (Bitmaps->YMax>3) fprintf(OutFile,"%du#,",Bitmaps->YMax-3);
+ else fprintf(OutFile,"0,");
+ if (8>Bitmaps->YMin) fprintf(OutFile,"%du#);\n",8-Bitmaps->YMin);
+ else fprintf(OutFile,"0);\n");
+ }
+ fprintf(OutFile,"normal_adjust_fit(2u#,2u#);\n");
+ for (X=Bitmaps->XMin ; X<=Bitmaps->XMax ; X++)
+ for (Y=1 ; Y<=SizeMax ; Y++) {
+ Active=Bitmaps->Bitmap[X][Y];
+ if (Active)
+ /* Current pixel is on */
+ if (Standard)
+ ActiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-3.75);
+ else
+ ActiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-6);
+ else
+ /* Current pixel is off */
+ if (Standard)
+ InactiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-3.75,
+ &Active);
+ else
+ InactiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-6,
+ &Active);
+ /* Avoid METAFONT buffer overflow */
+ if (Active) fprintf(OutFile,"\n");
+ }
+ fprintf(OutFile,"endchar;\n");
+ fprintf(OutFile,"\n");
+ if (ferror(OutFile)) exit(1);
+}
+
+void EndOut(FILE *OutFile, struct RunTimeType *RunTime)
+/* Writes final METAFONT header */
+{
+ fprintf(OutFile,"font_identifier \"%s\";\n",RunTime->FileName);
+ if (RunTime->Standard)
+ fprintf(OutFile,"font_coding_scheme \"JemTeX Standard\";\n");
+ else
+ fprintf(OutFile,"font_coding_scheme \"JemTeX Dictionary\";\n");
+ fprintf(OutFile,"font_slant slant;\n");
+ fprintf(OutFile,"font_normal_space 8u#;\n");
+ fprintf(OutFile,"font_normal_stretch 4u#;\n");
+ fprintf(OutFile,"font_normal_shrink 3u#;\n");
+ fprintf(OutFile,"font_x_height 24u#; %%ex\n");
+ fprintf(OutFile,"font_quad 24u#; %%em\n");
+ fprintf(OutFile,"font_extra_space 0u#;\n");
+ fprintf(OutFile,"\n");
+ /* Must end with CR/LF because of a bug(?) in emTeX METAFONT */
+ fprintf(OutFile,"bye\n");
+ if (ferror(OutFile)) exit(1);
+}
+
+/*--------------------------------- Generate --------------------------------*/
+
+void FindWantedBitmap(int Automatic, int *First, int *WantedBitmap, int *Number)
+/* Finds number of the next desired Bitmap either automatically or manually */
+/* The characters 0 and 1 in the first font kanjiaa are both set to Bitmap 1 */
+{
+ int Valid;
+ AnswerType Answer;
+
+ if (Automatic)
+ /* Find automatically */
+ if (*First)
+ /* Early in font kanjiaa */
+ if (*WantedBitmap==-1) *WantedBitmap=1;
+ else {
+ *WantedBitmap=1;
+ *First=False;
+ }
+ else
+ if ( (*Number==128) || (*WantedBitmap==BitmapMax) ) *WantedBitmap=0;
+ else (*WantedBitmap)++;
+ else
+ /* Find manually */
+ do {
+ printf("Bitmap number? ");
+ if (ferror(stdout)) exit(1);
+ if (gets(Answer)==NULL) exit(1);
+ if (1!=sscanf(Answer,"%d",WantedBitmap)) exit(1);
+ Valid=( (0<=*WantedBitmap) && (*WantedBitmap<=BitmapMax) );
+ if (!Valid) {
+ printf("\7Bitmap %d out of range...\n",*WantedBitmap);
+ if (ferror(stdout)) exit(1);
+ }
+ } while (!Valid);
+ printf("Bitmap number %d.\n",*WantedBitmap);
+ if (ferror(stdout)) exit(1);
+}
+
+void ScanBitmap(FILE *InFile, BitmapType Bitmap, int *Empty)
+/* Reads the Bitmap in a logical grid */
+/* (0,0) is the lower left corner of the Bitmap */
+{
+ int Y;
+ BufferType Buffer;
+ struct ColumnType *Column;
+
+ /* Read the Bitmap */
+ if (fread(Buffer,(unsigned)RecSize,1U,InFile)!=1U) exit(1);
+ /* Find if the Bitmap is empty */
+ *Empty=True;
+ for (Y=1 ; Y<=SizeMax ; Y++) {
+ Column=&Buffer[Y-1];
+ if ( (Column->Data1!=(unsigned char)'\x00') ||
+ (Column->Data2!=(unsigned char)'\x00') ||
+ (Column->Data3!=(unsigned char)'\x00') ) {
+ *Empty=False;
+ break;
+ }
+ }
+ /* Update logical grid */
+ if (!*Empty)
+ for (Y=1 ; Y<=SizeMax ; Y++) {
+ Column=&Buffer[SizeMax-Y];
+ Bitmap[ 1][Y]=(int)(Column->Data1 & (unsigned char)'\x80');
+ Bitmap[ 2][Y]=(int)(Column->Data1 & (unsigned char)'\x40');
+ Bitmap[ 3][Y]=(int)(Column->Data1 & (unsigned char)'\x20');
+ Bitmap[ 4][Y]=(int)(Column->Data1 & (unsigned char)'\x10');
+ Bitmap[ 5][Y]=(int)(Column->Data1 & (unsigned char)'\x08');
+ Bitmap[ 6][Y]=(int)(Column->Data1 & (unsigned char)'\x04');
+ Bitmap[ 7][Y]=(int)(Column->Data1 & (unsigned char)'\x02');
+ Bitmap[ 8][Y]=(int)(Column->Data1 & (unsigned char)'\x01');
+ Bitmap[ 9][Y]=(int)(Column->Data2 & (unsigned char)'\x80');
+ Bitmap[10][Y]=(int)(Column->Data2 & (unsigned char)'\x40');
+ Bitmap[11][Y]=(int)(Column->Data2 & (unsigned char)'\x20');
+ Bitmap[12][Y]=(int)(Column->Data2 & (unsigned char)'\x10');
+ Bitmap[13][Y]=(int)(Column->Data2 & (unsigned char)'\x08');
+ Bitmap[14][Y]=(int)(Column->Data2 & (unsigned char)'\x04');
+ Bitmap[15][Y]=(int)(Column->Data2 & (unsigned char)'\x02');
+ Bitmap[16][Y]=(int)(Column->Data2 & (unsigned char)'\x01');
+ Bitmap[17][Y]=(int)(Column->Data3 & (unsigned char)'\x80');
+ Bitmap[18][Y]=(int)(Column->Data3 & (unsigned char)'\x40');
+ Bitmap[19][Y]=(int)(Column->Data3 & (unsigned char)'\x20');
+ Bitmap[20][Y]=(int)(Column->Data3 & (unsigned char)'\x10');
+ Bitmap[21][Y]=(int)(Column->Data3 & (unsigned char)'\x08');
+ Bitmap[22][Y]=(int)(Column->Data3 & (unsigned char)'\x04');
+ Bitmap[23][Y]=(int)(Column->Data3 & (unsigned char)'\x02');
+ Bitmap[24][Y]=(int)(Column->Data3 & (unsigned char)'\x01');
+ }
+}
+
+void ScanSides(struct BitmapsType *Bitmaps, int FixedX, int FixedY)
+/* Determines the minimal size of the Bitmap for proportional spacing */
+{
+ int X,Y;
+
+ if (FixedX) {
+ Bitmaps->XMin=1;
+ Bitmaps->XMax=SizeMax;
+ }
+ else {
+ Bitmaps->XMin=SizeMax1;
+ for (X=SizeMax ; X>=1 ; X--)
+ for (Y=1 ; Y<=SizeMax ; Y++)
+ if (Bitmaps->Bitmap[X][Y]) Bitmaps->XMin=X;
+ Bitmaps->XMax=0;
+ for (X=1 ; X<=SizeMax ; X++)
+ for (Y=1 ; Y<=SizeMax ; Y++)
+ if (Bitmaps->Bitmap[X][Y]) Bitmaps->XMax=X;
+ }
+ if (FixedY) {
+ Bitmaps->YMin=1;
+ Bitmaps->YMax=SizeMax;
+ }
+ else {
+ Bitmaps->YMin=SizeMax1;
+ for (Y=SizeMax ; Y>=1 ; Y--)
+ for (X=1 ; X<=SizeMax ; X++)
+ if (Bitmaps->Bitmap[X][Y]) Bitmaps->YMin=Y;
+ Bitmaps->YMax=0;
+ for (Y=1 ; Y<=SizeMax ; Y++)
+ for (X=1 ; X<=SizeMax ; X++)
+ if (Bitmaps->Bitmap[X][Y]) Bitmaps->YMax=Y;
+ }
+}
+
+void Generate(FILE *InFile, FILE *OutFile, int *Number,
+ struct RunTimeType *RunTime)
+/* Generates the METAFONT code for the selected font */
+{
+ /* Bitmap pointers */
+ int CurrentBitmap,WantedBitmap;
+ /* Current Bitmap and its dimensions */
+ struct BitmapsType Bitmaps;
+ int X,Y;
+ /* Indicates early in font kanjiaa */
+ int First;
+ /* Indicates current Bitmap is empty */
+ int Empty;
+
+ /* Clear the area outside the Bitmap once and for all */
+ for (X=0 ; X<=SizeMax1 ; X++) {
+ Bitmaps.Bitmap[X][0]=False; Bitmaps.Bitmap[X][SizeMax1]=False; }
+ for (Y=1 ; Y<=SizeMax ; Y++) {
+ Bitmaps.Bitmap[0][Y]=False; Bitmaps.Bitmap[SizeMax1][Y]=False; }
+ /* Number of the Bitmap ready to be read */
+ CurrentBitmap=1;
+ /* First METAFONT character number */
+ *Number=0;
+ /* First Bitmap wanted */
+ if (RunTime->Automatic) {
+ WantedBitmap=1024 * ( toupper(RunTime->FileName[5])-'A' ) +
+ 128 * ( toupper(RunTime->FileName[6])-'A' ) - 1;
+ First=(WantedBitmap==-1);
+ }
+ do {
+ FindWantedBitmap(RunTime->Automatic,&First,&WantedBitmap,Number);
+ if (WantedBitmap) {
+ /* Position pointer */
+ if (WantedBitmap!=CurrentBitmap) {
+ if ( fseek(InFile , ((WantedBitmap-1L)*RecSize) , 0) ) exit(1);
+ CurrentBitmap=WantedBitmap;
+ }
+ printf("Reading Bitmap");
+ if (ferror(stdout)) exit(1);
+ ScanBitmap(InFile,Bitmaps.Bitmap,&Empty);
+ CurrentBitmap++;
+ printf(".\n");
+ if (ferror(stdout)) exit(1);
+ /* Process Bitmap */
+ if (Empty) printf("Bitmap is empty, no METAFONT code %d.\n",*Number);
+ else {
+ printf("Writing METAFONT code %d",*Number);
+ ScanSides(&Bitmaps,RunTime->FixedX,RunTime->FixedY);
+ MiddleOut(OutFile,&Bitmaps,*Number,RunTime->Standard);
+ printf(".\n");
+ }
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+ /* Ready to generate next METAFONT character */
+ (*Number)++;
+ }
+ } while (WantedBitmap);
+}
+
+/*----------------------------------- Main ----------------------------------*/
+
+main(int argc, char *argv[])
+{
+ /* JIS24 and METAFONT file names */
+ FILE *InFile;
+ FILE *OutFile;
+ TotalNameType TotalName;
+ /* Current METAFONT character number */
+ int Number;
+ /* Run time parameters */
+ struct RunTimeType RunTime;
+
+ printf("\n");
+ printf("Bitmaps to METAFONT Conversion Program.\n"); /*To make Borland happy*/
+ printf("Version 2.00 Copyright F. Jalbert 1991.\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Opening Bitmap file JIS24");
+ InFile=fopen("jis24","rb");
+ if (InFile==NULL) exit(1);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ GetParameters(&RunTime,argc,argv);
+ strcpy(TotalName,RunTime.FileName);
+ strcat(TotalName,".mf");
+ printf("Creating METAFONT file %s",TotalName);
+ OutFile=fopen(TotalName,"wt");
+ if (OutFile==NULL) exit(1);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Writing initial METAFONT header");
+ #ifndef __TURBOC__
+ printf("\n");
+ #endif
+ BeginOut(OutFile,&RunTime);
+ printf(".\n");
+ printf("\n");
+ Generate(InFile,OutFile,&Number,&RunTime);
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("Writing final METAFONT header");
+ #ifndef __TURBOC__
+ printf("\n");
+ #endif
+ EndOut(OutFile,&RunTime);
+ printf(".\n");
+ printf("Closing METAFONT file %s",TotalName);
+ if (fclose(OutFile)==EOF) exit(1);
+ printf(".\n");
+ printf("Closing Bitmap file JIS24");
+ if (fclose(InFile)==EOF) exit(1);
+ printf(".\n");
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ printf("METAFONT code for %d Bitmap(s) generated.\n",Number);
+ printf("\n");
+ if (ferror(stdout)) exit(1);
+
+ return(0);
+}
diff --git a/systems/msdos/jemtex2/jis2mf.pas b/systems/msdos/jemtex2/jis2mf.pas
new file mode 100644
index 0000000000..ee944f7913
--- /dev/null
+++ b/systems/msdos/jemtex2/jis2mf.pas
@@ -0,0 +1,939 @@
+{$A-,B-,D-,E-,F-,I+,L-,N-,O-,R-,S-,V-}
+{Compile with Turbo-Pascal 5.0}
+Program JIS2MF(Input,Output);
+{
+ This program generates METAFONT code from a Bitmaps file JIS24
+
+ Author: Francois Jalbert
+ '
+ Date: November 1990
+
+ Version: 1.0
+
+ Date: April 1991
+
+ Version: 2.00
+
+ Modifications: - Added four kanjis.
+ - Fixed incorrect VGA resolution.
+ - Command line parameter now supported.
+ - Added automatic mode.
+ - Added batch mode.
+ - Updated and improved run-time messages.
+ - Long triangles added by Mr. Masatoshi Watanabe. Fantastic!
+ - Fixed and proportional parameters added.
+ - Standard and dictionary parameters added.
+ - JIS24 now accessed through low-level I/O channel for speed.
+
+ Error Levels: 0 - Normal termination.
+ 1 - Error.
+ 2 - All fonts generated (batch).
+}
+Const
+ {Number of Bitmaps in JIS24}
+ BitmapMax=7806;
+ {Size of each square Bitmap}
+ SizeMax=24;
+ SizeMax1=25;
+ {DOS Record Size}
+ RecSize=72; {SizeMax*SizeMax/8}
+ {Parameter flag}
+ Flag1='/'; {DOS style}
+ Flag2='-'; {UNIX style}
+ {Parameter keywords}
+ FixedX1:String[10]='FIXEDWIDTH';
+ FixedX2:String[6]='FIXEDX';
+ FixedX3:String[19]='NOPROPORTIONALWIDTH';
+ FixedX4:String[15]='NOPROPORTIONALX';
+ NoFixedX1:String[12]='NOFIXEDWIDTH';
+ NoFixedX2:String[8]='NOFIXEDX';
+ NoFixedX3:String[17]='PROPORTIONALWIDTH';
+ NoFixedX4:String[13]='PROPORTIONALX';
+ FixedY1:String[11]='FIXEDHEIGHT';
+ FixedY2:String[6]='FIXEDY';
+ FixedY3:String[20]='NOPROPORTIONALHEIGHT';
+ FixedY4:String[15]='NOPROPORTIONALY';
+ NoFixedY1:String[13]='NOFIXEDHEIGHT';
+ NoFixedY2:String[8]='NOFIXEDY';
+ NoFixedY3:String[18]='PROPORTIONALHEIGHT';
+ NoFixedY4:String[13]='PROPORTIONALY';
+ Standard1:String[8]='STANDARD';
+ NoStandard1:String[10]='DICTIONARY';
+ Batch1:String[5]='BATCH';
+
+Type
+ InFileType=File; {Low-level I/O channel}
+ OutFileType=Text;
+ BitmapRange=1..BitmapMax;
+ Bitmap0Range=0..BitmapMax;
+ SizeRange=1..SizeMax;
+ Size0Range=0..SizeMax1;
+ {Buffer for the Bitmap Data}
+ ColumnType=Record Data1,Data2,Data3:Byte End;
+ BufferType=Array [SizeRange] Of ColumnType;
+ {The Bitmap array is defined larger to simplify the forthcoming code}
+ BitmapType=Array [Size0Range,Size0Range] Of Boolean;
+ BitmapsType=Record
+ Bitmap:BitmapType;
+ XMin,XMax,YMin,YMax:Size0Range
+ End;
+ {Run time parameters}
+ RunTimeType=Record
+ FileName:String;
+ {Batch mode}
+ Batch:Boolean;
+ {Automatic mode for JemTeX fonts only}
+ Automatic:Boolean;
+ {Fixed or proportional fonts}
+ FixedX,FixedY:Boolean;
+ {Standard or dictionary fonts}
+ Standard:Boolean
+ End;
+
+Var
+ {JIS24 and METAFONT file names}
+ InFile:InFileType;
+ OutFile:OutFileType;
+ {Current METAFONT character number}
+ Number:Integer;
+ {Run time parameters}
+ RunTime:RunTimeType;
+
+{-------------------------------- GetParameters ------------------------------}
+
+Procedure SimpleQuery(Title,ChoiceA,ChoiceB:String; Var Answer:Boolean);
+Var
+ JChar:Char;
+ Valid:Boolean;
+Begin
+Repeat
+ Valid:=True;
+ Writeln(Title+':');
+ Writeln(' a) '+ChoiceA);
+ Writeln(' b) '+ChoiceB);
+ Write('Your choice? ');
+ Readln(JChar);
+ JChar:=UpCase(JChar);
+ If JChar='A' Then Answer:=True
+ Else
+ If JChar='B' Then Answer:=False
+ Else
+ Begin Valid:=False; Write(Chr(7)) End
+Until Valid;
+Writeln
+End;
+
+Procedure GetMode(Var RunTime:RunTimeType);
+{Determines if the desired font is a JemTeX font}
+Begin
+With RunTime Do
+ Begin
+ Automatic:=False;
+ If UpCase(FileName[1])='K' Then
+ If UpCase(FileName[2])='A' Then
+ If UpCase(FileName[3])='N' Then
+ If UpCase(FileName[4])='J' Then
+ If UpCase(FileName[5])='I' Then
+ If ('A'<=UpCase(FileName[6])) And (UpCase(FileName[6])<='H') Then
+ If ('A'<=UpCase(FileName[7])) And (UpCase(FileName[7])<='H') Then
+ If Length(FileName)=7 Then
+ If UpCase(FileName[6])<='G' Then Automatic:=True
+ Else
+ If UpCase(FileName[7])<='E' Then Automatic:=True
+ End
+End;
+
+Procedure EchoParameters(Var RunTime:RunTimeType);
+{Echoes the current parameters}
+Begin
+With RunTime Do
+ Begin
+ Write('Font='+FileName);
+ If FixedX Then Write(' Fixed Width')
+ Else Write(' Prop. Width');
+ If FixedY Then Write(' Fixed Height')
+ Else Write(' Prop. Height');
+ If Standard Then Write(' Standard')
+ Else Write(' Dictionary');
+ If Automatic Then Write(' Automatic')
+ Else Write(' Manual');
+ If Batch Then Write(' Batch');
+ Writeln('.')
+ End
+End;
+
+Procedure Manual(Var RunTime:RunTimeType);
+{Get parameters from user}
+Begin
+With RunTime Do
+ Begin
+ Write('METAFONT file name? ');
+ Readln(FileName);
+ Writeln;
+ SimpleQuery('Fixed or proportional font width','Fixed','Proportional',FixedX);
+ SimpleQuery('Fixed or proportional font height','Fixed','Proportional',FixedY);
+ SimpleQuery('Standard or dictionary font','Standard','Dictionary',Standard);
+ {Batch mode intrinsically isn't manual}
+ Batch:=False
+ End
+End;
+
+Procedure FindBefore(Var FileName:String);
+{No check for before kanjiaa}
+Begin
+If FileName[7]='a' Then
+ Begin
+ FileName[7]:='h';
+ FileName[6]:=Pred(FileName[6])
+ End
+Else
+ FileName[7]:=Pred(FileName[7])
+End;
+
+Procedure FindAfter(Var FileName:String);
+{No check for above kanjihe}
+Begin
+If FileName[7]='h' Then
+ Begin
+ FileName[7]:='a';
+ FileName[6]:=Succ(FileName[6])
+ End
+Else
+ FileName[7]:=Succ(FileName[7])
+End;
+
+Procedure ScanMF(Var FileName:String);
+{Scans backwards for the last JemTeX font generated}
+{Looks first for a .TFM and then for an .MF}
+{If no more fonts to generate, stops with error level 2}
+Var
+ TestFile:Text;
+ Found:Boolean;
+Begin
+FileName:='kanjihf';
+Repeat
+ FindBefore(FileName);
+ Assign(TestFile,FileName+'.tfm');
+ {$I-}Reset(TestFile);{$I+}
+ {IOResult must be immediately used once only}
+ Found:=(IOResult=0);
+ If Not Found Then
+ Begin
+ Assign(TestFile,FileName+'.mf');
+ {$I-}Reset(TestFile);{$I+}
+ {IOResult must be immediately used once only}
+ Found:=(IOResult=0)
+ End;
+Until Found Or (FileName='kanjiaa');
+If Found Then
+ Begin
+ Close(TestFile);
+ If FileName='kanjihe' Then
+ Begin
+ Writeln(Chr(7)+'All JemTeX fonts generated!');
+ Halt(2)
+ End
+ Else FindAfter(FileName)
+ End
+End;
+
+Procedure Automate(Var RunTime:RunTimeType);
+{Get parameters from command line}
+{Finds the next font to be generated if in batch mode}
+Var
+ ParamIndex,Index:Integer;
+ Param:String;
+Begin
+With RunTime Do
+ Begin
+ {Defaults}
+ FileName:='kanjiaa';
+ FixedX:=False;
+ FixedY:=False;
+ Standard:=True;
+ Batch:=False;
+ {Scan command line parameters}
+ For ParamIndex:=1 To ParamCount Do
+ Begin
+ Param:=ParamStr(ParamIndex);
+ If (Param[1]=Flag1) Or (Param[1]=Flag2) Then
+ {Not a font name}
+ Begin
+ {Delete 1 char at the 1st position}
+ Delete(Param,1,1);
+ {Convert to upper case}
+ For Index:=1 To Length(Param) Do
+ Param[Index]:=UpCase(Param[Index]);
+ {Scan known keywords}
+ If (Param=FixedX1) Or (Param=FixedX2) Or (Param=FixedX3) Or
+ (Param=FixedX4) Then FixedX:=True
+ Else
+ If (Param=NoFixedX1) Or (Param=NoFixedX2) Or (Param=NoFixedX3) Or
+ (Param=NoFixedX4) Then FixedX:=False
+ Else
+ If (Param=FixedY1) Or (Param=FixedY2) Or (Param=FixedY3) Or
+ (Param=FixedY4) Then FixedY:=True
+ Else
+ If (Param=NoFixedY1) Or (Param=NoFixedY2) Or (Param=NoFixedY3) Or
+ (Param=NoFixedY4) Then FixedY:=False
+ Else
+ If Param=Standard1 Then Standard:=True
+ Else
+ If Param=NoStandard1 Then Standard:=False
+ Else
+ If Param=Batch1 Then Batch:=True
+ Else
+ {Unknown keyword}
+ Begin
+ Writeln(Chr(7)+'Invalid command line parameter: '+Param+'...');
+ Halt(1)
+ End
+ End
+ Else
+ {Must be a font name}
+ FileName:=Param
+ End;
+ If Batch Then ScanMF(FileName)
+ End
+End;
+
+Procedure GetParameters(Var RunTime:RunTimeType);
+{Get parameters from user or command line}
+Begin
+If ParamCount=0 Then Manual(RunTime)
+Else Automate(RunTime);
+GetMode(RunTime);
+EchoParameters(RunTime);
+Writeln
+End;
+
+{----------------------------------- Output ----------------------------------}
+
+Procedure BeginOut(Var OutFile:OutFileType; Var RunTime:RunTimeType);
+{Writes initial METAFONT header}
+{Co-author is Mr. Masatoshi Watanabe}
+Begin
+Writeln(OutFile,'%JIS2MF Version 2.00 of 14 April 1991.');
+Writeln(OutFile);
+Writeln(OutFile,'% Font='+RunTime.FileName);
+If RunTime.FixedX Then Writeln(OutFile,'% Fixed Width')
+Else Writeln(OutFile,'% Proportional Width');
+If RunTime.FixedY Then Writeln(OutFile,'% Fixed Height')
+Else Writeln(OutFile,'% Proportional Height');
+If RunTime.Standard Then Writeln(OutFile,'% Standard Positioning')
+Else Writeln(OutFile,'% Dictionary Positioning');
+Writeln(OutFile);
+Writeln(OutFile,'tracingstats:=1;');
+Writeln(OutFile,'screen_cols:=640; %VGA');
+Writeln(OutFile,'screen_rows:=480; %VGA');
+Writeln(OutFile,'font_size 10pt#;');
+If RunTime.Standard Then
+ Begin
+ Writeln(OutFile,'u#:=12.7/36pt#;');
+ Writeln(OutFile,'body_height#:=23.25u#;');
+ Writeln(OutFile,'desc_depth#:=4.75u#;')
+ End
+Else
+ Begin
+ Writeln(OutFile,'u#:=13/36pt#;');
+ Writeln(OutFile,'body_height#:=21u#;');
+ Writeln(OutFile,'desc_depth#:=7u#;')
+ End;
+Writeln(OutFile);
+Writeln(OutFile,'letter_fit#:=0pt#;');
+Writeln(OutFile,'asc_height#:=0pt#;');
+Writeln(OutFile,'cap_height#:=0pt#;');
+Writeln(OutFile,'fig_height#:=0pt#;');
+Writeln(OutFile,'x_height#:=0pt#;');
+Writeln(OutFile,'math_axis#:=0pt#;');
+Writeln(OutFile,'bar_height#:=0pt#;');
+Writeln(OutFile,'comma_depth#:=0pt#;');
+Writeln(OutFile,'crisp#:=0pt#;');
+Writeln(OutFile,'tiny#:=0pt#;');
+Writeln(OutFile,'fine#:=0pt#;');
+Writeln(OutFile,'thin_join#:=0pt#;');
+Writeln(OutFile,'hair#:=1pt#;');
+Writeln(OutFile,'stem#:=1pt#;');
+Writeln(OutFile,'curve#:=1pt#;');
+Writeln(OutFile,'flare#:=1pt#;');
+Writeln(OutFile,'dot_size#:=0pt#;');
+Writeln(OutFile,'cap_hair#:=1pt#;');
+Writeln(OutFile,'cap_stem#:=1pt#;');
+Writeln(OutFile,'cap_curve#:=1pt#;');
+Writeln(OutFile,'rule_thickness#:=0pt#;');
+Writeln(OutFile,'vair#:=0pt#;');
+Writeln(OutFile,'notch_cut#:=0pt#;');
+Writeln(OutFile,'bar#:=1pt#;');
+Writeln(OutFile,'slab#:=1pt#;');
+Writeln(OutFile,'cap_bar#:=1pt#;');
+Writeln(OutFile,'cap_band#:=1pt#;');
+Writeln(OutFile,'cap_notch_cut#:=0pt#;');
+Writeln(OutFile,'serif_drop#:=0pt#;');
+Writeln(OutFile,'stem_corr#:=0pt#;');
+Writeln(OutFile,'vair_corr#:=0pt#;');
+Writeln(OutFile,'o#:=0pt#;');
+Writeln(OutFile,'apex_o#:=0pt#;');
+Writeln(OutFile,'hefty:=true;');
+Writeln(OutFile,'serifs:=true;');
+Writeln(OutFile,'monospace:=false;');
+Writeln(OutFile,'math_fitting:=false;');
+Writeln(OutFile);
+Writeln(OutFile,'mode_setup;');
+Writeln(OutFile,'font_setup;');
+Writeln(OutFile);
+Writeln(OutFile,'pair z;');
+Writeln(OutFile);
+Writeln(OutFile,'def s(expr col,row)= %square');
+Writeln(OutFile,' z:=((col*u),(row*u));');
+Writeln(OutFile,' fill unitsquare scaled u shifted z;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def sul(expr col,row)= %upper left square');
+Writeln(OutFile,' z:=((col*u),(row*u)+.5u);');
+Writeln(OutFile,' fill unitsquare scaled .5u shifted z;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def sur(expr col,row)= %upper right square');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill unitsquare scaled .5u shifted z;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def sbr(expr col,row)= %bottom right square');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u));');
+Writeln(OutFile,' fill unitsquare scaled .5u shifted z;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def sbl(expr col,row)= %bottom left square');
+Writeln(OutFile,' z:=((col*u),(row*u));');
+Writeln(OutFile,' fill unitsquare scaled .5u shifted z;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile);
+Writeln(OutFile,'def c(expr col,row)= %circle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill fullcircle scaled u shifted z;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def cul(expr col,row)= %upper left circle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--quartercircle rotated 90 scaled u shifted z--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def cur(expr col,row)= %upper right circle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--quartercircle scaled u shifted z--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def cbr(expr col,row)= %bottom right circle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--quartercircle rotated 270 scaled u shifted z--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def cbl(expr col,row)= %bottom left circle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--quartercircle rotated 180 scaled u shifted z--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile);
+Writeln(OutFile,'def tul(expr col,row)= %upper left triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--z+(0,.5u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tur(expr col,row)= %upper right triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--z+(0,.5u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tbr(expr col,row)= %bottom right triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tbl(expr col,row)= %bottom left triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile);
+Writeln(OutFile,'def rul(expr col,row)= %upper left reverse triangle');
+Writeln(OutFile,' z:=((col*u),(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rur(expr col,row)= %upper right reverse triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rbr(expr col,row)= %bottom right reverse triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u));');
+Writeln(OutFile,' fill z--z+(0,.5u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rbl(expr col,row)= %bottom left reverse triangle');
+Writeln(OutFile,' z:=((col*u),(row*u));');
+Writeln(OutFile,' fill z--z+(0,.5u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile);
+Writeln(OutFile,'def tuul(expr col,row)= %upper left long triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--z+(0,.5u)--z-(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tull(expr col,row)= %upper left long triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u));');
+Writeln(OutFile,' fill z--z+(0,u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tuur(expr col,row)= %upper right long triangle');
+Writeln(OutFile,' z:=((col*u),(row*u)+.5u);');
+Writeln(OutFile,' fill z--z+(0,.5u)--z+(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def turr(expr col,row)= %upper right long triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u));');
+Writeln(OutFile,' fill z--z+(0,u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tbbr(expr col,row)= %bottom right long triangle');
+Writeln(OutFile,' z:=((col*u),(row*u)+.5u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z+(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tbrr(expr col,row)= %bottom right long triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tbbl(expr col,row)= %bottom left long triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u)+.5u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z-(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def tbll(expr col,row)= %bottom left long triangle');
+Writeln(OutFile,' z:=((col*u)+.5u,(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile);
+Writeln(OutFile,'def ruul(expr col,row)= %upper left reverse long triangle');
+Writeln(OutFile,' z:=((col*u),(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rull(expr col,row)= %upper left reverse long triangle');
+Writeln(OutFile,' z:=((col*u),(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z+(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def ruur(expr col,row)= %upper right reverse long triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rurr(expr col,row)= %upper right reverse long triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u)+u);');
+Writeln(OutFile,' fill z--z-(0,.5u)--z-(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rbbr(expr col,row)= %bottom right reverse long triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u));');
+Writeln(OutFile,' fill z--z+(0,u)--z-(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rbrr(expr col,row)= %bottom right reverse long triangle');
+Writeln(OutFile,' z:=((col*u)+u,(row*u));');
+Writeln(OutFile,' fill z--z+(0,.5u)--z-(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rbbl(expr col,row)= %bottom left reverse long triangle');
+Writeln(OutFile,' z:=((col*u),(row*u));');
+Writeln(OutFile,' fill z--z+(0,u)--z+(.5u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile,'def rbll(expr col,row)= %bottom left reverse long triangle');
+Writeln(OutFile,' z:=((col*u),(row*u));');
+Writeln(OutFile,' fill z--z+(0,.5u)--z+(u,0)--cycle;');
+Writeln(OutFile,'enddef;');
+Writeln(OutFile)
+End;
+
+Procedure ActiveBitmap(Var OutFile:OutFileType; Var Bitmap:BitmapType;
+ X,Y:SizeRange; XX:Integer; YY:Real);
+{Writes METAFONT code for an active cell}
+{Co-author is Mr. Masatoshi Watanabe}
+Var
+ SquareUR,SquareUL,SquareBR,SquareBL:Boolean;
+ CircleUR,CircleUL,CircleBR,CircleBL:Boolean;
+ LTryUUR,LTryURR,LTryUUL,LTryULL:Boolean;
+ LTryBBR,LTryBRR,LTryBBL,LTryBLL:Boolean;
+Begin
+SquareUL:=(Bitmap[X-1,Y] Or Bitmap[X-1,Y+1] Or Bitmap[X,Y+1]);
+SquareUR:=(Bitmap[X+1,Y] Or Bitmap[X+1,Y+1] Or Bitmap[X,Y+1]);
+SquareBL:=(Bitmap[X-1,Y] Or Bitmap[X-1,Y-1] Or Bitmap[X,Y-1]);
+SquareBR:=(Bitmap[X+1,Y] Or Bitmap[X+1,Y-1] Or Bitmap[X,Y-1]);
+CircleUL:=(Not Bitmap[X-1,Y-1] And Not Bitmap[X-1,Y] And Not Bitmap[X-1,Y+1] And
+ Not Bitmap[X,Y+1] And Not Bitmap[X+1,Y+1]);
+CircleUR:=(Not Bitmap[X+1,Y-1] And Not Bitmap[X+1,Y] And Not Bitmap[X+1,Y+1] And
+ Not Bitmap[X,Y+1] And Not Bitmap[X-1,Y+1]);
+CircleBL:=(Not Bitmap[X-1,Y+1] And Not Bitmap[X-1,Y] And Not Bitmap[X-1,Y-1] And
+ Not Bitmap[X,Y-1] And Not Bitmap[X+1,Y-1]);
+CircleBR:=(Not Bitmap[X+1,Y+1] And Not Bitmap[X+1,Y] And Not Bitmap[X+1,Y-1] And
+ Not Bitmap[X,Y-1] And Not Bitmap[X-1,Y-1]);
+LTryUUL:=(Bitmap[X-1,Y-1] And Not Bitmap[X-1,Y] And Not Bitmap[X-1,Y+1] And
+ Not Bitmap[X,Y+1] And Not Bitmap[X+1,Y+1] And Bitmap[X+1,Y]);
+LTryUUR:=(Bitmap[X+1,Y-1] And Not Bitmap[X+1,Y] And Not Bitmap[X+1,Y+1] And
+ Not Bitmap[X,Y+1] And Not Bitmap[X-1,Y+1] And Bitmap[X-1,Y]);
+LTryBBL:=(Bitmap[X-1,Y+1] And Not Bitmap[X-1,Y] And Not Bitmap[X-1,Y-1] And
+ Not Bitmap[X,Y-1] And Not Bitmap[X+1,Y-1] And Bitmap[X+1,Y]);
+LTryBBR:=(Bitmap[X+1,Y+1] And Not Bitmap[X+1,Y] And Not Bitmap[X+1,Y-1] And
+ Not Bitmap[X,Y-1] And Not Bitmap[X-1,Y-1] And Bitmap[X-1,Y]);
+LTryULL:=(Not Bitmap[X-1,Y-1] And Not Bitmap[X-1,Y] And Not Bitmap[X-1,Y+1] And
+ Not Bitmap[X,Y+1] And Bitmap[X+1,Y+1] And Bitmap[X,Y-1]);
+LTryURR:=(Not Bitmap[X+1,Y-1] And Not Bitmap[X+1,Y] And Not Bitmap[X+1,Y+1] And
+ Not Bitmap[X,Y+1] And Bitmap[X-1,Y+1] And Bitmap[X,Y-1]);
+LTryBLL:=(Not Bitmap[X-1,Y+1] And Not Bitmap[X-1,Y] And Not Bitmap[X-1,Y-1] And
+ Not Bitmap[X,Y-1] And Bitmap[X+1,Y-1] And Bitmap[X,Y+1]);
+LTryBRR:=(Not Bitmap[X+1,Y+1] And Not Bitmap[X+1,Y] And Not Bitmap[X+1,Y-1] And
+ Not Bitmap[X,Y-1] And Bitmap[X-1,Y-1] And Bitmap[X,Y+1]);
+If LTryUUL Then Write(OutFile,'tuul(',XX,',',YY:4:2,');');
+If LTryULL Then Write(OutFile,'tull(',XX,',',YY:4:2,');');
+If LTryUUR Then Write(OutFile,'tuur(',XX,',',YY:4:2,');');
+If LTryURR Then Write(OutFile,'turr(',XX,',',YY:4:2,');');
+If LTryBBL Then Write(OutFile,'tbbl(',XX,',',YY:4:2,');');
+If LTryBLL Then Write(OutFile,'tbll(',XX,',',YY:4:2,');');
+If LTryBBR Then Write(OutFile,'tbbr(',XX,',',YY:4:2,');');
+If LTryBRR Then Write(OutFile,'tbrr(',XX,',',YY:4:2,');');
+If SquareUL And SquareUR And SquareBL And SquareBR Then
+ Write(OutFile,'s(',XX,',',YY:4:2,');')
+Else
+ If CircleUL And CircleUR And CircleBL And CircleBR Then
+ Write(OutFile,'c(',XX,',',YY:4:2,');')
+ Else
+ Begin
+ If Not LTryUUL And Not LTryULL And Not LTryUUR And Not LTryBLL Then
+ If SquareUL Then Write(OutFile,'sul(',XX,',',YY:4:2,');')
+ Else
+ If CircleUL Then Write(OutFile,'cul(',XX,',',YY:4:2,');')
+ Else Write(OutFile,'tul(',XX,',',YY:4:2,');');
+ If Not LTryUUL And Not LTryURR And Not LTryUUR And Not LTryBRR Then
+ If SquareUR Then Write(OutFile,'sur(',XX,',',YY:4:2,');')
+ Else
+ If CircleUR Then Write(OutFile,'cur(',XX,',',YY:4:2,');')
+ Else Write(OutFile,'tur(',XX,',',YY:4:2,');');
+ If Not LTryBBL And Not LTryULL And Not LTryBBR And Not LTryBLL Then
+ If SquareBL Then Write(OutFile,'sbl(',XX,',',YY:4:2,');')
+ Else
+ If CircleBL Then Write(OutFile,'cbl(',XX,',',YY:4:2,');')
+ Else Write(OutFile,'tbl(',XX,',',YY:4:2,');');
+ If Not LTryBBL And Not LTryURR And Not LTryBBR And Not LTryBRR Then
+ If SquareBR Then Write(OutFile,'sbr(',XX,',',YY:4:2,');')
+ Else
+ If CircleBR Then Write(OutFile,'cbr(',XX,',',YY:4:2,');')
+ Else Write(OutFile,'tbr(',XX,',',YY:4:2,');')
+ End
+End;
+
+Procedure InactiveBitmap(Var OutFile:OutFileType; Var Bitmap:BitmapType;
+ X,Y:SizeRange; XX:Integer; YY:Real; Var Active:Boolean);
+{Writes METAFONT code for an inactive cell}
+{Co-author is Mr. Masatoshi Watanabe}
+Begin
+If Bitmap[X-1,Y] And Bitmap[X,Y+1] Then
+ If Bitmap[X-1,Y-1] And Not Bitmap[X+1,Y+1] Then
+ Begin Active:=True; Write(OutFile,'ruul(',XX,',',YY:4:2,');') End
+ Else
+ If Bitmap[X+1,Y+1] And Not Bitmap[X-1,Y-1] Then
+ Begin Active:=True; Write(OutFile,'rull(',XX,',',YY:4:2,');') End
+ Else
+ Begin Active:=True; Write(OutFile,'rul(',XX,',',YY:4:2,');') End;
+If Bitmap[X+1,Y] And Bitmap[X,Y+1] Then
+ If Bitmap[X+1,Y-1] And Not Bitmap[X-1,Y+1] Then
+ Begin Active:=True; Write(OutFile,'ruur(',XX,',',YY:4:2,');') End
+ Else
+ If Bitmap[X-1,Y+1] And Not Bitmap[X+1,Y-1] Then
+ Begin Active:=True; Write(OutFile,'rurr(',XX,',',YY:4:2,');') End
+ Else
+ Begin Active:=True; Write(OutFile,'rur(',XX,',',YY:4:2,');') End;
+If Bitmap[X-1,Y] And Bitmap[X,Y-1] Then
+ If Bitmap[X-1,Y+1] And Not Bitmap[X+1,Y-1] Then
+ Begin Active:=True; Write(OutFile,'rbbl(',XX,',',YY:4:2,');') End
+ Else
+ If Bitmap[X+1,Y-1] And Not Bitmap[X-1,Y+1] Then
+ Begin Active:=True; Write(OutFile,'rbll(',XX,',',YY:4:2,');') End
+ Else
+ Begin Active:=True; Write(OutFile,'rbl(',XX,',',YY:4:2,');') End;
+If Bitmap[X+1,Y] And Bitmap[X,Y-1] Then
+ If Bitmap[X+1,Y+1] And Not Bitmap[X-1,Y-1] Then
+ Begin Active:=True; Write(OutFile,'rbbr(',XX,',',YY:4:2,');') End
+ Else
+ If Bitmap[X-1,Y-1] And Not Bitmap[X+1,Y+1] Then
+ Begin Active:=True; Write(OutFile,'rbrr(',XX,',',YY:4:2,');') End
+ Else
+ Begin Active:=True; Write(OutFile,'rbr(',XX,',',YY:4:2,');') End
+End;
+
+Procedure MiddleOut(Var OutFile:OutFileType; Var Bitmaps:BitmapsType;
+ Number:Integer; Standard:Boolean);
+{Writes METAFONT code for a given Bitmap}
+Var
+ X,Y:SizeRange;
+ Active:Boolean;
+Begin
+With Bitmaps Do
+ Begin
+ Write(OutFile,'beginchar(',Number,',',XMax-XMin+1,'u#,');
+ If Standard Then
+ Begin
+ If YMax>0.75 Then Write(OutFile,(YMax-0.75):4:2,'u#,')
+ Else Write(OutFile,'0,');
+ If 5.75>YMin Then Writeln(OutFile,(5.75-YMin):4:2,'u#);')
+ Else Writeln(OutFile,'0);')
+ End
+ Else
+ Begin
+ If YMax>3 Then Write(OutFile,YMax-3,'u#,')
+ Else Write(OutFile,'0,');
+ If 8>YMin Then Writeln(OutFile,8-YMin,'u#);')
+ Else Writeln(OutFile,'0);')
+ End;
+ Writeln(OutFile,'normal_adjust_fit(2u#,2u#);');
+ For X:=XMin To XMax Do
+ For Y:=1 To SizeMax Do
+ Begin
+ Active:=Bitmap[X,Y];
+ If Active Then
+ {Current pixel is on}
+ If Standard Then ActiveBitmap(OutFile,Bitmap,X,Y,X-XMin,Y-3.75)
+ Else ActiveBitmap(OutFile,Bitmap,X,Y,X-XMin,Y-6)
+ Else
+ {Current pixel is off}
+ If Standard Then InactiveBitmap(OutFile,Bitmap,X,Y,X-XMin,Y-3.75,Active)
+ Else InactiveBitmap(OutFile,Bitmap,X,Y,X-XMin,Y-6,Active);
+ {Avoid METAFONT buffer overflow}
+ If Active Then Writeln(OutFile)
+ End;
+ Writeln(OutFile,'endchar;');
+ Writeln(OutFile)
+ End
+End;
+
+Procedure EndOut(Var OutFile:OutFileType; Var RunTime:RunTimeType);
+{Writes final METAFONT header}
+Begin
+Writeln(OutFile,'font_identifier "'+RunTime.FileName+'";');
+If RunTime.Standard Then
+ Writeln(OutFile,'font_coding_scheme "JemTeX Standard";')
+Else Writeln(OutFile,'font_coding_scheme "JemTeX Dictionary";');
+Writeln(OutFile,'font_slant slant;');
+Writeln(OutFile,'font_normal_space 8u#;');
+Writeln(OutFile,'font_normal_stretch 4u#;');
+Writeln(OutFile,'font_normal_shrink 3u#;');
+Writeln(OutFile,'font_x_height 24u#; %ex');
+Writeln(OutFile,'font_quad 24u#; %em');
+Writeln(OutFile,'font_extra_space 0u#;');
+Writeln(OutFile);
+{Must end with CR/LF because of a bug(?) in emTeX METAFONT}
+Writeln(OutFile,'bye')
+End;
+
+{---------------------------------- Generate ---------------------------------}
+
+Procedure FindWantedBitmap(Automatic:Boolean; Var First:Boolean;
+ Var WantedBitmap:Bitmap0Range; Var Number:Integer);
+{Finds the number of the next desired Bitmap either automatically or manually}
+{The characters 0 and 1 in the first font kanjiaa are both set to Bitmap 1}
+Var Valid:Boolean;
+Begin
+If Automatic Then
+ {Find automatically}
+ If First Then
+ {Early in font kanjiaa}
+ If WantedBitmap=-1 Then WantedBitmap:=1
+ Else
+ Begin
+ WantedBitmap:=1;
+ First:=False
+ End
+ Else
+ If (Number=128) Or (WantedBitmap=BitmapMax) Then WantedBitmap:=0
+ Else WantedBitmap:=WantedBitmap+1
+Else
+ {Find manually}
+ Repeat
+ Write('Bitmap number? ');
+ Readln(WantedBitmap);
+ Writeln;
+ Valid:=( (0<=WantedBitmap) And (WantedBitmap<=BitmapMax) );
+ If Not Valid Then Writeln(Chr(7)+'Bitmap ',WantedBitmap,' out of range...')
+ Until Valid;
+Writeln('Bitmap number ',WantedBitmap,'.')
+End;
+
+Procedure ScanBitmap(Var InFile:InFileType; Var Bitmap:BitmapType;
+ Var Empty:Boolean);
+{Reads the Bitmap in a logical grid}
+{(0,0) is the lower left corner of the Bitmap}
+Label 1;
+Var
+ Y:SizeRange;
+ Buffer:BufferType;
+Begin
+{Read the Bitmap}
+BlockRead(InFile,Buffer,1);
+{Find if the Bitmap is empty}
+Empty:=True;
+For Y:=1 To SizeMax Do
+ With Buffer[Y] Do
+ If (Data1<>$00) Or (Data2<>$00) Or (Data3<>$00) Then
+ Begin
+ Empty:=False;
+ Goto 1
+ End;
+{Update logical grid}
+1:If Not Empty Then
+ For Y:=1 To SizeMax Do
+ With Buffer[SizeMax1-Y] Do
+ Begin
+ Bitmap[ 1,Y]:=((Data1 And $80)<>0);
+ Bitmap[ 2,Y]:=((Data1 And $40)<>0);
+ Bitmap[ 3,Y]:=((Data1 And $20)<>0);
+ Bitmap[ 4,Y]:=((Data1 And $10)<>0);
+ Bitmap[ 5,Y]:=((Data1 And $08)<>0);
+ Bitmap[ 6,Y]:=((Data1 And $04)<>0);
+ Bitmap[ 7,Y]:=((Data1 And $02)<>0);
+ Bitmap[ 8,Y]:=((Data1 And $01)<>0);
+ Bitmap[ 9,Y]:=((Data2 And $80)<>0);
+ Bitmap[10,Y]:=((Data2 And $40)<>0);
+ Bitmap[11,Y]:=((Data2 And $20)<>0);
+ Bitmap[12,Y]:=((Data2 And $10)<>0);
+ Bitmap[13,Y]:=((Data2 And $08)<>0);
+ Bitmap[14,Y]:=((Data2 And $04)<>0);
+ Bitmap[15,Y]:=((Data2 And $02)<>0);
+ Bitmap[16,Y]:=((Data2 And $01)<>0);
+ Bitmap[17,Y]:=((Data3 And $80)<>0);
+ Bitmap[18,Y]:=((Data3 And $40)<>0);
+ Bitmap[19,Y]:=((Data3 And $20)<>0);
+ Bitmap[20,Y]:=((Data3 And $10)<>0);
+ Bitmap[21,Y]:=((Data3 And $08)<>0);
+ Bitmap[22,Y]:=((Data3 And $04)<>0);
+ Bitmap[23,Y]:=((Data3 And $02)<>0);
+ Bitmap[24,Y]:=((Data3 And $01)<>0)
+ End
+End;
+
+Procedure ScanSides(Var Bitmaps:BitmapsType; FixedX,FixedY:Boolean);
+{Determines the minimal size of the Bitmap for proportional spacing}
+Var X,Y:SizeRange;
+Begin
+With Bitmaps Do
+ Begin
+ If FixedX Then
+ Begin
+ XMin:=1;
+ XMax:=SizeMax
+ End
+ Else
+ Begin
+ XMin:=SizeMax1;
+ For X:=SizeMax DownTo 1 Do
+ For Y:=1 To SizeMax Do
+ If Bitmap[X,Y] Then XMin:=X;
+ XMax:=0;
+ For X:=1 To SizeMax Do
+ For Y:=1 To SizeMax Do
+ If Bitmap[X,Y] Then XMax:=X
+ End;
+ If FixedY Then
+ Begin
+ YMin:=1;
+ YMax:=SizeMax
+ End
+ Else
+ Begin
+ YMin:=SizeMax1;
+ For Y:=SizeMax DownTo 1 Do
+ For X:=1 To SizeMax Do
+ If Bitmap[X,Y] Then YMin:=Y;
+ YMax:=0;
+ For Y:=1 To SizeMax Do
+ For X:=1 To SizeMax Do
+ If Bitmap[X,Y] Then YMax:=Y
+ End
+ End
+End;
+
+Procedure Generate(Var InFile:InFileType; Var OutFile:OutFileType;
+ Var Number:Integer; Var RunTime:RunTimeType);
+{Generates the METAFONT code for the selected font}
+Var
+ {Bitmap pointers}
+ CurrentBitmap,WantedBitmap:Bitmap0Range;
+ {Current Bitmap}
+ Bitmaps:BitmapsType;
+ X,Y:Size0Range;
+ {Indicates early in font kanjiaa}
+ First:Boolean;
+ {Indicates current Bitmap is empty}
+ Empty:Boolean;
+Begin
+{Clear the area outside the Bitmap once and for all}
+With Bitmaps Do
+ Begin
+ For X:=0 To SizeMax1 Do
+ Begin Bitmap[X,0]:=False; Bitmap[X,SizeMax1]:=False End;
+ For Y:=1 To SizeMax Do
+ Begin Bitmap[0,Y]:=False; Bitmap[SizeMax1,Y]:=False End
+ End;
+{Number of the Bitmap ready to be read}
+CurrentBitmap:=1;
+{First METAFONT character number}
+Number:=0;
+{First Bitmap wanted}
+If RunTime.Automatic Then
+ Begin
+ WantedBitmap:=1024 * ( Ord(UpCase(RunTime.FileName[6]))-Ord('A') ) +
+ 128 * ( Ord(UpCase(RunTime.FileName[7]))-Ord('A') ) - 1;
+ First:=(WantedBitmap=-1)
+ End;
+Repeat
+ FindWantedBitmap(RunTime.Automatic,First,WantedBitmap,Number);
+ If WantedBitmap<>0 Then
+ Begin
+ {Position pointer}
+ If WantedBitmap<>CurrentBitmap Then
+ Begin
+ Seek(InFile,WantedBitmap-1);
+ CurrentBitmap:=WantedBitmap
+ End;
+ Write('Reading Bitmap');
+ ScanBitmap(InFile,Bitmaps.Bitmap,Empty);
+ CurrentBitmap:=CurrentBitmap+1;
+ Writeln('.');
+ {Process Bitmap}
+ If Empty Then Writeln('Bitmap is empty, no METAFONT code ',Number,'.')
+ Else
+ Begin
+ Write('Writing METAFONT code ',Number);
+ ScanSides(Bitmaps,RunTime.FixedX,RunTime.FixedY);
+ MiddleOut(OutFile,Bitmaps,Number,RunTime.Standard);
+ Writeln('.')
+ End;
+ Writeln;
+ {Ready to generate next METAFONT character}
+ Number:=Number+1
+ End;
+Until WantedBitmap=0
+End;
+
+{------------------------------------ Main -----------------------------------}
+
+Begin
+Writeln;
+Writeln('Bitmaps to METAFONT Conversion Program.'); {To make Borland happy}
+Writeln('Version 2.00 Copyright F. Jalbert 1991.');
+Writeln;
+
+Write('Opening Bitmap file JIS24');
+Assign(InFile,'JIS24');
+Reset(InFile,RecSize);
+Writeln('.');
+Writeln;
+
+GetParameters(RunTime);
+Write('Creating METAFONT file '+RunTime.FileName+'.mf');
+Assign(OutFile,RunTime.FileName+'.mf');
+Rewrite(OutFile);
+Writeln('.');
+Writeln;
+
+Write('Writing initial METAFONT header');
+BeginOut(OutFile,RunTime);
+Writeln('.');
+Writeln;
+Generate(InFile,OutFile,Number,RunTime);
+Writeln;
+
+Write('Writing final METAFONT header');
+EndOut(OutFile,RunTime);
+Writeln('.');
+Write('Closing METAFONT file '+RunTime.FileName+'.mf');
+Close(OutFile);
+Writeln('.');
+Write('Closing Bitmap file JIS24');
+Close(InFile);
+Writeln('.');
+Writeln;
+
+Writeln('METAFONT code for ',Number,' Bitmap(s) generated.');
+Writeln
+End.
diff --git a/systems/msdos/lalaunch/lalaunch.cfg b/systems/msdos/lalaunch/lalaunch.cfg
new file mode 100644
index 0000000000..8eed5f69e2
--- /dev/null
+++ b/systems/msdos/lalaunch/lalaunch.cfg
@@ -0,0 +1,148 @@
+***************************************************************************
+* Greg's configuration file for LaTeX Launcher Ver 1.4
+*
+* Fix Button 18! Look at the end of this file for a note.
+*
+* Good Advice: Leave the structure of this file alone
+* only edit the relevant variables and commands.
+*
+* If you change this file while running LaTeX Launcher, you must save this
+* file and push reset before changes take affect.
+*
+* The "*" at the beginning of a line implies a comment and is ignored.
+* Blank lines with no text are also ok.
+* Use a "|" symbol to indicate end of command, anything after is ignored.
+* The + symbol will be eliminated during run (no space).
+* Do not put in any extra spaces that you do not intend to be there.
+*
+*
+* Variables that can be used in commands:
+* TPath: complete path to selected .tex file @ run time (no file name)
+* TFile: selected tex file @ run time (no extension)
+* TExtn: selected tex file extension (for those that don't use .tex)
+* BPath: complete path to selected .bib file @ run time (no file name)
+* BExtn: select bib file extension (for those that don't use .bib)
+* BFile: selected .bib file @ run time (no extension)
+* PStart: starting page number selected @ run time
+* PStop: stopping page number selected @ run time
+* SPath: path that LaTeX Launcher was started from
+* LLvarX: 10 user defined variables, X is an integer between 0-9
+*
+* There are a total of 18 configurable buttons:
+* butX=button X label
+* dirX=directory for cmdX (changes to this dir before cmd execute)
+* cmdX=the command to be launched when butX is pushed
+*
+******************* Basic Startup Info ************************************
+*
+* No Variables in this section. Don't use +, TPath etc.
+*
+unset=| Runs at exit from LaTeX Launcher
+bibtexdir=c:\emtex\work| Default Directory for .bib files
+msdos=c:\windows\dosprmpt.pif| Launch when MS DOS button is pushed
+work=c:\emtex\work| Default Directory for your .tex files
+*
+pos= 9.5,1| Window Pos: %from left, %from top
+*
+junk0=*.blg| Wild cards for delete junk button
+junk1=*.bak| Be careful! Everything in TPath
+junk2=*.bk!| with these wildcards will be deleted.
+junk3=*.dlg| (no more than 10 wildcards 0-9)
+junk4=*.log|
+junk5=*.toc|
+junk6=*.lot|
+junk7=*.tlg|
+junk8=*.lof|
+junk9=*.ilg|
+*
+LLvar0=c:\emtex\pfelatex| 10 user defined variables
+LLvar1=|
+LLvar2=|
+LLvar3=|
+Llvar4=|
+LLvar5=|
+LLvar6=|
+LLvar7=|
+LLvar8=|
+LLvar9=|
+********************** Button Commands ************************************
+
+but1=Edit TeX| Edit LateX file
+dir1=LLvar0|
+cmd1=pfe.exe TPath+\+TFile+.+TExtn|
+
+but2=LaTeX| LateX Compiler
+dir2=TPath|
+cmd2=c:\emtex\lalatex.bat TFile|
+
+but3=TeX Log| View .log file
+dir3=LLvar0|
+cmd3=pfe.exe TPath+\+TFile+.log|
+
+but4=View DVI| View a DVI File
+dir4=c:\emtex\winapps|
+cmd4=dviwin.exe -1 TPath+\+TFile+.dvi|
+
+but5=Edit Bib| BibTeX Data Base
+dir5=c:\emtex\utils|
+cmd5=bibdb.exe BPath+\+BFile|
+
+but6=BibTeX| BibTeX Compiler
+dir6=c:\emtex|
+cmd6=labibtex.bat TPath+\+TFile|
+
+but7=Bib Log| View BibTeX Log File
+dir7=LLvar0|
+cmd7=pfe.exe TPath+\+TFile+.blg|
+
+but8=Mk Index| Make Index Compiler
+dir8=c:\emtex\utils|
+cmd8=makeindx.exe TPath+\+TFile|
+
+but9=Edit| Run editor no arguments
+dir9=|
+cmd9=LLvar0+\pfe.exe|
+
+but10=DVI-->PS| Convert DVI to PS
+dir10=TPath|
+cmd10=c:\emtex\winapps\dvipswin.exe -p+PStart -l+PStop -o+TPath+\+TFile.eps TPath+\+TFile|
+
+but11=View PS| View PS using Ghost Script
+dir11=c:\emtex\utils\ghostscr|
+cmd11=gswin.exe -sDEVICE=mswin -r75x75 TPath+\+TFile+.eps quit.ps|
+
+but12=GS Cntrl| Ghost Script Control Program
+dir12=c:\emtex\utils\gscntrl|
+cmd12=gs26wgui.exe|
+
+but13=AmSpell| AmSpell LaTeX Compatible Speller
+dir13=c:\emtex|
+cmd13=laspell.bat TPath+\+TFile US|
+
+but14=| Empty
+dir14=|
+cmd14=|
+
+but15=| Empty
+dir15=|
+cmd15=|
+
+but16=| Empty
+dir16=|
+cmd16=|
+
+but17=Print HP| Print PS to HP laserjet using GS
+dir17=c:\emtex\utils\ghostscr|
+cmd17=gswin.exe -sDEVICE=laserjet -r300x300 -q -dNOPAUSE TPath+\+TFile+.eps quit.ps|
+
+but18=Config LL| Edit LaTeX Launcher Config File
+dir18=|
+cmd18=\windows\notepad.exe SPath+\+lalaunch.cfg|
+
+* Fix Button 18! Make sure the path to the windows notepad editor is
+* correct and complete (with drive letter). The way it is now, button
+* 18 may not work after you change drives.
+
+
+************************ End of Config File *******************************
+
diff --git a/systems/msdos/lalaunch/readme.txt b/systems/msdos/lalaunch/readme.txt
new file mode 100644
index 0000000000..bbd3b12c62
--- /dev/null
+++ b/systems/msdos/lalaunch/readme.txt
@@ -0,0 +1,459 @@
+
+ README.TXT FOR LaTeX Launcher Ver: 1.4.1
+ 12/95
+ by Gregory Gutt
+
+
+I. Description of LaTeX Launcher
+II. How to install and configure LaTeX Launcher
+III. Tips on using LaTeX Launcher
+IV. Good complementary software available on the Internet
+V. License/Copying/Distributing
+VI. Disclaimer
+VII. Revision changes
+
+
+**************************************************************************
+* I. Description of LaTeX Launcher *
+**************************************************************************
+
+
+LaTeX Launcher is a simple configurable shell utility to integrate and
+"Launch" programs from various sources. It is designed to work within
+Windows 3.1 or Windows 95 (it has been tested with both). Although it can
+launch almost any type of program (DOS or Windows), it has few features
+that are specialized for the LaTeX user.
+
+There are a total of 18 user configurable buttons that can be customized
+by editing a simple text file (lalaunch.cfg). In addition there
+are several variables that can be passed to other programs. The variables
+include things like: file names, paths, and page numbers. The basic idea is
+to give an integrated "feel" to a LaTeX session. Use your favorite editor,
+LaTeX compiler, drawing programs etc.
+
+There are several programs like this available for DOS or OS-2. However
+I am not aware of anything quite like this for Windows. (This may
+simply be ignorance on my part).
+
+This program is shareware (see section V). However, I promise there are
+no hidden `doomsday' clocks or nag screens in the program. In other
+words, if you don't register the program it will continue to function
+normally; although your conscience may bother you.
+
+
+**************************************************************************
+* II(a). Installing LaTeX Launcher *
+**************************************************************************
+
+
+
+There are a total of 4 files distributed with LaTeX Launcher. The
+first 3 are required for the program to run properly.
+
+ 1. lalaunch.exe Main executable program
+ 2. lalaunch.cfg Configuration text file
+ 3. vbrun300.dll Needed for visual basic 3.0 programs
+ 4. readme.txt This file (not needed to run)
+
+All these files should be distributed together.
+
+**************************************************************************
+* Some FTP Sites do not allow for file 3 to be included in the package. *
+* If your zip package does not include file 3. Then you must download *
+* it separately. This file is available from almost any ftp site. *
+* Typically the file is called: vbrun300.zip *
+**************************************************************************
+
+To install, create a directory for LaTeX Launcher (example: c:\lalaunch).
+Copy files 1,2 and 4 to this directory. File 3 should go in the
+(\windows\system) directory. There is a pretty good chance that this
+file is already there. If it is there, check the file dates and
+keep the most recent release. (If your feeling lazy, you can just
+copy file 3 to the same directory as files 1,2 and 4.)
+
+Finally, add LaTeX Launcher to your windows environment.
+
+Windows 3.1:
+ Select an appropriate Windows group by clicking on it within
+ the program manager. Under the "File" menu in the program manager
+ select "New". Pick "Program Item". Then fill in the blanks.
+ (Here, I am using my example directory, you should use the directory
+ path that you created above.)
+
+ Description: LaTeX Launcher
+ Command Line: c:\lalaunch\lalaunch.exe
+ Working Directory: c:\lalaunch
+
+ If you did everything correctly you should see a new icon (looks
+ like a sling shot) appear within the selected group. Double clicking
+ this icon should activate the program.
+
+Windows 95:
+ Go To the Start Button.
+ select settings
+ select taskbar
+ select start menu programs
+ select advanced
+
+ you should see a graphical tree of your startup programs.
+ leave this hanging for a minute.
+
+ Run the windows "Explore" program (Start button -> Programs -> Explore).
+ Find the directory you created above and then find the sling shot
+ icon (or lalaunch.exe). Drag and drop the icon from explorer into the
+ tree of your startup programs. For example drop it into the folder
+ labeled "Programs". Then exit out of both programs (taskbar and
+ explorer). Next check and see if it worked by going back to the start
+ button and select programs. The new icon should be visible
+ (in the appropriate branch) of the startup/program tree.
+
+ You may also choose to drag and drop the sling shot icon onto your
+ desktop. In this case it will be on the desktop all the time.
+
+
+**************************************************************************
+* II(b). Configuring LaTeX Launcher *
+**************************************************************************
+
+
+Configuring LaTeX Launcher is achieved by editing lalaunch.cfg . You
+can either use your favorite editor or you can do this from within
+LaTeX Launcher by pressing the "Config LL" button (this simply Launches
+the Windows notepad *if it is where I expected it to be* . (If the
+Config LL Button doesn't work... don't panic, I am probably assuming an
+incorrect path for your editor. (Just run your editor manually and make sure
+you fix up the information on Button 18).
+
+If you change the config file while LaTeX Launcher is running, save
+the file and push the reset button. This closes down the program
+and restarts it from scratch (with the revised config information).
+
+Syntax:
+ The "*" at the beginning of a line implies a comment. The rest of the
+ line is ignored.
+ The "|" Symbol must be used at the end of any valid entry. It means
+ end of line. Anything after this symbol is ignored.
+ Blank lines are ignored.
+ The "+" Symbol is removed at run time. It simply helps you format
+ your commands more nicely. So, A+B looks like AB at run time.
+ Do not insert stray blank spaces in your entries, this will mess up
+ the parsing. Use blanks where they are required, but nowhere else.
+ Variables names are case sensitive. (Tpath does not equal TPath).
+
+Within lalaunch.cfg there are a number of parameters which are
+set in the following manner: parameter=setting| As an example:
+
+work=c:\emtex\work|
+
+List of configurable parameters:
+
+--------------------------------------------------------------------------
+unset Name of a program that executes on exit from LaTeX
+ Launcher. Typically a simple batch file.
+bibtexdir Directory to start looking for .bib files.
+msdos Executes when the MS DOS button is pushed. Typically
+ \windows\dosprmpt.pif (windows baseline DOS prompt)
+work Directory to start looking for .tex files
+junkx (x=0-9) Ten wild cards that get deleted when the Del Junk button
+ is pressed. Example: junk0=*.bak|
+ Be careful here. Anything with these wild cards
+ that is in the selected .tex path (see TPath below)
+ is deleted.
+pos Location of the top left corner of the LaTeX Launcher
+ window. %(from left), %(from top). Valid numbers
+ are between 0-100 (decimal point is ok).
+ Example: pos=9.5,3|
+
+--------------------------------------------------------------------------
+
+
+Variable that can be used within parameter settings:
+
+--------------------------------------------------------------------------
+TPath Path selected at run time for the current (.tex) file
+TFile Selected at run time. TFile just has the base 8 char
+ name, no extension.
+TExtn Extension for the above file (for those that don't
+ use the standard .tex convention)
+BPath Path for selected .bib file
+BFile Selected .bib file (no extension)
+BExtn Extension for above (for those that don't use the
+ standard .bib convention)
+PStart Starting page number (from main screen)
+PStop Stopping page number (from main screen)
+SPath Path the LaTeX Launcher was started from
+LLvarX User defined variables (X=0-9)
+--------------------------------------------------------------------------
+
+
+Configuring Buttons:
+
+--------------------------------------------------------------------------
+There are 18 configurable buttons. All are configured using the
+same method.
+
+Example:
+
+but1=Edit TeX| Text displayed on the button at run time.
+ Typically about 10 characters can be displayed.
+ Longer names will just be cut off.
+dir1=\junk| Changes to this directory before execution
+ this can be blank (no dir change: dir1=| )
+ The following configures button 1 to edit
+ the selected .tex file using the Windows
+ notepad.exe editor.
+
+
+cmd1=c:\windows\notepad.exe TPath+\+TFile+.tex|
+
+Note the added "\" character between TPath and TFile.
+
+If you want to leave a button open, just leave the parameters blank.
+
+but2=| Empty
+dir2=|
+cmd2=|
+--------------------------------------------------------------------------
+
+To execute complicated or multiple commands, the best thing to do is write
+your own small batch file and run the batch using LaTeX Launcher.
+Example (Run the EmTeX version of the LaTeX compiler):
+
+but3=EmTeX|
+dir3=TPath|
+cmd3=c:\emtex\lalatex.bat TFile|
+
+The file lalatex.bat might look like this:
+
+ echo off
+ call \emtex\set-tex.bat
+ c:\emtex\compiler\tex386.exe -mt8000 -s &latex2e %1 %2 %3 %4 %5 %6
+
+Thus we have written a batch file that runs another batch file first
+(set-tex.bat) then compiles TFile.
+
+
+**************************************************************************
+* III. Tips and Tricks *
+**************************************************************************
+
+
+Question- I want to use the "+" or "|" characters within a command, but
+ this messes up the parsing of LaTeX Launcher.
+
+Answer- Write a batch file. Put these characters in the batch file.
+ Run the batch file from LaTeX Launcher.
+
+Question- How do I hook up a windows help file to a button?
+
+Answer- cmd1=c:\windows\winhelp.exe c:\hlpfile.hlp|
+
+Question- I don't have the original TEX file, but I want to view a DVI
+ file without an error message.
+
+Answer- Use the TeX File dialog box. Change the extension to DVI and
+ select your DVI file. Now, TFile has the correct name of your
+ DVI file, and the rest should be easy. Obviously don't try to
+ run the latex compiler.
+
+Question- I am using EmTeX. Each time I Launch a new DOS application
+ it forgets all the EmTeX Environment variables.
+
+Answer- Look at the example above (section II). Call set-tex.bat
+ to reset the environment before you run your other commands.
+ Or you can configure your environment in the autoexec.bat
+ at startup.
+
+Question- What is a good thing to do with the unset parameter?
+
+Answer- Some programs, such as set-tex.bat actually reconfigure
+ your DOS environment. In general this is no big deal, since
+ Windows will forget any changes to the DOS environment as soon
+ as the DOS window is closed. However there are a few
+ exceptions. The subst command can reconfigure your drive
+ lettering scheme permanently. A good use for unset is a
+ batch file that undoes the "mess" from set-tex.bat.
+
+ Example: unset.bat
+
+ subst r: /d
+ subst s: /d
+
+ This batch file deletes the two substituted drives r: and s:
+
+Question- I am using Windows 3.1 and I want more control over the DOS
+ Window when I run DOS programs.
+
+Answer- Don't run the program directly. Instead use the Windows PIF
+ editor and configure a PIF file to your needs. Have the .pif
+ file call your program. The PIF file allows you to configure
+ a few key parameters such as: window size, memory allocation,
+ background execution, and close on exit.
+
+ In general these are good defaults:
+ Run in windowed mode
+ Close on exit
+ Allow background operation
+ Leave the memory stuff as is (Windows defaults)
+
+ A Quick and dirty way to implement this involves editing
+ the PIF default file (\windows\_default.pif).
+ However, this is not desirable unless you are happy
+ with the new settings for all your Windows calls to DOS.
+
+ In Windows 95 configuring the DOS PIF is much more transparent.
+ Each time you run a DOS program for the first time. You can
+ configure the PIF parameters and Windows will remember your
+ settings.
+
+Question: Can you make EmTeX work as a real Windows program instead of
+ running from a DOS window?
+
+Answer: Yes, you need a program called RSXWIN.EXE (available on the
+ internet). The LaTeX Launcher command looks like this-
+
+ dir2=TPath|
+ * cmd2=c:\emtex\rsxwin.exe -X
+ * c:\emtex\compiler\tex386.exe -mt8000 -s &latex2e TFile|
+
+ The two lines with the * should be on one line. Your
+ directory structure may very. Also RSXWIN takes some setup
+ of its own.
+
+Question: I am using program x and it can't find file y when I call it
+ from your program.
+
+Answer: Many LaTeX programs require very very careful placement
+ of files in specific directories. Additionally, DOS Environment
+ variables need to be set correctly (see example above with
+ set-tex.bat.
+
+ If you want to set your environment permanently (and have it
+ available from DOS and Windows) consider adding all the
+ relevant "set" commands to your autoexec.bat file.
+
+
+**************************************************************************
+* IV. Good Software on the Net *
+**************************************************************************
+
+Here are a few excellent programs on the Internet that can be downloaded
+via FTP. They all are great additions to any Windows/LaTeX system.
+
+**************************************************************************
+** I am not affiliated with any of these people or there software. Use **
+** this software under the conditions that are specified within each **
+** respective package! Use at your own risk! **
+**************************************************************************
+
+Available through: ftp.shsu.edu tex-archive\systems\msdos\4alltex
+
+Emtex LaTeX package created in Germany, A must!
+RSXWIN Allows EmTeX to work as a true windows program
+ instead of running under a DOS Window (runs faster
+ and uses less memory)
+DVIPS Converts DVI files to Post Script (good for including
+ Pictures). **Windows Version Available**
+PSFIG Good way to include PS figures in your documents
+Ghost Script Allows you to view and print PS files to non PS devices
+ like your screen or an HP LaserJet Series II printer.
+ ** Windows Version Available **
+Am-Spell LaTeX compatible spelling program. Won't get hung up
+ on all your LaTeX commands.
+DVIWIN Excellent DVI previewer for Windows.
+
+
+Available through: ftp.cica.indiana.edu
+
+PFE A great editor for Windows
+GS26WGUI A user friendly interface for Windows Ghost Script
+PageDraw Good drawing program that works with PS files
+LaTeX2e.hlp Windows Help file for Latex, complete with examples.
+ This is great! Easy to hook into LaTeX Launcher
+
+**************************************************************************
+* V. License/Copying/Distributing *
+**************************************************************************
+
+LaTeX Launcher is shareware. If you continue to use this program for
+more than 30 days you are legally obligated to register.
+
+Registration, send $20 to:
+
+ Gregory Gutt
+ 2250 Monreoe St. #311
+ Santa Clara, CA 95050
+
+U.S. Currency please. Make checks payable to Gregory Gutt.
+
+When you register please include:
+
+ A check for $20
+ Your name (and company name if appropriate)
+ Address
+ e-mail address
+
+I will send a confirmation that you are a registered user. Registered
+users will be automatically notified (via e-mail) of updates and bugs.
+By registering for any version of LaTeX Launcher you will automatically
+be registered (free of charge) for any future versions.
+
+e-mail comments and questions to:
+
+ greg@relgyro.stanford.edu
+
+You may copy and distribute this program all you like. In fact, PLEASE
+copy and distribute. All ORIGINAL versions of the files below MUST
+be distributed together:
+
+ lalaunch.exe
+ lalaunch.cfg
+ * vbrun300.dll
+ readme.txt
+
+If your distribution did not come with vbrun300.dll, it is ok to
+leave this out. However, since it is needed for the program to run,
+I prefer that this file be included whenever possible.
+
+**************************************************************************
+* VI. Disclaimer *
+**************************************************************************
+
+
+I really tried to make this program bug free. However, one can never
+be sure. If this program destroys your files, hard disk, computer,
+or your mind, I am not responsible. The program comes as is with
+no expressed or implied warranty. If you do not except this disclaimer
+than do not use the software.
+
+**************************************************************************
+* Revisions *
+**************************************************************************
+
+Ver 1.0-1.1 No releases to the public.
+Ver 1.2 First public release.
+Ver 1.3 Added exit button. Allows for double click to select
+ files.
+Ver 1.3.1 Fixed problem with changing paths when path was on a
+ drive other than that of LaTeX Launcher (ie. TPath).
+ Also program no longer quits when a drive is not ready.
+Ver 1.4 Fixed minor bug with the reset button.
+ Added pos command which allows for user selectable window
+ placement on the screen.
+ Allowed for user selectable extensions in the file
+ dialog box (TExtn, BExtn).
+ Made buttons work more logically when selected with
+ keyboard rather than with the mouse.
+ Allowed for user variables in the config file.
+Ver 1.4.1 Fixed bug with file selection involving files with
+ less than 3 characters in their extension.
+
+**************************************************************************
+* Thanks! *
+**************************************************************************
+
+
+Thank You, for registering and distributing LaTeX Launcher! I hope this
+program is useful for you.
+
+Gregory Gutt
diff --git a/systems/msdos/lalaunch/vbrun300.dll b/systems/msdos/lalaunch/vbrun300.dll
new file mode 100644
index 0000000000..7966645263
--- /dev/null
+++ b/systems/msdos/lalaunch/vbrun300.dll
Binary files differ
diff --git a/systems/msdos/lated/readme.txt b/systems/msdos/lated/readme.txt
new file mode 100644
index 0000000000..903dae117f
--- /dev/null
+++ b/systems/msdos/lated/readme.txt
@@ -0,0 +1,99 @@
+LaTeD Version 1.1
+(c) Gene Ressler 1993, 94, 97
+ de8827@trotter.usma.edu
+
+LaTeD is a graphical editor for drawings in the LaTeX "picture"
+environment. It runs under MSDOS or in a Windows DOS box. The
+distribution includes full sources, including LaTeX source for
+its documentation.
+
+LaTeD is meant to be one of those "right arm" tools that
+returns a lot for a minimum investment of learning time. It
+is a simple and quick way to make clean-looking {picture}
+environment drawings and diagrams for your LaTeX documents.
+LaTeD makes it as easy as possible to live with {picture}
+restrictions and get beautiful outputs on the first try.
+
+Features include:
+ - Runs well in a DOS box under Win 95 and NT 4 as well as
+ DOS 5.x and later.
+ - GUI with Undo. Drawing tools include
+ . line, vector, solid, dashed, and black-filled boxes,
+ . text justified within any of the unfilled boxes plus the
+ option of an invisible justification box,
+ . open and filled circles given by radius or diameter, 1/4, 1/2,
+ and full ovals,
+ . modify tools for reshaping all objects and changing text.
+ . Other editing is through a pick set chosen with pick and unpick tools
+ and a tool to cycle the latest pick among nearby objects.
+ . Picks can be deleted, moved or copied. Copies can be in one
+ or any number of equally spaced instances.
+ . Bounding box can be computed by LaTeD or user-drawn.
+ . Earlier-saved drawings can be merged with the current one,
+ providing a simple drawing library facility.
+ - Fakes short lines with multiput dots.
+ - Nearly WYSIWYG (LaTeD knows about line and vector slopes, but
+ not circle diameters, and it only approximates text size).
+ - Writes {picture} in optional {figure} including caption,
+ {center}, and/or complete {document} (for quick proofing).
+ - User docs with figures by LaTeD.
+ - Full sources for everything.
+
+No warranty of this software of any kind is expressed or implied
+by the author.
+
+Copy and use this program freely for any purpose except for sale
+of the program (including the source code) itself. That is,
+no one can copy this program for the purpose of providing it to
+another person in exchange for money or other compensation, even
+if this program is only part of the exchange.
+
+All copies of computer source code in this distribution, whether
+copies in whole or in part, must have this notice attached.
+
+------------------------------------------------------------------------
+
+Please let me know now you are faring with LaTeD:
+ de8827@trotter.usma.edu
+
+Installation files: install\*.*
+
+To get started:
+ 0. Make sure you have a VGA-compatible display and that
+ you're running MOUSE.COM or MOUSE.SYS under DOS (or
+ else that you're running TED in a Win 95 or NT DOS box).
+ 1. COPY a:\install\*.* YourInstallDirectory
+ 2. Add YourInstallDirectory to the DOS path.
+ 3. TED
+
+Win 95 hint:
+ If mouse response is sluggish (crosshairs and rubber band
+ cursor are jerky) while running in a Win 95 DOS box, set
+ the DOS box or shortcut properties, "Misc" tab, "Idle Sensitivity"
+ to a lower (slider more to left) value.
+
+Documents: install\ted.dvi
+
+To compile source:
+
+ TC++ for DOS V1.0:
+ copy makefile.tcc makefile.
+ make
+
+ BC++ V4.0 (16-bit compiler)
+ copy makefile.bcc makefile.
+ make
+
+To clean up after make:
+
+ make clean
+
+To make stripped binary in ..\install
+ make install
+
+To build documents in source\docs:
+
+ makeidx
+ blatex ted
+
+
diff --git a/systems/msdos/lxmail b/systems/msdos/lxmail
new file mode 120000
index 0000000000..69e3d618eb
--- /dev/null
+++ b/systems/msdos/lxmail
@@ -0,0 +1 @@
+../../support/lxmail \ No newline at end of file
diff --git a/systems/msdos/mma2ltx b/systems/msdos/mma2ltx
new file mode 120000
index 0000000000..4980c5bc7e
--- /dev/null
+++ b/systems/msdos/mma2ltx
@@ -0,0 +1 @@
+../../graphics/mma2ltx \ No newline at end of file
diff --git a/systems/msdos/musfilt/README b/systems/msdos/musfilt/README
new file mode 100644
index 0000000000..d124b25c69
--- /dev/null
+++ b/systems/msdos/musfilt/README
@@ -0,0 +1,55 @@
+
+ -------- MUSFILT --------
+ 10.2.1995
+
+Dies ist eine (kurze) Dokumentation zu MusTeX, einem System zum Notensatz mit
+TeX, fertiggestellt und herausgegeben von Jochen Schuetze, Braunschweig.
+
+Vorbemerkung:
+
+Ausgehend von MTEX, einem Notensatzmakropaket fuer TeX, habe ich MusTeX
+entwickelt, indem ich
+- die Zeichensaetze um zwei kleine erweitert habe,
+- die Makros erweitert habe und
+- einen Preprocessor - musikerfreundlich (Notennamen wie gewohnt und nicht
+ von A bis Z) - entwickelt habe, der eine komfortable Eingabe in
+ TeX-Quelltext uebersetzt, den TeX auch verstehen und uebersetzen kann.
+ MTEX, die Grundlage von MusTeX, liegt auch als Original bei. Ich bitte die
+ Belange der Autorinnen bezueglich des Urheberrechtes zu beachten! (Danke.)
+
+MTEX wurde erarbeitet in den Jahren 1986 und 1987 von Andrea Steinbach and
+Angelika Schofer. Bei meiner Arbeit an MusTeX.TEX und MusFilt.PAS habe ich
+mich auáerdem auf die ausfuehrliche Beschreibung MuTeX von Fran‡ois Jalbert
+aus dem Jahre 1989 gestuetzt. Viele Žnderungen, die ich in MusTeX.TEX
+(ausgehend von MTEX.TEX) vorgenommen und mit meinem Kuerzel markiert habe,
+gehen auf seine Anregungen in MuTeX zurueck.
+
+Sollte durch mehr oder minder oft wiederholtes Weitergeben dieses Paketes das
+begleitende Paket MTEX.ZIP, das die Originalarbeit enthaelt, verlorengangen
+sein, kann sie per anonymous-ftp von allen CTAN-Server erhalten werden.
+Solche ein Server ist z.B. ftp.dante.de, login "ftp", Paáwort nicht
+erforderlich. MTEX.ZIP liegt ungefaehr (!) unter /pub/tex/macros/music.
+
+Ich moechte allen Lesern dringlichst ans Herz legen, diese Dokumentation mit
+Bleistift und Papier oder einem Texteditor mit mehreren Fenstern zu lesen und
+sich Stichworte herauszuschreiben, die er dann nach eigenen Vorstellungen
+sortieren kann. Das ist wohl der beste Weg.
+
+--- Diese Dokumentation hat Markus Neteler aus Hannover (momentan
+neteler@laum.uni-hannover.de) mit viel Aufwand in eine strukturierte und
+uebersichtliche Form gebracht. Ich danke ihm dafuer ganz herzlich!
+
+
+
+Das Paket liegt (bald hoffentlich auf CTAN) aktuell
+
+ ftp.rrzn.uni-hannover.de
+ /incoming/tex/musfilt.zip
+
+
+Viel Spass
+
+ Markus Neteler
+
+email: neteler@laum.uni-hannover.de
+
diff --git a/systems/msdos/nb4latex/README b/systems/msdos/nb4latex/README
new file mode 100644
index 0000000000..3d4dfb2e28
--- /dev/null
+++ b/systems/msdos/nb4latex/README
@@ -0,0 +1,31 @@
+On NB4LATEX: current status and developments
+
+I wrote nb4latex many years ago, around 1994-1995. As many classicists and
+linguists, I had been a happy user of NotaBene, a Dos programme (later
+Windows) which was, for that age, spectacular -- you could write and print
+non-Latin chars (Greek, Hebrew, maths) with no effort and an excellent
+quality. Also the bibliographic data could be dealt with very well.
+Later I 'discovered' LaTeX -- a colleague in the maths department was using it
+and I was impressed by the elegance of the output. But Greek and so on could
+not be typed directly (there was no Unicode input at the time). So I planned
+to use NotaBene as input, and LaTeX as 'final' formatter. My programme was a
+filter from NotaBene to LaTeX.
+Then I left Windows for Linux -- and the programme became totally useless,
+because it's a Dos programme. Now I write everything with the (g)vim LaTeX
+suite, a Unicode encoding for Greek and other non-Latin chars, and it's a
+pleasure.
+
+I decided to upload the programme beacuse I receive some requests of
+people saying more or less: I have a book/article/essay written in NB and the
+typesetter/department/whatever wants to get in LaTeX.
+
+However, please notice:
+(1) he programme is old and that needs a radical update;
+(2) I must update the programme to support the modern Windows versions of NotaBene.
+
+Please write to my email address for suggestions and requests.
+
+Guido Milanese
+7th of January 2008
+guido.milanese@unicatt.it
+
diff --git a/systems/msdos/picins/picins.LIESMICH b/systems/msdos/picins/picins.LIESMICH
new file mode 100644
index 0000000000..23ce7c0d32
--- /dev/null
+++ b/systems/msdos/picins/picins.LIESMICH
@@ -0,0 +1,32 @@
+nformationen zu PICINS (Version 3.0)
+ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
+
+Edmund Lang, THD/HRZ, 17.11.92
+
+
+PICINS ist ein Makropaket fr LaTeX, das die Integration von Bildern in
+LaTeX-Dokumente auf einfache Weise erm”glicht.
+
+Die Dokumentation zu PICINS ist in der Datei MPIC.DVI enthalten.
+
+Das Hilfsprogram PCLTOMSP stammt aus dem emTeX-Paket von E. Mattes.
+
+Folgende Dateien sind Bestandteil des PICINS-Paketes:
+
+- !INFO.DOK Diese Dokumentations-Datei
+- PICINS.STY PICINS-Makro-Paket als .STY-Datei
+- PICINS.DOC Dokumentierte Form von PICINS.STY
+ (wird nur zur Dokumentation ben”tigt)
+- PICINS.ALT Alte Version der PICINS.STY-Datei (wird aus
+ Kompatibilit„tsgrnden noch zur Verfgung gestellt)
+- EXTPIC.STY Makros zur Realisierung von \special-Kommandos
+- MPIC.DVI Benutzer-Handbuch in DVI-Form
+- MANDEL.* Externes Bild (erscheint im Benutzerhandbuch)
+- MEXHAT1.* Externes Bild (erscheint im Benutzerhandbuch)
+- MEXHAT2.* Externes Bild (erscheint im Benutzerhandbuch)
+- PCLREL.EXE Hilfsprogramm PCLRel
+- PCLTOMSP.EXE Konvertierungsprogramm PCLtoMSP
+- PCLTOMSP.DOC Dokumentation zu PCLtoMSP
+- HPTOXX.EXE Konvertierungsprogramm HPtoXX
+- HPTOXX.DVI Dokumentation zu HPtoXX
+ \ No newline at end of file
diff --git a/systems/msdos/public-mf b/systems/msdos/public-mf
new file mode 120000
index 0000000000..ebc7ed21c0
--- /dev/null
+++ b/systems/msdos/public-mf
@@ -0,0 +1 @@
+dos-tp \ No newline at end of file
diff --git a/systems/msdos/public-tex b/systems/msdos/public-tex
new file mode 120000
index 0000000000..ebc7ed21c0
--- /dev/null
+++ b/systems/msdos/public-tex
@@ -0,0 +1 @@
+dos-tp \ No newline at end of file
diff --git a/systems/msdos/pxlgen/mvcloi.if3 b/systems/msdos/pxlgen/mvcloi.if3
new file mode 100644
index 0000000000..0bb817e04c
--- /dev/null
+++ b/systems/msdos/pxlgen/mvcloi.if3
Binary files differ
diff --git a/systems/msdos/pxlgen/mvssbx10.if3 b/systems/msdos/pxlgen/mvssbx10.if3
new file mode 100644
index 0000000000..cbc0f2590e
--- /dev/null
+++ b/systems/msdos/pxlgen/mvssbx10.if3
Binary files differ
diff --git a/systems/msdos/pxlgen/mvtt10.if3 b/systems/msdos/pxlgen/mvtt10.if3
new file mode 100644
index 0000000000..b7b5fab1b1
--- /dev/null
+++ b/systems/msdos/pxlgen/mvtt10.if3
Binary files differ
diff --git a/systems/msdos/pxlgen/readme b/systems/msdos/pxlgen/readme
new file mode 100644
index 0000000000..f0cf867ae4
--- /dev/null
+++ b/systems/msdos/pxlgen/readme
@@ -0,0 +1,131 @@
+========================================
+PXLgen (C) 1990,1991 by MicroPress Inc.
+========================================
+
+Summary.
+-------
+
+PXLgen is fast font scaling program designed to generate fonts for use
+with generic TeX programs. PXLgen can generate either .PXL or .PK
+files.
+
+Fonts.
+-----
+
+This version of PXLgen comes with three fonts, MVTT10, MVSSBX10, and
+MVCLOI. MVTT10 and MVSSBX10 are the MicroPress variants of the traditional
+CMTT10 and CMSSBX10 typefaces. These fonts contain more characters than
+their CM counterparts. In particular, they contain proper paragraph and
+section signs (\P and \S), all ASCII characters omitted from the CM fonts and
+european currency symbols. MVCLOI is a non-CM design, based on Cloister (or
+Old English). These three fonts together with the program can be freely
+distributed. Also available (but NOT freely distributed) are about 200 more
+fonts, including many traditional text and display typefaces, as well as
+many foreign and symbol fonts.
+
+Distribution.
+------------
+
+This version of PXLGen is thereby made available to TeX community for free
+distribution. The program itself, the included fonts and the output from these
+fonts can be freely copied.
+
+
+Usage.
+-----
+
+You can run PXLGen either from command line or from the MAKEfont menu.
+MakeFONT includes on-line help, and we will not attempt to describe its
+easy-to-navigate menus.
+
+To run PXLgen from the command line, type
+
+ C> PXLgen <options> input_file [output_file]
+
+where the name of the input_file is MVTT10, MVSSBX10 or MVCLOI; the optional
+output_name refers to the name of the .PXL or .PK file you are creating.
+If output_name is missing, PXLgen uses the input_name. The names may include
+directories and/or drives.
+
+Example: Type
+
+ C> PXLGEN MVTT10
+
+to generate a 300-dpi font MVTT10.PK.
+
+
+Options:
+
+ -Q suppress copyright note.
+
+ -X generates PXL file
+ -4 generates dword aligned PXL file
+ -K generates PK file (default)
+
+ -R#### defines resolution of the font. The default is
+ 300 (10 points on a 300 dpi device)
+ -A##.## defines aspect ratio of the font. The default is
+ 1.0. 2.0 makes the font twice as high.
+ -S##.## defines slant of the font. The default is
+ 0.0. 1.0 makes font slanted 45 degrees right,
+ -1.0 makes font slanted 45 degrees left.
+ -C defines SmallCaps font
+ -O defines Outline font
+ -Wxx defines Shadow font, xx is NE, NW, SE or SW
+ -F## defines Shaded font, ## is 1 through 23 for
+ different shades.
+
+ These options can be used in any combination.
+
+Notice that the usage of -A, -S, and/or -C changes the proportions of the
+font and requires usage of a different TFM file. Therefore, if you change one
+of these parameters, you MUST choose a new name for the font and generate a
+matching .TFM file.
+
+TFMGen
+------
+
+The TFMGen utility generates proper .TFM files.
+It's syntax is identical to the PXLgen's. TFMgen can also be accessed from
+the MakeFont menu.
+
+
+Limitations.
+------------
+This version of TFMGen will generate up to 2400 dpi fonts. (80 point on
+a 300 dpi device). Some of the fonts can be generated up to 120-140 points,
+depending on the complexity of the images and settings of Slant, Aspect Ratio
+and SmallCaps parameters. If you attempt to generate a font that is too large,
+PXLgen will report OVERFLOW and quit.
+
+Shipping list.
+-------------
+
+The following files should be included on the distribution disk:
+
+ README This file
+ PXLGEN.EXE Font Scaler
+ TFMGEN.EXE TFM adjustment utility
+ MAKEFONT.EXE Shell for above
+ MVSSBX10.IF3 Sans-Serif
+ MVTT10.IF3 Teletype
+ MVCLOI.IF3 Cloister
+ TFM.LIB TFM's for above
+
+Registration.
+-------------
+
+If you are using PXLgen we suggest you register your copy with MicroPress.
+This will enable you to obtain newest versions of the program as well as other
+fonts and programs available from us.
+
+Send all inquiries to:
+
+ MicroPress Inc
+ 6830 Harrow Street
+ Forest Hills NY 11375
+ USA
+
+ Voice 718 575 1816
+ Fax 718 575 8038
+
diff --git a/systems/msdos/pxlgen/tfm.lib b/systems/msdos/pxlgen/tfm.lib
new file mode 100644
index 0000000000..596016a020
--- /dev/null
+++ b/systems/msdos/pxlgen/tfm.lib
Binary files differ
diff --git a/systems/msdos/sbtex/dvf04.boo b/systems/msdos/sbtex/dvf04.boo
new file mode 100644
index 0000000000..d916a103cf
--- /dev/null
+++ b/systems/msdos/sbtex/dvf04.boo
@@ -0,0 +1,2719 @@
+DVF04.ZIP
+D4\310X0~21P0WK:hDCaF=La;>~240X100T0~2A4eOETH^FTU@3`0B0b@E=RLh>FYkC9e^7`T6
+0A<diOJFmj4^7DQ@`K4K12Q`[F^:Zc]>7ofI@?<hW0NHX=Z9=QF:=BI<UeJ=?P@XLB39RSI?h\bY
+MRoCcVho9S@HL2;=l_H]ggnolR[JjVRS@RJkGG7aSA==6ld_\[I0PTGkl`FHg6e5T8CO[[D;f>1a
+^_<10kaXU2e2V6217jhJ6^9;j>6W@QLhd25IW5kS0`M<<:?4PTZb3g[HK76;3=723R\E_l617]7K
+7a``8\^M`P4W]=`c;=22beg312ndl>jh;aTRQa[B:Gb60ffR]6lhH4NJkAfBMXgmXd72F26?i8Xh
+h4R;o1WC50\dLL:c`RUSQ2\dmU>6B4=SCfV@=ECf5@MZAFUgLL2G=YVnWPLnHhAK1A[727>\d><f
+IaZT3[ofFXJh`kKmSQ7bL=ac6F:?:5Zmm8h3mE96^a_dLL0OGOLO2aCReig80HMLJ=HhAiVPTA<V
+7Gla@icRP7A6b<AgCfJ8EFcfY@IYAWI_LZ1WY?LW1hcZTFO2SVF1Dbc^BGg5LJmVQ5_dmR^i5[dm
+Zd6fJJ6BA6hiH5NF^iL3OZVkOeVP68]K=CfFhUkVP6DZkVXFN<KR?VN2K2cfM4KHAV=O:m:S\KLe
+b3\Zni\3aMTeih1cc7L>F:MS^id3gZFh;gVN`^Ej3[RGMO^N0oDCAKQamG?0?aGg?`\DI7B7=<52
+k[TG>V2Q6kFbKdTC?6BMniHWfU4^fbGGAcDHoF93]7C3TiM_I8_GaG_GOGC0B4F3Ac[@I4gDgm=:
+1jadXT;G[^:GNYQ]BIL=TI>7gcT]L=<Agb]_Za5jL]`k6n:W7IX^kjL3QIJ5oMWlak;IAa^T[1eb
+C[VY0iiV7?bd@M;:`NIE7G2eCYkYNJ\5^[;_k^Z0[ijdB;E_CI2FbakG27=Yk;<=DML=oABieX5^
+lbnoKI2lk:;W=L9N;_]^@oBUUk^_2OibfOlJ8C:=?KPQAX]QnHL?>e1aL^g53G:LR=nWCI2IbikL
+29^Ud=_]UggajO_MfPBOFNo?SA2KeakM4;=Ykm<=DYgKG^e0edgAKPb_7C1KdIgK0[Oi5[k]P=dI
+kmh>n:ggoVf1hUc^l2IHcW4OKhCZ?WQbm>D=L]h;4kgog07C4o@m_B7Fdm_G6j@m_KgMPMicCokN
+4?7Ik?4=<Yo:?^m0mDVEecO8OBk]MdCjZ^R\\?T>]9oE_^n0oBW^oPkhcaQo>AA\F__6?nMOC35S
+EX2J;j?7RG8hF>R`9h;^RY4Vjh]X2^N6j`mZCaad^?o07\?6A>_mYl[m2iTOY6UcYf;hF:mjAkog
+><jH>SdZQiRio4JNUL\oS]heoFN66Pfk1gg5oZ5gXKlLK3SSC_BI4gX>>]golIlJmI=V^0WY6GJT
+kaadF<<>mIn53W?X`KhdZLoTSIaiI\VlYaZFk_@ij>BWBJ?fWg9hV^fY7^aI4be6eH=mJjC977[@
+]`deVVI?l2aKe:4IcTk]>^]T_IoAmZeZF1_Bdd;j=^a[HOlVF\bTf=m^4JC@lfm?VchH_;k[VhKi
+MdeJoG1?S6hcXgNK=nibh]9KoU0NhN[bbE]>U7YginF]eY7gCgPajU30_G=R[B[h?=_W6c>7Sgd`
+NWg7WKoWgekmLTm<k>?FGKhJneM_lmMMEVajZg_]3VjkM6MOZ?274\G^>>?RagW_<\O<UoW_\LK=
+SoGY5Nc6n@0;SQf^mSK1lTTMgaCo_fG`_<P5OiA?7g9QWnCGQeb>5oWfXIKibec;=c9YQ?=lLo_G
+Rj9nW77jhoamQ?h_lgU2;ooeG]QOi33GPfFWn_Dnn;oUa>_WRcm@b<P1QNa:[H>_WjZ@WDLQ>h92
+9V\@<R0o8FCde[UeUaYW6e1XI[ln0I<m^Q2Rh=\eM`8G?1JGI0od\5KH3c1e\GO74Um86FMNGK_b
+`90R?Nn42C;hhOoK9bcJD<EbaEi`X4K6V2Wb3Pkh0:T?5RS1iHhbNL5UWf:46UcfRU8MNURc`aL>
+U<TFjNnH``4gE=`[Tcm<\O_C^aSQ1hgmTb72j:3mSXHhd2Q?o1WA4PL\<J=RcRR3]UOLaeEFF=aY
+C;25aKk624fBglX@KdcAM6MO72RF:^:>98d3cYSA>M_<<D4KO]ee;?26JoM1cm5hYn@MEka^oigk
+hh_o7moC87nhkCl>58aONe233??2W4TNL\2R<_VZcTXFN<BUmR<7C<YkIg;09Bgg9P]dHWZg<\4W
+Y_\c8l@bUg@;F9^9[iibX6Z<Mb\7_4Yg_g;0;7Eg^^@]8db\WVe6j<EUkfJ8Si;oLX^=3g>P<DDh
+iX1UAZ]4OTIKV`FZXJeWPTWT=hZgZKSK9Kna^9m;g[7HhaUQ7XemWR7ZlFR_CE;9_i^TAk8l]lXO
+enim9^SWQEY]ODlWboleB51RNj033FJOOK0QBXYRmEHF8_9??O]Q@jADaC=gC7BPaKi8]O>iUHef
+I1UfM<37BUVgoHlF:<VXL4T7W2bB[4>NJH6FI]QLJeF=L5=I`\5N=TQF;WiW]_cDaDl[gU3EbG;_
+K92_a\RnaIl>65XXBHDCe@97^MaSCM3D4CIm8BQC=lbfXI>a[bQJkG:Z0jeFARTkS21_EKoMe@5O
+RbFYE]hTcd;`[`WF\]SW6Z6^7ZiMObe?Fbm\\=]K1lc==WY^PnaU\nnRlTl_NllXGEji?m0K\mR3
+6f6b5gkNlW2352OGG]`@YdWhOMT2UKWLZDf`f@\2aJGlc=k_cJClDmnO7C0jeafhLU[e?E;UV]MM
+LO9J3AoOj;XQe:kdf@jdWGO`[KTfbkgKG<mgogJPl:afL@LLcgP_Ml1b9dZocO8VN>j4Gfme1]LW
+B^5^PN_\k_DVZ>=_KhC__3=o]d1i[1D]kfV]J?VWDRQml9i7mgd;e6MG>h;lOYIk17ToD?P]l9o5
+KO:4CG?_n>OlRcYVc1;RKZF97@nFbH1@gQU@Nb5IGFmPnf4TNCmB9lVcohPnX\G1i_^?U_dK>5nP
+HfN?A_RhK_W68alBCnQam;Q=?G9Fgl6W1abl>_And@`Wh@m]EEHVZZ<CeL^8jV=4mIW1Ij;Eo[Oj
+bZ6O:HM97W?X`MhcK8[nTnG=XPOmf;1NPddOl\c?<_W>\RSKdc>N[5j?E?mC3Tn3T=DC8Ln`N]2_
+3M3UiMm`ZUg1<feBQfXh>mG[[9?okdoK]lXQQ<ckff2o5O\KJC:E7_Ak6m8hm?cKDjL?1Zogn\JQ
+]UfbESoL8l?KC>WNiXf;DMcb1nD9EiM?gW;2e0lG`nH^fjSimalWJaC8_WU`eA9iW]g[7CW3adDA
+^kk;M_mo_<_3m\e:>3gVf:c7N^dhdgAMiZmJMLn>lmXmg9KioK>[`oY5S71kc;7cHkj;i3LiBY4l
+]TSnn4ZfHcf2C=^GJg_;X?QhO:?lOiO4nC1;;NoIXfcXQoWf99_aHMjmb2FebXeOBjHHeYN_k5lg
+`WY2[coV[dQn7RG]UcUFogDOfUoHLZ=dZO\YOkh?oWMIlOYihhlocY71DlJ?6c@YRTPh<Wk3T@7\
+g^W\Rd[V7U2H8o?S3Q`Ie_3Gi@<I7>A5;\gbb1?6317G8g]7\bdNF@d?_oG83U6TD4R?k7@Hc[TN
+6NR@`bo5mlS>5Gen5hn<Amb^g<hSTk71cnl<TKMgT=ReAabXU2[^fZ0Zn@V?36;lT=mG?K8cACaE
+a2=kANON>Cdbb19[WVkWo\RRl9dl<XVgn_E1NRdMj?d@<gfZn7G60XV?]<ani4196VG90IN`MY>l
+BNWMA;U9gZm<T4X9E``b>V<FSGd:CCnVNaDd_@gG99nEkXj3N<^6b^mV@hT_;W\g8cbDn:nh6YC3
+6V@dbLLLZ<`VWCWP6IKD94mCLJM2KY;gLRY=l[O<jhSgS<^a^:=@KY9oWQ7ZlNR^Ih9;o]^2obQF
+Im<o[]g[8?hihNBGm]0SiEQkQ2Be1j;5IImm\6^S7PXmHj6<\]Bc7cE2ASllo<;41UUZjmSG5af`
+\Dc6km@`<5c`ElDl5?99:G;@BI<nN?El4oUC2iNN_;91[PYSQjAO>V1VS[iW=\A>EbCgoDd7j\ah
+1i7ok9?mgWnd?6Z7Z3dh<WihjnXU\W[Mh?:W3YAJ5cjeA_Jn:?VNJFCL:]NDlAXIIS>6WZjAaoUE
+[cm61WCF@Q<OHF@@2N\=KNW1KOYnMkK0ImKg`a;G_?K8nTekWf89VmMNKJiG@nkm_GK0k4Ag<<CK
+NPOOMZ2^^;hMl3__OLk3]MbQE\HigT>]c9E`hnW:Z?iRJ>JLi`jDWY3_ZIJ`dm_GZ6hSgTk7??OT
+[iG`LmWSE\:W\LlCTDnV_;hQk_=X_fn4o;;XmXCie7XfnchliYAfO`Ol=hJo6PH^WGgSWo<_YY@Y
+6bSbe2Ee>U@>`eNL8=X;4M4;JSo4:N\?K5M<9OlG51UVZ?WnXbd_L9hMKniH94o[UFoZRhb_<WIl
+F2IA<eGom21WcXkM;iK9A2;b5A;aD1;aBodcd^BI4gQ9Yof7H6KHEj[QIQ9AmDQ4gTnC^Dn=jS=j
+9EggJ5;_:HNV?HDmFO8l6QVP9VkjM?eZVMBX7edGnY^eSjhCOJje9k7fgFd3S:SckljJ?A5<b[eS
+TVlOFUGZ7ac^LZ9gUboNJ]9BPJXSCQA[bbL`JLSjHB=LgW8]NOm:hjL>2M`kAmHZPlneOKhaLoSH
+1j?GNmciGkKZeEGNC7Ai[]gUZa_9[mkZ]k_<f?C;AYBmTNeFkGGO0U:TKg7bh\Mj>nE=OYcoCYK?
+SoWaANc6N@;\VGZ[H?TT6>ka<=;PNI8=mR_[ABiT8ehOLUTNBQebZMo<=GdSUDXh_onHnmN;Y7jL
+LO[So7fJIOkCO3i:?_oeW]QOcfK[>[9mUCoO1olch:jO1i4ooR2AT@@BfMN6GQPDC28kRDA6BnW0
+02jALNF=4li=baMfgh22=BFb?\>8d8DPg08L[AglZR`BNK8H[nI:I;lXUe<RNm32Z[LT\T<>NPnA
+kEC6N`ZAP@hc^;m3MZ8h?LXL>7Y51TH>m85A?Q``Y4C6RcV:1HjHX>]7jh\DK?XB1PJd1S91MYk@
+kf<LJ1JaGc2f\TKOMQ\7_57maX5b1=:>0nkDRMDG0_ISR75n=dijN>doV[Kh]@LVlTAS7fJ8DRcg
+8YQfg=^?YVh1>hVU7I]mbH6JTMiI`7k:N9lQSk:QN9J?IH9E;?I9ZehLmjZd\TW5l9>=gYj5BIlU
+eVXbML0^;GNkR5o\k^nDIbafiOBHRW\4a1J`GEA:cGnZU5[UJG^>TUo3`TC9ff1QN_:K0lJU^2<0
+>hMiZ7;7Xk^Bjf3_Tkc7H[b2?^RJe`<6lTGJ]HXOZYkmd84Bbl8dYb^^6[`C1lbY1\OGP7UI^?dH
+<9>1^aD_n?P^4d`mYF2A[aJ`9H?^dbVK??bNR@YhGJR7=a^T:m>mTbRNfii0M8;]XIBH<:QA1bc]
+TZOk:;ebb[7`6;1CDfh7:ikdgP9fJ`X4V8ITo6L0djVlIo4PF`N\MB;_EbYabkci[PGZ<ZYMe`5g
+RH:_0oJRimL2OkU<EG2V]0oIn4f^_KPA;U?`nk65gYHkLDZ]\UNKX3=k_o>BO]K4\`=6jkX32Sk=
+nYjVPiF_W=mBl>h_TWYCf[<bLO<=_E6o>NhMQ7CcgKlK8_3P3XO`WnUCGTjj_8H2?aEIbI?n[:VU
+3MTYn9gM0MOEgD\U_C?X[^C_RVIoA`@<9<hkh;bbmPiH3b[N>n1mS^gg3YBO^oe1NEEWm?\=d\?0
+mS\0QMbNac]`jN`KogYonY4^bN4J@A<mRQA7Z@3VeoclBPGFhlTlYL:=5QalFSKoV;YOR78@JHKM
+PkhJ`1R2_>5<^m1WC^@if7@o8DbCO]:<=Qh`Pm@k3F3lf@36dBHeS;]gjDhPf1?C5Zd[N5nW02Yd
+Q95g[adjTR3mKLT7k7UkYE2Pgi]j54WG_efeBR5b5Kmga45j:Db>\[TNiXfCS:Y<oYRUGCGTDhMI
+b;j^bl<\PJ[ogD9dgkb`JTVlk^WcSUiAN>OX8EOL]7=JMWS74l`D1j=`E8b27]f1DHh3H?lXD[RM
+QIa3NYNTC7j\?dWIiToRPn?AkglSOmCJF`K=RcOjfhC>QblFDY7fBT5AQRlJl^g35b]S7Kn@10kf
+llnXOk\?fWLi@Ko;ggWBm[MjoRhcjWOioBD^]ka]amhCoi\;M9l_oO;7EbR@?jO3o2bWD9a5XOR1
+@Z4jL40l@RQhjkAh`I]m3C0ddYlOPLYNFa1Qj>fJ>kSTHfkg217\d=830kB<<DJ?>e5l@J6<EgL5
+2cb``i?[?f:437XXigU;ca8oA;_K1@M\j9>eFV_J3nc^Qe?jeHodY7ke4aMd4N\:=G_DL7VK;a``
+@imJB=k@6<hN9^S1HSI`3beL=MP?:]B`fBfToJGbPaJBANZ90ik0>CVT:G3D=2F7]1NHW4?jE_[2
+]O^=2M8hhN==aKRD@fZOLK>7Gg]=[1ffkKNQ7TYk;T?\DDGJ3me1I<`JHmCBa`5oM;D13JBV_B<W
+7j;AlR6>>=j53c7RT_^L9h5KiNB0^1N<G0?n3H@bLMbO6B:F65YmMY@3C@7ZU0=FIKb[0GnUk[iU
+PE[\kRaCGSkHLF3K3=7YbUeLf2cU5bi\SU@3oYS6:RL_Dg6GW=bRk>>7:2MoJXEXDFhHY`7OCJKD
+o:lA;8ol^;7:U>N<MEcJjlHZnK\6bDNe?Fn\T]lSFkG:?VA[o982TY?=5Y0@<:N0Q:<TSWR4XKQj
+j:bk1BBgBMck]82T4Noj24R^N`A=WciH_J>C3UCI5F?\dM81;`fYWfI_VR0W3km[>^1VYbcA<Xao
+Ie5hL^fOZ[Q4fT<KHRbKOKA1b_ZQ`]IS:9nFRKWoJH>TYMZNfQ1[bNj[L6VYk:d>m=XJoNajTc:F
+WMZ[c[:h9iFdML<L0jj9Z9MonFfYUe;^E;g;iMjZ_ecf_TKhbfGolKE=H`mFea?KQmV`TGfa^Ij8
+ghM8?W?I4b5Ui[8_fFAlW4d6NCL<fLXV0caWWKPBl>M6I=Z_N;ZF0W1XYiCk1N3@g`9`g7O5alo9
+kIe3nYh5UT>j7h0ZD_jKDN3BfCOm<ol;4SYbPLeEEdJ?4nE`<;cjA51bVRK[RfPoC8XOe9k8eoHO
+f6?H63kR_fGW;fAnT:K=WC:_M\dkn_gS`L@BeRR7TZD:4jm>\71_d_e2@RcSDMLmf<^Tl5lTQ;<7
+OMHT7Q;RoAOI]TDoFBJKCg6jd7M<2_ld:CbjI8KY:HNV?@dP;K8e:TijN1Z7=9DJo1ZDX[heY>3j
+QU8faDVOIH\Z1G]fZ5>[QW2dQ02@=fX<2OZlgJ88dNm>?YB`lnm>VbHDe38g:_FSIC29LVj7NN<R
+8iFA?aiZFEFZiBV]a;4B;PniY]coc2oK>YVcMDVe<_SLdnLK_HZGYA3b=NKobc4WNm`\QM=USY5j
+c5L@a:=eV[lfD7ijW>M>k[5?mlM]>7m8TF`lb\f?lmiYUZe?lmm\2?ghg2kS_80MebEK:bBkO]7O
+9G:nO[4`cmjnDI9OGkmXb;N_9^6aSIm5ZQSVmimVogHU[1mcc?jH_`Um?ZUkW^Eog@Og9kEldc0O
+eceogXOnDVGGcaMoo0[?DR2KLoiHVhjU>0Q;@I@@P60Yj=jIn`CQe@33F@YOHRV`h8FKcV4YSQlb
+f0:F\PhM_aA;LHH5Mg:@]44>AEc4DQ`kk=Oo;<E]T\DjcE:02Ulg=T]aUL`eF`h;g60aBo7QQ`gg
+e0UI]mRo626:3FZiMPRE?EJX]MLS3USB97V\Eb3U1;>NX@@YWgZ8YNC3mlXDY57281N>bACG_c_S
+@;Gh]MLdb1ffkKL<THOUWP=2S33RFGdVnAh[i9Vi^A0o_?KQ1XWhM@M36F:aR3QXa74_IXA;G78O
+DZUBMQ:[9bkk<R=dX[XgiN3Ui9lJ99[WciNYU:O4JYFbB^=M5_8E^o]Jb2mfNbIF;afDL^T]>2f8
+]<^1_VJ8;`L<ThUEBR4I46fOM=AlG8?<V\liD3d>5=eH9Ko3HDC9N`jhYb7LPhJK:?[\[d8bb1Tm
+m73=U27[g;LldHd>;b>i?Z[QY5<][?Yd`l_=A9:m;U;ilTXbK[3V[Pk2deB2\g@@[Qg^oghM14iA
+;=Mc7@A>]_gCPD8CJPnUaB[8XlB2ff:U>IXjh:TEaK;0h0MIFGHWV[c:m5iRmDYK;5IGCIbfjmL6
+RIf?ILMUdVHM\;I;dUR[B<X]lnJkbG<1ZG<MJ6LU5I?_cG9GC?j[iGh0JIS57@@@HdKk@=AVJ]fU
+CO2HPMn?7C3IeGGTbe[^mD4l\oMk\`<mIk`GTho>MJMf`6WEmf`;]>IeEnM[9m0SD]iVM6OlKkj9
+Ae9fJkcK@_[VNgn5?>NbQ`YiioSGSR?4YajlI95f7mcclG>3f0PigH7Fdm_G7K0MC=R>5Tl\ng]3
+A13iN5_<ElncaM=_[kO5im9nga3iEJ7^Vlg:Wl^ng`SmJNam?5RRlWnI12fKOL\oklnncb<G5<kB
+QLB:XQj\X7`B22R=5^];j3i0MN\?JDm`e?\?k2U<9\ok_o;c5c4oA<_F;\G`\Gc\dNoGSCfF;To:
+8FFZa<Rc8gCI5WF_k3n9EXM6Zb\CNW@8nC:ZnQQEOFH`GEgkkoMnQgkJU@X8kSf3[NYo1P]I7e\V
+Ro@d0iI<e\]A>e70;EM>AOA@R;jJ3l7G49dS6>NHWGmIc0dK@jjJDDe;1R3kh=GU7<Zioloe^:Ec
+]gUA]E;hg==]hR]ifPNYTfaQUQR3BkoDDBXQQZ^kO?FF4j?NiZnk[=Sd>?OJYCefjO^G>_5e2RoF
+:LZTDnRQ?34n]L_n_fml<1T0nWk0_9k_PomME[anGRlI_P2VN7:VoW^S`A@b0JK`ZDa\B82oXRVT
+lk8K9i[TNQeVIh44RoKW2c1Idh<To7J]GL06Sm>M3aQPAH4D4Ab@0cML=CK4Ui33LRd_L:13[\SS
+^_<Q9eQA]M\Vf@Lef?dR@kA`@ho_K80`6o@71hb0>P\7W=1bck102big3H>C9kSoAJ0><CaNi0`I
+^lJnPMF7CW_7:PlJfd]f960]Ae8N:@70;aIXHXBJ_E`:i9FZ2b1^JI3Go[jKnI37f?ZmS0?>9?Y3
+l`KJl>\^7o:=e^giT>MT_<<Tgk4SRblf8DN<\oTN[0n_oJM1P_5[3bX9RlHne235V>i53WB<No]A
+PbA6MI83;F>e;cUPDe8JMl0WSOMKUBTKS6_iR0Qa4HOG8HHZEe7e>_8[1lY6KmMb`:dF1?beO?8G
+Uk^;BJ5:2W<8Q7;Um1QBnIVP9>E;ZEcccaC`2>Dd7URjN\f1fSP_6_8g;>7VP74ZkWPF>0NOUWVR
+LYOT>aJK]D4n5W_^U3n^gM_dc`MNmDKman;nZ8N<mZ16V<PcmT@;Y0EJ^iJ<O<Pj=^60RFERW4md
+X<FZL4l_=TP3`\egM00;K=cna2NIgQ6[;5g`lIdV2>XDPdJnZQ5^D^RnFS:^4oD`B<6ikYl>6:YP
+>cCTXgBX4VFY5cgNA`51CSTV_^FY:[M3@kjJm1j@_5G5gC3UeA2=oc:86NACN\nRR[GZ[A=j_cKe
+Bkgj^YD_Xm`Q:7LQeJRS8GO7Wd_ngoU<H`ojBI_D?Xb9Cjjm^25>To3k24Xdi4i6=IOlRdNKjO]M
+U_:I9SHmcN^>Y]N\m`V]g;cfZYbdaN3MGnEJmfLgb7Jn`COX=lNm2mLfgofKkEN[`aeX?>?7?1ii
+^@dUeU@QT>Ljn6WCi`fAWXC7T]6P^bFo<j[mg@7S<Fhdi7W:BRCO\nn^i?Lj]^M3WQnloH7i7Vi6
+gfLEW=;^kh3om?QG`l2U\follogYQcYU0kDN^JA>XL8J1D36VJaAd>TS;W3\HZdITQD0=aaj5oZ;
+RNckABo<W41EWh\LlTn4OJDGK^hi_63gNLlnQ`_d?_oIIg7ollTc]TXFLKHCNWBQLUKOCZWWHc7a
+?BU1FHfPe8[g[K4[C2K?=7]nmmRA3\eXM^A8X^eM=fH<4OZKi2AUkZHTiKhglb9fWWlkjYA1hAIn
+giSD[AhL;W:i7NF;Qe`D?N@?<>AE1\XibF34YNLJUHfjoh^MNdFeWI_GEBfAidfmg]4ZJ0F=Ge7f
+N8i;SnhleFYcMY^gkW:Re5_n^YBajYN=<7]`abekonDl7_aQa;1Vb2enW>m^YY`OlanKk0oSPnEi
+?OJo5o]X]KL9UPmOm7M9W0mO:\b[5fmDi=L\aKeIbUC3=Wim^CiHWgm5nm?8e`_UlE7M2SWf]gTZ
+IB:Kl_fE;;Lj]K\QSPOo^iahoKca1cP:I>R<K><RLQAXZTTL1L1:Kn8XNLA2hcj>PTm`56RC]1b5
+Ej`I`E4>6AFDXbS>^>XLA@fkII9ml<;T]c`:ic[_DH1:6?YI5i3RXOnfPiAmQ\lj_85_CAMge5@A
+a0lknRcHKb==E33jVT9lkMPPZHi389`XMXV`2XPW:^hS:QD@>hd9QU=nSA4JYka5Xa`ki5Cn5`N:
+iHVl>XU6>F=4;G6<D3Kl^\]6_X6]AlPOSW^>T1lmo;7e7B]dZg3LHQl7o<V`o<N1PTVRSHSSPG3U
+mR47;2ZBNf8Y0>V8Bne73YQD9Uf]TbH8d=91RcLg@N1<fj\Lj>[9E`jHUNk>iH1K;SC_NI_jRl_N
+DKoX[@LaPTII>Ie=nG56:9_bLXHhVSoC<MZDJGB<m]LL\2g5GI_bSHMLAFYCMS`C[:<M;_>?AgOe
+TD[nfdOZQ6R2l;5]glG4SmkN1hSYo`L@UmPNj423>DLOK8RR8`oM\I0aWWOf0m18]2jj2e@DE@YC
+B]iXAF?6@J@8dV3;OZSYTn`NfB1C]G1;>bLM\;98VS^]4:A;<mb\]\\>MO;`>b[UYQg5E^m>4oCT
+^7LFlTV]nm^E:H?^H2RSG>kQ8dnml>[:Bb[e4SA@=AVdn^7mfmATJ;:n8PP_4D7XLP\A19Xg]nAH
+IGomHaIkH:C<U?JQ^CKkP2J[f8lK8CToR@COK?IUSoQ<Mc?IBU8c6ALeTkGHC;H?hRoV=`og@:0C
+;^mF0SoIoI\B>4dMMl3aS?NDR_[gV:9Di]`C7`CQ8ZnWZ`G?eA=1X=WSk`hHkd?I[A5mi;g=D9ln
+9`XofLdVn`BK[1O5F`G<Mj2m^_LM\9l@oPkhSa1n>AA\F__6?mnOO[1SE]3gKd_\N;0\1UKM[T3J
+2dcenP;K3k^en`?MhD2<oBOdTB`==]ooVZoO`?T16cMk=:;7_J=_j_LK4R]SahMU4SEJL?39fD93
+FLX<K3;H[gA3g6AeV1=\bm1?ML?>?Y<[m9k_fFMdR=kcGo\<konEJSRj8P^2Aa]O;nRQ7:>Ngo\4
+kb?UI<hT9l>NgcefA4jfDRTWRjWXMV@iFE?TI2ijSX@[9f^hW0a4agAM7VHMNOo`TW8;Jcdk]k=Z
+P\oKNkjYFBS]6CSInNIE;XeFCVliPJ_\]K_<2:kb:e_I\RlIH[^lL;;oGS\Q9`?kL7Kk_kAKiF@P
+E\W9[bnCTgoYg?c?iR_[Gnn9:UD6oSJOZDb<EIkGmNZgn_hJ=[_liEDKglOj3h>PG0Gbk7NHoCFi
+R]=`5DOP:Ua8Z`3lTeHQ5CM>>5Fod>LZ0`[Fk=LWH;8g4d8DO;_VC^22an::W86Yd66`9NZ``eIU
+BG`QFHaGLiG:0bljYieSE0mJF?GF2AE<P;chhPD7J^BR0Whj>>23^_^31DY`^J=1[X?h:DHX7L@[
+6N8J8OJoL<3[Sd>4N\2=fkkQP1eY]WLhd<NTOcQPB8V<5g>0bI7R[Qn];e8XH84U3G8JP9hhD0Y3
+GG705B[Da@5KD1Um_iQQBh^o1_371gDl=hJ5635TWnP8dSGi]]Lhd2gFkCL=TXOYW\<>=eg\Ml\D
+Y3e4OE7e<E3nJoniCobj0`:R3^:k749eY8A]Ki2mLH[SLjTflMfCiUY\mRF=NFCg9QYcY?LW1hbZ
+TGQF3a7456I:jR^>NdDSabRoh\A5KlmB<lh:FgFeQ7@G2ZIFnHFFHdSii:fJ7X=E7l@b5GLe2nb3
+f8M1_U5:J2<7:emkQMGZKE92\?;=PN;nVW?0>NHk1jcC\Mg>0Nm\S9;WHB3K872NL<_g=LP?oIl3
+1BJf2c[PH?KI1egDMD=TkLHWOiQjmT<VHNEPVDn@mJT6goaB`hYHhl\eXJ:C]hF::RQ8;WG`ePP5
+BG3nXiD>M9WHMgcYP9Tjo9j9[OF3OGRc8GZbg0S<O9E1P0=[B8MFBOOUQe4QZAXn^FYD_2b3DO7Z
+QCV^U`;fUL=?YEieX1HAnUIf[C0l>U=A]X[_F\[4K?3G2Z=He`ZdUD9mSkme`=a\XnMBZ@WbG@OZ
+CBmk3d2n_;9D`MT7YRNA@6[bMn=KTT0gOKlkFn0cjo_18O>DSjSO]?NY^CJ__AZ8OC5891@9X8\m
+W88RXJoI^9FA4=2i9i4@d4VETA3hNM\OTI4@`6KnSC@B2K5;RR^SAiCXH2:o<j3f@Zffg\3f`d:7
+kJN@aTRCoDOd4Bd>=]mo]>cO`?T27C]k=<;7ML\gmWdlbDIkO6R6TB;b`JL^_U]Bmd_U<3cb3;\7
+OLFAn1NTWfTGn\b9?0NKoWnK8dgjBC?J@4V6:7OBNPJ8lS=4DOeXDIo56iWXHY:i]fVTdndO=6gD
+c^1m=^QO?NQC6]7[@[lBce_5CnUjaPe[V>3K[5ic[Gcb=5\=PV]ASlKX]aTm[DONcB>Oa21n^bE@
+`\jo>fgjD?3j[Vl6jIV[M@o?bEeVm6hUJL^9BfoeXga4Zl\WLMZTJ0QMAT?ldki5]@QQgcbhRXJH
+Lo^l8fN@eZ?GMmcimkk[eC_ICf?8Gkg=bhEH_7[;GflcIMTg:f7f1[MKm_kCNEch@ekjSS<^OYcg
+;W?<O9Wo7V_Lo66l<;f2gOhok^>^]KL:URobn<Kfobf3idTfm`>E=7:I7giUb6EiTVlOLZ5Oc3Em
+8YDn>3ooa?[GNjA6mN0L\7diH?l^Wdo]M=;ONWVf^HFWiLokh3oW[il_o_PUWUm16_PEianaK7i3
+_n8hG19J:=JH<U`B@5ALO>=Ddg3G>dd2mDILTS[Dh9:PQAiWh9;lP>iWX0hJSbDiFKbikK4TclSb
+R@kQQbG6FdT>>oS^PcbQ]clhD2AF^hBnSXO;9Jg@L]N``0\[33R@:dK8X@FGcn0jKDXWbAj0>b;]
+6P\QSc0fd?P@1aYU2M>?AUX2o2m\ML9R?jEWTIkbZLd@[cA8Zgf;0kfbQG__8cUAf3`lTTodcGBC
+Al;GkX>NXo5>bC^6N=W]^hKhJ<;RNdcJL=]e9<N_c@6MHEJhkj5e93N9f`]7l[_kF]8T_GOBB;14
+MFTTUaMD6@UW_5\ih9FjnhC:5[\k\nF`N?7K3=6ElUdB;@Ol5`JmAaUc05\QFcYm1WoVP6TYkW18
+eeCLbb6m\KPKPQ@Qon\3Sb0mWR4V@Wj^@NYaJJnkQBEoQa>?J0TShBL5Vfb7GP;n?oBAdQk@@4gf
+^HN6?5C3bfl_h?E9>oOaT8m^L5V]>=fP5egDb^R5X[YI6nBY7SKIO@5h_Wd`S:B@kBO3B<hkNbE1
+Fcel\Ne;1lc<@@>k8GJJ@^oa4;Q=T]cgY`F:VZ7a@aSHbVDO8LSG3[^m\=B1CS<HFXAfiJ3dZ@jd
+fQI[OcD1^>^g^c[PJjDXoJ\5bX;UGA?<[?3eP^W9R\^oo<K@;]_f_4IH6oQg6^UB0SP4135iScI1
+HfKMAE>>6OSmf86B\mZE7G2iB=YILO7:<g^oldRNnYi7`]Ei9;gVTE`k`F:`0ZSgA];UGW^UDEb8
+LanLjMJC@]`Yn1d@jKZjNk\ab0gP5O:MMnKkB6jihe_P?4AN<fW?Y;TTgo?X_PAl_RDY?V\EX9B@
+]DXcn8TM3iK9X5D0e=UZ<Q8gPh7m]6MJTgBo<>XbdF;D?MR;[;0?]DJck46O=HWGH=?meif\Y628
+fOR:dhFn0e3h9eWQdJ4nQbmbh_bTl^BhdYdm1i\\k3Ndo]<<Cfd?IG]ZQc8ZAlh1mj47NcWP;W\R
+imRQ3L]TKUZgfJJZbiJ^9i8<jJ<QoBeJhMcHUlBnfjf04GKngEVcAh;GKY0ab\CM]7]Lk8?3ZL[^
+;En@EJ^EabT?Fj^WFSUTgM]cLiM]c?fck8@e2F;O?;QZBKc>kO>>W>753k7[Nnci=aoVfXORaI9>
+_8XUJAbFA;^]OOH[69K`aa@THL@8]h6ThlMlAb]?OYb?E\I6:ano2Y`e`81Qbk]=Z7`bakO4G_:2
+id<^n9=l^U6iC`KnD<_aG9:cc5oF>WjABB>JggnLoN_5D3o>=8F1_@l3ncoVLcOalUo_Pog]G1K=
+FDX8o4=o;0T<ZnS[KQY[EJa2\2@BZ`fF1>2;NOSQAPF?QbFMRBGYj@D\2MK`c;02F=9@aD]?`i9V
+S3PR;IKT7aEfel6Bo51S;`5CQbUF^2jFi7banVk5TX1f4VMNZREI::M`Hl1_l>W1h7gbadOJa@Po
+R:aXM?1BfLf:dlCZebe1fElAVGXE>=0SR^e^[5JL:EJ?;Vc5;cX]I2\PCWalUIf]N77;Nfh5>Rgl
+WO1^aEfBEnbU0\L6m<T1UkCLVbc@RNWMbPCG:ol0e4\:cMhcRZ@UT4liD3G6>`khEnW^liEIj^i4
+4;OTlGO9QUD_;W]G0E5036A=J7`HXUV\m2^GjN7jUFNdEJb\XJd0l6;UEnKIY4_6niGm4<@8l8mW
+Q?4[WfN8NScJJ`2Qi=l1Q7Rhcf74Sf_g?Q?dd`:RVJj0QWihlS9M`J<R?QiC`Zi<?GCff4FjN5_T
+O7=]h1lM:ImX7ndUXlCaTC:meK;U9;od`V3?[^PQYbUn::G6FfI>_VM8mIC5XcOLK92^C?M>9<b5
+TF:HX0NTFZ_oZT1BYUcfTJB\PX4JM:T9\g:hJN^W3YSJ9f>]V1[RZR7nONPZU5Kjg@fVG7EagH]O
+4\YUk2jQU8Fc3UCK5_o5d=H1KffX]<eX3_9bBigG0GO9df^1_^aZmgG0gebcojY0PRV37FRh:VkN
+N[435R_KK^b0a`WjO\A9NN0W=lQb=FBBoQ[ii_AmKfj8ekCgi`J9cVf?a^<7bM<>F9g[;TQnkDFF
+hF\7c4k414O=h[L3O^NmcgThVm:^S7?lNlHKXKXE7[UR^KQN355_om`1dfgm]2YmN_\jQ]<2oSJZ
+?noDkdf@WTiD3B5GR@CGU=Lg`WdNgMOdGaO7G2a?4A@Agfn@7USk7NQ?1LUE3e`jnlJoiUo:9D\f
+\>_eB^UbJ9AQC>0WQ>kRD;JnT?H35M`7]RMVJ_l7nQPF9?onHnGn1LgYlLdMRn9U_O8]oOko0\@M
+7iI5c:cZ?C]4Zi5Sm`\7A3:9Gj79OQOjReWaWNPc9o@LM;[o04B]Wm@9f:m`Ic:9WaTEdL?DIo96
+bSn]I=iC3D^K>H=>^WdQ:Z\NWVIkZPMko<XHE@of[I4V\hMNbenSJOH4ck95EA:NWMYee\WC`j?]
+FmF`=YZTn]^`[hGm6j`l:OJgF`@Ym?cKdjH?1Zo_nZJQ0nRYe@oga>Pf<gZgNN>4T4]_nD=iQ:_;
+9m<XBoeX<L`RjmlBR`b\hB^;308>[X?K;]e[_\U>0WV\3igda_T0Ic0bh03=JVO5Ti0OOc`bl\0S
+nfn75U[h7QTlSTL6\8^WVXl;^WU00C`hbh5kI=S2`L\m\T<DFoG58lm7iSg[TGfSJ\<m7_WPQR?6
+N6B77ciZY4Mf^WRUkWYTX<<=_GGO8c]E71]TSd`NK;X[nHN:n`NdOY7aZQiL2njOcJQm\D;=Bo?1
+PNY@\SiAWS72]T>9Hh@iFZQVdC=0b_1[[mWj\6fo_LB7hih3DXhYdZgm3Qg<W=5jM4F0oM5eok50
+8GkM<I<:hmhh=aoL2kM\^<P71db?o=UCl<61WQIRc74n>:B3G9Vaf<LIXNC:bj8^97gF82U@WXH6
+4bR_>F0KD4hROP?;PO8LB[2;nN20cA@S5HPkh1oXW`DbTgK`P0niiekXP8E^=7eCa@TnI9gkUROj
+DB1A9=O=h6=?Jn60W7;8ZNZ=3_CH5j]EL9@lD]7PT@hdfA=amC:D_=::I^VcTUoj`Nh_>\[ThGM>
+2mbda8^SffS:bG7_F:QC3nKhdNCE3WM=?[A1AS_4D@LZ[H]E8fSZP:LJ1clUS;M5ZKF4@KcZAhUD
+]FQPEoKMcI9OCO6\O5k`dJC7=\AL6_\\<JhKj^lZ>gP2o>Fg3YBKGOBLCZ^DgmEYBblk]oM_5P1e
+`60EMaR8`dkh08_AjTb]^bQ9H`In[i5?cW9WM\1U8jXo[JDTW]Wk7HGhLn[kX4O[^V=Kh3C[NiY>
+0O^:[=iJR5eO=dQfHW^f0fgW7Gb;96bFNcLDlgcgKe1<3Z65n7S6;`[R@7<Sm<k[07_^@oMfLgc:
+WH7OdL5OCgN?@Mb^H;^k0kkWW_`M2a9?7>m0LjPbkh3eBIKG>m1mC^ggG<`kHli<jc_P?QoaMl1n
+MRnCn<oRoRn7Q4eckoSWo8\ZI\`BjT\Z4Q60NK`;08JN7W3QLM6kYOl0`83Non;M6P0HH?N>BS8?
+@[ad9eQn\YdggDnBWmH@EJnJA]Hn3M533oKFb3?=W]0iMZQ3<iZMfWFfbI_cYN]GcD000oSL>aF[
+O[PGaP06V;na\QW0X7WJ1jWKNnci;@o^eRok0046c_1nkQIffkBGWAod<a51G<Qf[4O`hV5RKFlI
+=<oTlHgboedBil<\\;aWSk8DiWakT\g@P;dG^NB_IQ^oU4`a[>noc?g[E5ZLLO[So7fJIOkCO3jV
+cgnm9oIG0mR^5h=fOKhWo[NILO]ljILo?T>6A2SE>V]BQP`nQb43f<fCG@hWkS>P44?Vea<H<_CG
+JHI\[79L18HlGLakLaVbbRN9`b:jhLn13=VQQnZ<3=WI8]L=bi216Uhh:d=FY;P\8VK8?S3eB_^7
+0hJdB55gdODS;A9eoj=DCYc`_O3:6>4Da9lbA4:0WM8PZdNnhT0]SocRP2me<]E<ci2e^R]3m[52
+go\aI1158mmVb8Ym:RY3QWAhEl>VS9a`n2B63:ST]GX`I:32ChW>T06`S\c;R6lGIlS04TGh?ILQ
+Pj2`<VAdAh=NVARb\^ej`I2W6cZ_8D?f^PPmoc=T=5;IH0cI9eZlk4YnZHNOIc]TM<Cb<mTL<QkB
+nOZW0hFFaNh5XPlhZ^DN<ORY7HIEB5TSG>DHnBb_^^5EYJH:`ZY`On:[B<[BKnFTlMHE;eKj5AiC
+X\hjh:a164=LjdFSgUnYa2goiW<@MkVE[^^0^cX]GmV[K_IN1o[=J\lR7R`1BR4NMZ9dnQP`<109
+MhF5P@4jXHRjZ``<d;n:4NCU?_AiF@D1=_O1Me<o@`VOn78ZLIgM_AQPM`JeP@elieeiSW`lFVX1
+>joRWVn1mTbJ:oVmS^gg3YP?9_g@djo\LkVgm3n;_KlAGTclOeV4;9]kacocKfBA8aLBgNiEm7S@
+30MmfThVZD5f[j3k3?:\?j8m4BW_?jRGL77@NOnSI_lBiTOXf=VS53jfJmkAkhON9XhN;lZQI2fo
+QDlMjam41\b]GfDP<V2WKXK8J;1YXb0b@9fh6QXR0k@LMbE41\BogF\P<_0ijdIOkY49[lcUOWDE
+DOeDa6?CGMg3XFjkM6oN7O675<U685glf02cFJHncGl[U>O7o?PBM^>lP0dO3E\;8CIX;NSSokL<
+WROIH;fbG^A2?lZ_3kT\Co;]@bkeVkVVKjAB2NOg7g?oNY7DSb4bl8NEY_ci?_RO7Wom_?777gn@
+b92WC_V\YA:IG938i5BV<F4`<R2OHFCdc\]]VF9f_=VcMH@@:MNO7i3TkZ:08@Y_WCfPB8kcVa1`
+hc[07PXh@0`kJhF5l@Ifn5V`1ETMi?3hRPlJ98TL<TZXPU3^>VV^]4G83fhhFOP=FakXkHl<4H?=
+7P6673KkQ0=EH[EK>>15UM`Kkb7T3B^<:oP\AUPKf3LIXPNMmRk8>RjkBIZhH8kQQKCB\L6O9AfQ
+Y\lDidAC9AS@XhNLFjh4<aRcA1PUV4oDJC]C2@Hba:ZGgIEPeSXG:<6P\l:LJJh4Li<T6glY`Oc^
+_U6NY?M>bD]LkVEG0\6nVA4nDMfOi5Xnn:CXD@3@DLZD0eIU_0\4NjG^?[^baNk>IH9M>UQTD5]b
+1DQg^NU7KooRYXoB]\`>Q_aHPi@<NIT3WLFO>F0JBln@[i4:<nA0\=g`h;UPon;1\l0Nca2CnG=`
+\AchMKQHlWMRnQ4]cl?5akImah1nDRQf[7g::^Qo3QBHf2kXP8=]<Wdm4bg@d0eKf[OPZR?]g6Mi
+d@icfRkQZZ<LS7iA;ZhK[Qc;?>1S7I_k_Na9AXE;>^1TSMCOdd`;]7C2PUN_a9mjZ6f9Udc:L_4k
+8jBW8kiKgPI:VBcgCW2]7JY>kjMJi3:a?igo22>b5gB>^C0RGQHfSh_X7CgCmG8AlHT;EO^jR51X
+CNHR0WmO8ccbocI4J1Yk<32n6:Ion;035ROKG^a0a`WiO]`8VKW\B@Wh5T=_]emfX>KdOFlljTak
+Ol91=jlm6^DmmGfJ0^3LMSB`[i^TgAR>9Vlc^W>KH3OOa7>1kMIh]i_hcOOnKH;TG?H@3Kicg<LK
+X[`?WRam>F9\Qik^_dfN[\3_jDK>dm_G7JPmgDD4e9GAFF:iR83=0l5]6Ce>U<?17?8C@GLiI;n8
+mP>T_?jPmTBe]_o07\?6A>_mY`X3K^H7JMYh:L?7N]DkC]U0Sn><ZM>SLXRIbfoTfA:jJ9RjEoJO
+a3hdDEfIZ8i^EBhSZXomBSOTc620_l><lDF6OX8acSjC:oBNkmUWM8SNleok3>ooUFXh>];Wj4Gf
+]JYB_]><BSOfG;RIm4>EjSo;i9Cg8n]2Wn;;Io;UEoTb]bKebYgO?FiDXg:HVm=[edknN4V]Gb^7
+]S60gWZ`ghdd6E\?LPWFJ38mj?Mf2b9fWWlkj_A1hNINgcSTgj]BjhMmJ0R@eiF2cfeBO?TSiHF[
+cJ?84jKNg7UibcGUoTgLUcW4mf`MEjd<?VOfnDK5hVDOU6k^\NO_n[MK_na3DnbkdT3c`2IN_ND_
+3GB\^ZMkk]J3;MgbbL:8HGNLJJ43ged7OWk<ObkUi\Oil_HNdga0QLH=E`?1O0h81\@Z8=PJ@330
+n;ac>eA^2PA3=C8lPTIf^6>GRhGEb4jRTN6Y9VUT07GYSDIfXa\MEVO@b6BIAXJ6FYY88b]ia8HJ
+fJljYm38?YCnQ4IFR:WU=;;BEWR[TGF^_TH6ZTcJ2?Td\UJnJ:JADhV7m[SA85f4lFd[?BSeHAc2
+K2@ZhLHEE30g6=Gi8aG<QKEN:QQ@7gJejl\5NJC`h?IS6VB>6Rk]nX`3e^CKG^=0=i9jhh0i6Nn`
+R7L<JKNR=UCnJ>:OEoLba1lFiCogB@Ko?X:B?Bg\T^0XFMTniT;9_]Ani819KK;lRLVBXJGjU@UB
+nF39QDLMbZ9:`PJYaZbmjU0JREla]@ai5Pgd=37ZSS<BMfVifd7hHWMojXg4Edj?PM4Ki3<FMc78
+=OlY9a@CWiHCbYGG]9A@II\3_EgeiX1aE;V<N0kc4>8MSni:C[C^Taa]WH<Sg]>j_IIhGkZkC28\
+M<?I8hGf:6V79EYHj427NFLoV:QC3`gd<m615\_R3Qco`DUdm=I>X^:\iX8QLF?dLa9EhZ6Cb:<N
+>hU8n7RW0gIBJRUo^V7GUga<IIE3VK]i`O2f2;VR\VB_Z;WP3P5iEL>lFdl9U:^7;njn2X@noOKF
+1WV[l>2V_SYP;9kBB3`;Gg74FbmlKMFJ;KdfJ7K@]f9]fDG?XF:@o1eJ^^@;CMK:oL:7LF?;U36S
+OA10cM`S5iCXaGeTbYUTbQ]QmLjG@UbVLEIJ9m4V@RMA=j_gK=[k=30nUKgJPJicfn?T\g?d?F^E
+=]o@FdUh<fa^U^cY;5W5F39n<GC@M9J\Z?W2\f@GNLfBOFYehn_:62M_Yh`Wk_Qk8lBG@_TKS5Mi
+;hKlVm`V^dOVkZTLlSf3kX>9lbfYn[KbVf0oUgdGh3>9k`_`WlKnGbI1bfKOl\ol6fWTb0M=df@I
+?BiD`l4<mI=0Ml=4RoDUM1ldJN\?JDlHeO\?k2UL;7CNOjWJ_hQYSk>eBc5lK>GgSDL^j;HTh^Sa
+i4O>lS_h]86E;XcN=OfWTlQ@khI3kd9o\A5m_nR5VA<Da>LR5ePkHEoYQI]k3RoHOMjccn42_Lmo
+mUWLobO;I6aD[m6;RJd>SGaG>EC]j5K2>B=fYOjc;0iEfJQjd:MLPXgbEd@2KcG:Dnid@]bH9^F`
+=ZOGG2\a;LgF[n:kI?j;gMN3?\OnI;[@knhFB?@lokKD:H?4;ObnDJTO;H?5BDKFcQ\G^DRjb1nA
+jZZ5N^HXVf5O[8C;@l[TodLnjQ[Z^Y3lU4`nMkM<OTXV:g:5nF5W;_e29?@A3kM8WLA=RWJKci=M
+NUQk;_oSU[dYlT\D\1AJ;]R;7nMa`LKTP_ek[77cQo72m6Qfngnl=j>\A8D_n[]4cXL_5^KITcM:
+l^_35`gim^5;eK2=Gen^5nKG]I_olna<3I47kK^\`=oUk`gbne\n4l56oCJogl9UUcllGM>_md4V
+hLC[ih\oP<V@Q74>=@:3:Bi<]V[1i8M>7G;90?oUTTW7WGOJ=<WDN<_hH`TRE:do?d39WDD2A@SN
+>W^03ag7=cG@YX[NH`lDk80MSML_bQ^hHL6Q5jA@@`iM]?_0PA:i8]G[h`Bkh8HIo:h`@@VPCbjn
+XB4=N_]3Pd@RN@B^>EKkQ0=FF24G3WQQA;57Lcg41h\AR@?_jmQ=j]`emPiI7F98[=TO@=2Ca=ZM
+adDlHT>E;cTdbXCSGZ;1P9I25Q:M9fJ_9d:RMmA\;AH<fWQQhZMX<8lMTVWm3@1]Z[RUWYQTofSF
+<3O]Si7D]n^II9:hMPLVJLAR7hSP4ho^DRIha2E6XUXJRM34LHe4U`kJOjVA2>B5^dHRh0JSfQZ9
+U_`NTi;n?POjaboi?d>4I;<7T\EUWgfX4LY=GkGC`PHiBRgjDB=T]4=5mda\T4G;N7Mmd@4K^jBi
+d3YJh:<KoUcH@e=>ZW]4@9Xjf>nATm3lVf:<6bZBGk[AO\7L=45>7WkGM<3=?RWk_:DC?cWNWBPo
+VGFoi546gO62h@`cGkad:J\E?]k2KDeJZRe3mY;MFS2Gb]kZ@:n=4FiD1a?7J[WSF^0\LZ1VhUH;
+fejX]R7^lRno<OFBbjaj5`54eEoZR92K8NY]eQ7M94o]FP[if0WGjnH04VL[g3o^I7WEZOM>Qh?M
+G2ASU]ZdWje`\?\O^7YCGD8N\fWi?6X`[gc>TCdioc\eV364VcMW8o?_R_:kVYB8agkoaX`We1h>
+43H@Sc]@NE>DFVdalW<O>Vf;lbK8c[9`<4f7PjWHFciQ]d=O]eV9d2:I8Xkbb=hfgb?K1ScOPOH>
+<IQhOhZkH>9oM_h_Qk0@fcOnnOkdPafcPRh:GV;7PfDa?<Yf1M9N8:SG5mQnF2KO7nR>TSSfWm17
+\SCHo?mK_WX3i`M\g>cAR1kgS[jYgkL:cM\ad;mTZL;4Za<dn;Ed_jCZ<WSb^PMk0D3i;j@gbakd
+FI=h3CKMal9o5Uf^c:IC35KOdBWlDd3TdBDcC4lie2:\8Bbb=JXIj>5YG33]hH:=DOFP3Ce=i]23
+_TVECK<WN9H]j]0<IhN>:<_PgQH]XACgAXdQNVFkAA6Rgielb0[6;`YNfgNfmema679nSlSe`ehh
+_>O`b_MihgZUEnmi`O[`Lngie7e6inb7bfAiWg4W8gbDh4oVgSV:nX6O:g^]h9o0aN\Wn3nF8WC7
+cJL[o<^lKoK2jFIaLk=hWEUlcRb^JnQS_e`>^@]67C_M_ooX]4NA`ajPH@Hmf7\7FDg0nnm0UPoU
+R_4mL^Q^<bYOfG;0SmRdDi[egk2MRF<ao^5<b7bm4TSekZVOk46<hhLGkH[i:F?XMBnZWcRBVTZL
+><;j?7nV5=[cno^>>]l;oo\MVPcV2cd\<RAkj7YUReUTAd4BdDB[>TE24P6\i=K[;I14GcYnL?\5
+997NjhDT`Z:621X8BGBK[1G9H<i`_<X;\3YhXHkWT4A73KG^6Y;X<]7k6XVn\4<0gDP4^TW\OdBR
+8c`ne2aH^\FmgO:3CGL?2o`03:I41LN=?0@6>c;`NRnH4hE>KjfMM=Z90jKX]2cR5CX]7>`5WGI<
+l8E[md^NlD7m7Rb`6DIob<`P??bjZnX=enhk5ZS3lLh`d8lNG7k7EHlXd^UlS`?mh[Ko>60@W3S8
+PHJBKR9JY]@[Sg@G4JFUWAa`BL^mb@:MV=j=9IlhkXmH_GA@c^FSY9FVW\:07^?MbP6_d]egb0WZ
+W@KRUP^^e]X60knhk5fE54WlZd72DMVFe@4@?lh@1J=L1\0Eolb1dTaac@7G0;P>NA\0K[?03WVo
+<d4j5W\l8ha3oSa3e>?AG\l89oWg3971WmLPnmRfkhGeO62b6bm5gB0kBFf3S:<GK6\4@c<dcR<W
+GK@RmgB1k2XaOP=TInSjajn@]<77Mo@[GQ@ZnLX6^DZTQA3A3]G3@HSTbN_n97W:X3_Th:=LkR5G
+YekhN4nU3G6FINQS85i9d:YNIKX<C0B]AeTUhOR_0VgIK1GO]BcfVE0=o_M[6n@^nI9RS[b42g==
+<;?bNhg@I^Dm3RD@k5no7d8J31=?K8l20mU\mVD;l=?g^kD9?W<LE_7V]EQ5M9;>KKLZGQC^oKD3
+ICU0f`jhWGO`KAGbVNkM3_BMmok]P>6Bd:HLeoQA3i0bel546b\Kjf\ob=?W@;6\?`DAMW[k6TCh
+91YDLJNDnk\5bW>iXhndYk;22Comk_XVN<nSnkh5jU?G[2J10Oen`K6?bF8MB1Tm`X@7?_?>0=\;
+blak0mfGTnaCM]:Zfgm87n4RW7bo7VJ_H7f2SYdm:^7S^^DKoCjNi2>Ia563QDoElTnSmh]V=<5o
+j9gX:eUPO9W@6n><c@Xn2igf?b5\f<NPK0He7^;YALZH?=dc38YnK9TLh^eKY48jQO]99MX1aT<M
+H33GXI0MH9HY;_O>Z00mXN2UO=nBd<5?J:PR_Akb1AebXHOiZJACZbBO?>Abj:5bl3B8TOJoGFRR
+?cNdJX;?>g^nZE\XkYTjbAIVSo>hm?3>de]>N<X5Bb@M@B?mBRA]fAOoMVV?GN;17hLS0N^IgF@l
+n6?EgBEA9:Ce]`bN5fmDi=>7;aKZfj=GR_;]^J@U[^DKV?C1nOTWe[mfXF]80f]8mh69nedn3n_E
+KoGm1F<\IeEj`D5<X2S^gX49obI5LAZ:hPTDQA\ePRP0O`EAB<de=dhd>ekaaVm@Gk@oGh39VQXT
+hKM[k@8fN9c^O<00?WfK366LjXFaGgV@@`f=5;:00FJR^>^2>dTCS:SM:Y;\0iMmRA4jF:6f:cHd
+b1=jnh<3ANaZ3NT9Y;M0oIJk^>Z53iJngaDSi?31EEO=J92=BKkQ@1fDl8RRQ`=n<7;RU14?O2nn
+<4JHhX6Vmc^RY8hF[T`mQ?992[\hH8Z:I_H0EjodUBQTDL;S;gkii6>3_NlNhd0c[_c5?1eYSKk]
+P>3OL4U=91_D7@OLjI;PcUfHlR>Mo\YkS_C`fWmHOO5[3eCJA;<>Mb2A7?NR1KoHi3i0R1>G?ITA
+eV1lVB6J2Yg=gd@?>dOLNnn5bRPGNZK\B22]F>`CmX_S4\5M?=[albB59SQNha]90Kb0b_cLgQoG
+kWdVj:N3N>mmCaOdOdimRNf13TRHHh`N5SYPXH;YSPdMl33ek8M8`IYQcSCc:2lfBCmU;U5ii7Dg
+9OVXQAOfm]P@<DV5SRR`Y@Zf6?QTPaIRd=UU:agX`]<_7C2C2oD<5fZZHKm;KS;6<mii>GmVWbfb
+9Rbg?MB1AS;JZ0>FY]UNRRVh9fJjoT[BE=gKEAe`=FGo22RBBknm]B7Nb^7?S[ibHlmZUgG0FDO>
+0eo[@niYF`Ndk0n5[oSLA;?WB\A0\;\>e??mjh2o^G0:>^m`hl<=^0lVQ6aA=`Vo;e^P<YLkLL7?
+17UET3?M^_26X\jdmjNg=ZlmfRYhj\4WRW[Cl[Ve0ekKD;GGGPShVm6NXMEK2hhG:R1NkA0ZLaNh
+O1WEg`K]M12XP>aF<3Z416fA[6l^2<V?H>2jdI>TQh43\jBo7YG9>O1B^Q`FLYLbmXC@GDCP_Y3f
+0hOT0m\C>kGojMj`<M;loc]jnX;V1f[Lg;4XG]H<_J?O?fi5[=>SLXPI9C;dc3HUH_N;IC9i`?T:
+E>6GB7E6Y3XcBQ]df_nIn7QOZHJKACAn1UFd7jY`Wa[EZLX=hMifCO:M@m;I\Y?fMo:@07IZejfK
+VWhO^Ri[fcK0KcgHS`K>Wh5_<SgXmkH;8XJNOg\ZP3;Lg^\KQmcmmlZ]o=3@Yje[D>H^<iH9lB?U
+QJ_=:gLiHNZ7Rf9eVmDcoKP?eB:4OO?PJZG`>KK7>g8VCo\PM<FIj_eNoI;RkCHcK]gUZcWZEfle
+Y<^:CKmL9=VKf6gCCUZA?lB8]UiUlF>mMiaYl^?lmiQSi`oYTO55k?Io>YEk]KeUd;bAacNjogM9
+W0nc^QoZfJ=\iXOimRBKlF7N_LP5EC0gORRIgRSh[fROaKEnUaWh^oam0oSm;InocICjKChJHMWU
+;b[>n8<3cgV^Wbonm1?8T4ciBbbN:I2MA20ST`@bP=hTT3M?_33Q4X5<U5Z135]AoED5PNb7Fmh;
+i667OVh\T9d[EZSe0]Tjk8FKI1nlH?@;S]JX??Fi`H4NdM\O7332hKB0Wb213E@^^=`eC?322L>>
+eGXSQaPFKVd63[4JnH@E^NVgF3^Z8VC_J9@[?XLTW;@@QgA\l=>S?BC5VI]G83mALAmNFF5a9bJi
+W?l[D4X5Od\<M^C@b1]eh8YD^hl>g2NjY:m90=o`jbhNjHK5OLL4NCS^NHb`A`nmKgi73CG2b?WQ
+?:Ao<RcoLJ1PSYQmWf18QdbXV6260gc4LBl`j\@Umg58BekXf1<73T]DZYm>G^UPFiaH0k5Xk5<J
+n_7MZfSX>CV?M5Jj>iL3K\5S_hi=oLEUkjQOm9H0?h9MGCUMaV8O^G:;o;9=Z_Tc:EB;?<f1eWaR
+RgbK0[I5oTHXc0BOHg77<l4\l\o<?akM5@aNl]lc@Sj:eMWdSf_g?P_dHgMgdclFndlRS9Cf`8HH
+jHK\bccX@8EMDN^V]LP?mLin20idFLaiIF`T_fSjN5JJX:<GSU]h0j]>>gcblTM>oXT5NB@5^CfA
+Ae:dEUUih9iAMV5L7SQflTMLb`<W=<YCoeV7TIjiE@SIKNA7ZO`U6_W0EFS`JAnhJ`M=okA6f>Z5
+<iODb7Q5lFM1=C:DA[QGlE_mbf=TYefNjd0kSkC[P;ePP:l3oVZioeZP<8\kZ9DaXgd0:S?gb6D0
+?fIa7iib9UE=EX>M;lWZI_WiFRFon6L7S<ieQjnLEWf?2]b;^n99Jekk1B;N??b>1Obfg\6g7JPk
+hO9^=m2CgD7PW]8^kX3S6NmIi>Df=?kBADnNLdmlbm<ENCfm@MIcmMi]YBT]l]_:nZAMORM9aaoO
+2??5QMS]_1oXbKj5mPihWf2KmklS?UUiGR?hK?ImRiLZkRL039FC`h5;Imoheok7jgS90bCK<WZL
+W7b`E_dTd5dUbEm2mm78oY3f14^iol2N`\E2iooOj>V;V1nRIF^GH_SHb^lKSec@JVU5W3?jalcU
+=d0iNcn4b80i^AXR0k4jfNlCTgY?>CAm@lV<5j:Ek;<\STWI\7[@YfhB_m:3leI9=`0>WW736ZFh
+cNZeJbN][YZf[`gLSUk;dC4bmlC8<iDNm7\K6NK@lfm?WBY80oWkaZAm\@X>3kVlC_;5@bj67_:W
+`jbZ5@Sbb6GBACdg9mV0dW4^Ka\JNgJ^Z5D6Wo_kO6?G4=dc0SoTB:NdjN:NDb\;ndWebTb9MYNo
+3UD_oF81^2?HkM9MbRD@b<0NcfkoOoNME0;INO96Oi_PnO15@chaR2_<[jLPn[J2^5;Fl@]:m\Sl
+hWKcoiej0HQ0UDml<B<:L?2obfRPllKg:i2_VoOO;bPP@RHER^=G0>a:RfOWGcLkF2118[nRgROl
+2Va6ZgMnaH4So]\nhT^8HZ^JnQEWRooS_enaTYcePQmFEN`2E0LJN`>X3W[k@h=40?0A3SB9eAi1
+_49XIlP_c?0boRDZ3bo\^:a<Q]Q1Hmo`\\HHUfGH``4oW:@0NHP;iMYM67bMjDcBPj9<]?3OnT\D
+;CInPS9;RE<LJ4GAEQb`QJ8ePGmA\og50F>JI:f``Z[<F>5aULhFl8OBGT>B3m_ffdIhf172nZRR
+eLc8@?ZTlGofOAc`AmOm4^8@_njX5EmX1CFZ5IQGfDU9JR3n0R9=TRQWKBG8?6>j?cU@=57DdVT4
+h:MDg;<\d8[SGIGP:g;QB]iRMfOZ;agl?ol]0J8lgVDcSmknaFJVT\HLL0bUcab`C<EME=8IER>E
+M6>aYbaBQObe@E0QgmHP[d;niT3a:6f[V677?VLbSd]kgETUOmLP^N]i3[B?MO^Nb3`ce=iY?`Ol
+0jBO0n8Qk^1233:]OM012n]TcIk:LS9R7jYjm<>ohdm0XBJ=d0^]^66eBFS5BGIoY<FU]dNRaG<^
+WlB9BkFm\R6^jBlK92\G_c>7n>BGNAY`o5d33Tei3JZhNZ7EBJ6:2JBYC354;bOMJXYG1gaE=KYA
+PCI]Ye>nCKiV]E4a2]>X@8]VojGP=jTQh0mGBAamSi9dk8GS1EkL29LYn?gH0I>eg2UFUYf`hVHG
+UC[[X;EA=h_RDmnORN:i2]P3CZLNS0;gZGUFaKDFiYkMU@VfBNgI2>@Khj<VaX7O;@@<Egk[_AlS
+miTkR<UcSUoMN4>D5h?_Uc_@NE74U>6mRP_lmRXn_GgMPMXCJVmWaMO3m?enMl1h6[^BM1hde83O
+>n5S[MB:nWUdgcM1OWJiH`:o3`U@MA?hkUkiCa7oiA2aJ^hMogaoQg6=F\AJFCGAhd5lA1ThH?]o
+gOe;1XjC;[ngORZJA5NPBC_4_hoTOJ7PYKiQMi<PFN4_D=ETiL`9?@NMk]o_jm1?UL=R`=V7FZ=I
+m:0Ne0eWdXEnM:U<dU<=BgObb2NV;E[oJHJW:VDXWab;?RaZQo[E560\9heImTC>\D<KU\WL\57T
+ZQWF3Qd1Q\d3EloK:gSP_cOi<:;>_c][mTCXnVk_V6C=beG]Tge`^<^9gUfnJ8A`]oWS:8neiA>O
+?6Cm\14^KkVF_?lk[GI8h=hi\QXE1mbn<G?hf0NSeg_LnD^fiMDAgTaLRWg:jSkUeE_mW>37YUlf
+X^b=K;MZkkS^]1HYg2ic;1ah=nc6bHoeYb[Ko4UlL7b1fodOgnUNMGN9U2oVm8kfgjVHi=bW14l3
+?CoTEa[Xhd>n\DUi<:W:@EC5ccnUo_DnJ=mU1Oh^OjlP_;oU\eR9E\k_5g?IiK^IaoC[CKNJnoGc
+aAmC`N4EX8X;AK_O?1fDA2905BheYXaC0N@WYd8ZKiabhW[eZ1l65;SI[hoMoB]2R89_em`Q:8o5
+GA<TL<;90;08LR3YXAR9;bB;Gb:[CgUPAKo_NncZ@Fc6PBLba0Xgm7_S1CCDG15FU1dLl47MoB;R
+19Lk^^@5UggBZ0NG_J8dQQTNBOh3IA95^Y7T`=4[kA\>f466gN507hDBZaaB8WF54LD8dP@WSfoD
+__SPjZ6Fd:4JUBL>U?9XSLX[0;=AfH8>5OP;eni;7V=3k@LIgJ@=XgfVo_3[[Wc`3MO^lbPkS>i\
+nZ>7AojohjS73h_o^LN1OW7K6dT7iM\NA0;Cf4<>F2BbPYE7^[LO>F0BdRh2_hASibY?C>nVDDhL
+m`M8^GC`aK2S730AjRT7ZW[1XTQOYK\_EP;1jH9a1H7Ph;F0h;QhNR;YCc6iiZOm^NKGO=Cn]cW@
+Fm]_3QRGhTkWP7<PIPCYSTMg9Ko3aINlaf8H2OmlL;WXNbRa6_ao:76BfP<KI2Skk4>=D=4;IGbb
+\46>D\mne0QYnOgg4a]TZAYRoGLUn8eE<\lCQX6?IUQIl4n=49?Z`TP:>[dkS:C8hJO2B6ZKmBn<
+Q:J^oAM68RNckYLlbZ0k8_2S]9SE0Tfml>5?BjjbLXalUUMIM\NXG5Ej[nAG183G15lE<LJMGaJ8
+N=:a3C:GbSk[@;E=DFKd=I5L_S`@76BFnfRU1>P>Uc;<j1i]P\K<^\]4l\3_a`jDe;g\P<]Ik\d>
+f<`?5j[H3A6ZX?MPY=Fjk]XFN6f4RLEkZDPgYCf;YfbnXKOn=lNm0d?LO?O_QPPFl^4=<Y8okT3U
+Z@MYh7i=hlm?0cNYeae`?Mfmg@4Mgmd]l9eAkHT:K<nn^i;OjmPNACZoCjX==HgPnec^C@>[DkhW
+MAchol\RI=WL>okiO_F37WV@m?n\X\N3ISSXe7JBM0SP\;f2k\>0coX3PLmAggm@;n7RX??n[hB[
+`o`87C]kU<;7M\dk7[W0[B8HhGQA3RE;5BINVBeMjWjY78JQc;1kd5NY`[lHR]^5?W<Rcl6Vnhon
+JI=ndX`f?3;_1?H<4>EW74WeXdeZV:ibZ=[CfEoILYBI_8n51:PdQEX]RkYQHhS@g`hMBI0nMmL8
+0oJmVBL1ibTBl8]kAjYnF0QJYgdmi8^=?647Wc9bZEFACi:e@cnPWCW:1YQ>P=dFJlgF9MG:h7=?
+Wfod:Ukf@NTREm30KBXV_aN6Y1c>1TmC=RW:TZncDYIn:OIfK9M]fX\:3OY5S71kc;7aHkigW77b
+hoagVF>SB3ld?[WSo_l]=JZf^aBZAjod]`ZN3eldi=>7;aH:`>N=TW`kR7A9joP59WeXO_i9mJog
+@P70`OhV1X3oE[[6Wnn3od7knWWSSl\D\8:S^deN9e?0glPD09]g<W[jm_50f]@GJ8ZNnW0;_M]L
+8Fc`6=gXGYQjDh[@3i95GM=19giAX^TE4\A02`LmoI0QDYPQkO<V>=0REk`amDS:1R_Z][e6nl1^
+Of:4l2R?::06Vgf2cjhQ[G2PBj:8;H\G2?XWm]lRI?8=5ONj`3nll?iO^aSQ1hdU@Xh`3\fk><B1
+ATUR]QW7QUSR@jd5FLCZQ6YmT5Ah28REo:n[7adDn>0HPCW4mQT2LocJJa[T3]_fV`c\T=Yco=KH
+HK<lkSQPCin<lDHSBCnlkPl27o7[3R3448]kn<U09jYk4mF;iOjTXYhEJ]f`U0=>8J@PIIG6^d3:
+5K_kB\1Ok?H<AKiTD?F8]l24Hk=g>M1G0_kUP65X=Ial3<gZPPPWkb:7K5>0]GgBDO=aaZ[iW0?E
+hmANIjbBgcU@gRW^>N0NS7[?POYYh_H:2bOoX`??E4;9>mPY@njiYhEHb0aebaB@>VBMniHWNU5W
+aBCGAbgL\:V57gZJXM5?=W81gAEmeW`8n4RUMa39TbjhEo6CASim\:6^K92[KZS`iiL>V9VSkaVb
+?^f`i\Tg7JPchmgC0CnCKOmdX92LMRQJ;e>?DP5M5JMODZKbU9dm?H\ib<Zb>gfTEJKglY6^;?Jf
+AWRl_FSR[`edk^ba3SCcTH98ecI94OOE]L1Ki\dG:W?YbL4@P<WD^P^>?6KPmf<7C5I[GLYUIT4N
+jIVmgl4@W_4N305mSB2im\71oa4T[8Gl3Dbj>NkM3O6Kkoi=5SbK?Mb1aS?NQ9kEJDL^QW;^PWmW
+Ob[TWL^N=^0n_GeM5R]8flWRRFEo0l@:NJkkNAKgE2Qkm]gUDNiiM1nXc;NSKHdn`Gh^n`kZ:^Em
+D7lJngnI16J`go;?nk<_oTPihBL[123boZldfPZ1M\dk;]W05^^?YL^CLTRI:S7bc5eGPDl6c??7
+=NXWcG0CYG1WU<9R2=jG=\VQ>\^RK4nOXFJUbe7]H0m?DcgEPceVlQQE3oJ]PBGY6eKI=7^2ImVR
+3\e`ETiNEPQQ>]WmK]BPTcm_]bQ2m;^C3bG\o;_CYPT56Hb=B_eX6Ba>\[TMiZVDAMSZSbYUeD8m
+DLX<IXP9UhML4>TO>cAJWidKFQD?MRL[[H\CObQjZ5GTU@Sc_]T7KA0W?;gE2jPL0E=nMI?L=d\Q
+;?naBbk^0^4?9HZ]DUkl>4nUS<TWol\WKoh`GYRN1??oJ_m7[EDYbj^D_d_TI2W>`e9dg@UQ=?VG
+:V<K_hQD;lc??j?nkCiHGmII07n[U=WOi[50;=YgnGd]hiIOAeZlBc?[?kAgoGcaaimn=0Fi@5?L
+8N;REO=XR[?@53nP:KB=C07T8iV2eljlX`iK1aPLjLn?@6F?=XP`U0]aAi31Hfkg2:62c:4NH6><
+7okOW^8;jZCmndX3LN26VjekV:3:?WjQYFN97Qk6F730QSKI?XBVoL3^OQIB;OVS665dbRLIX^ZD
+:o3F^>7S9ehhH4JG5;EF3P_L`<4O9^RQR<L7g0UI]mPo[;[HH1k08Ga[];19jTLL\:A9WUjSP>@C
+`=1QJW3le4V<D[h2@kM2g293=2QoIHPhH]SgcC7heXS]<`iH@b:_LJ2K5?XK<gBX<PONVS7jRG4X
+R3fN==YnGBIoN>fo[2MngD6QS5S\`ha@RN=N58<_=[T?F8eB?P6[<OjGZ5iT]`\2ij4@k8:0M_\5
+ERmjNmH;_WC@jZFg7:PKZae:nD]2NSUP62nm1V8<Zoa<D9CbYEF>DWkF2C>Dd`2`lNXe0=PXII9n
+VWlSjSF?Lj0iWccWP7Di]]Lid5gbW@?VVN@JiIkFkGW:OFamaMG?0_mHg=l4?VBd1cG2A>ji9eZP
+XA_^O5^1XXbdLioUAC]\N_FTA]QXQc;^_=Q033ILVGQ71g`DRb>6Ycg9m8iTINV3:JhnfA0ecA0i
+NRFeh;ZhNoOKbC=en3gCZjla[T]d>oU>8ShChZNbkGW:X@VfQc8;\]AA1bb]Tf;R:8ebJPDhITlF
+LJGIWMH4FiW^Jhg@UM22J_3[RPj_[8B0_ZSfRl4M_6GNO0YUUe7]D<Zk77:D\UO;gE[UUl_mHO:H
+aAkL29<YkD<:i2KGR13@<YOO2B6LB@0IZGcFN3mBVNIeAh:lI[e?1?WV]ELUX5\=;cgmfX6b4m_1
+8=k>>oPfFA1:gXd\>>omf`73GG8;a76=mg@;=6MM^;T3W_M8ek^NiGDH_6J8G^MGD^odmSJc?ZWL
+3`6aik;7mRi@?_OWCjJlQT6@ga<k_R[_4UH[kj^1Wl[Nkh15foi_QX5;Imoheo_Cgg?91]C:aBHC
+7^]NV`9diNHf1CkjoL]W=0GM4F;=63HI<3LK_66C0C6bEJ[o:HNWDBVBahRnNQ0@V`2^]hQnZUe1
+3=CDJ>W\d146Ek\V9^^fi3KF]eL:1OZmZHM2fKmM]DXQLXemDm8?>L5Q7]AeTBlNJ\4?njVDZEJD
+CaibFOC3AK8lc3[bo^nNKfd:[53L<gENSmgnoo^B`^WVWZ_C;4?eV:lNIabehoceV6>O7^^iXg_\
+dkgk3EJBSfP;DWb\]`O2?lioYgenc8o?kSC>4jQ`gk:e]`bJ]fod]`VM[eldB7_mBU5nOGdonM_G
+;iK7>WhVbJ:HggnLoM^Ud3jC_5mV;W[So:Cnhda;[>;mBBkOl=GjBo?WOF0W?O7jnN:?Gn;Y5<RK
+Q<noQ]<Y3Z9CT3Pj1L0GCgkg[OG206JH>TDo4^PDN=32WJ?[54NW@^fRDkI9?>6GC_65U@Mbj9C1
+2eL=YU<L>MbKlS[5IO9D;:eCP8hIJ\mfWN8V6Bo\e2TLL7[=MQJ8?e;LEi26V52LEgWTR@^>VOT8
+2Wg4T609ZKDCAcma`1B>GP1aQI6dF:0;K[QLmL:enbG?n637PLF`ORS]<ePOO^eeS727JoMEb1m6
+Njj@7cmd=O@MVc?6Z2Na;13of5RMbR1mfeTP7\:J;A2;H<Smi2?NgILl2L4\>IflUhAdH[Xg;:QX
+iLl<0I??>KiXAYQ5l]3D5JB[\7GdmR\0LoAf;@OLJV65OaN\O76i>eRY8?e7QhQAj]dan>YS3E;b
+eFD>M5KFV@>V:N_VP6^D5D9j@eTQY1^;oFDN2gWEn1`dAX7LCki;XMba64@Ii6>aibKYhmZmCOnD
+l<6TnU91AOoG8469kH4>=9QmmP5B3k4FZUcX@8NYIcm\R9AbJ;n^RBcH^n;7J>LTKoBRE[9^7=;A
+3E^=jH6VCk9kY1a\]O17DRLM\;98jXf[2:A;=d`[fd^[WSclSTNijDLSCDlCm:@D^XAlD^_nC8PY
+Pnk`::=LkZ4SCmE`h?Q:E^S;<_@aTd6[nO73V\W@:ST^cS:C0HnXUC3nk:mV<Z3Oaaf`_4J2KJ7D
+I3NHM[>WV[aCl3\JR>_ZkTDZ7Nof9_S>:?LiSmMb1iJLC@Hk4[am_P?]UKG_P?dYk_h>n0n4oNE@
+\6W]6omlOm[[WDD56;k4SR73PeTPWPRjb`;Q5m5n^;CG7mBNB57g7mQSf9QX_Ol]?glQlh<dKNQ0
+`lMjeC_j_JkYa]@Y\7oTZ<71Y`Ml>7Gd_U4=9h?EdC_DFhJWC?MPOiUX4SeC?C<hF`g@cYTjm5?U
+\3<PI7g?@5KecjdhGNQ7UlXTg[i5CEJT:eGojGQ=2WmR@O1Gh7`;8imbIo2<6mFR7<kV9HnlNbfM
+_41m>ETmKjn@Tgm_lV54WGljc2DA^\Jn<HU7GW1hb>EeTRlNLS7dT3lZR5D[c2\G^DbjZ>OV9=^H
+neNNR5\4cY\GERf9ecfmB[bRl<kA@jhT?ibSIHMg7\5<LGJG[jj66_EF?cWif?C;M<A7MmbZmco7
+L1AL8n>MIUWjh6<Ea?9So__9KohX?SQNfF?oSbmi];[KQ<Z7;oJk54h54JE<Sh;`EcgINOGTDA?G
+n1D4RYb_Oj;mjciDYi67AgDEa;4ZR7SbR@CBkbmS]LgcRF5n_ROn]iUang`QTn4ID8YgSTSGY1a:
+PLa1:@2nNGk;m\FG1aR2D^P3U08[M:Cd0cimb3HAC<XbZCZT<RUJGNN7B@WkoH0VAB6[GSLYkY;P
+@f^C0UCh<]U=RU9<b3T@W]jC:3^H53S4O<6TZ<7@ARI5WL:K543m;93HY01mm53f9bK5<?16T2H5
+KK>g0ehki4356>m63WRDNo^A0bGYU2D7G=8cCPkHY?A^W?;4lGh4dTX7U`dZjPIK=?HY=ePoNID3
+GLf@E`jHUNh>Sgc;QNh;J^^E5iNmdb_mi0CV213e<1VQZ8liD1T6VJ=laZl^R6TZkRB@eUSL2j_V
+:=lb[eKnEQ5:86RfFkTNSnk:E7H\mY]?bUBNmjO7]WdGP7dnN7ShO@gb:oZO0`GTm4477<a>AVf@
+PZDeNhL>N9Qjm\<6M^;`hgLE7G2aBl9iMHGTAb^lnmd6[[DkcjOjR0IK\W^T0dffa>lmCTQNJDCW
+?FKbh:FleSeOZ?[ThGOjU4do;:VccD0n>NhM[3k9]Gle@U@:gL55WW;IAcI4:ob=3iLfb5VV`Dl]
+6GA5dGT?]FCX2PSd[EXb05kf`M1FG3:PF`bk5Ye;1SQ7^K]LBeC_>ZP_S[E1dQ?a`FB0n4D5??0l
+V0cDSg@db1\nGdZG<26Hk4h1f`fc:G\5gFMCo2?J4iofoX=j2AL7WOMoiNL_HGj4SYdm2PGj[WU7
+_hl\g3Qj_2R7TZD:4joZeLTZiDR6gP81m5\JZPD2b=bmBgO2Tdm<FkC>h7dX1G2=OPeA2]SLSVlJ
+iXeg^oC`cQ@8X;ooG18RoY0RfABTRaoW]BTcfIBoKL[cQo;4n=@^nknjhJ=jbH[W9N^`UfbJX_Dd
+aFmYbYENlP]9m\Clo3?Zgnj3mUe>d>obMeA_Oj^WCCW:Y]`?IFciN^8c;AWm`58P>nXhiNmH2YW0
+D_QDYS5UH0XPGl4DdWWISE?=OZDMlQGD6ng?5h0=DjE<n>eJ^h0=7ZLk7c30RBKo?XAAZnGa\11O
+@Pjo5;J0S35Eo;g_0`M<\:;aPTjb3ekHmlH;7_A`@e95KW2PQdeoL<08[K^`F]Ubck102big3L<R
+CGQTa9L<TD<<fAHb@dI_]<\I>^dM=7g@f7C^Q952GDVTP7RTA2IBS5M?O73ed4ZbVP3aTa8j0N8D
+9OA@fELLZ2GAGQc`AA?^b:mCg62kSEFW07Ehi7nMh_QQlSlCT`7HR:F3;hXMiD1CTCCUP5D@j2j8
+En[^Hi:gf=fI0_ib`CR3gd[aRlgNeB2OPoC;PL9AfVcI8BKCK>?ZHB30f]dLl0f\m9?7<D=dTX_9
+@7c6B4OO5i=QLhj:bDhgY?59<AVW6k[o_YS\EA7[_a>C_J9igVX89IZid^0OHS:Y5C[MNc5IbN:W
+4Y>MhEK[Gf8bmY5_obdV0iejhL<OUlATX:\TDX<GTj5=DVKh9BH3?Y5XW9P<\:T7;bN8[hEMdUl4
+LGXF;aW0OeA]\=TPokW\>jVSUOM9oFW\ocaabfKOl\ok\bodb0D=6M[AhlS@1m>eC`;M]D00GBVj
+1@:jID@a2`BN=VK2kQO;HVJP:I3kABoH59f;_79\Q7fU5fk^>KaPmgW??XL;m3kofFMaoil\Tk5E
+\TQne:DKSClinlbRWMog^9B=G<ZW;\G[@[nB@o1FScbUjadgYTTi[4fI@ZfFAMfH<DCXKdM44<kM
+E0Aagi]i4C_?_aeebZ1`>[RAZQl^TN5QU]M3_\2D2C_<7aNie:[89`ne7?[QHUPHa4KMolbH_:;J
+c\g[ZYK8ljINkfPE?^j9j?b@@hgCLSTo==E[LgJKAe<VB[gUKkNI\NZGSC1kL<L]Nol=3AKlHLB`
+48P]812kaa`3POP?Z]clHGb`?0[`oglG7E[]KH;U`aOmGA;W`aN7]5jlDI5O<aGgIRYC3M_hmNGj
+H7gn5NeOml5jPc8nZ__8HgnKYe@V\R[OGlUbZgnC[N??mlP_9LkellDOW@8Yl6DFWe>W>8U>L@BM
+@RP@P?R4Dm2;Im9dCWUj@86JoOXhf?me257`kIXkP@\NRd^a1eZ84Cj0P1UjJ:ELRBmTRgRR;dYi
+h4FE1g5hi2SUZ\7\=9IGfBgiPP<eT\E;\GA``0Mem`L;U>1bAk8BCohYARPlnID<LL<<[EOk`X4b
+VF:lZ2<Ugf0Q7g1jcOH>1oYP]7Sb8BDBKnaA;7341LO:O=BnB:704IKPW2;UR@>UZ?Z:0jk0e7Sb
+5QEg0gma`j_cOf>4>3kXLJ0a:^X@ffLLZ1JomYX6^L>foHJF3jTmYd7fn:6[Y>oX1=`XmHCFaibL
+[o^CUA6okW0X@bc^hE32F5o<29MhMalVnLAUChaJQo4UAEaTmjH6NJCTC`h4VMOI7h_e?_FD0eF9
+Y6SbEnW^niAIj^iL5[SUPUF7^eTY5iNmJe4G_Od;HCHn3<;<[S47;5?3Ai>OZKS?015=g^U<<3Ci
+EnJYb]\IhY7EgiQj^79E7R[iLkkdN;CGkRhi536bjo>8MFcKme3iRN63B_Ja<B[jc`434md97G2@
+5?RP0aFFA@aIe_93eK<O>U02j_ai1JELm:9?`ee@mNR5;FKN@=>W7LZF?SY@I=8kU?9TSO`AeT`;
+]3C2^V>[JXBKMZQVeYL=TYF;gcU=\=<?A`iZ\b5j\]`k:N:BJom\\<CA7]H8DkW\8k]liK1PND^9
+\6LLi3=7FY[]JHf`UNZnfQ1]JNb]3O;F6=TUnmD1HbUJRW9FaCefmMH:Sh^eQ_E;_O[JoBnSg14Y
+MiWEZZ?9^f]8Gbkkcb7>I86i8@IAOIQ;N78]:hcS@]`WDYJig<V[W;W\Ri\<j27mf[_903?XATXg
+FKFK^\T0noBKVhaoAiRka`1aWk9n2oAWLGN6o6NaoiM3a:ZiMoccoNT7?FXA=Hl=n:=8LJcTfA=4
+Nn60<0Km8DaKOf0kUC;\_j2?HXVQ__le?gn1l`<fK^iH94o[UFoZmkbb:f?7@?oHI9E\=Z?^UlYQ
+^90ck1kdEJS`;j3ZMZ7?W<Qc\>Wole_7Y9ldX`eFiIeh<Wo6TcWJY8IambkM:B?i`8TF@N\[UDma
+3hEkJ]bShUi=A];N=BC`IDoT73^dHIW<3A]5c;g[APd_nFo98dBO^h]0L[Ob8HJNOg_ZE<7PF>_8
+e0nGa=2Z^akZ9E56f57nN<RUED<nXBX??JcclU3[b?]GehQ=HC`k=mBZP\nMa3Mf3LTmHdOI@Wdb
+3i\NkWVjb`U?KoUZDTJ\^obeA7gYUb34lXmMn_kcR0ki@haXNjaalF>mNLXV?>Eg7NSi@gYTM<=]
+ojMG^ECKF`K=TcLjCoVLYacbBJMh_TkAKIfbD]Ka2d[fb?clDnYOkh?fGEKPkg:4h8WkFckcU56o
+cNoW<UlnWo9<_mh7on\PGSmOo?777cH5fF1C_3eJ^WWci6ARDk080Q0f1KUi\Uc^[CT75;8Yo3R3
+CH4fnVQC75I=6L:VC1HeAeBKXZ[[n]RDPaJfUgBKhR6[G]\Dih[@8j]=0F[h\]PfAE5:a3U`m4[k
+QP=fY;4YB<H<;Fb:=QCJJ5>D<kQ=0G9RAI^R`Dl3f1BPXXNh?mVV^52^OKe]2[[Y:i\<D<5VQFBC
+PK`g\2fK36g7DQhCMIJbC<EM5XPc5_L1TK>DCk5bU_8eE\iGKh?ZmLXg1hXc3hW?YKSMh_Fh]=Oe
+^N__6RAg?Ln1m[5^gh<AcP\G9am;n@m8nSUPX:8kXPD>lR`m3N;2;UWfcK9lb;[f=8PCbnC;mm9b
+6o>`WUgPD:<Fg_ef8d8\QIQWmM418i?NhD2LM:7_^iaXIJV4iciD8N_M[>G8\6gaW7c?_>[YQbIf
+^XWFUnWN2AM?[_gC8RjAmQ13_FcfDBMQiE37QddMl3BS?cG[BkDm]B7FT]eG6j@]UKgEPEh;XoDN
+_SYP;1:eUC`;RAY3fVYQQT7GH7g9UmlLhT\hA]FkG>j]>T_iWTQj^N`o\;aYk<4=<YcH?P`;g=PG
+=lPQD?MY4hBUO78SK?I1DEMNKY3Vm?e^B_:IhokL265B7]d@\fW_de[PikIGd`;GHMNX;b7=EWCW
+]\1]_XDW:WM[hm\1_oGN3b>=LkV3@YUcg4N6W:ElVi=>E\P_`nUT9nQkFUZOg[h^[JNg]c_@Nf;I
+ggAl>^Ca02lMl[`3eBMEGPo`WT_k7D?lXUR^h?Ul\Hn`kh3mJWjWlUo5oEl>1I_F__7?mjLOk9PE
+]5_N4S^630n6DIh8^\\3hAOAOQPE?jPmTJc]?k37\360m=oblaLb?dSCiTk5l;5NmHin;fWH<GEj
+E0haHdF6WXUV?NanD@1CY4hWDYN95Z?^`GiBIFHM`=jI4d2DLi8OSYj`coC2cLcTPmkW=I?72GZ_
+?i@lmgn`\]6E<XVcKmVFGRkGPdmB?MogJOjGN[17Y7SZ`Ki4R9U33oY68FfJ?MnkK4V7ISPkLTCA
+MZlK`ABoUKa0_FjWK13kg\bCj7WnKJUC1XUKk5^BmL<V=8BBG`oiPZ@\m31oW6ACZbBO?>Bb2Koc
+lY1[b_eg4gH=MCeKee<[PllMOKkAZHS]6Sf]dc]6nN;K;SfjlaA>1ZYU83PI24en54h6P?Eji:kO
+1onkW7Sm_?777l<Ph3a58DHE6_ZCYcP=308i=BH<30;0MmhhdNcfb;eK2bAH18=@UaD`2=R8Z]df
+`22dJR`<`\=b;HM1>5>l7<UQ4<[eb@FQEF]K^20lm?Q>5`A@2Njc83@lnGXF18TM=WPfVo:7dDPQ
+3O6Pd_\;Hh8U:YQXHj<<DDH<2C@@Fc]I]A<7C;40]BUGf?Ta42l\kSHVn<:hkoJAeHd?iWQN;4?<
+lD6bOADZd66iQHYS1k\:Pe3XLImP43A0]OG[PaaXV2GD?j:2;kDO>F2B[Dh>^0C:VRc@b@b;FZI1
+:Y<<SQ_iDh=4dd8lVbMDW]:[QLXZf<?9Ec`RT92[]KHAB=1\bnZ@U0S1:7Ce<X^I[SicX3A9FG?0
+=O]A4=]Xa7;USLGmi<Z>aAk?24<PPAo9`X=03cR\IXPo5_N7?^BI>PBBffLWT3bUWDoi\4[RJOfR
+1BYb[nlC0LTW<_h2T9``aoDJNWXEa8o>FV;18`oii=@dgQZQ9XG^:XKXPY]SNaNR<GWhWDR8CC\<
+J97=99lLm`h?I[[QG_fW0hFVeAkJ8:<IlZP3UEJ5C[YDFb^6bi<LZQCJXoBd@JajXOMGkB^cXJ_8
+Ecmhm8o2gG;I:JEITB=8JiGhm[7FPFi;h\nKSX<0fCGk[`<5YCG\P<=iQgMU:UhDZ[j113;;`;E_
+KXC?]?NWB=flmVPJmZT7298g;Il;E5kkD>U1GY;lI[AW9?VF@kLk<4PP:c98F_2mnTX6BB>?<4Rn
+5CkNXkX3[^NjIh?HkT?1aM^0i;\FMUn^EJ1[8_e8ZhAh[f=k6_;lh>d?c?Mh^N3g7JS_[7l7o8Nj
+OcD<G3[kaSoW3fHm<VKJEJgb`K8H5?9f1M9NP5>^;k3m\8Yb?anlDaWkCfQQZ0Aoom6bO`?W1fcL
+k=687WL:HTQkSnf48GeH9U4cE1O5DLZUnhGRUb[LbdCR_i3N;7_@IdgR=MQTMToZ5Yd5<I^?i7BQ
+kiQ8o==4h]6Q?XL_\^Y\YO9jk4YgmQa\l_Q>DA89h4g[=]]DX4[J7JlXZ2Y`GiNAX_YA5OQcZ3h9
+eNm^6e0TGOmfeNZ5b?Fmg[78\GNUfSdlQelMWJ8LIm>Fg_:7lPQGUdl6Z4_mJ35\k[9iY@^>WCXT
+L>lLFJ\<iPPNgjRC3_]8Qo2Mc^?F?MaGMeWajReODB2m^oae=^GB;aM3kPif^oCkCml?m8\HhOJH
+Hn?7j<7>>?UaoS^C\9Sd@f<lM4ZL=>;EMYM2mDX>QKooMhVLI^Uk8lVcVQoZfj=\aXMimb@Ko>5\
+h`NCjXGinFOD_md7jkNLT;oUKeo?oSK?gfE5nbjo?jcUUPog;\L[^Ykch_GcaQmo@24S7ABbCe:8
+OhIEb61U53:0?]Ddf?=BjaCbAPYIgDhXI6S]kALD\SX<DlPNORV\@QI:oE`QZo62C[9[BNnoHlPJ
+TRXb@`HZhI4A3UU3Gbmgb<CbmndL<]ZgRd?V7SLO`KAD`GEA7C;@RaKFN]4;AChjj;k0<@hdba?o
+gKo60F_dKKMa`9^\fflL:8N7K2BmdbKSkK_70Wgll:_MnQSQ3jomUb52lF\?;6ZX4^Tl98K]QEST
+@<MHICmVR0@WWm@PbmS\B`kDc1Eege2Eo<V4JP_SnL1G>_QRf56T]6S\Dc1jk:_0j>?DOZF32RC=
+LZ1]5S[8O9L3MVViFbEo\K\omAV;WBhmQV\VP;NB]WSjc97;BM=Dg>UGP\3g4R[UY6maDZKl=kHb
+iN>@IZIl3]8\jN_4H\W_72POhC8679og4JK7P>>LX`OJZL\nnf1C^TS;;UnXYjhJ:TQ[<\UMT]Bj
+BBIi`]DfFl3Z:8G;;bNCG;8k1]`C2ahQD:H<6W[[Y0=EmTAM>iA?NVU5Timgd`@iNOQMd`4gfnC=
+FiL9o\WakTkijHDMQoGATJlI^[m_Z0>==<ZX0iIFbAXkUD8n=L:dPcTYY5D;_`hf]D5FL5lO_NZ0
+[NVgbdUN5nWNLCT9eSYQbN5bTR6<`cONX\IJbW<Ko<:cki;iNM9NF_]L>`Tmgn03EIU5jenW9d4c
+Ph5R`KH<ERi_\`<mYkho>f1d;PW\P=>Z1ilV1SXecb^YL_^PcA]N<f<hLCIV_2a>fg1ddVj=Md^8
+ggc_3nPiUcdD@n`TiSN0O1\dmOab1cZ?PZJM4B3O1ZVF==f1eW?KdnCKNjBJEK]Kh;\E;[gl2b?l
+G?Jh:WdJ6e9CG`^WX`G9ga<5ki7SOE5UU4I`H<ojQEbGi4ogEDF?1le`d:C^I9@>Xa3g4[XYA?n8
+m\B]_OnPG\;5@NOmSi[mBiPOXF=W1hC7EWkOf?M;iQi7So?8AlkZ>oQdP7ooSmh_V^6ToZ55b\XR
+IGBALYU8NHa4NVK`VFReofhjM>PWFRiic:47NloPTO@O;C]jd8l=jcEl<FEf[i;_o9ReYl<nNDN7
+eGo`^EOI\7Y@2?Z6@ekU:hC4FeTMRQTlhhHeQ]iVmIY[YKIFfOYEo1]Y<[KFBg4b4`DgW1A;gmd^
+T2Qjo^fYdj^8bS2gk\ZZMg8NE\QgKoUR8aT0oS7U`mKVlLP;ECnL[=WUlTVG73me:>3N>K7Hh8hV
+0SYcn=P7XhMLBAHiI]Nnf@Nk`BMNk@IGG3LhNWM`fjGOOoLKh0H7mR9fnkn=9kabPc]_i?6=k]>8
+V]GmD4nA???3O2;iS0ocU30;oVRflD?9m3XRT8MeA:n_>SkAMAfA?639T?mk5^gHbY;1g[1T07fn
+fJ3[SAlif:>nb>nBgGm4T0COJjh8>WS<kSall2[UkTDoF<C5]^W1ihYcmjhNg2N:iXRS1mN3aGY`
+Qa[bo:0Ng:URkkn[1`OJ8an7@`kHHlRQlQT>]8VR1eNIe?=f3`^\Ogm4Ccc`hni3>=3SP_I[?h90
+VbMFW;f90ijX^:m`Z1DZ6KXhHOl1:UW1[kEGbHYf?Ym:1\V6n[6_B[H4m\Og:QVb_;i:AQK?dh?_
+90=?0O`5C9ZlD=WJVicJBF6GicliH5B;c=ekZ9DY77XKf8[SGWU85ho^jeMNk?K<@kY\l<3a]c32
+46TG12eKn>F0HF:a@jjBBILcK7NaWc=2>^BW:JU3OTd:Djm\8hDIYNfCSRXI444K[eO980YA^dYf
+cI3Whj]T@hVkmeC9SW3nk1NEk4:?]j]TB9194eFbHXgjZi9EM?mOUHaVSomG9J<[]_iAbAH0W:nB
+\@S^kUhZFFmkoUC9nSUK9B_\U<4Z6HeK\[m:QXbI[98Ek7E\U@b`<:\5]4X64DA6ZI:1V5YL9N=M
+LO_FDlU01GoLGREkBj@lhoW4jBkDGOR92aH6lZ\2_n_PllVgZ`6OF;kFBXA4S;GEB\Amd<jMg`;g
+<@1o4a@TOdo6odB4_Ra2U\fmhio_MgcfTHW36V:90?nJHQnFR:oVniInkjjn<GIlF1HaLoT=?A]4
+_AEPmh]U<OE_f3gX:i3RMj6oP1CORCic@\m1Yo_oK1FSO]8<=hE4kZcZ<_[jcaA4kD^CnPa3^aR[
+cg^ZHNU>2]2CSkn?fWo:HB:HDa715:<Z4@bFh5VfZ4@`CndjjnBa7M?f[FYH6m;C@_Xfk6]Qo`H\
+CH[mkAI12Sgom[CYPl4[kV69oXlU0R;Wm:QH8Ralk8?A@jhX]cA<_=T7Y`^9[c;E^l_0RBmoUH=]
+fIL;^]e11^SK@A_lBIA`^d@N?nHk9mS9So?OJIH=CocPn8:fI?O8gj_^;XWbALdm^_ng2IfA8>n7
+O0XV?SoT5doNn90HK5TUj5W73bKI4o?ccjS^^;FB>?SKo7fG5O^kO3jW2^Fo8HCIi\G^goSc_O2o
+bGeO[ocaCC8Tl9M=Ih>JI1;199<h91V@WdPbN_5do5`gE`hXD;=OWh39;9@Q2[iMLbM``F=a4K03
+9`bdXP1I7GYXYE`RNCH`MEnAk1DM5nO1::5P7Ub2X@n91;m@93]I_1A;AC;@HHKFZggQ@9U<TDMm
+PA5_@2X7W6HX^k@FbDA8g65N8EhO6GaHB97\A15R31G9395GF=c9Ckb`f5Mi;cCfEXIh@k[mSA7R
+n:37PLJPWA53;LfNLL2JO=][V:37^_fV@O8`gG>8X:N;Do?LHkST7\fV2j@?[ogW?_7[3WIUa2IO
+i^30SSSNYDc`R4_^dl4VJKVC3UHUknEFCVYhO<e=FBlIY5_j9`N2c>\\1nR2cUI?XIYmDTWjb\Qh
+iD3Ij>eJ3[SE8]F6^l\2_KSLGM21lWlc@^2E@VL<[_9HPiCJUf6JCLZI0jHIiEJ`JfRiDFh5fldX
+]a;oIEh8M]Gh72:]W9PVgdD3^f=aGa[HSf5cB]kSf[g?0O_X[4VV@ooAC0mmY9dkf<XPRg_0`8H\
+mZ96>9BlNkj73I80iDmZQ6DCabam\D6JVR7NgS\jh6>jn`;@THX6SgBPbLcJ9c6h9M9NLJ[C3CeG
+U>4]<bOO<nfW7YcC6m5?SW]G8obD@hlKoJ@1;igfd8HHO?EAJZdK_9hCk=<V6Bo\ZaH82WK>oJGL
+Ebnd^^eEPG39]KL\83gB@dUO7BPfZegF0F8`lWT]@[QBV3kW]`jHVfSfG8J`GkW[@3gO_`h0@Ud>
+1T<77jKbG``OIm;H0HlCm?e886dfNc817@Ya6@5mBhbCLfL7O5Im_`9dV]LM5J1[eXTWTEN[lWUe
+Pe`G@dl9_GK0k4Agm<Y]=`XdRmdVj4ebUJXgglGCAT0YQo^0XiCS3UCN4SggDkeB;bgAZ\jK8;\>
+7YUbNT>\ikF_Nn^m\7ENgAg`?M6l_^l>50OE_0?>Pj]NFNm3ajEI4L@mSnkS4?LMDDh;N<3m;?Mh
+a?gl03Eb7W7oUd?2Y]7SO\kOhgZTCY][bHP05WWFS\4gm_f[OJCAhd<cRYc=Mo3YP69O7[eO=:<9
+FcVD[Ec98o9UXKYaQg[=hZF14Omi50M61>b4[5J`MOL^gDVEGN13_j1e1^mS:c>\7_B9AnB_AU2n
+aNYCkPbNLJ=JU<?IZUjkMW;UefP46J1GGdfeCjDLSU5fKoW2[<dR1gnLl[2eN^H^<fCMfg<4FME>
+NL50o6PNcP\6f3mM1gS1P?bGm:PG303`JjgEGS1T`@N5S7a@b=hGj6`86A4[I3a78@?HcE?eKano
+=j2@@^Jo5a@bW4GLO\01]C7\T6dZkHETDG=4ELRZU?:?RnP5[eU4Qb>R[TC8cQFQAeJ431B9?SI2
+=U2iTj`oNXE5E9\<UgjcR>Sf3`QI`F;OAlQ2B_<RI:173OTgoHGBc0BK8PR8V85IlnW><D4KO]ee
+;?26JoM1cm5hYn@MJF7ck=`O?oaooYh6nL6<?jSVn;GCef75=NMR`H1:5_5UDBbH6SFhQ`GC\T55
+\F10aGdA3@\6NLPU]<POlh1Ki<\Ji;C8ca`X7JEMc@7G>6J;_8gKjPI[TOLc:c\FNlblAKi]g8i7
+Mc\7_:?:W`GZ<Fb>@;jWMO^N0oKeb=7Q=dWn0i527o9<WM011kG??^Q0QEDaojbeo=2:1Pgc84U7
+;canhXCMV6I@b2h\hVR5ehIS4B71NDXFDO7b76DAoJ;aR[h\8ZjC_ViN5Y706IMlIQ6mJ\S`g5P`
+=<oVEbbR9b`Z`29J8^oiP4EdgM1Cok>8N5odF<eIA5R[QAT6HL5h?1H<X0_mOLHR@\XG^:`@_QDj
+B2XBlNODmegbJ5egZ4WC[0^OM\3ZE3f_\SZE__3MJecnRNgJ3[SM9Unl_=\2_G7G=\5___^W1mni
+k663\1klLH<`X9lI=7O0la[IZ]o[5ZS^P^67Tm9jikF_aHC_Pb`og8j1[ZX\8YB:GFH_RhP;`HEc
+\XS0c_amG:O4b<mOAXl;eG0`E?\Td=d`dF9m2Mg7[Fkm8Nd9Sg[oPCf5RhG>nbmEnaLa?dC;eRj5
+2g;Umhg<HJ>:XlN;7cW;Ka]^`=<3AnlKeG0b4dceV61>mf1o6JIjk<6N<h<Ki=^M_NK@CiG3JVCn
+[Y7iWeGQAhOf7;jHM5^AbGNFAMVN?T?=]9lRETo`GTD4f8\oB390]EjmBTD4I;[S91T=^9dTLmMg
+fO<_7]6eNmQ?6YV[fhSZIb<NVgkIR;8g\]fZgkofU<0OAPc346OYdg`gC5inc7nHo>J?hX?S3Mcf
+of:BMZ^kCJQl<LNg]?m_5C`OLWVOi=>7G<hGnKF@N7c8]dAio66]ho?QOfQnoTWe[oM2jDT7oRio
+gmOg]ga>kJWOi_^SAUinjmB=CfWkbm\oGocY6i`T@hXOcaHo9dUf79;\2bBI58Xe9Xa:1^@cUHaN
+JO4]DlcaK<AU5D:TG7mn@98kY@:6:;aemX0R>Lik82N86FI:_h0fNAdTmDE:_V7H`ADa`PD]73cL
+0`5]g71_`QDLL:5<fPeS>O83;^X``@Mfnj<RilR?0;G1IYl0J\=V[g2PBjY8:JHG3YSQA<7EVkgb
+Pe20PM=gT41MA`8oJ>`O4_RA@AL?3b4f9hTcKim8GV94VHMMJ:@90A1SQ>C8Cj6U@f=OhC0SH;K@
+VR?No]8PLKa@MH:aR1T01G3K`<1^n7EG9;mQe9[1c\UhQdFlhdO?a;fal\LALhb_Ub7nL2Tk_8iO
+Ni0\;A_\GOPQ1bXVR]j[;hghB<_\A`jDS?N^i81;QO;NBZ\V?[WQI?Dg<l:K@2_2C`dBC@]a9e?:
+0JMhb\X1ZcCNYI2_N7AOlRaeMd[Nh]4mV@biLQX<1XSf=`N<<a=ki7>HmlQU<WcF7IV<RnB[F5\V
+hcYgI;:USaIX2:Q[U:4GmQWc`DZIk7>W=<56KZUW8VidX\N3JJj?e<De@TaNRi:M=URYnbSI4fZ_
+e59F3_6To]81<g?`2LGZm<>`iTgDL<Hk1ng?5?M?1`aE\ae5O]A9WCYPZIJk=?8YVni;W\YdPoaZ
+mW]hIB]@K_[E47l>kFGebfF?\O[Bf6LKY?JUGML4Ked@HNjf8O:bRigG17^ik;];O>WUKZSlbj_f
+?>;1[3af`64SJZjjhB:=UK3ndhXKhS@9_dm1G0H2D44l:n6F3D8`]`dB:kL@3:P]QO]N4H;QKK7g
+iA>20AETgfPQV=O4_k5L2>H=_EMO4X:A;XEL[48`8iCk@a^9afNiheO>LjLRh[d?o[aISN^OAoNe
+4?j>>7?@ND_ZU=oGRigbORR0DmZCL0L^WGgSGo>?io8U<GZ_F6A0o>Ved2:SNnXMoKk]C>;XlJ8L
+B]KbFoPdPGOWSMiGCii<8F^_@QjSk\5nL\Fa1gg>59jXK?omG>W@Cab<2YWO:FCnh`McWNQ7IoDL
+_ZSdPiG9^gd3b7XBmi>?H=JWnPQ3n@QG=f`H\;M5WVTf67;\D0clIZMfWFdB<FG[iMdA<Z3GMggC
+<7?NFJ\OkXVQT86o^o?bE\\W^mIF[54PnnK1ED_TNA2kMf@fb?KAjcg^o73_l^ZGNfABb91dEoOL
+7MafjOM?]GkT>iX>8@>kU@8Q0`2L^EKScoO1ojQeoKcaaalPI2@4@WHn57KE^0PI?=4QQ0bP;[G;
+QY27Fo_af`F4C>oE@\S`D3fN]c?8;V>@EiCT5iIn=\P>E[SZ9X?\Z:6B=S;8[Y:hUe@Kj625mCOF
+b9B1g_k8414P7j65391?D9YS]E\hh4FAk=gf3@Qm96gDVbCR1X]kQ`UjZ>4W>j5D7CCf3`Gd>:72
+Yh\hh4R7M5okT8PW?SScZJF_0nBO4:@0nA@e?D2nhT0]>>G50EnZI1=IPLoHh>3=aC7271oLMlTI
+[SWlfV]h`V7KOY?UQn>Nba1kk917IgLhX:N;W2<^B_jSjgjX?<B_>g;UT0TMOnD@PHdho\[5376:
+CNiSD4ilmfA6f:B79YJi1:NO6kkK[I<3?YE8?:6oBIib`NW[RDBTRlHncA2eF>iE@>fh]5lcA2ij
+NeJ3K;?253_\1K\[bef<o0\1V``fa^9FCHmaiIT3UZVhBd><TONQ:6EPWk8jA_hj@cB<O9_CS96o
+<D2gei`3cS5?T=OYf6kWP7L`]NAi2YLSb>mUgKkW@?dl\L]n=LWoE=b_T`MiURkXP8?IIan4h5H=
+WkCLd04?VjCM4dhU;e[Qofd\V6g4I4@\f837Tbjo0@:OI?M7\KS4PTLeN;b34SODP[UN^6JG7?:G
+EC9WV:LRK_;`NjH3KKI5J;L>8NoTddh;o?C2Yb;oV<YZQGNO7@Z0R28MaD3O5?YmZ@>M5\Eh4AlU
+NdFOgIVXbUD;2`imaEL_oOIF2;[ZXK>ee30CDao[@3>1UPefKI=<]G\Ii7K4HLMfR`P_]n2X0gOQ
+D\:9GgJinc[P[jkIcF2hAo[ILCCb\@mJmlXFN<c0klO0o0K`I@N0[BWRk6GmK899]moXb3>Uo@TQ
+mA2>5WY??OST8MbdO:iAO^e3Wnei3O:KdIjQBKLGZWobMX=dIkYg>m1gb^gO@RlIM;P3SADekX3U
+;E;<7]D]l=`5Cmoe_16b6ceO>5gX?KMmgH7JJn;d3[\kh;\E9EK?<lQk;W\\TAZ8Wfn8nSYhLQ7W
+PNicJ[m_T?an^:JCg6107Bob<M7RjIOBiM21=lUSCg1:CK8_Y?g0E:oWBQ<ke?l3O@b;0?gmnhcU
+2iX[H=oL\BQNe_9kAkn_IbE<UbOU4;[`VgPePWOOUNjGoRJINiWT6GH?n^^@WCgX\bKa6[Sioeim
+5_eTVF`VVNnHI?j9Eh;DjDN7nQbnb9lWTlYgVZ47^nMP4kli:8To`e>Hc:WM?JYOFLf_?4BERXUS
+USfALnc@QVDb=jgKK5?YoDWG[iYA3M97@oYKk:=QWa_kT]Pkk041d?o^[=TS`N^k_O7<jO^\NQOW
+hJdVMFoebVeDO?TSiHF[cB]g>F7ZQh]RMD>9daAKE2e2f3L?[UH:Wb?H_B=Wl[@?D[Ogf??C3]J]
+NaST;C=^gFFM_4WGK_<MedUO;X[L;NbfjB[fPnoTH43m:I9@3PIPkWC[]iV1_lgO1n_m;Ylgm^Zg
+n_iX=[\l:]ohlge`>APi09BA4D3I0aLeki0D:9<:@9U<l\T0odD7@mXdbEcLc?[f@HBZmNL7:;UW
+Cj08B^K\O\:>hi\N:90XJ]deH;03K[AJk:8<e73LbP]8[@O\^9073YA85Fj?5nb25jeFeb8[1bo\
+n:h64Wc@faoTIYTl`X4V\MXW7;12XmDAGcRAoJlBk:649enO2E>GB<`3?na`@HJb@Cjjl\>1@SVR
+k?j28ahaXLBJ6T3BA0T3;:RTjc3iT`I9MDmaX9FD\^:0;BW^;PkhhTFI7oo6^<4Nc?6lV9m`O91\
+GfLLZ4H3^jI1k[1]_`6D`g;?JI0mM[2[Me3<lD>?noAa`9mLmal7Z;InOI033K>4nTND5b6C9P\l
+hU;kT@<V\ARmH9Ndg>\S>\>RUVUlA<F=k2?b\gTn8]0]5eb]]Fe6j<EUkhZ4YO9OG_>XK<_Zd<40
+m7>Xm7Rdec?2BNj76oU8U^L0jN?J_Ll4oGcPEFlj6;CR^aeYPXH\mZ96^:R5LSIoR>L_noaN2CRH
+1lMOI39_RSbfZiCh4Lc>UBLI5BkYP9>ImW:l0eHVf5j9P;h[l^S^N;2I921W6XB[Q`Pf60mfIlJk
+<?VW5cgNamN0C]Ud1h<h2U1=DJIJ\:VF6L`A7QoZ:EAF;ERL3:KPnlEPcRd6hg3YGmT0cVZcn<jU
+\LmPfRGSVJ2Qa:d:oW`99GY9IBPA@`S_KHRo_7;o=D5R5W]PD6NndKf6TnP4BonRRHlEn?dHGBW:
+I0MJ4T6Bi9];a;[71@>ZOM1dPKUPV8Nh?B`G3:S`GG]a`IARCST^V3jnhh8QO48^V5NQDO^;i?68
+`:G:?4CP<;2m3ZHOM1gGWdOk;IMo\V26m8815KU>fD0_nbnYdj5b6;:B1S7J2kCjnX;J3iGJnP?K
+jHS3oP_j:1JEm?e7HUj0bKQaLlLRNMXUn9ISC]1S>f?\n;0\8PGXQYhM8]B=\O_5\YQnIL?^@Eoa
+OnQMj2mVaGNRcic@Lm3Yod_:e:RO=<==_l:MfNZ6K?DcXj9mJE:ObA^YL:ZBNDle;=gYLm39_M]4
+]N<O5X<1k:aEdlAPP<0BUG7gX]Dk>Pl7TGM_n@94WXE>NYcb\;Ej\^A3eV=@FmiZ7GWoL@kWXH1k
+ilAJEE2HjPEW3YE`kbQKR<ij_7Z7ng9ih]EK_^X8hmIMoUY7N>UGRb5HX_K\oA1oB95\Sc<^OYaG
+C9a9C?aK9Cmo:4n<;gkNOb>;M:fmIM2lTLLg]_mg:Aa0W_]Q7X1liXOimB:GjE6nOLP57>8J?i9<
+7ib_Oj;mjckXU@941KjHN:bH>;nZeVoioN6\]WVbKcTn\OEocZnO;okhAAj;33kRA[je5QVdS4D6
+D4dcKCn`Z955W]DRbiaKI6Rd]el\\^XT76BAoFE`1H^\gS\]\ZR<LC2bEgCo?@\S:mB@6aPIZ8j9
+lVYTmGZYTLV@@kU_Jf@dO]d\6UWe\_G@b1<OG3eD8`=IOT4mSKcA`OH3SVUT1onmGb>32=>=`3]P
+Ciml\eLOX`=lgIokR5mg6>@Q4k`o\656Z<AaZDAd6IEX2?E;4bV9_?g29RkXJ]`EaHGb:1]j9MaH
+9US5HYn`GacgZP:oN;AO4;2;gYiEh9L=dRWlUP=eiKP_1oa:Mem;7:KRYT^?KCGVP6DYK^G\bI41
+T8?;A]oWBD7BOcCPiNRaVa@QggY1BUCHK?>TA5M94G6MU>P;IWlC:E4hM2UaVXYQlldk>^1Sd_\`
+NJBR`B<IhbEAdUf3b2]mZ;H]:PMdZHFCWgNQZi>7glTSK[[Q2ln9Edn>N`N_CSOdF<a?d7QC];mO
+H<BSF^jY5VQZQB]]EZZUE@[E3_8D6]?`el@BP;Y:ZSeeJKnbkbh4m:\MYG_70b]KXRUEeBKcVZ79
+h]Ljd6e9_7S7F`O<ECAk[P?]a<Z^0oIVXA8QN@LOm]N;HHK]6S_PLH:n7lW02LbC6f@1bYLMZ;TT
+IXj_;_Vcj__=a6UNMhB1[UTW7Y6hFYG?ZcgX=]SW3ZlM<3_A7CYH<go7;KUidY_SgPVDVnongA01
+3Gjh3QL=O]b1bU^R[>];1l_6O9Kf73KN4[7658UlGMNmC_WM1j]J]]FnJn7Bbko[L:dmgX7V;\:l
+0mKGb=E[5dRnQl@]0Yg_AmD6VkfPOg:4_J1Ml_^RE2_mGbI1bfKOl\olUFc7[22?3YKHlF1I39fb
+GH6d5hA45mQn6:oM7nS>63Sa7b;L;?KOOkC\gl3i0A\gNcBRamEl>=W1Q[G7bDS<nBU`<V1R?Agj
+ZG;H6E15gafPo<m<i4N7mQbnV>cjU<UgUTGIW]h_CK]aH?FOIG;bmk[@Yc2PO=DSLF]9[M`YG>>6
+=O3RVmE[[YVDZV;[El^RR^F=[PMUH6hhR_dik2MQOgLK36Zjo^fZe@^AJja=3P5KbBH3DNK\\XgI
+o`Am\bI1k9\7EhWl1;QiAlkXLBn4CKI9>Qd22S;m\Q5UKfBkEKoomQLVlhQQ4U1Peg:6Th020:kj
+F^=Cf_kbm\lGOoX6alU82Ic\V4?WgCn;Td7Oh6@0eE`6nn=^>W:TDEoRjfAedLUo[kTBn>2a_=<3
+jZDMdcgIai9?G3_RBkSQfK\G>=0QDlAb`Kgb12^0L3n52CIXHLh?;IcJD<=8_L617]7K7a``0T=>
+TTm@V8L5FW2iJiSPQA8fg_`U@;f46BJOHF[aH6lPhDH>mGcM``4oE90?Pd4Z0NjabGi@oMT?Vjb5
+YboII0jaJ^bY3;4P_m8P;E;N0T:K:l:9kD9iS0emVgdL4la;g>Kc<k5fn;GGI]27JoLeb1n>NahS
+k973kj=;RHhNkW`l:I463=:gGLP1Qd[Tj_Z7ACcRN9Lb`B<^^HlVC]9b9eQNhW8_6^S92i>]_NTA
+;QW\l_`W1hYVRKUkShehB\DmB;0[SWO5_^;AOI:gf=fI:kmLl<3a]aVR5i^m2b@lN_^G0hDQLYHL
+0@Z8K9mbH>C76L:JW`<3ih2lCYE:oXh3WLengY0NfhJ26O[iX8gGmcG83i?nlO??>JXG^nV7o_<B
+7jR`:TZH_W3R@bO:mOSS91fe<?K^4ecR5<?j]OLB_BQjg;eN8[A4TRUSh62G?[QBoAEE>KF@c?fb
+@K9blC^W2GJjhHkoKcI4CiIkYkSF3E]doM<1@i_TcO;3C2BYKA1_GmX@IlG`e^M?7BRebTmmab=O
+IO@^RDGkb[jkTKoJhEGY_g3@;>9S6f8^SGgFGf^6JC9_jh2g9K;G^7L]D9MAkESb^b28;7V_U[]1
+X;nlJ_me`>0DMjc4`gX77gJ0WlJnTmM=194hbflKj3?[nfW1e[cfb4RhJDLN8?6JULn[7NRj9lZZ
+o4ii]Z8k>HA];kanm@fPg1cg;T0Y<1]08OUSmc:0J^8C0bRo3Fl0AN?ec6\0MM6lkNl>60mgDnCc
+:Vi^noYJR;6emPihWf?k_@?UmlD=EdL?MQl>nE\P?MS^Kh;SROmO3Q6[i]kacoLg?_^XAH`bMa<m
+7SBS0E:k<l3f`QKegT3g>J1SZNBM:<[f7m;[0@hjgoo:XUo1nP@MZ`2Nl74E2?jSD]OjdVC4Jie1
+T`4c[N8==a6`LGNkRFS[a6hR@4ij6le=1<B:NlLRdhECkAjNPdhJ_M^lL@X`KoU3NHB[bbL[R4_m
+J35\[Tgf_b0QK3:8[UV2ff@PJSMHhbH2nGmSOSLA`?IEG=]gFH6obmmCj_d]WcFPXfY0mh^ik?;Q
+mVojmCkX9X:Pb@:kQkhXBY>MQRIk0Tg6LF@b85o9I:C5TdQCF``4MC=n_P2C>ml8T_3K]GH16ca>
+MmhU?e5PE@Bn<Q23MQa<7WI8YoP`fJWR]3P?Tfd7^n0BC7K302]P\T<>7iDB9P=M>67eJEnle666
+?=ZKhD0K:fF3C;o30\QQ<Yi@9oT4Zc9A@@GlARJ88hH4BlR]WHbO>62:eBZA[jRh]eRP2h^kS@Vn
+Z>6k;KlbA1b?PAldaX5V:^2UfSD>F0>^g3SPCMK]=`jDRo6>BgbWCXk=Lhl5nTP6N3ImS?0@nWlI
+8QBom\1=[P<h]^@Q3NfHkTD>M8aEmV>6B4;U90_]f>a;;;C9h_@jbbEn<Z5hXgmU?8;?<`ZMPE=h
+H9;U5LNmDY8^7]eGB7Rafc>`L]VPeF5_NHC9kg:P;c2G4`ncEIAlS47O;11:g^E<l8c5O^X8DO;C
+4V6llYY4f:Y\8hA>b6l>64LRG?5IlcT7Z\NY_Hj7:oTMYCW2iGTlg;5]gc^U9hH?:]WW@7oXO`hH
+V7?d`0HIBVEgbMICRXU:g_TMGUWTG[^R0biFbCQU[nE79hbknjI6n4Q_Ofb8V:A2AkZbi=@m9?VB
+@GO=a9MNe7UBeb0mNOPM7^c=>S6?KcY@IlHkRIa0WbiKN^:SK;Y39N8;GEobiMD:a`d]9KY^b;>o
+Y4AgBKG][YCXFE:RQ]A9E4m:Q2U0if8[]bHhO^Jg6?BUU3\]kd:2:9M;@;mWe<^Q4:187PKaf0PO
+CjJh4BiCl?\RNC8f?d1NQ\e?9ieML<c<Va_R=NgmVH58D4Hkd7CZ`JNZg[Al;X1lKHBM1GKiU9_B
+W]d@^bgIgg0K29eLg`khWOLnW3PL2Ra07VMa3cghg0Dkkj_\5kl><V`YU>PeLDZFPA;AZnOF@XTk
+YD@2OQ>T9kPbZXDHaAceOO1HUN\Mj3jWmW\0k`fjo3TIm>NbkgF2A>;mOWhhhKlI1BjMOM<olhNb
+7K>4]8PWMSaH9X=3NFM0kHEZMKf1kHOa`OH;^U<5jQoAAk@hf7codK9o0nL;M>c\TFO[3:0:?^fS
+ADJRg1eQTH4N?S[X]?o]afCHEj[QIXF\NPZImio1ZhLNk5>SnXaNbIZWV]CMKViG[l6VPWlJ[B]h
+?`e2ETn4?<?Z@KlfV0QjjnVWfQDldbIeZ8JcDkg>:Y7oCm^gbR64c?_KH;lEna]Y<YDNm7_KQA13
+cklmMOXPP7W_V>CEEeG]Tge`^<^9gUfn:8KH\]]lT3aA[2dB`3=3e[dm=gOIA]eokQiIXd3fcH>[
+U\Sc22lHVBU^7cgTR_;319c_HSl5_j]0^\h1Z[oPajYO=\;\3FfgK7nl1TT4hV>jM4PR?IM700Z0
+iZffBP2:O838b0V8k44E[U92R0`f1b83j3K?:hMnnJI0@XS<oDI0I=R8fPlbL9F16jHM5>9;b:7U
+PT9TAAWEGdQD;R3AK;13GcUTQa\B;ja31_;U<8O\44?BELj@\B^@:2Kh;?^0A;C]W`P>FL>n?g;8
+DT9db43nn=3;8C_hZH0>fGVRmGC8`37aFHO\3onO_gO8j>W[[_QJl`ih<:1;3^UE4@nV63>bhl7D
+T\n81`<ZN:nPN3383QMa3:^I09HPO`VF4nBOLE:2O1ZIWZYL@jKW4a?Tgfbi0g@LiYl5c[6hkN9e
+D?Xj@;<ZgcUPG\;UN@jdSgGkWPAgG[Phn@SbOm1o3QRXLoA01aZ\R_b[7Xfhd8[VWkI@`8IJ>738
+1c1j^^7a4bLjd69CR:Ah<=L<]bDG7P`BKeHk?9QjO<J3^OC2L@^oh<5`1b?Z=c`HBCU\lWTlV5M5
+R_<63hIn>Xl7LkE28`>CI;KRTfBUZohG3hIoe6TiSbC3EPdi51X?a_W`H00Mn_\\?1PTKf0QdBgB
+A5P]90:e:6KhkT8Rg_2SQi08I?Y<XHA4=kQIGdSTn664A;`Wd_b`@Z:b_c]@W9>j`IjGXb^9jgeX
+VNV[QKPW4UE5g3O4l@8X6C3QWTE3b@1f52blZ^nKSSW2W2VE\N?3<XVJcFo`jD6fSAciaC:I?39O
+LH?K8gn9j1Tma9TC`4VWoim`A2D3i]RcBKfW79[f5?HTjEZTNQ;g4a^<Yo8OR_oEi?TJnEYWW6>7
+=[2UVmI][YWTgZG[El^TIX?a=na7HclGnbCHkfj[==KiMfO=WPPndhOJM^eJ_L=cU@blOUP7jiI[
+bO\OocYeB>3N>K9F6G`^h?J=4_aQ7k^nbiiodJjdQo^PR<NIi5M]\^KKI9Mn^BQb]k3KY[g^=:1O
+a0Rg@O;aHkj3i2LocWnG>GIn<7gS2mW^odXbmVZkBj5j9HmgM?o_4SV]H=l?nOAQE_=3OH7bS0oc
+0^F3FKB=7dbZ5nKWWe7oMQn4b2M`i;lAn=WOi_Vk[6SOiON7]Mcb^fK]N0RhW1N_WcOnn0<\6E8i
+Xckob9;1AoV80?[6RnNUjRijG\17Y?eK\6BHPWQa1AoA4J_^lQ677gZ\9d]f[WPiT[=Tgf39c2>N
+`99=Bg<]IlU0;KR_TQeZD7XLTA\>f54XNKCG``8oF=`o`?D96CnHi8T;?4:3>M7200\ZXL6HJ[J2
+CG6PUODE1fa9LALWOc6Shl]l>[2=4QhOLT`2L@bd=imaX5Yl<E`aIMRfgfAmF>hiH\XH`m5PRS?R
+BCdd61C[gE`73@KDPoEV<9OU4^hdPcU?_=a7c6106n=7==jP5iNmVa5N:?l;UNZE`aYTe2_77:R\
+ElhLl0bUM1:WZKPC:Jna^1MBSPOkUWVTo3MOc7aE4V:acd3Yhm5MoLBBo`I:7lGZO2KHakEkW`Gj
+\J_GG8_lClGmU0MiURkXP8?IIaodJ6\7jG@1@iebl8lO7?:X1lMl8Q2?JW3laHIXj@JmKnB:9kd7
+bDLV6ScBQUT[i97MI[0[VbBNe\^_G;ZQMGZH?5>7gc<KI:\`]VY[8O7>S7M?1ocd8o]o<G6Z1^<n
+[0VFL]W76Z6Z7B:`;Vf@\fj`oe<7C:dCkbL>K=D<L=:_LWVUgmgF15lehM4oQPaK>AP>ND?L]L6S
+AKhUiYmHmQb2M=W\^kZhK?IN1o[=;O]_@hBV\@McL<lVng0SE>Ke2AHgb74ROQn^LRK0R=MVi_:C
+Jn]0^F54=jT=8iZPQQ6QJjin_gJPk<AfK@OLcSO]9h^8DfkoQP58D^:EadW:g07;BH5OVc_PNHm8
+aEE4khUh<Xn:B>h\nc8K9[ocZmIed><Q2;l5cR=1AA3fBYQcNWE\OAh=13kTUhGYXN[\5>Vn0oFM
+h[l3o^_2G`d3UljnlLok7mOSU9Qmi6Gd21<Nn<20>?Oob0lO66bO99cCj57@?eSL=fYci=6kY_o4
+P@6mOlOc63P`8:]>2[BZmUPLV7nTg7PQlL:EOiK5DA0g[1kd:J8]Dki2]6G:[O3[<Hf86mH0^=^\
+G[]fD]kUJK^lNdeG0?e>A9`TKQX?4FRi@Y?mOc@WZUc1JHo;5Nh`jhR<m5j6jb7^Yl\LZoFH[ccU
+jC[=Gd^EWakW^EOPdkDoUeo15Ch?Eg@C[Y0=SJmTniHo@XC^;H?VZCbnDOfoBn:@UMT?mB@[8co<
+AeK>n33_G^Ab_i]]o5HbMK2noB[f[m]PoIACkJOloCBcl:MioBZWb[m^A?^kFDiMRYo<[Oa39Kc_
+EZXE98EJlI=f@O^nE2^>XeIL@JeP5QS0Ok4Ei<fFcYdG;6RA84;Dn_=mD?L42A@QN>_\0Cid7=nd
+j:mH:jhHU@>6E6fg2<Kj\>>lS7o23AlGl\214]W2kATLL<6=0TURQ@Tjj>6hUCLHfZ2g?e2MHK=7
+T=;7JYm``0X^\emihDGf_f6275X`nPb;<ZR5Z0PSSnjb4?U0eRMQnR@>>:9QCKTbH8TE1E94DI<V
+54:>4K8@e2n4k5MN4D;f:e\Lj9D]MZgSN6F<4@3fS4IihhCSISk;47Gh]MLa`Qf^gELSQgNe=nba
+Q4Noa`Qm?57>j7^d[>6foo3A\nB3I>IIXMIXR0L\T^S1bR<]\aliD194FW;0YBcgk:A=OZCnaU=>
+;]QaGDnT^Wc`LAnSj<a>JLX1Zjcg:jmdK;mb`:adMmbTFcKTf:MhUiJk^F1Ok>h_8MBC?VB2QRTO
+`o5QbVD<[EmiAVKf:f\>^>HejdWKE=c]EmiHg>m<4:ObJ_4i22U;^N?AgLh1keCL9gV?HG>XbSf]
+foLL\2oM_>DL<6SUL7VChiD;fd@lGDS4_bclhhL=TU@?U_W4QUP6NOa51f[\2[fGCoZXm7hKf2BS
+`X6E9e\TSoB62gjY4fc=EbCBJ@OGk2F1hD9IZjj5oLWakSCRd`o^om6YE`k:kF2<@EHOKI2bMVPS
+^eSi]4_\OfCBZQej?jdA]\[Qn9V_2^?BKfl9eJ\:SdK1S0Smf0JIKB1WVOPAMKfNi2eaJYCGT`2M
+IKJNi7=k1^59T>c;]83GQ7SOC8Ti\OgI0J=AZ5;BJMEET0mDWI[W5Ag\i^[giBCBiUO]I`R`gA[_
+Y_c=<PhH=6NGk;GP93lX6MlPCoNQN99?Kh:Q@7i54WNJOJT]1VcWUjg[HL1P;hHlZh\1`iN6k>\k
+h;k?oc\P`KcK9OlSHgli96bJNlLokgmL1d4Jo]lk=fW8L5QUk0VQ^a2D[BnToL3B[Sn`?C5EoAn1
+65I?n_i?nO4;VX_SVc\FaL]JGQfo7cobF;X4mHnLcGO`bLKWA`T0olc`@m`mj2]OhEl`mIUfXLnL
+b7>`jOicjLZTWcBSSD;QWGb5?o<ESQHE84lKj66;TWWU2_f@YZ1L0DPd]E`1j6BiTe_0P5BCL?6a
+MPF0?ILSdia42KO773\oi[_76CLocZl2Vde1[6MOdOI=_fAckZ19k[4lgQ4dRKI7Ti@LCD;WOT>C
+_YUD;Lb_?h_nkBRc==?\YoWk;:_`IoUlQWcljdFa_iO=]6EATikAmWnLLKW?Ugkin@YheF8=OQOT
+:`j29Z5lX6?:X4T0DG[CSE?=kLPA9j996j59jY02CH:M:?CO0^I03Jef=6W88H4BF\0DJMmf2iQZ
+K[^40N=a630=ck`C0`KTc45O0]A;V7TZ@7HH?>V60gFbALia5`;f`hh2^E3`Pd30IQij:4><\L4c
+gaaaX5:R2663H^@Wa7X5f0Z;>g6E2h]mMBTmlU\djL1oQElL:9HWcXTW3[0cA]ALMU=:g?3[[V>1
+=ba6b>RQj4?]9==BPmm>LXKU2]U98X@;HUL>ZMaN8D>CaAYiQB1OdW:_R?S4m6h<nLAa<6N8YH?>
+GX=BIR8YYe3=lMkiUJoLh2Gb;7EgbYE:\6ONMI\ANW7I^aWR5kg]MRHd?X`AYUlMLl2b5;MbmTC8
+P7e\UClRV[7RhdaL<eS9_a?aeO9i;_ZaKMmWR7kdmSjYV?ho1`XPZ>DT@nAbT^^62ii^j02=MkI0
+M]d@MJ8E7G2aB_K<KN7:XaFnLB3G21oUl<J87ggl9K];`;`VG[Qc4S2?j9e40VH_k0Mo9638Qh;M
+960TbKEo=D9D2]d1Cb;E2jfMPbNiI<>WWkCZYMT@\R_EOJDTGaYkJh>lmL>@jJl>66\?aLYIL_6e
+@5]VORO8WWci[DYK^RFL1:G8_`hHc5;63SR\j9i\PLKL2nMGS>7VG<Jjd`_NB=f[CM2Ihmhhe@3R
+WbAYlmZSBO69kG[5H_WJ0JmchADIlFLKlLlgD8=kDjc^KH;OC?O_AXQ>H`m3aLmb7hN:[hDio`a=
+L_IQKM4TClceE4;HNOXl9fVk^[_998lmCPK7:>8oC_1kUWjG:ihPEgC`mYOTHW1PNGofRAji`=?;
+:j?7hJO1V>1?1=d5EFIm4Nf7CW_m@Nf9;VgoPCCN<M5joe^BoT;V1fWJH7W38eWYRPg`RjG;Tg98
+VBXal\aH>F;g2`i4=0WlO]4;JY;>AFk`J<8n2\3=?HLGk3k_fNM`PMkW?o\\k_nCIC:fBQKYJHJU
+6fE47eQ@kF:MgoMZY<VHNQ0m[]5<[obZUid^m2e7Wg;WmhhKdfPeFk:4FB^7^S5SB=3OSAY502\g
+SBQ@_e_i43_?_aeeZV3`2P[lBO]R5A`NLWVMi8^7R04?n@=AEZd`[ecT<^VBWY^CK6?^Omm2GTUM
+inKeE6B0gMOWEO=K`]53[RC?G;=UagJMk93Sk2iO_NG4Z;OjFL6?CKm\A=WS>fkEnmm\Ln0?8hH9
+UEWjh?D0NOTaokDTobPn>5k<KOm_kSVd^]^4bXL_m[\D[TN_5>GCQblJl^_35`^Mb[aA2mOhmNGj
+h7cSf_aoES[Zgnj3O8`9nUgnkYNf_mDC27_Dko;k:ea^nJag][b?jg<nKUn_o505F@5E7;Kn[lTI
+X@Z905G86jL2b4m>1Keg\Q^O_O>0`S?kmM6jGgD8DO3]VS^12aj;BhHON67PC`L@JQGhDP<BGdPG
+LiFKm<2<Z[oSj=B36\IKFP937WIXnmD;H=cI8[K:BbImD7LoB9kPLTNl\^2bCc523Bik9D?LL4?:
+7km`X4bZR7^Nb9@KGQAJT=]4O2QRo7eg;?`Adbc6Z2><3C9_K8P3SM94G[L>Bo:9VRffH4U0ih^B
+_SnFY=X]8nZESAKff8dUhD=SRN0h`[S^^c\>f5<YJKgIO>F7@o>=h9jPH^iPQ1Rak1hS>7A7Z`BG
+E9o8QH]G9jZ;17Nag9odnWUQhf[d0diIeCYUUMjkM<XE^o^jB2mfNcHS[41N_O`]7okHk5d>m8D8
+_a``36U4PAn3dCL;=6=a5ca4>nU??4@kjFU]EBR_JJ]MgNI0kbQ]WgCDO1bKF_<i1j[7ZKf>0U;b
+>`O:LnA>dW]I]noa`hkNSTWjSjNgT`HZ^R=JH2Khm5:B<Tf8IOV@KnfabXUeDW^`;BnJhMS_;6Qe
+U4<i`fm\T:MjF0^[4]a9k`2ETckDf;dcCM3B2Gmo^8:3WWYXj_XLKiTinIkAeE<B]KieDe_;M>md
+X<oTfSmEhQ9Y\BCDXQb79KU:gRcW]:AEU]eI7G1EjKfBGeU<1=O4SNmkFDV`GO5RaCD[KiD__gG0
+g;C;ZBAXbod>NIS57MX4RaU=2:hN^Gc:<H^1h8X61<O=lYN5TS`;BU8^:8WgK0^dIW5GUK;V]El<
+R9^7gg6AK^\MW0O^2IMg=lQg\S\?g5=hh<[80eNhmjO;7NQ<1_hI8giBc^`<G>OYnoYe1fa?MiN[
+O6LGo=hP\I]b4EEaTgAceePECgoAVTol:GAO>nW_RI\^UQN9Wlfn;a8kUOdXV5?JP`0>G3[ka[oV
+Gd>DBck`aN5:jG98:9dT`7koFgjnThAAH7_7:A\hJk@aMGYD3S5SAHJN;J;4Ck5kIOo9f4O_D6nI
+7f:j1o_;A1=AOjTKLVI`?^W3g7TfQWjb:gKf6EfRmgcG?\>3M9oog6^8aIab>=ZRQ^T0b][ASInf
+<UIZ9HTK:DUlATV2VR1_C:<T^DbQE\^RK\`H`TMji4R2m;VKAV0Q_iTG\O?lfe6W30Zgl?_6Y7fb
+b4Q5T7ND;aibDOB@?kRDZaKVLBYW`4PJ0R=ic=IM@e_?ePW2B;kkO6=C\_PPlR_:3l]ejEOkH7FG
+5IkNlQEJV@R]_8iF;SfLOOKhSU_fo_\H??S3R65gW6WahgcgV6>0Y?n097lH7bb?Sogon293Zke=
+\7chX[mc]d\E?iDZ=X7?6bGiM]5G]8iOKmJ7i]NfWOoiK6;mjceB^g[`]oWk;R_fEdJjiLCj;Kno
+Q\dfOoS^aYo_QNLZ=;iL:eHP[o=VScAA[82k`04QEY2;ii:U>j\e5ZPYE_@`PeR11eYHN:eHLNSQ
+QLJ8UMVRUU`[8Sg`XQf3TJ`DTDhKB5HLL^RgbfC5bF:VkT]FP0he1>TV:lhD[mHM\^8EaI;>3SSm
+Qhfb>YWdl<=Ljo^@5HdjBUJL9M:]M6C58gZlmh43UBiJZOaTaAmZ?[[X0mNKnLg82VSld4UZTaDG
+b_=Y=eU1>bk<@5K8b0Pckk`@DRH^^LobTQ]fE4mRDBKFVE7hAGI_`VS7M7mbX6RNF:7JN9EC;<YU
+PEJL4X:[kSk9Fnc^3>RG3RJIoiI3GVcf;Ymim?H_?S=MkB8mYY?;UFDZkY:@bYEm9:@KRcdEMKWb
+]JQKUM^Xe4;U6`FmG5VUYnKW6Z@NUoJj9IGlWH7NmC`7f\NjODmUQW@P>4id9gC0@IfS3cY@0F@O
+^MOb@kfc7i83GAKYEaXCn4D_>SK<IE>>GWQVF`d3a;C3AeEoM:38Y7M4L=O8W7V>1?bB@S1bPOcB
+SKXYoa;1LIl45nlB`LW9[?\USc;XC^Z0XjbH>>GD31=^[?B0[EBSJAnLOfGIWMD2EiWNJdg@ULGN
+^XV[9AZI1<a8B[?7>]3<Z\ljH6fboQGGB\DUGghc4bnkf5U7o7;IMkcdDZo^?;WTolG4VLHNU4RK
+e=J1nnb3<kUa930De9[JJPGoVL9oKW\d=M2Ykm<>F9gR;UiYMNk3:m\lo9k]@=]i1ml>;CM\;Uki
+S@gBM1Ch3P;`>HV02M;^Pg\6G`k0EoFO>7VWi7FLbWFM_^eMMj3fm7Ig1ga?g?6gBo`nJ;gGl@hd
+GaA]IKcN0N^EO[[eCO2N@OOaUGe7k3P?905jojVFdB=<N>3DkPb`_C1M_CO@OKhbeQlbF;jboHOd
+4Bh>>]oob\mO`OX47C]ki=YkAmoD=m>>bmPad;mTZL;4:m<]@Md_UL?@`<5R_STcn4bd3S?g;aSj
+ZFkHfFMbQMkcGJg\X5KnDb_Ooa=SSZjH`Hj;2oO``ClXWCo5nTlc>^7kB:Ab:U:IB@Ya=AmLmJkY
+iL^NgcefI0>NV:YhkEfehT1odH[>gBb2E^i>?ZC>lfm7VbHH_08UG5:VC71hb>EeTBlNJ\61gBm7
+fE@LIO:@bj97NVhT[C7gCjX?[j:^Jo=jJZG`^I64AnWLMhhNJQGihjD]>kKWi88?EgOiJX]j54\]
+EaJKO[U8\\MgfQ[XmnFI?JA8=Z=blN>lA=9<g?`gTOClXCa8lmW]on;NRUYkbj1ilDIoHc<BB@_e
+59:dgZgh[E^i:]Kajl_fa?bjM_<o1L3ZGnn5@RT7TTS_<jCkFcjG:o7:O7l;UegnlM>=?ml7ok^L
+N?fllLLOOn0ZB0^^h\BKIdMob5G0ig0E0;]ilVg]b7\75>8Zc>;T:]1=W`Y`U@kBfj^hbVCaI\CU
+:ZZgNHj@i8GCGioP:QjfZBAGLJh8NN]b5J269`[8EACiK943Aco5ZcL>[Nb`Xo]2[^933lNnh2X:
+ERP`En6goKR:F^jJ`UF0cQIkAWN^XSX=:PY9CQQjT904<W[h;mniR[9=4I:@bUVi2W:l3UM1<cci
+lXB[P:J9MkL:E`7j\PGiME^^0X2gbcWPG8[K;Eic5@3K5CmnF:j2AV_EQJ^XI<YHG>FXQG7Wg01X
+JK2gLADTJLdk5^GB27l^[A8XYa`:?O=UPfCUhWM>4ncD`kVCgh2=bG;K0>LCl_kI4659]8Le`U@^
+nfQ3U7E3noD_MJ3CY8<DL90EaVO[CP47Z^bRim9O;__>e9MlN@nCBok?e9_67]`PPa7R\0<E:N@G
+=lCQo;4N=>O93[ATTIHM\5T=U<Gm348<1IoVMDL8LLeXMVNXCF>_D_1Uh5lSjcUT=OgVVgQ@IKO2
+iMh>n9gd_^CQ:^jPT<Hig^==d5`7]l\1PoZc3gg<i3_MZ3CBjeRP[hgejNg]aW[RCSoDNam<^NCh
+QYS_PoF_?Dn?CDWUc_L9]]oCHbn<V[O:kh3kO03MbSn;^`_T?h_m_a`RE\fmhio_CcoXDH^XON\V
+NQ@YSX<dNh9X;aSPGU3k8EYKOf2kHS[`oh8nRYFQi_]Olo<G>3mPhnJ>AO:dKo@]oKk6Bf?\n;0\
+H\H:3CiEG5KXoJ8ICJcZXGNR[f@o]5EmfJY^g>5l\bKa6V`NL_eoT_BCG[@ATEjXngcWW\<3MYoo
+k0;Ooi=>GV_TT6KOYQem5SYmX8i7RWIngm?MSkQ8Cc7jC;;b:Z=WH?CFS5jilk_7SFYP[`1g]GOK
+@>03m_>0jgVKAAk`MbLOB]MI1WkCQ89GlWe;\WkHQ8J7FUh?nL95F^QQoSS9YUI9?QV_33fblo:@
+Jl[m7m^kJjS[fKZNFQUl[[lg>QFaGJ>7FD=>nE:[C^diOXS3defnRXEL58RlcZl]oG9Ai8k_\TgO
+OfURlQf74\D6P;ohLMjkc37cIOik[77cQo72m6Qfnonejj7FgRYHgZOlGB8WS>@l<9:^`dSeR1nn
+E0gKn?GU<[<GclkoMNkEoWDOL4Q?a=obmm_<f=oVTL0WPX5oObG;[EkcAXk_LAf[0?EVl:R:ck2:
+Tf0EM=FH<5P585Y_W72^B:BXc@LDa2[lhP=FP@91fTPJd[VLSNAHZj]R5G_e=19gG4LSJM1k6DTa
+G\bU:T0=[KiJA^:lAf@T5LoaFdIbZjdb4WLLAeDD^;aDDNQmD4EYmRYnX^:nHX4Z;>h4DRh\mQGN
+aLYKF\S3]_f=4N98`Kj?Hh@iE[QZ[3=Dj_1[[n4jA?k6H@kC?@LDM^AjEiVeG\K8hk[jU3lJU_lh
+H529S=Mb94=8Umg3@bcBN9OT8bje7cUPDYOTDEiJGP;?F2KXa7A_IXA?7?MWQXSU0jn?PVM4Jg6h
+Zo:2B903oiCnX1NG_H=ndE\Gg0QFMNEdM8POIh@B:BmWR:?i\`I9iNXd1e[CGg?0=SOmiX1_:^hG
+P\na^>>IH1f;OFKnlNR^E_2BokJ2OcCfO8KHakImeh=mm?InQ_Sdof^@X<Cf@0LJc0K@0]@Y1mfj
+P3<Vgmc7ASjj`K6N1W1Oj9i>ZFcd8^<g7;WX[gmPJ9?\7]TPDcFn]kYA^K99U?:E3WBID9^Vh9=c
+^YjET?2eOfK:BZ4k><QC;_]H8eBEPfVb@<QCYXT_8deE^EgE0ENCgP>0KeEa]hSdjXS6OjE7ZhnI
+mE3UFDmLLWiGj5_VcDMDM]Tfa`]a5eP_nIO;2Q;`5gBXW7nDbSVOg23;fNc;3]BLlK\ZC87FPbT0
+<_N1AemDjYakhR?0Yb_bNWZ3[>OZgMYj0d_im[I;n4Vko=d2iHf`Z6?R6f6n5>cbDo^NjImGIoDW
+dGjKBKlUO3mOang_nea06F3o3_P_8ocE<71Y0T@>he<>ImT0AEl6BSRSPH44b:Sig[BiDa4<oLKN
+dNoSC3jF;T7m8dL;3SheZlN<gBnHU7`b_k:Y3kd;oLD<JJ9biXBNPdkg[g9jai=U\G5_5SgX>a_9
+jD;o0D7`dBDcRZ?<kNXef9AdaFXa13LD@o0Q<@@dN<H=Jl@@CU<XNOOJXId@md]fX<oK:bY8giel
+667WgideBbAh6KmgY>Z7IFJ>l_F@;aeV9N``OecTDZ\RWc@Z;J@k`A0_Q:co_e3f^7=3[B[h_=oW
+6k^6Sgd`N\REY;VSJLUkI69AaX52[2jTS7Z[Wm\i=YdZA^SK;]fdZL:8HFkb;6kbgFkblV?nbi@g
+Oa@O72oW]_ncMjbj^bB:GEeobf01jJS8Y`4Tm`F@e1jX;74]gl2T3lh_KS_oaM_FNj8jU86ocDLX
+4e>Dil7bj[OjoT8cUb_gYQnJocnfGcmOo?777aP5NH5AW;1im@OK<8[SH1B[5TKI:UDZSP;`Gab5
+e5ijjDfCC<>3G_G54J[FWanPi9hcPB84Kidm`8N>hi\N:90ZD^XW2>F06odO?lXK^>685ADTaW33
+<kLlH6>4dALLL:5<R[UjBYQiLCNQNV2g?fZ]@WTT@laP\dldB1DfN`FeeDbNHgkQP4KFEP\[1hiN
+LNn`@0lfgHDY?kR=TTM<\>YX@j2jf:2A@HhdB1TaM=IH4`LlHKU5bQ@EMaH;;5;f6Q=DY7`K8gbQ
+dog616Ull=gcH[0nY?kH6@NZ\OPg3WRCMO^=0nER_;>BgjVCkU_OHh4nQYSihKgfQmOnPf^;Gg\`
+8dbR\F[@DH[UG]@PakRg7c=48\BCo=JafIOh[I7doP6O<]jO733:QR9M<[;E5H\9T4<]SW\E:2mj
+6n1<AZ;<`X2M9JHh_Qb`Bl_Mb`:of=foC126l\[Y<B9J[IY9g\FXe_bWDHeBW_H8bmCGK8@XII\3
+_E7:V`?6YKSC>N0LiYl5f_7X[^AHnck9Nbc^c5=nG;]GlYl?MWmmCi?KU?n5=GW63Q1eb3CgW>B5
+GUC]\TFR1R?oZ14bb^7<9bLZJnW]Rhb2Zn;NKV]B?VZo?eXPS;8SmRG?iW51N=UM5XA;ki>lRAIj
+YP=]iYLdTW7ikYl>538ZQcK8J8DljT2U^NfV3WRJLK38VYCcE0MJdB5SU5_5DXcbEMGX[`hDVmE>
+0_6\W119GZ]Y^jd3g^[]OM]155nk0e6PDNicKT]gf267SK2ZIPNR>U?[;Vf2a`clO^b0bCiBP7:I
+m03UVKgOVagXjH1hM\3XG7LL4:MEgf>6_>IeEnM[9MbmmR\A?5Xi^d6fl`fn2MFKhmkM49mToMdP
+XD4MkT3S6Co^2ICUZPL_Ml00=T:]kA[5;GG>`2b8_M3ZWD5gBgkWg7`Ra7P]Mg`;W6MaChSR_[\T
+go?X?PaR_[[IlmUaOLAm=GY?S^?l9g5o>AA\ONohioka>8llb=ikEm4SBG9`]Nd:Y;gPd:h_\?f`
+A[Tod9dadF9[U4Nb<2Wg7dXP=Ll?f;SIXa4mC[K6@kaJJS4NH_Y7SAHLO;:ii]3kAC>LQ96i\_[A
+>mAOQX1lk<4N2hAZof^fjM1?RU[bV4<?m_I2c4a7oVmBn6?;I15_ge:09WeUbe4B\0e?`amE3kTJ
+o:TNk5^3WF^TbC@K2cefZ4<cVQdjTZQke`dKnNY_TR<Pi^hZD^ik<`m^Wgmkj_A1hOINgcSThX]A
+?_8?3Lgj^WSJg2;EUcmBG[SJ?8TcHFXOno:FbbOISDDK1[Qg;VcE19mW\m8bO;QkjRAKV37>j=Dk
+fTnWJGGT_Ac:LC[b[nZgk<\SKGM`fjFkTDN4ii61m`[68gog?AN?[2:?KfagZH?WBCKg`kajTL_l
+046d>?<Tmf=Oj1McCIm8Y@n2L2OF_mh3035CL2Kh_Tc`OiO?]i9cbGmc`6NK_c=_hlog`T<QS]_G
+:golPPm@2ZA3[eX5RQo@??`2U88WXA@0eABU:??gj_?:;d0YM<LGU09;a8:K1JFhh\Ih0ca6^CYP
+\AmFZ876FR0L=?J51VV\D1\Lj>4a7XRnhXiM?H5S]:XG;>jZO<5R_i@O=?J<S5ki6`gB:MoQ@1oU
+7`hHXSJReB>HIi1?`7@h9=3<Ga``Q_W60FL`CeE_d7CV6cYYVGM3?ZOYc=n1@6Nnah5nc4_8IYi0
+?XAi8>@AVUhVN4AJYFXYbY>JGSCf9EZUJY]h[L`3U:>HId9RCFONX?c5o::aIcFMnE^fbWbG0gfI
+OcUPF8YK<c]Z?^I0IJehiX1W?:TFLQZNE0^i1Tmj9ZPFlU^>VZ7lCB9U:<Leb<cl70YLiWL>N<Ll
+GYf7nFN1lN[Nc7l\YUIad]P3_C1;ICM2f\0hM<13i_WZA<ck:H]X^Pkbb69_F=0SSLECc3bNH^HW
+7JS2o=81;iTgZc<a?be`4deWoVBaMla?6R^2=8ABZkZDE]DD[B[VeA@cKjF\X^U[PZjdENH[SOfU
+jLb?]EGVIkV5Yf1E<LmFif;nF^0^V\klBe]Uo]9H2b@nUMd2jBU]3^lSDiQd<\FWb1C9;eAoUUn]
+SPIBKP^LQZA]4kAV\ELbLSHUDSGcB=G<Kc]@UgT`aBW057@aV>:LaEhbgfW\Ideo6Y];<O?[3]AV
+o^j0kl`3EEL4ZVRaelao6_]MdiUgDWc:BH5Dm4>iOhkSSAY4_9TgdN=1D0YPc_d?<N1G\3i1alhN
+EO0aSO[XlJ4IAPkN<4^^;A=gR8kR=fcmiKh=0oJL7C[TY1U]K]@XD>oIXD>1oVN;aXAnM<F<dP3P
+de8MjZ>Qg5S=ljVS=_2dJhNZokIEVhCO>fi<0j5hji2[IE8gGH?X]m<Rf[M:@bPL?NOOSA2:WfdY
+mJ=U<13D^AgV2BR;Y8_lDD1I]E3?76EmT<_CX2j[\;Aclc:[A:@g2naY6JA>dNUU4i`N\FW8ehkA
+:VRPgRM@IfllSL=lNn>Yb7M_?0gikdfW8CnnM:^mIM2lk>V1f_>aYbBOc[56OTgKKemmV]PnOYYI
+4iZOO7Zm18cndi2oWgXZnjlj2o?mfEKWbn1oXm=9=?0H4\fO_h@kgU^R>KI4l`F9aZLbDCB0NDKA
+B>MUUeifbaCcmn[cbBn4B;TN1c;9WEh1@aCN>W]0TAcW=cD8eA]>;m4NB75SO86:^h85mVSkH:4?
+;?HTAUR?mTF6J5;mQPIiK<H7XJndBbS[I4j?]X;b``9k]7fE?eS\VO8NkI\<3<7H>`B\bWl@\?:]
+4@LLHAh7KNHAe1i]7cX]P_XYlak]:db7j[O`0C?o0\3:O<H1IiSgJ6\`Obb`Am^GnHO5WS?_dKkC
+M>Kg=<S?o8l31IT?>N1@2Q:d:Y:PYNT@fXVd>R>\Ao]Bdj5jO<eS=ShiD9Ai2_ACc7^dEISgdWZd
+OIVoJ:_<NkA_=IgiGKK:o9L3QJ>d;K<3ZSmV9MNl39]MYoEXYb7D2>Q[M4hFm@d0<H_JXodk8`AD
+Oma9c_`i8ecVjacXc[a7>hoic`7g<4nPo[6h>o<NkGoVXOX3A;Q@oD4RG9Zad84>@7Z?MR;cH=Y5
+c8=YSfRjR=ZSoB>13MDO4L=VoRB7T7T4]9WgJ6LbOc[P9^H9d5i<P5Ha0[C67]9dZ?jX[C9OjT0W
+iSgJZLacJELaGbg@5DgWd7ZdOQQ3mGhHc7b]0mfHmfSWYU3CE55=df8eCLGh<5RUil?hE;J6mf<:
+a7bhY9oL48_db`8acBRVFGhacBW4=5DDdkAHC;=7nh]iSoK\Q]S<gaJ8VNlV43?_d@iWGTLkSWTJ
+c3TNHCZ<MH;<NkBW=AfZ_jhCI;hMWIQiSgHllcSJNLao2kA7diWgJ<d`mVS?Jc[cmgF2c?Lkd9oi
+_aL6[[Qgo??n>HdGiWdGEJ;iAH=k3Gn6cejhio2mNNj7OAK_cnM>fFOdogaNX]dSdO2Hea8=GaRi
+ML>^M<?:X_@mGkE]To[liKH=jdVdOm:EG[Ri?nW_0>[enLonRo[lj?H5fm<=CO]dj<l^>M^WHCie
+CnKke_h3NF^i]]K^\H\JM\WLJTfje@][EgFmgjgEXCjO^e:Sn_a^gd<]??mfdJV2`J\^W^j1@@9j
+H5@nU@O6;C``nfZd0HI6WYd[J9G1i`85OE`RdJ<dG\9P6Ze?_aZSnFngWa;mKPWDTL7^SZ^0YCn^
+dWi_;?_aaI_@\?jh\mnUL3g^;<bcYaeHFhnffeNOXQ?o379U<1`ggJj2mI=3oghbDG_n4U7[0KoY
+nI;hGfYf__SS3d>339]@\>1]Q^Kh30g5bTlMHVP0EW[7WGOI6=[CgiZQ838dN^lJ@`>LZ52b?WU<
+M5lfd@7o=m41Ek\MWTC7UM8UBWQ`c?4C<GO5>==mhNb7U:_AMe;Non7lPh]S[Sigo?B;UQnRICjG
+<_SHJ52hdLEafcD5aWm2_>2lIKN>a?cE?0gTcK3JdWmWih7l6NC=OfiFoF?S5HGN_fAiRhC_RCS[
+ORWYGm]l3=Jke^V8K>cKbjXDc]KXB:A_fa0W\COckFkcfKlkldRlkml:P^0>WWCnojZY<GI7gb56
+_=lA@Rm673gV3nGGZSBO?>KHZLOiiSC;OW5PmnI1=TWXkaMIEaNU[36`kU?41nN]dgE4iZog8<mc
+Mek2Y[VkmA0MlPCW_cMGoO7e2T?WG?J07U7W<n:nk`U:n^^KSl9lncX]DK:?GdJ^6=KWj8R4Na5K
+Rgc6]ooVHgmoiQ51moo=UXa2moP31PgbMNkj\J4=VS<J=4l`J1A21mQG0Pd__G6RnK_eNNHGB;1X
+Okh0Tc^n29;`fkEf0A\lCWLnH80A=EML21=<0_m8;k7n@XHh5_f31TT0aP@7FY2]1@M\\88O7?21
+5Gb0NX\k8Pn1obU6:;7n2QRPlP;1I<YWT01E_^607LXO3_Q1NBol28\kS0T6POnANK7n4ZI[m4lP
+@9U?0@7:O<D1FiQO7?05lekh6CBMNKCn<o=XoCE=Ioi=PnC<icS@S_V>0oH`ocSP3nI]fQ2JGRHH
+F_mQARRdoZ:VJoB?J1EVC7:P9O<U1faROW;09lcK]2TdWGVdoQ?cJ?eECFONRin<nB`7fS;OL\0^
+iRl7o<:lCA]SLJ^Vafa:];j<CHWFck0Yc`A1jimZjM7jecHUF[o=YTCocH7RJ7g>0NNHAn_[<8oF
+ki3:VDO[Wc>?e[nGbYWOAjAVoXl4:\PNM<11i]7j@\bSmD<d?Dd@]?i9SK1XoH\=dM3jSF`YdoSX
+@17VT`hhbCaJGhUi]7j9YS>?eSmS7Zeo\b4jlc_MD^Ho^JG<Aae`U7Vd_QCcJ3fA_lnJ86SmDnKA
+nUNJS]I_]EGVGkVUc6LML9Ii];hFlfSm5TeW7ZeocSaJodkCVMm[ZlcohY<c7gK0HNISXo`E=hOk
+hCLO>e2Bm;83;Y>>eSN[^3]Kh3>;nkD9P]Ho^Q46[Gnj8BYJ_kY1;^J_7BS;O=\1]iU7jk\aKm>n
+FMbONKCn8O=XoN<=DCCji@eb<Wo^P1NeGMd1eiU7jm\aKm?NdO@g@M1j3_0`J?ecCFMnOH?Lc=lk
+D9ki_P>@j?Mn1nc7_4gkIg6K?66;OL\omloS^2EfS1PN;7?l1<eN=<ihKeSkHIWSoVSfQ?;oU1O;
+W?]?X\0_H^[ed:kGSiVVedLHojSaVR9jOF>m[UajgNge>TODjn2]EaCCjbZTed4Sc;iaXiUNidYj
+7KBNGWn`J`:moV;XQd]RZ1Vk7^Y5IHcn<;l6o_@kbBL?^O`_lT\=o2<]hmjl_6i9_>hAdlLZ63eR
+dl\U<_TI7IAlQUi_]c>OiB4>:I6=S_3gKST;mGO@Ra3caYgf=\5b:_Vg2If?^ARO?ZKmecOJNoOJ
+\bB>BkiZBD`iH]M;XGkVFIRocc`_OKoY:?[mJJOWCO1odNUihhl;h>4cf;X_aJk`SZf3UV7[0?XD
+FgmhkERf_Q5KEjLEK1gJ?OT6]PjhJHLc`C;J:_=@_I2@[@=^^\^X7j?YN>=<FkdAe\ohD]>=n\ff
+ZS8nDd=W?^f0dl`Kh5MSgZPg`>o;o4eKIIjROJ_Yc>nfENJoZJ4c7gL06?^N0GhiiXej0o`nA_e>
+FfFNXWf]jDKmMU]UoYdkICk_P??<6n3GHmjX=l3_boa?FfFNXWf_jLc_]eD;k<<7[[A_o??n^IaG
+AXlHdH6YoaB\WESgRfHo:;lo[9eH7an_om8hloi36O8=W1n`LIm74gZLK9FaHhQobKCj4_lA>nH[
+^nkibci1oXbTSk;o9UOg>i_^oWkMlj?]6];^7`WZT@CO4C_VDk_^nME8V[N^fAQbkmQQCH]Te^Z;
+YVm=eSgO[^]iBoKkgYaCm3e<7[eBR9aY8n`SjHN7G5hWnN8Q5o_A0MCg41g0nAn26I?=:CKak]aL
+[`XnkaSYhi:8H81e\``fDg?eEhoD;=A_MalA8QJaAY71kDP8MmLRo7^Sk8l_gVcWdV<AmkL<WTN;
+>:nNgein?Fe_Gff3NjK?[UF0VWajg@C[]@Qo?jWB?WnYd_knM;?cYO2od^allJLOFhMT^KKdi6Nf
+CR:`MA97[@?bTeY7;ijo7f[i^`45J_K[4c3ICc[0PVoGg0ULl5QL]3M@`X0S2VB8XM17O<4f5l23
+QUX73YQPAjOZ5jR8P`Dj`0DK9SPMlDo0GV>WoSCn11ddlQGXX95O>606lU;m1^BUnPMH\<S;4Oo5
+227ENl<H1?dA>VSVEKDCla<7C65NZUo1_5Ao`M9ER7;4_la;mLMH@9To@`O=O0djJ>Hg3YS3_5Bo
+PgVYoX>V<on@3YYiZOjPYQ?dQnRPVNHR1cXb?g;09>JUnRG<BoDW=5f5>55FmD2UnZ>Jc_`YFfFn
+bX6^c:lL<8]iZGh;le;m2deWoZ:]<VoC7mId<P10[AZO@hb]@^`XaYhAC_?_6B:S?dn<SOhN<CI8
+ng?0?aSVih21H9QBOA0o9QLiI;4G=L99mAolV0CmA0dZf[a8A^Rg7ag`TOWA0B<a;mDWdGCVBfY@
+VIOZ_oPaVInY@FEndh4jc3lMl9?id`53<BoEAm5d;W9:3B[cD_dWCBOXYfY@VEmeX1KcE`MlIGie
+`5S<BoEI=9giU[K:_5CoCM>IWf^[c>ljD8oi[`?n<_ljX5nn@jX?XnT4A2g05fQD:@9`ZNEB112c
+;hja0V1X]`;@8hV145m7C0ce_aKXEhkK6:cOK3ecliULOJGoFXBKkgC[o^OFgJOFZhRkOmD8[DJn
+QmS=^M2QM`:Td7e]di5Tgk;5W1[Qk8b=DOJ^AMcoVj=mWk^LoNo=>TKOngM3gA89WV`Ym<<>6<Ph
+]h<B<G;A7nF?Qecj?N@C=L3oB6HoHlMHaK]eNKdbn=`SYHm=:2[EMkTDI\MXQ[hjVS7T[kNOQW`F
+<SJ<59K8L5hYP>M;0CBnN=?M9E8:6OoB6:T02oFD0SSOG][WgE]?YeK:GjfTeWUe^`cJEakjne80
+cemZeklogOAlRO`_Z00G6n37@n]83KC^O_4JiD7[H7?@>X3M?7mWf]<40`ZQMCkC`jc3VPdfj`1i
+16I6jh2K7]Mdi]_6AN^0jfejgd47@=^=7O2HM35S\XXk7MXbRg\1mF;6=cO2>k@o=iRM\DLgb<Cl
+]0=EVElkh3GcH\I\c3^dKAKgIUk<n8iiQiITSB0g3Vn@TOUa1bXc?gO0LnK5S>VHMfS[J3Y@;fIl
+bka3ne_CVAoO83?cl`iDIgk_P?O<RaWc<No@m]5di\F<kiUgJ3Mlb2X5nZlkA]ledJ=4LHcj?P=W
+;nCZNlGL9mO=eDnTo5o<_IBooc0Ro8;VR?Qn3Q=ZYUYSjQC:?i:ZSiCoY5Mg;kR^Ug\PkdUSE3=o
+lb=UI<R8d=5e2c6dBjWj47VONWGgQ>^jj]7l][DHdDKKL6K5<5Bm2?h][jjgL=dmKoEQ_e_cR;eE
+lZ1G1XD[GBCm\0T=MHcG@kj@j^\?nB?EenO[bdD^cmL_ac=6G083F6hG3>2M8W]J1U4QCRnKh?B8
+CD>nRQV9nWEjf>Fc=ihF<L5]7l=gXHPQocTAo_6UFnd]PnIUCgn[h?WH:_gd\KBoY^fg[cii4N>W
+FcFQ>HoaNXWDCkSJ_e14T_IG7I;fckHjG`Ko6ig>1N22@8AYc1L2\7EJP:gkjXkCAglVd3a>0b:2
+2ZI171>4]U0\9`2cQaePkdZ]PjnOb]ii6VPebQiYW80mGJ<NA<[h1\BTf2KZ8B\WZ:M_e8<WD>m[
+@bl<2ZKNBMB3VZGZEDYHX>[eigBHWnGD>h]j?e0?GEi2?@<;3;dfioba=Qej1d4?V^l5N_HEf0;d
+WYbYomiXj0TQ@UKT@:mCVH05bUi3If@K5i4m\:A1n29?HPo\fNl`nf^bMaY=0Sfea11I?FP3mLho
+H]WlQT`Of8TZC9nDH@oRjnhZjJZ20k30GMSC=^[17jSgg`h]1PaE3bcT6ODdSWX@4DZecX[cP7hE
+AcfMXak4djhGIbeECbjXQ`kIXikb8hP8l1g^f>ERHED^P@oi?PPn1@@@l9D`cZ56cU9Ln:h07aZi
+4G`M>WG8?K3\XN^E;NKNDL0=V_:BNbEJeBTBO=09l=fm@jV7=lDn\@O8Se3`eJPANf2IlYMH?1>H
+2G_8l5C\VIM1\]OGcO__5m@f\:6cf==2nP1FPKd;AK_O?1gB05JY5m:P?QM<_@Z>kSIiWGYPbH^Y
+Yf0Ck89jMhRhN=DlVPk\gc?eS7;0d>]=`^MO`m5dH0I<m:c:H1W@NnN8M4g:X@MF=Qaj9SUPj;FS
+3PKR>iP>K=8jSdH\2Hbm2WbI=J^M9@5k?Xlm5AKH1_GN7RgM_7WH9^XQ1o^YYl@2Djl@X`X=oHWd
+PADiZ9i?fCc@3^amLVKDWf7I0h_nT3fAIC3fn[mWdHj]k87mcLRN<7d`mP[lIM?IX58If<VAk2TX
+PGe@kgf1cXK0=UH?VMEB?@DU<?DZOSaKo9`<5ERFVnXYQ0dR17cW^e6]JUch`<KoQ4lCLCB@8n1k
+h:;V7KPbIZR@dTWQDil1dSf?^95_[G]P?JNjahP0E\:m@NSckYme3naNEoMH4L3LjeZPXBn:hP>`
+EVOM4dH0>l7NPbYL3DgeP?hAUcea133fZY`ac[6?k86ecl^NS]8fV;2bojAMd;h_LAUHe\7\RK90
+gJ]Z\@Jo2e8=H=LJ6iS44\5F\7OHn[lVIdBK`59LITlU4DbmG^O=7VVRNV2=?j^Wa09[XMj9=lo6
+VMD3FiMJ?GE4<?Ej<gQDaFLH5ERAfNZeb^J2_Z1ae;cjPff<20a2[ej]B>3M0n_@ZeJ1hWI`QeoP
+7RaALONJi1i43?Ono2GLlMk^7G\1gP;[e1b_D?Q0LE0;5[`=go7QPjjZSTZ<H0:7[jmcehl=[@@Q
+H1lbZk\IQ;87WL7NUf9GN<LNj53UfA>W1lINFJh]?FT2P[577[EWClDnV0@@^7XTCgdG8:;nPPJ^
+mDJ`9a^BaoCG8aE@B`<42P0000H0dV^^5?U7PEQ1n000FB0100X0~2A4eOE4I=;UY9D0l04P<T
+5CHW>3UZNdbMKQl91P4C=>GfU_NQ;Qe8D<6a6`A8\Z][R\9ODPIn\H2c:a3V08Tf5HXe9TbGE8df
+O@Q@hT2B5FfNa9UCkEjVWMenC6P`h4BJiNeK_Um@KD6D`K7o7lPf8DBA@0\3G2R@iEFfccmBAoVE
+Z7g@T3lS[LgB:VBjblFGGRQMMGCA8=N:9iSI[__=X`<M?NgDD5U>1an`hLk2XO\CQodHXof6`af7
+aIjDhMk3JLES]2^B?F:59HG[M8_e:L?90L<bo0Wa>?b6HA]>Q^\h:LcQPg7J9fc@l5nhk3\jki?o
+CM8bNBX^gKMhMIG\_`iTW1Mk`9M2lFYmfgLokK4KkDOL^[bna8IVMaSmAZ6KkN^L1_K9KOh]3QRR
+jOIJ@cHLB7PfCN1IGD9<7]fSF?`5So\6_chVimHPPajTjS`\Lk:8bmOlR]?^`^<oJlHV:A^hO?0M
+>Ni=?;hkkoB0]DoU>_VSmIk3hM?l:EZ[mn7@GHKEGY?Shj_4HcO]6o`dBl=]emjMbEMhkhZVN`;O
+J]M\C^\6_iXMJciRAYiiaDkU2K8m`N?;]H]FRETdjkR16lJeb=m^Nm?>jh9d7GhTblmQ\ckUo5J[
+\2J?dK=]XQb77lD]NbCVn`>7^hD85nSHkIiiRV@^>:=i_46:M?O]dMlcQGfdL7KXXYERIVPM<>7j
+V@4O?9S`_L>6P`gNi8hNkM6Y`klB_\T`:oRmL8O37;XblM[o\7VK3P]c^dc]:REjQdTLNdn_fnEV
+E@iFoTVK3;V_CB]dhn?KPXm?3X\Oh73`P\_BYaglOGJHV=_VKI[O?]WQ\2?6HEO6DO<j[1dg>7?<
+Q_mCcKZAHT:aN?\kaGQoH^cl`D7_=obI\N>iKd>[7DUg^e^lF0G[58j_O[e6[ijTb;D]g^<f3Im\
+o1K_MXBh=AjGK1GgJ[YN<LH>3]nWf?V59d\]JmSRgXI?:B:7^e`ianc`aeL<FYgfCJIBBFoT^GMX
+N[b6WkjN27ZXhkJ6OjIWRomTGNjQ\lHL?S]cnHkN>`ld_EYXh=IE;`]M_e\^H]jITGHEgOZ[Gk51
+Zf8VN[mXG>]1noN]NKRmOXN`^MIG?MXYkMk27bLeO8Ae4_[k:jWOobohkEN<k=MWQ9VdlTKM^]<>
+9U[omW^0SnmRm<]k94WgJ54Gi9jmX7R?QcFgC6ihlfNPj<<7]Gl@jfWhGF7JW]ogZD7TAY<>=2]D
+ld2V4f]_CZkk_6Z7<PfbQ0SnLMR7<MVW=7b@NgW\_^o2K_o@M^23U<WWiWXJKmOm@85NKgPkXONI
+k?VjkW`LmWj262e2oCj8LH;2;]eR?oKJi`kklRKk\P4_h[LMoS_3oIS37VTn_N6^gF6ogVP[R^mn
+Rh^H=^^khFkNHCm]Cmm`Knn`]fod23ogf8L:DE9db1KkX>aQQoeXTcfak;73K]cbkGRGWS\GQmfa
+XG2X02_2cIdKnmnW=oUf3W]i9]\[TOOgSiRe>mj\>kaY]kQCKgB[gY0bo;>]efnhkgOHlnhne_?\
+3FoL7MjHM\[kiRhinoB36nf67NiSkA<gg1\kk5oi]amV]3mb^<Nbf4\g`<c3W][kjXJkJlOZUcgf
+NJoakk3oKime2mJUKH]RGjYM2O=_`?\E`KJ>R?K;UZIO]USnGo<;g>QM>Nbc6Fgg=k`=ba7Skeg_
+k[RS[;N[3UnLHFIJJoZ^hGIB_J^[GBG^O[NJ3]PfJgB>ncG7W4]`C9V>cg9Wi[4Oa8m[^4>I?XGE
+MHOk@^;UT<Y;Wa;bmI3:BglBl[>[]PA?l:kPPWc?YaCOF3mIaf@[kiAlg3i2^X2cKO7]\=oDkgJh
+dk98?@Gie^b3>jHO>>KfbSYggghZTcdc8YhMmPh_n^c`omMoO9So[eomX7d>G\PEXMWY6n_oomOV
+7OmNO?o_kkGK6gX5GAWeDn^18hKT_=aek:FEb`J=3GQ[0Em2\_0U9mT[mRkQBf@2Gb9[m18P^nTU
+VTl_>G12_J@?X@JOoI5[MlTa]`:6lT\0MFmAZ<=?mM8CQmW:f6\dhDA=66HC@5d[hHiA@aK5h[Z_
+EQaF9TS6[K\KQnoPUo13V7c1^0gQ1hom5`NR?m`mI>G`EeZfKo7ZJ]Qo6b:42i8mh8\Q6NmE^_Fk
+coKH3FG2[L_]CG``M^a\cXNXWOK7CI;dl8^HOh\5RW2jgMJ@3@LDWUDSN9HOdI97`eSc73cf;?cj
+69eKQ`ajX<[k<<e:9RiOldb>>`f?ob`JZlBdH??2SnRh>o7hK[gC1MZNYN^T4MOk3X]G\lRV;An:
+AO\II_^>SXo_58oMe21lj\GQ]V__c^Pc_?N5def2KkUc=\OEPeo>SSTOL@=2>Wk2hm>]`^G=N[cY
+[c2;IQd_\:=fU_SKJfoJNFGPU[T9Uio9LZgRnDfOj?`?3Yo^6NeH_0V_fRLhgc5Hk0l5>TC;M__T
+YHBci7V>;a6:akegYok>2^fSQ[UA:mf4Th=[Q0cKidChh4>6kahj;7A`Q7G7oUQVKLK`3GglnCid
+Rm4\fYIafh^dO9dV@k=KSFhm:WbSHHbkSjoMjW;YAZKnO??0Ne]FaCXn_UOhN6Dbo0PF8eOHS3g[
+a=mcXl7I;EnWo>jI;DH[X1:k>hjYl_G[f3ja`Vh>?k?DmH<o1`KYWVQMQ\liHRc_7WMan:l=MoIM
+d[AaQ`9AWkBSVcDOoW??ie394`ioQV0=?gWV\fR]MN7S6f7V]@Ec?_dM\O_JcSOjW1djo=[e6ogo
+gDWcZGK^L8lkS8bdlV74N9g3Engo<6J_9H4SC^ZO;^6fSe5fI`jOGRIN6g7XbcQW]McSb^I=O6MP
+gLBC9[I=G;]m`7c_SZF]NgOiUJkK7dGi<nMolOoSPXhIaAHWNW3gf\7B3g=3a5LOQLlNHMGKN]Nc
+hH`5Wkf:F>A<ZoS9HZoOlcOhk1OejiO?d7S_d?:7GZgI5S=ZooHkPXnMnb1>mjh7j]@mG`3=_ckP
+^Qo8^<FfE_GRY^icn5C[<gVV?_TB[VRmP=W:C@^L:MBiP==Z]\e[CW>U7]Xoh882nAGR8@gg>=:0
+Mg?LO]o1Z1gLQ_:jNEjjnmM[?b94mfQ;a^lik?VikGVHnRN1``J\gb=gf8LFoCRJDZ2MC;MCA5n8
+6oS]Q_o=H>8<MnX>Pl^c8mCkT=[ML?Vn`hSY^o?K[1YDeco_^1LZ45f@;SG:d1^gNSONUNO>aF5g
+JR@L6Z1:l7;Wa_k_fBen7KC`\mPVIMboOl:\gO56[]jd>m`YEdnmPC;licMG2^`Lno<gfHii7Y_f
+MXLgdTii_[U;cSkm@9DF5UE[?n4G;7JhOo9_?lCZAmbL8`Fhfdl3:FWeZTE`kMSl\LLnmhWknOk]
+Lnk0^K9]BM`[MJ]Po@]d_a:heY7@OC=lR7jih_9_Ol\_J9=giK3?IK;Meo7n3XLHgOG^CS]UKK_Z
+l<DIIJIIjoL<]eM_N:N[8=k`nM]V>U2kK=4ikML@Z2<d5^R?cfYGiW4OJWZLVV2G8GDNY1;bji2j
+MmPO@_k\JZg04kXW^12oljW40>WT79>[_4_bLO^8j07>0]mff6m>WQ_\[1`bcnF`]fHOg37m04oh
+b[YfggkB_3<AlMUQkm[T2Ok\l?o?_d:AYOWm`_TJ_8Pc>oOBKc1NR?SFQQ`oaSWMoK>]bMkP@lad
+?HnN]HSN_GKWiJeS5eW4`bcRBaHAO\HRnUWl1gFKF4C`=aHAT>D\8TeX4B5YkXe<lRiP>8\8D7L]
+8[NcR>2];28\l:Y]ncL>ge6hAY?Q>Dh6JoQQG?H:aF\4BgS\OkS^CGS^8B^7_lZb_D_GE_;G<=87
+`V259Doi]^nnfV=aON;FiODV?QPkM[IcYigf=\gf5`foQ>5Pb@0>U_@97iV3MK`6Sc]c\3b4PgEg
+3WJBRAc\If[Q31c\AAc\dQb\On1R3YK<hV0GJKf?PoFRW[Ej90kMQh=mQh?mSX>UGcQHo:;Y;PjF
+FcgPH1U:>ZohRHi?]`J?=n_aY[o1:YI]_:1>gUWQKo\Xjk`ZL:_LQ<_?H[E>lOaVcc3I>jSENlKC
+nD]dcCjQnHk1HGlT_14jM]\W;b>LUNMcNXE8?>im^oAgEV@O=Ja=f]PUVQaL4fCH_RK11alZO?O@
+hJ238MHjmLNV3SmSn8I3=N:kSF4bQjiE_?JR;5nWaLSL=V?KSTZ\akCkn;Y][YI]H^HW60nl[eDe
+K>?SNh>?CaJSCn0`LH?=f;<^o;dfK]6mC_GM`l;>V_PFM^Lh5W;nfN<G:Wen_?a]f\H=1[N^dJ__
+QLCke_F8_;M8a>7;V\OX>ji6j1f?QnH<1H4io>BG`]DVk5eKL=f[F7FH^2[L3Go^WEK9mo>D_nlM
+_]Ogh<boDOCDOi=FcS38A=^Wkh\bGn;G3WohkIRe1j]d3g=]i_3f2_@<Qfnnja1nN>]ZQlo_;I>k
+kilDkE9oN?PU28hbmik42@<go1KZnZ5lD`Y\>Y]bCKjK`iMDZe=mH[S>Cj=M6MTd@^l9BO>F:S1U
+e>]^XD[WoY4lb[>]?GL<[KkZfIZE5F=MoYVROhFSMnGeMbmbKkm`l>i<Zn>nBMD]n_NV6dn\o]gg
+@1j`?okhSU7S7Wgc9LC[GQLHl0MlkaATOKRTOA^nb0iBAWYE9dSnT`5VQjXNL6J1hR_;Mifn>MG^
+Lj<NE3_@8X:D7bNEd:LhO:1k^FboklA6H=h>O:36dSZ39Wf1a`l:e<FoIH3gM_g?Jlo=hSh36RiP
+XG\imgS45`EJSkRCAgaIX9lEN47OKO7O74IZ7ZdiDP_0=J>kR?\>kgjS>f:jli]7J]DnAf1J]Em]
+KdlTc=NMPefPCH@@6Q7`Ohd8V=LOc\KoWko@YGdJLJbd6_7_gA[AgCk\n9^f_4ILemdKK2V54Cd:
+8hkf5B<:27?I@8ch3TJ4el68C_=e@9cY2C0R[1@;0>2=<29=`P:0iZ[a8m^_P2h0`?b`R4hi3LZ<
+ARfBM?PNF_Y`f5^5>XGV<?37HSKQ0aeB46J7hnI^TkE7`lT1`c@^Qa=OBK0VDn4iC@KWf?JhHnS0
+hBmdg75hkSV2l<9EG[1Qdej<Ff_IoV\1?I0Oi0gc]LLW5415EkXkX01dX@T:`2\:N;3;X01P2Q7g
+@05@;]2N2U52j7f2U[m`[<TK^gY^hK6Oh_BOmW39b0@]7g`>7RU?d9]_MXBj4o5JbL=e?T@jNJ@Y
+0cN31F;3iP?6Ik\LO\7?SS7Jb]7Ia1?N=hYY9Yl<0kcSJ==UDJ?6?ZT7__Q0jDHD[;MD:CRULXdG
+DD<l6oc=ZZnNJd76kAeJOXhA?5>i_]<Mf>fnRm6;TiB3Enh>W?L7c5P`W<Ih^geb1g:;c64NGbPX
+9^oM\MoSe>Gk7KXha<DK_l26JC4[=<So]U6lMm5RK>PF<f4K3\0XSBhMOPFE;<4NS`7[1ame?DZl
+^N9>SK9V`m5dhmA]<kK=Y[_S[[_COGc]eP_>;VhWPI`VjK1R\g]M6U4kG]hANGYV>?Ke<@RgOj3L
+gBhnnb]aAh]d>;FL]6V6[Tm^==[eM]kANWWK[QkBm5S5bXlG]LTO]nVGF:^]>=l9dce>YGE0h1\c
+o4nMHWWWLBkLSYdO1HU3<R[2]P;n^a^nIX\kki<leZF?mjBZ^>m[\=X[ZWIKTg_]UkQRknfn`Gjo
+b7OWh;MW4Do3\8mg]_e6][\7Ukd;ChOO]Ef4faf6cniI>V3H]cWF_\_ekdo_dKTk1=oF<fbcW\?=
+lNgjCiLfo=Okn3Ddj;cK5kb2h6lHo[5>_MgK@nNO=:eooKlXbG7:7XSo?\0YAMQaGOXmgLL]ncbR
+\i;`Dm3ghg:L?Y3VF[>hGoL4oEaI9@eJFbFiH<[CZKJ]g[KWI]H7lDZ4g_EO7XLhg=?46WQGangg
+B=;n`Fk42oAFR7>N^D8L_EDP=aD@0=R32PP\jX\7??ePkKG:3fJWE]U;9VgLl^fh5ilk5h_M\L6`
+:04[a<fM:o]O>VmOB7kI1_`ZC_cm@bJ3EBB1X>cWPTiTk<]Bcmm`Fb@Q><Vo^Td6eH?j7WKH3f_g
+`=i[kGoVgghX[B>7OIA9Bh>D]L>N`^AjkVkK\_aYUgfNkeR0ofnONA?VaJd;Hen\GN606?1nQK2]
+8jCm8^J_GkJHo5oc3Mc`C@Sl;5Z^UfkgMLChgN_M7GLZ:bT>GjaQY]XdlIg3kDBB`^WhlocMLSYP
+fjcA>^kK77=>@A=@2?BF>c>?oDQlW<<M0O5YF>DiOk7BlY3:BSE0fmN3E4;nVI3?[]XRG<4kP`_d
+?ImRO:=mIAjE[KaSl[5k2NX4AXVk6P@eR7ONHY7;9:49IfoE?]RSnX5SKZndLoO]9c?le8Mk8n:M
+6ck4ac3nOgnWlOaOon<gnSWh@:Kj7^WnA]cdk[oEEA\J16Ok_fiL^_T[ETB]]gY^mQYgDleZD@09
+_iM7@Pii92oX]J[]K8m48WPTjP@4A?d478TcL2BL]T<H6dii`Yemi@CdWdTN2BgO[EKMJ;mKck7F
+BffWOFjhm=J[K[?WV^U[K:U@]TVWT=>Nmme1U;BEWmMXmc1X`mljj@bS]g3H@c5T@>hd[6JLQY\`
+bYPM8Ub;?C;3AccX0hESG1jGjdkFH@kk605a]3_]3ckX>Jg2La;df2M:cNQi^7CghMEF];L9mWAI
+BMbVl7DM<Z3g78iMKWoPP[<kgVRM<7CCgJWC7X_A;g3n1PL:aFakKJ43I8S>Y@<lVmOHb=VSN<a6
+G\0C>[Mllb?LnhASC[iXnB_7l=P`g0nY3YN<E>3bXeOQ\\OXn;mld`=M_XOKe2cFl`6GVREJVfoQ
+d9f3@nL9E]>^kQ\Tm0L[X?mI0@nigN1dSc2gBdHmQ^dIePI>l:U_Vh?7;dWhnjDi>6MbRQD]HWj:
+N3I8fV]odgD]d;SmP\]GHQo]5^MoVH?3k[h_WF6LP3QhiEk1NVo@XPj:>n3K][_M5hJiD2GVl@E7
+L[ckm^Qc\F[co^X5@hJI8G<fL?8_>=3oMY6lKY0IJ_3DAhnVn;CQahSNHI8<o7id`n4<VkKdg?8g
+6Pg7nBj7BGalkIJcRkKSWM50R8W;kVgI8nohN3oRiIWAN=3f9V<bkQlHMgN;coe`hFQ0>9F3O:ef
+l;YMQjENAn7_bPGdRj9eVXKk7WMcg:iaVHP7M?WN4IU[[LoZDMh<SWN^J3G91;CSjlCm4WLho7Qb
+aWcO1MSWXZboDFE7V3c]N`B\dmW>N7?]VOc9[<KCEj\oG;Di0dW\YPMY`e@OlBP3\[IY64<V3aoa
+cX1aBWfTMMT?3NRD9EX61gYDVO;WeXIonQb;dR=T[i=_hRfOQdm_K=mmmTS6<od:9kWeT`:eiMmg
+]3SnTdMO`lKNoBEiW6OaKQeJUn[h6aOog\?k;OS[ookMiiAWbcXPoke0Skhob9ieHM\jIDgXfcZd
+[_V^P<GhHg_8bjUaP_>_]KUlX5V5>462U_VlL<B3:2F2O`YLH80FKa:N_7<h?i3`C]mLb7\_k[0G
+J>=a63D=obGJF5H3^?]M_@aXa8kWc__Pd^WbVbWOV[C1ccg^TB;d520@0?f6Q0Nl92l93kS50a8N
+@4@Ph@5\6Q08Z>oaVP>1U]hN;]fK]c<f=OK;mmAko6XWU?go>4>O]8T6^F7VZQfbEUfNZmg>?CFc
+T4POi8k3Ui5:O=VQ1fbbdRkPbe0J420ZJO0d3@d8T[W?S;B[J420i^2QOhaj3QkhT:QFmh[4A7f8
+a[7j<Nd9BLI9LAhWRGVD8_m@8dJ_`F>?aGV?=OL<BJ<Nd[;mR5MG\okKP3E73oRRnO[SDk7nM^Rh
+mk1[Lg\E6iB<bgb]D;3C_IkEoY9UM_>_<D8DC[_[B]1Q^=Zb@Abi_LNLfXLlh^2aAnCKdo3\l\dX
+X?e@@9<gA05m5JOm11C@mF6CU4@1nDD>;SH:R2i20MgANUjPVS^nK?Ti;9[=V^I3a6Ng\83SYdf\
+H=oN[N4W;fAMOi2XkI;Z<MI\>KASc60@OWL;D2;DSRng1n]DI]6\h`E>m<hBOg_]CC^_1QbkMg3i
+6@MbC^[la_KHgGNf?GcSl9VhIEo4O7N0A1nRFj1S]g_V7I:ih8cVl@J5N:cT7?dmIZgNgj:=C9:Y
+`JnP@cJL6Qc`_hoiNhL=AeW6Tj4Kg]Ra>=Zdn1G3V`P7JnDkDOPae_J9>gCFf7OaNYd>@i;j[E^>
+K[V5aGoKSDKLjgKEH6fioDg6QVTbIKUmKOZP6aoO3galLUSfmK73N417_;g=Po\nF``ac[EK_Thi
+N7db6^ke=]m?0H4\\:K;=1YO[cT9HHC1>iKU0jji>nRNbID>_loCX=K1;6Wb?_^Cj?=H2oe__V2e
+U\?GO8ECSemA;<^IO:gC7?kehT:h8H^[77jcNDcnLS<3c2RDYDbndQK@5mZ5bCm^A;;?=X3Q5mU@
+OkonK@CJHSjCnO^P=HE;73hI<O^?4UW3h<Toa<A;di74jaY7>Ic9SEWfDZK[eJ\`B>^nO=YUI=8=
+7MnUBoFiHiS>ZIkT6iGhA>EOkMioJUe[B=];mHHlVW?hMZgK@K>6OkA[kmU0lhM?ZZK5odd0D__e
+0OZ;l8mnkA2_JbN;M4E4GkM81cjlWm^\cMUZO=oiLCJgEYR[NBA7;=GYa=ZKTn\n[mXSn2B@i?iF
+??c^G2_nh3KQ0mK\jHDK@>Bm7bS@j`fogE8kjo=cfo<dg?dT<<]N_hMAnQ0Yi`?_XjFLk3=blIKB
+1PI@oRMX7a<df6jeT\B?V8`W:IMSi>;lZNg[4Kdg[goNLBmDX87QPX6HXM:5\U<8LG2c;fjh;M^l
+6nn@HAHmd6PQ6QJ86_3bi\Gm@H27Glm`=jNKgO7no@>WK\O4Pe;VO53YJe]W2No44S;a62aan>D]
+<oO\0iENl2QA`Yf\oJ:eWiCcA`kk0bI5aeeDmJVKO2d:X;fgKUcnV1^jDdjGgonkim`1YO3J4?M6
+gAXhGiIo3G1]Hj3kILc@_e`QLNn_o29fn5IB\E<YaL<AnidJFL9?U;KJl:EIi:@kQodmThf9Wa\\
+lOWKICI4PhZKagjMLNJA65[iafNcmG8FcaoeZ=4MGITBd=\Sg`DZO@jYD>UG@]jnhGiM_7=[]@5?
+hYk84_c>Ya7ODSliUnAZkY5ifSh:NR2c]=JfaKO3W^?7E@jEcd;3GOJQGM8?6FMgCCekkkjB`ika
+_YTG@o43o]B4C_cdB`jOBgMnQUfjChkoodA2\3_hPImmQh=9AeJj:c@K21lm>iRe`?=3MekN>_Ja
+b^F2`@Jl_N2ET59NbHfBDT7K87=f1[;4G\VW<_V10EjSPESR;60l?NL7YPV_efQjbPl<J4Q?>ceE
+Tm?19B3_9_:W0oXUC:N[TD6eEYaf5D<>?90j`\`iPC:6W;3YA[[7Qn<dZOd`@YflQAFh5BW0KN:C
+0o;N^>H1hRbA[bBlB26Lj^9\VBG@Qm<\81idY?j?9Sf?gX01ND:112KoaoPbX9]gobLc?]Sm__3O
+OWTf7klo?6[77afWg@\MZn^ZHX>C9aj@hM?`N\73=SG7n@9lOA0WA;?25@L<bK_]M]L@HJZba>WJ
+QGn@N4cfB;=bk<<AnPRCogL;gi<:gf_cCH9MnD^nfHgcM0]hHlS3eKV6GOTIHFij@`di:\]4N9`c
+Aii3TK=fC3iG:O:QC;OGUX?Q3YaF;W6ji6hPMMlFoM;afBkefCm;aVAko>BMBoeNCmYF3V@Zb<U3
+Mm`9NNaI^3c9dQa[7K42BcifBXnBKDbH6iM]6mGac^T2[N<RhcSGo]fC0YajSZ^O6BF@:[ga;4>h
+Ao=nYhORo?O:mXNjUnhFlFBB@0O3c1VUaQnJME[L7A^ggB_g<<beIecL]H=bO9[NmnS_<N_3=NoA
+;=[58\<:eYH9QbdD>Ee36naW1C[T>\;6>F>3=iT:gNRF;\GAYG=bSNPcM5PB8Oj4`[ObHP1eXnK1
+FgTN_XdW5NXDe:jRGinihHS[A:<3jiM;;TEk;`IjZ4JCU]_GYQRjlC4\iA3NJ:`Co14l[D6Xb:Vg
+]hgGXM[h6\CM]:f9NeVh?K?3E=^knLIZo;Mf6;?SE:XnGLX>OkaVgn2ZG[<Kn40noZRZ=i9DBaKo
+JM<XkcZNJjRCmRT`N5[\1g31kA5jKh^gk?3VNhF[A1eGn7R?:X_k_PZc_L:Z]cFjegjAngk1KKo2
+O[o@5h3hmTcRJF;BLLm\cc3lMX;H`Fo_b><4?>mQf;F7hS\1Ofjc\T72_L^VkQd`38:m@j<?d;ci
+Q6_=IoCZ4N:EWm?3ooUNa^gU6[kM6nbJR7Q8oU4Xk;\kK_jI\]UXOWokGH1;k@;lQhP[m`Pm]V?@
+aW^jIYmC6<QoOd:27_d2[WX@XfS8WLT`R=lb[PWhiDjP:F^;cd:QOeeK>7`_8O67I]?NG6dFGoDH
+@GkNKA0YH\X64F=S`EHD:Oo77A`nJ=llPD>OJOQXCN\0A3fSc\O;Ka;T?N^=7CiFA]Z7@R`6?ng3
+gf[ab]=0OgVkM43GhjT7U;fFk=gkk@k1K`7Sgljh?Z166[kU^K@DmjAhQgo6^CYlZa1Tf\GQBng?
+<G^]2GUIMb[olP7_l`d?F?3];S7dM84ckaA1gWd]o_1EUJ<_J?P;0kU4kA9Jm^7KInLZ7g1VPB:;
+CjNL_1U4nKadV\0WVOKoO?\@]m;B0mk=LI]8gGJoUJl4mkZl?Y1Rg?H30gJmbGGZ^aUdWmNMSlGN
+Eb33QJPC3o[ThGab:3nDnPjDKimlfH0mZmlMo\\GSl42`k>mYd[I^8SAl7IPV8[kNLLmDH9^bH0G
+=P=0=fkiM[b;Qgiaf1dK2XL:\2;Lg;Vaom5iln75;o4RoojQI>ahTidf9O^WjYdPK\[`chYJ7mRQ
+o>M5R6<mcjj`Ba4Kddiigm`UIioF8j7ob[o5anf?8;VGaEh:hdo;ikKgeCiaKC5am]SWFHAoQoeo
+njaK\2i]FaCkD^e:V7nTN4F`[B>RoM:YdbmK;?n_n@E^m2HQ?l=hmcNlCHJ?67o_J_ONDEHZmO35
+6FH:`nc_\9bTR^=H0cmN_e]=1fbK=I[7Gg?<^@@4m>7S\mbINN`7lN<hARSoDeR5l_O]iV11`ohT
+i6MGK@VNh5g11OVNCbVn\GjbS\UFgRWi^7f4=9=<_6^Y]j4n=mMD3I??dQkXQ2]o2;QgCCekkgjB
+`if9nDe>O7KhP3lgn_o_miP6n_Z?gm7G]9l5e8jJooo_8lJW_OmJRn><dfQIP:_IgQH]085O<f7f
+n:^NUhfD?FFbFF5B1?lO9UKPc@G4O:BFV>n6gF]HL8DX8^KCE9?4O81g<Z9X9S6O[R^@CXYYA=T5
+>GcBCf@n8:J\CT;Vdm1A1aB<Dg]>`JHE@QLNNb[1YQa16hG68QJ3O5[]2MKhhK4BF`97S7[iB;j8
+=CNDhSjRUMIP;c0<dWF2C`h5_=0N[`ecn?22L]UVo@fA^Of@YS^63Q@0;m[do9m<<@kW6kJZJH17
+fOC0nkJJMNh7QSo```:3G_J=72;=aJ=m=YD8nW3NPcTiF^M^VnieUm71bSD?`3F6nd>R?7ebCZlP
+3IOLlF6^F50Xg^ffnhH4JgDhI<BF0m^eRWm1cmLd?Enom?aK]VLLWWe^g]T76^l=_nc6nK`3^RGH
+]CKK`ZgiRTA?GN=?`BIUTeSAdi@;^67@j@H4a7COLgb[4baiRM?]]Y;k_5YOLhcJ<CmSd2>=mdFX
+DCXdC1^iKHJO^hi?7;hgalllSl<?gmPXM^d5CIig29ki50=RWW]g:QhOLZK6fDJi`RAjQ6M?^\a2
+OjEFgKkK6QhoEZ\54K_Yhd6]?Vok8^BL>Gc4lA[_D22[gajDmojQV7=^`HWo5l[agQ\o6=HNET<d
+nKPT``^nnUj]HETo3J^OLL:`HVGg8_ZM;4B`ZBi66EIXYR0dbFN<3W]hOZK00jlUO7_OShAGjo0Z
+hJMY<BK8@AH<?g;3TL57i?`=f?`M__451V[iP\_B;[\nU?GFfn<n_WJ[bjDn1??XT0dW;[^eIE6d
+hn=[kSnFhLR@GCggm<a`c<JK]To2]?7JTeV=26fkO:gZ`GE8g\eg2jF>e7e^XLbAhVa<6gSVRDAO
+1e@n]:I=_^ic\[j_N8Z2F;`I7Wb?PG??[AVCigJ5`bMn=URm9LbnQ7O2?D_HC8cmKBi6gWo]V\[?
+=^S[_PJWWj@=Tbng@?^`VaZaCNIm`a?VVSLl]0CbiCE_lULclYkl]_Sf:K<achQ@=hNMfW;hcUI@
+ScD[i[a5Vg@`5k<IKjc<l7mdkO2O@Sek66_M:?L[Z\Bo6jkjGJK5SQ0]U41=S:dK?>JQgggf:<K3
+SdNBoi[fOOV8fQD^Jn5Gn;EkOn42LM\G^WfQJoOK=`[oF9Nnk^d=nbM=Db7nEB4h]@YaAn2J<8C7
+6<?gLF;G?5b;RO_llj8NOMiJ\5nf[a6\JMWM9j;=Wg^d@OCNUl>_GiKiBk0o[j3l@d:<3kQSDHHo
+aoH7G??Nc2^T7EXkA[o:?c_4JQLiO3Fjn^>kdn7W]KH;1SZD9lQ@<6_<J59aVZH76]JZ7c3YX0co
+JQVo]K6:mWXYZG1m8:lM\n^B7L7`8:=^To<g_8?2O7CWCRRFL;][>l;fK_4QgXOG7B9o:?dR@VVg
+l9Ek>]kBF_Hn3M<6dZ7fFLgPE4;_Gf1ijaWm@gO_4RabUo3WB`iOAYL?3=nPmh6df@nL:BcRc=ck
+jHBC=bNMYVZ7KlS@Jl7_ObbacoR95@O_HY3_;[g]Ok0K\MX6?53033]BZO89QiMnTZ7OkchQ@P=h
+EnhG`J91caN=Ob_`PP4]YL9eY;`4a<>4CX<kh]nlaa2k2ETQZ49mnhJ:P_M4OCe;ZXGo77DomAhZ
+jTGD8C0k\LBGOMa4lAhX??ADh0L3>_058<2L7oF`N`kM:n3mOn]R_[<]c;aG0lF6`]mZ@TdFMU3_
+HXOg[PkgKDg^Fa_N]dIEblO7JUWnb^4f_MW`M:^<6lF966G3JkLI>\ImRlSL^E[l=_3>[jMcclaG
+mUV9cK9:kbj`OE5@^MCgMdhI>Ah7?B_5c7cSJU;^6_dAgX0M`S3PGl?FKA911LbYVILM4oMJ=n9N
+K_RmoI>>`C^ebFoZCn3lac1`<hMmk656P^dYc3V`ke]I7k3ch@eg\O>?6]ib5<0J7VckaB<9lX7n
+2DXih=Gko7ook0Wmgnl6l@mHm;UHcZ?GmWoo6mL>ofjKoOno[kgAOFcfd<]2[PZb^l5aD9X\e?:M
+JbSlabUln34:ga6>M^@0YO3910ZO2dWh02lWhM>44SjmH8Oo@L9Gb[jQceJBl07m@l8o=N@d5VQ[
+GSQdef:a=f71?acf>dcf9fSfa6W6IKPfXUfRQBV6kGRC]D[3b@5NK@PIY>?`7hEEf0=fW0cGl<Fh
+k1OHkUmZn8=bgYfXIHbe;?j:BgL_GUdEnjmHG2gfP2nMh]Gj]Po^Mf>g>g6;0kc4QVIgc71o5;[I
+[P`=LESl0^MOIHP`[7KG5JG318YScg<^?c0bagHKnKM`fCOdkG5hMYDBj@8]om4hDlUH_Lhf??Hi
+G?kC:BhE8D7ld8?8OCA>kldg>dBeDjnIDFcg737L<dVZ;VOQKdoAM>oQlO4^^DQC_lQG7i:gKOOV
+l9?L5hEm@MiUceXN@d1LeZIISm63CdZ1;ci@^UNh_5VgE3ThYG:=5o53?1_lkKF;<]N4hSEj5Bho
+XnFZaO>KCT5k3`jOMX[;VboQUK\5icgbY1KkPcA]]dmNDSP;7Vc75`W6iMjkHgoW1OMBaMb`YFg2
+bL4fA8[eLd:lL2?3M`lM9YZHN6?7PVWFi6fTafM3kF_fISRC]RM@6H8[iT4l^nGXeREFhj6<^i48
+;Ng@i1oH7WQ_bbiYiOE<_3`c6Y[335eR=O[d8go?3@MA<5nWo?JYCHH[8eiSmn<Hcg^l\86^9l7W
+82[ien:\Ef\=gC`^JOD6neZ1k9=6]XVk`Z^=GKAnT<Mc3_mNO2K_dO_Dm7f0^e<D04n\:I?kkhJ_
+fBb\6a[NOiL`OOedQJ_6DQ3V=U:ONaDgK>K`nacQekYDj^k;Qlg[^:kQcfW7hXF]fo1FkBC?1abn
+UDERWEa=d2MWW=5WHVH:L8]ia9LJkA\Mo]C]LHdmfc\dK?o0P3Ulmi2LMa9^>k:Tmh_5[aj\Okob
+l\c:e7cEeoZg6nH[W;QZkei9R`kofI8FodUiMo_mQH=_Jl3WkEiiPdNMMQbfjQ43VP@c_7of8Mag
+T?]jc7Zi?]D;lRR>E_mWH>_3hc9m29fEa=Xknh3N>cMLnA1c@SJbLE?ZE_\;?ZoJLGb3=4^Y<Vc_
+`Fgo`Vk84ba\P4:3WbCiNVe1^^d1KaG8;M3Wjk[cLMSk2F:d25fCKX1M;U2ij_N6oiBjN7QhMigA
+JDB<J?4`]o;c3Y[T7mn2RNA0nD;I<JPFMoK5<7FfNCONSLnNQJ2=5Z9QPJP1;fmNg?lN2?\ja9ac
+60c[o[d3YbI1C;gQSJm_fQg^e1_:l7`>lF]K_mm`9dFjdO=S]<NVgA]B?[W]T[=??mQjHBJZB7`2
+ZBAjnbOomZ=<mTL4:@SmT^OCX7:dDP3mk]ZanF>?ONjDmo?mfnNlPG=Ufi:hUc0=I^K_ORE`[B>Q
+neX0A[mLLOVg_g[f=WUG3_]L9Y^9mRdA?V9dec\L9EV`;@fK:RdcCBkmWP46G@nOEWO]3YnoKJH3
+6]15ikAOLjciPlKI3QnOICIjn2gRheRa@JZ4Wef<^XnLDRSKch=D3omeB4Gbod70OPIb1Xk@?L65
+n9gMeQ_[9nNHG>EMTXoKAd@?L1Ih1nY_CYhKVUL>V@LQN6_f`AgC3P2A[ja[mneW\]PcTKaWQke[
+0o4oHm;noZjdom\oLl^nQR[D]cL8o=Wk[kYJXm^Ki6fbYEhdNUW:EH6W>YP_KifL]7;I`6KYC[<4
+WfJF72EPg]Bm4o3A\4:aaYA1Bh1\QYIX<[B4_\[fnDN:K[^WC0\HF8l6e=A@FOAXgDlDj_3=6>e6
+7>hj;?HG]5KTO8idiSQL:N6>DL<BaJ8J[k:TIH8`\AlDSn46VGEHRM1S9XQ1OgSL<gCPl1djkS`l
+mf:<mPeeL?n<CG\eKZf5njl57??QC_353ciMgnY:fjWS;\F^cNeEM70fA[mf:=[YG\mZSlTb^oWG
+624:Ymee9NV`P>5J=XQcND6A>KD?IOPK?;II_ZOQfOE7XQ?1_\Th<l7H_<d^?>heG0]`BL]4;F;e
+b7o`f9=aNFnnfA6:PWV]m>6jaf;dK?XXeNEg<FXObGB?PHUSSm=fjYOhjC3P]fg_e_1Cg9O2oR3N
+iLiI7]L>OSUKiSa53SkiU:gRPj@kPlNKMB_EPU<Yeg@9>jAc`MmMMjNNfb7aVS`9Uio90\g?Ki8A
+]fm`V2HH4J2>l:YMP_?mPW7\1CY4bgKki:64HYR7Lgb9D3`^1KGncPW]XhJiD@\<nnCP6R73mSTA
+?_P?PW[X\=31YAP_Uf;6^aRnhI0;nCidRm4\fPhCl1h6JIX<cFhe^WE8BmT`aUdOQVMTjTl0>O3N
+UTdjS5^5SeLV`hmP<G:5cMRcCO`m=h2R_dkigC>KF5nT:gIg75]Y;Mem9iVH?nc[\231Wl5bEeYe
+YQ]6NFD1Vg6f7cm;V]a_S`AMmBUlmPVoV\kX=md<_^VFDZT6Sbgd>971NKm@U<M]\fMX^G=`G25_
+KQo0bf]a0=_V>e0ekJKi6jRlPm>nRMVjnZ^H:E:V:^;DO\Wd?Fbb>jT[0<?g4DjgR5AUf>`UNFl\
+6K_\COCb8>>iS6MGK:fgN]Cg3N]Bl?YX8NHUSO2?bZ5Tk8F3In]HO8>5N>e1]3SAn[OO0g`lIlC=
+OjA8mcR?CfoJRT4LfCc7L9@aOh8j7akPmNNN9Bga8DjeOFdN7fQFX2HHhXVeK\:cbgJMo3<Qj_lO
+8RFHlaAG3j0L^nmk\=\o\Qf@jd\f;kMcnK[]1`K\LZX_1ECjMgiNNakZo1WPL87Zmh3L?JSbaGQW
+G84LXeoNL6nFh0EnVbW20Y]:@=XY]NlmF\Cdl]]Q;jDoSnR>J:Wdg^43OMiU7cAPKOo03Ld4j>gH
+iM]d;cik5[Z>3Y9Q@JP1;fmNg?mNCojJ@8[RmXWN_goPE2?\ZCN`[0e_`ZA=^e66allW<5?De7kW
+kk0KMiG4]8nU?G]3b[jlINJNOE;a2kkf\;iKn`][Oo;_OTR_6YB>dPSF3_]9DggL_CCB[A^G?njh
+ig?Hmkko^mNl@G>jMDSkXVf=]2o2oA[@^\K0m\_R1O[E:X_l:kl`_5_Uo2f7gOhFMgm3a6Qg<_ba
+YfNdgB[cIPhijLkQOQYYEd9EY=eemOWKICE2]ebaNNcG6FLHm<e^m?QL5PRjoAQ0C?aX^58SOLE:
+[d<Z:od<ZBS\GXAl^bZN>nc>[MD5>XEk@UBnjeVTMmA?cB>eVW]TG[J?PAk4U=Je`6^TccViFiml
+UXZgLPl@b1lac^jJN_KNoB@FK4Al4b\m>gc0Wa]nNMm7koH_VFf2NROMoooOHPgHF7O3YDU33\BY
+<gHb1>CZIBNGYmiE^<bPHP=NEe18B3R5i?oYmYf?8\M3H[E1B82\Qi1XAX@4CI0[AIaN0H<Q981L
+5>W`EI\kaN7N22VFTX;gPc48bKDB82@_2ZEGGZn8T;AeOf>dO908I;R>4kOVBScfBTB^o4=78jhK
+:_`?;NTcPoB^@N90G=R37^B5hNMNEK<nU?>a<hgB]^Ge9Cdb=jK7cXM^^^=efUlFLN3l:`hDR]WF
+bFSCQ^QL>\2cnH6??=;@3inAhlk1[ho3]JfH<4NXn@o7W<C;GfO5HIo9lCo=hY:A3U`nn=66Zd=l
+Mmh9^MZgLI\jaWX70gdjakaYld<L^[=`f_]`NGZEh?Ke2ghFS^7`k]hLO\;kHS7K3OPfNnKbF3_b
+cM`hle6fl<TWWX[C\fg1hl\hj0aZ>ekA`cNchdW?F_]^mCUL]VZLgfTFHSS3i=UFlDg3Un6FO@[c
+?@8<=DS^P8gKkYVO:>J2<iW75aBPgWekm?ODH1l[W1fjn6FH6ET7C:QnI\27;REjko3QKf2kAhl:
+^K;Qj`SOHY@>o1hU7MJ`eHWGOH[=<`8?iPC`bR@LjXQSknE]^ka\f\79EL8ah[h^]G1=Snl;?Shi
+77i0`l4;;TNON_0gQaD7\gc=lUY\oIod[8OM<HjF_cAF3G:]T_3g`0fonYV9nklKL;c[F8Zb[1S\
+QkdmW_LYFcSllS;k5RHIcj;OG^7UZf?E<QjEh9OIGjP[Ao_PcSFfh2DKmOd<;eGNl6FbI?UaKW;h
+<aFma[nbo1VAM^[VSS>jiMiAoFkoXJ5901m]BI<oJJ?n`nJgBKWnI98?Hc_O?Y@TAOE3nOM4Rgll
+aX16VF8mRol`BT<BlKi4?J=FV;iTIM_4hb=6[anke:TL^`>>jSHVlIK6FL[TfkdXJZ:[_MJ2QNmV
+Go?`KlDkSL\9QO\<YmE[Fd[R9OaZfof2Do<=2c_gFIS^0?6?NYF7a[onCjO_X>5o>?caSWF17SgK
+4^9eZ`o98bR=cGlH`PC5?^SI0NR;W_D8eWcClomgZ[G9JC0g3AQQOYYAMfMV_MNeNZQ]P@\<j>oW
+3R65F8`6N5O7kOLNg>j?1hkFGTgclWXF4>j?2=6EBQ4>4^[g@J\J8^h24@_]MlSj;`k]\P4H^0;N
+g`Yj8Oa7VTmGJB7R[cOJlPS_0]F8J@<DhUeon=?fm6BaF7_KXPhommR72[6311;Q09Sn8Q`0YO>g
+c=bc3`l@N_;__\QQOn3aXa1bU?8Y8GNbOkGgeXg;7n=AXe<No_foNlhM>3MfKHQkXfh=W<l3o3G0
+]Hf1kYO94oC;UIIomeMn4A\4B;LC^ahG<@X2e7BlH2^Z^eUT;_f`_fNblJBiDCPnOk_<QVPHk>Ja
+Gn^XSgSU6chnVbg4QbIo5?=PGOSBii2:`Oe:b5gTnjW8>kMF6o0T;QYRl3^OAWa;oNALTZ^iAnIY
+nbSXPLcBFY^03@1hcZB]LZQlU\?MUWeXUoA3a]UMDloN^joT\6NlKjJ9[M03o]c`olnOKBWoSmmL
+EHAK8Lf]IZNOmLkoonnaWG?>oo_;oniPUnOD^JGAaiaaNVkf6SMCcFZA0iZ?hXS8>hkXf`Nnh65c
+A?0h716@gCPRCLLAXBWWiHQf;V10SPP`nGL4@d\?ZbBGh?1ca6N\g1caNa=>YD`h3cOQWV=Gfi\L
+@2[kB@1m@`;XhCU>1V>3U`2N807l0B_OHh7\oKM84\1Jh7LTP3C6nK07N^D;WkHgAjA9>:9ZI?Ik
+`kI9f6KkBY3hL<U]oB\>69;Ym]X2O;GGj\HlVb]8bJ=k4XNod77Oh=O7h\Q92eZ1iSdLLm88?nS6
+0?6;S_oZ5I^DK>3b`GOR\00n_S__=8=NSmeTD=Jk3GfT1A>]cOm`j3hno[Lh9ZD3ofKmPYm^LKb]
+^j<a4g:9YKP1gfK?G2h[3b16<?>A<_7:9fkZ<mNNd?7UfTF[`RbJMKc0SN9IhVn__FWWmD2i3Un:
+YA5ME2=>We2CJlCK9lIYR1MNiVOmo\3UehQd[TJ4c]B8M:E6i>\JdCdd8_:a:ER]4EeF8m;F9Eig
+d8QhWDI4DVY4DQZEm_RV4N7C=29dBG6=B<J]g?3_UdJjOeJ0kQ5W3>TNZmKjPcmg<Y2_ad\hHln6
+KeOG?8[jIOZ91R_?i1lVPgoVIN=D[k^6GC[DUeJ\dN=ZAPoH<OWSEDXimaJ3e2Kn=kCOUE`mYj`M
+?WKGkc25]ZW2:g>7;k:`mUZU9\kd;DG@`bNMM[H`4^Rh\aKZgClB>_@9EVKhO_9dn4N=n`o^nbO;
+UH2IGZf_4:I`g4^i<SJHo:c9V[ac@nd\WZU7cTAg:T>XFbmYecY7on\O`nIJLgE[R`g5XbkZDZ?o
+Y1n]Y=R_XQ;4YOcFE6MWEHTb]NcLMV6<eZSmfnl8?Tk4o_5Mh\@D`?7Z_W\AlG[F1nG8Z<>K?`UE
+;mk8=?EnIVZo^5SW9gYaT1^AMX@i5BQ^^IYAMfMZ_DM@0g`ZD>^j0@_lY07[Znd<F<0==Q^``5HF
+5W7Nln5QKLL^IlB;ciiE<1hM5:=2d09Mg[bhoadSo9GEbgW47\;km`nL^Sd>;D4Yho3cbL9^jGMK
+alSKX2Gi9OCU[C;gjQ^5^kRU3gW:\EA1JonTCHLXlNfPSi:4dh84?Do][aK\FcL^Omaa[nN`kl[j
+_ggV3ITG]bjDOM6f1Lfo1>mK8>^J0]\_PiAm\lJBolX_Bkl55k>EKC60L<Ag[g]kk:UHNP_QScWT
+I3^o_7=H06lh_lBO_ee>4gC;UI[7OYeYeS4HGYjWic:<=?\aID[lDFGZ@kER\l@b7ZCm>G[J]^Z2
+W<4kQ@gh?LnR_:=nIQjI]MbSl[5k3>bP\HNm1_`fWIX]>3G3i;>2O:D1LF@O6^KMD\oN]in4R6N7
+OD=8;H0?m=>45<0MLM[?OfL5OQI^h9H9fnY?glO2o_Cjm?QMLomooh;aM`_MHR50O0<PSY@j<T3d
+GH3X5P1a:X2810B8oY1[lJ8N015l3T04I3F0R0A>213e8MCP\cnBGPhcmQ=03<82e3f12131=`Y4
+\?o11B:@2@DRN6:1R>h_;13A@P8A1alY407PN@@R0:Rg@2@1]laE0NY:AAGPCbY0kQW_F7`E8?PU
+5B28G2Y0I8P:45f_0WA65B2bA@DhR0X@?e810S2]RVmE0FY<UBon<?aQ\OASkQo1nbOA\BLIEoE7
+lY:6ikfd;OkcDW7N[KgBl>6J?HGRMhiJ\jV8l7_:nQ<^G\;UMgl>1dU[m?i[hWlJX7G2Jj>JGm0k
+ojnQ8XoTJKmeG?L\LV\Oi\n16GkgBW7ZJlXdNE1:M[h5C7fmL80MQE<HN3]O>oaT4`hgn2;6VkC9
+eggIhB_?7L;WL?Z3caleoKRdoXQ5jM^?F;iUKj9ggo8EnhCCOfVbN5:JHKnnkEdOF>a=NGKEihjQ
+eULmfSAMnPXmM`fY>7i5WiWg5]HOVV?efBlI>SN;6SAYi@eJHmYAAN_OOQO`lI`<OgZ?>?4^io7Y
+kK<G67Obf>KN>`=57gjXOik0NDf4Km:W7o3cIH?8CE\fb9``S@QldfU_CZgk_6Q?h9<1>nKo>>c3
+V>aCc:RiUlO^n`i7nZ7]`0MY9ifKffWEgOH30gJmdGM9h3dVno?JldSN9G6b1>gk0:`OKUI2W1o1
+aW9h\0[]IJdl?4coMhH?e1de?fgBnT3oNY==8::8KlhWoKc3OIbTdheF9nWK=gV2Wg_L8dFX:3WT
+dPNbdo3k4>DCIBO:KmcZgGQG7[mM0[96`Z41ZP@_9l7oga<9^8i1:P?V_go2[=g1ah6Pk9nf_QhU
+b<1nk^il728AWFo^T[=??nR]QMg4eWk2[bif^7obKclD01lYi9G3f_`b<`_KXk`Z[V_7iXlmm[TP
+=`SgooHiMn1LfKHTkYFjEK3n1KYO2Ec[B6P`G1D_0gOi]koU5kC9^g;Hic;I128L\GNm^m=>FM^^
+>WaaAYUYe_XMV_9aK0_3ifnKjD1]4ZdMl9YScB<dcWKhn:afIAkgJAKkN8Hkb_@C9:Kakd?cGXID
+G]Z9T5n7E5kjQi0o^eX[l8C^2Bi0W:LBgeP_aYiLiEfBSm]7A0lP`;b[0>SUcYkK:jdL<Xl3oMK\
+Pc^V7cSFm\ZjM]mn^_QW8V8foC^XL727n?o[ggOColnONJL4h8^XhdH_oO;__@OP_;Ti?[L_o[oo
+l^_I6jQka:=W?kGV:hO^_;aek:BEb`J=3GQ[0D948R94Me_k]W@KbSW?@9PA8Yo:=2J<@`BTn10\
+k1\4Bm?UCYnfDL2P316`KaRR\YjJVNW@PA[]:PHMLR3A^;@O4faJ@M7Bh4NXfBI@bJ0C3fB?D:=c
+fXG_lV`lE[9cKI6cJjPRfJ86J;QR\Ild14@^03P>H@cA^Qm1j1iM3?971V>\]4Aj_;;@PL=o4Zi=
+_f=HnCWRn5^`mP5>IM^NYFn[HIWgDkFIINik8a2m`ZMo=b:o?ceWainMXM^77I_]`mfaR@k>W[MM
+5FMhONQhmI7[>Wh8TRM@`C0WFVF8<7cKKBGlT7<f74QjePX`3`Im@I4Uhm8?jMa_H:`=7nkXPIim
+GR54T^P1:lo9=k]aWV\1Q`aj]AX<o\[K27G:WcZ9b[=<O95PAhjlQd977M0b`NkJVfl:QGL]C[_[
+nT>:<D;M;Y\oA^fHUb6lZdRd\P7Fi?kh:W7KCO_B?mgRYhlO_9^4]^oK`ZekQ;UcY_2?=VE9jIPV
+cl8_NiJVfLK8`B:M^5Ulbk@W2FO6J]eReN2In@;GH48?lBbk`ohPcKZ^Z7CGSa7]RVLLd3g:mi\]
+`fCO<:c]dRdSWWfZ?F9LR@DAfFVCbSLJ?olF8]bSHkMO20Q7=<^NhEbN=Q6?CmWm;_fM]SdXe\=I
+]XeKTZVDEMP0_TCVI`C177S\>`SQ6[W37CfjHm?VhAO33lm`j4G2]o4f7<j`=LW`;Cf9]7T5V=T^
+Ak\JlI]AN8IAB?8IQO08enVT<Goo31`VmNPbmL[6gm;;Q?Kb=L^U>dJK8UfI@_Yi`>FN4l9mRHo4
+Ka>U@>PgDGm?>=j_A>g`PcCZ?c=f?>m=NZ?XKGGjU<<S7?m`^?Z<R?<:3EkMl1eL7jmdo8I_=`Jl
+>Rk;]8EgacV5Ama@Hal\mB_>U5Elo[6_`a^HKW2iLXJgcn;d6Y5ZTh@`:Hkg7\EO>\[SdmLCA0n9
+iQcn2DGKOl;Dkj6caQ`n>g?i3]lkcnPi]dbIG@_J?XaJ=lF]gb\?9]lL^7>9KBl2YKa@]GRB^Qnb
+MP\CmNoHiV3bD7\n<XENfRW]g\8O:IB?A=KhCmiOB@df5ocf:dJfk3<2jL`gj]JMMSCAn[OO0dPa
+1OAiScCY7SgZP^bc5aC_lKSV7R;RcIn1YPoO\39YbGLgnQd=f]YP?W`cIiWl4oml21LEQ[baKH`n
+Td=jj9M57e1[JZXGYb;fJjOPo=JiAc0hjHL@Hb\>7g9Ae<l77OkWoHcnkOJ:@RO[VnkGhRNke8<_
+oGKhcU\GHMYFiJX_0l3<73hg1N27GRAUm8iQ0\lkN[gnECWl_hES_LVUhek4T5j<ebOhiCF7Ga^D
+0No@<;nO5OI9YLH7>3C?Ra[K0O=\hP?Mec3oLf^7:;?0lW?g0_nngSIGM9ah\O]`n:L?S=Ti[Dg;
+?l6J1P`PXBfKK=fkiK>3c[Wb8FYn6a94U0X3RSo9L_OJS`SAj`h_g^mcf?<<n3d>MclA;5JPACU4
+_0leo><do0KNbA3iG33VQNQCnh[2cDkN6Nfd^0knf2KaOH7nk[Nhma\RAVa841^V@C5kR7PGJPm4
+OV:E;Vjh;M^l6no6IdN`KhlFXV61Z04_KekLoajoJm:k:;^ENgSooX5C]h<Q@E1f?Q7_Jf1GmYe0
+I1PBCWWhiBdcmn`Sh[d05mIcMk9fM7coi=mmTL?n4?168JU5_4o1b6^7OKGgeXg;Dhdm@Oa6o_]o
+mi`k`>5L6n;NZ5\3ig>a_`Jh]S7@OJ<bj9L[;Oo^[b`fQVm5hPH9KRMfP1`anVkgMS:kQKOEQRo=
+8ROM>N`_4aV6I1W?ifnGfA1=a=eLP9aaiY4H;?j?cfHcnNo77?JA0@?[8^9m3ZTRgZn4g6WO[h]g
+KZdfh4WL4fBHMcj=n9KJPYSTJ^jANMXn2W[0QYPM3146>N`iA5cUD7TQo6k;?[A;nR7Sk:jYInoM
+Eg;H<mhgnkfc7G1oK_Sojgnlb?o?WkjAnT3mW^UZO4U`Y\[FbS3NWNDNoei<c7n_?I0RoOAN`EJg
+R5ZSMIGT1hhDR_=bD;6OBBhG>Q[Pob<nE16_ShN4m?4LXl>4X?^AB>;ShEBCO3b05g@RJEXOSjh[
+T6i362OBJFYK[Lf0?819MA;8Do^;@BLMb0KTOIYPHhXPE_k_;]hhPEX6WJZ_4fZDCW]l3U_`LI9I
+0Fn<NoTXfXPg_`;6J;RSLMS7<<B1HHHFB1;ad=DQQF]oReM4jfj>Alj69[o`8^S5JMnR1H]O<NkL
+o1m>A0kc<=;::X5Og;ZOlB\3<OL36^3```K5g_RUDl9=aj=n>iXPF[7N]cXMZ\i4_1\80We9Tl`M
+8HC?W33oY<]en_FLGP5?SIlGLl:E2R7_CVnkXdRbEXM3aV`iT0<dB<?[YD6`Rb`?1nFiAi6BKm>F
+LO8nZa3FbO>h@djN]PEl<^S9U\]>g]L:g[B=E`JMiN@m@VO?4BaAj;`3ZRKHMNNaTcO6[<I>WR>^
+Nbmle]LSXlK\RGo1LE<:=\WP@MmoJ9@;>OFcei40hRn?Gg`NTboNdAU]hHBcilZm\D=gg<70kECl
+L\MZVF^<:1aRki3\X8Z7WCGJm?YmIj3HZlffl]k\lFBW3FJgO8UXU<gJM1\G9o1K3?nkRV6>]Zgk
+[Eo4>=fgiiiA>4>fFDcH>Bk52==2YiH9SnggL?ZI>PTWc`QnT2N=L>3RgQn]Rff:ZMNfZg@hBM??
+2G;4VaC_k^l`dJ20=gJ\V6K=`cV57gYi=hKXXl>?>WCUT[b;clFkn3Y<c6dc]RdJKlH=Lnam_6fG
+UdenSX@Lk^[B3M_bm3[k;nB`J0<n?Vhhh]6EAK4^?__kc<OSEHGW2[Wk9=kd_>N>HfWOOalALdfF
+g7N36YhkB6DijM_PNcOD7;9c@l=^RF]nTJ;WCFKBGo6hlkEkTZigd;C37kQ0m_QUA@ki=dWW^=fe
+hXVSfTl@oDJKb;66cPRmJgPd7n:E;hW^GXfmlTF7mF7b[dKT5k\]ZW<[N>XIG^Gi32>[f7lFaS\?
+3C[4oPAYOP21OX]inWOh[Rm<dUbA`ln>[Y8CQKn72_Yan9MfK\7U6HLOkLQhiMagdQJLnRMif=DO
+M[VIbnmZoC3N[LGQcfl?f;S:SW3cOei]n2mA\eOO5[j<_^DkSk?LnPMc:\njn^aAe>[g4aI\gVOh
+M6[MDVYdn4nG=Wcm_WmQS@DLj7TgUmYhkm3bQXekoFPaomnonaf@d6T`7mlY_7W7m^8XnPeSjU@O
+V:=Q]KQCWhB:6jNfAo2ZAc30QlemckN`bmOaj\e;2alT2i?d@:FdHnSZ>\4GA?XCi98ggKAm`4D7
+b=iCcKa;LmeinFL73>39hLlccPlh[jF4?LZ?L>5[3Umaj>K]cRV_M^PFko8Z?Wm68>fml`=NgJ50
+GK]`n;WG\WCKQo0[7fA[lmSEKkjOG[CQdgIYme_lEfmM7eR=`APgFk`8ekh4So8Rk^P9@fJ?^Y2U
+j[OhBiim2E?]k_3EHDXGF;1gg00KOj3F_JGOSC06_mg`mM_e56gf0jm2Uch`_dD25la;gIZ:DD<W
+N1=TJKVnoa6P@l3iRlD;_:_SmW\>OomP=f:eIN8GJ5HQEY2PI@]^oaB]gNln8D:o0gPCa3D:ckOT
+3^S_9dC?6jEoRm2eGdX4fG3<X[`G:]33_gV?HEVcYfnh5lY[mf>hl<nXehM;LOcWDOLjNj2n67DM
+iA?D^O4>1g@35kYo2]LNh666nb>9`WZhYLf_7OHDDKRJE;`=Eamgg?<iM6n[l?n]Ro[>^]2gljXP
+fAOTKQFXAYWH@Kj=7MkK5[j]dGd[UOYj`H2mZlO;LVVn7nh=NGk5D9O5KWfS6iPA<GZgNk_\C_bM
+G_J]Zl<mFi?_9QLdQWmJmdamIYnIj8Fkf96ko`_dMY8:2b?7>mc6Y]k8o34V;Q_kGkI=PD3PdMa[
+\AD7mcVfYVYNMVb=KU\gi<J2OWOoa:=`C`a<WMA1Z9lK5_`P8FOWGMSiHbD_UfWDbj<>C6glkN\M
+K[mhA84nX3mYg3iPf]7oOgm8Nml2^gHSQ=e;NBG8[n>UgfHh5[mSBcOocNd=kfNiTfkF\QEaMYn>
+Lfo=S5CcWPeX4;hWThnlI?8mo>KZjf^HO7:1bNM3Y`hYn@1_WT39iha:_P<[nE7TfELYH9d\MhTo
+2USmVHCTXnFkeJXKkGO[>KfcGFXkkG?3YKMNMI?;Pfb]\JE2fBJM@TikgWN;Vgmjj:V7fSH4j;?G
+6;;Q;hVR>a6QZ@De2@9hhSAX^;M3`9aKQ<P_HRJ;kbK^4@:VGn3d3XW:A@lmIT;cJ2k`2AldO3In
+n`kC4g<QicRCkn;BoH]GekTNkJ5O?^e3a62mG^GKV[PS?SjELL_[3fVRI^Mk]dG8E_\j6gI3^3[c
+]e114TikeKk=V0bQ>gNKV2gjDX@Obee_l6]^3PG>A9`jY76VV[5j?Gehc4BLYm6:BdDVI?WlO_3H
+Xg5j9oH:o7[aVYW5MSi85K?<jO976YZEQfB`fbj;Wc36<6m]gJeHo8PEcV@BL2nkEKCSZ==UDQNH
+DX13Fj=`bcb5`kj:eNO\`F<RkSc54>a8e1Q[PW`MDggQlAmGH_A]oo1JjL9e?\B8GGCTlRDI][?b
+IYo]HV`nhVN<]U_gVmDRj4mR7:Caac?1cECQ5aGVQU>30oi_<^5kQ`e71flh6KSQSAd[iTf;mm6<
+>Wb`4[i7nRc6fShoQliNncAN[lMQ>71Q0;LLgG;[3@jifn<m_FjGVeEYA>dM=AXM^=6TiOJeJHZ?
+7;jST0K^SB`O8Vbc@H`MLRYDokWiic@I6kC91:SG:YnF2Fjm?NkSjcg[<XfJGed9M5o7KZ7>;mcE
+l?^M0VgfQPiOofG:jUIcQYoM8an9Tmd7ObjRQRgKl6>FJ_6bAh65gfX4:acQH[W2Ah7V[mNQfU6g
+WnCY=RaNm3GhOk`A]?0:<=boD6M@?n7KGL7R_HlNk=bIUNd;UOKR?^Vc;GkgeWKLK`^0`:=JDJ]f
+J_Pc2eGNO76Di`FSQWX\dgi:ncRl8]N0OY4hO<7b@=aW@`;EjOYen:I[2N:7>OFRGiAm7F82aO\B
+a@kE<?>1`[g;9=nkNnoPlAgKeSbFLoRPUg6Z;NcLl7>fJMmgfC6NOOY;lRS?0?cW=XL:o3k3lAjg
+jXW`>oI?V^KOo]oOOPo8O2O`LIOkA^d35<k0CiLjaG\j]7XNPJa\Ca6liaH?>_`m=d:KFX7oMII8
+l7_a1I4KYP:iDh@;56QHc`\PR>lKa3lA=U3P8B[WT\1k942OJf>JlU30H@<n98RA;;Hg_<M`_]0K
+Sf?DJ?bG=3T71L\C_=SSM[mnkgIPkc^<633iK`FjUgnb7>Wf@mBJ?\:M>N6bP1[BcB_g<]m?JeAj
+eGK84^1QOd;I`hneXP>E\H2:`oh2D5m5bj^jHlmIJ2_Q?o?l[>MI6mji>[bcAdXIF7`bN_m_fKjg
+KI6kEnaLlK3XGl^nb9d:bjWe3TRNkg1GKJOhkoce2T<al6OYP8;]GaenSX=kiEni>l[:4GnWX[cY
+GJ]?dK=fo5@Qf[3>j?cVQ[]WQ`oh8`6nI5o`cVgbZA;Ig_U7PUcMHl_A`jZi]gWcMXSAVIo2?4>7
+VJghYZiTkf?^db6aPOANn@T3OS:dN@jgBgEh2`;^:k8X:QbXEoSogj^Cgm`j^Ji_TllK=jCmXTF5
+lDSk4noVJ?8kN\kNd[am]kQGohAc2_m\4KK`ooZ?;mGXea@QF?LN56co<mMZm4X>@ohohTRm;;=j
+DoR7?kUj[fOJ_\oYo66g]9mJ9NCl\XZnXNf=\UVBm0RgGBLR@GFRimIQ@RbO08649E[E:A9?17PS
+198V@B3YQ@9IG_54ijYQQ?S;P0C4U=5LjdP3D^dVQVgh7R76dni6ZdoQD17jS\=ZaVVh<<:MXXDO
+?:HbmhcA>V0H?_@K?=:4JC8EZ==TN8i=Am80B@_nVo>^PlLOERWndE<_GUdUnjl36=8k`AL]n7@5
+jOl1H3oL_6WGGLD69b=aGbdDk7BWIKFoI921kUma~2noKJPSDJl:cC0Yhef8LNgD<cCW2cD\C7
+TXM_eR?Do8ESC]iXnC[Gl=Q?L_a?NkQTY0:G3a:TeSCdIXThjXk4JbH?ThRCCQkO^_`<ROS1XO<1
+he545ocdR2:jNc>Cn=jA?>Jhi;5\VO22WF?>F07f9fko8M8=TYjYKYGPE<XeGD8=gec`MmOMZNMF
+b7\Vkl7UIa[4>IWcFog1HGOOfOk`CL=_hIJm2O=M8mhK9;JA\>fN^HMR;SRCNGc181g__SgjNlcJ
+_;m35h\D<d?OP3EJ1P_lke[2M`lKSPkML18?[F9YPOY55<K`XCWBcPoNI:ce8gMXWWe>WZoCHTS@
+HmI^>K[UE[CdeU^em^^f^BQ_8AC:=CZ76EOoa;d]Rj8M7mlXK8<KSOKf;5A3`0`W3mK_e?m>emQo
+a]j_DclhCFI\]>_]_5oel[IM?GcW\HZE7bmZTcm^e2naEUL>ClL?dce>YGD74fg<l3meR^FMagD>
+gk7cXb1a<?Z0`lf`1mn5hfJ;>nmC[1DbOXlbELEmGh?EGU6eVmVnmT]L]?Mfgf0VJKhkK\AW4DoW
+3WNl\ndg\]dm^>aMn>hQ^[J;L;_3l=TmBiC^MgWD_F]Y=gAlUkK=3AMZYgRk;jnnlF;\Wa2akPj>
+eCe<?0Go?b?\o9UVSVelJ6FhHEg_1YQGM57nmOod@1nhJX37Kc2<nci4SoGX]cYg\nMHWVEfbi_e
+SPTo;]>7d5UW3]M@gNO:PF@Tm`42O_C[Ym<^FodUGQL<I\l4jEkoHJYmc4me_>5N7[_ONg3K?k4K
+m0PC:f2^[^NCMmf7aKn^32N4HbS?cfgGhg3g4l5R1Dh`X:2M0[i\`8_hKHOocX00m2?=Ym?XNNAO
+KkBUlmom5QLakM4GXlhkS853_?:iaciDR?[RPDTiF?_HHCnHU<D>mc:[6kMl>djHMfKBMV``;4[0
+2W5cil[nmnT=5WkHbbS9=kYooh3VO8cG89CaLd6gRo^beO<gg8k]^DRiTOIS]5?nZm]TD3fXkgkQ
+7mJNF=n]oLolfaH\l2ao0>Ii_[?EofnO<CT982n<OK5fALbo0NmK`KJ>H5::@MH_Fdcn[oT6K_RV
+UIkEflWRkKj>6;mk_K_SCVGM]SYl\HJIJ\<5BN9fY;X;;?]=W[mKCPM\R`KOLMoVV7<:S[T]P=eb
+InJa=[kSV?F0V<mlEhCk2hn7fOSnC<QWEfdA[^2M`@FXk2V`cWeU7YF]_6?b\G\9jPC>a]MkbMnb
+hkMhoS99?P_bE^f3?JXO>>KfBS]gliWUhVJ7:HBa<A0oa2N8oknodgPnUW_XI@9[`4ThjMm1S73J
+njneg9QoQ`RU0CY]c[6[7eaK]MNj;WLKMeWELV7P0S;8=PUiJY=L3P9cKP<iSZRFCMZXTD`2N3FI
+A1?2LE@;EddMJ_1IUcCG^>?gJ1:P9Cg]e557CPLO034g7;Y[<HRM9:Wgl9PiaT007RjF<0M2_BRB
+eGfmh[1B@E8>_e1\AZlRBHVhWLL<GW\_C_^6N^g7L=V?M=i?\5o:^RH?4GLg4NO^_i;V2gSeKiR_
+ELk\Xo^?`N8BWo\4[cNa`\XMKk:F6;Sgc\QYKl?T:CSoBXN4HKJm[]0\AY0>\FloZ3FS3eb=TmBQ
+hfjLi3cSfQi<\8<WOLRC9X5Y\aB?gI<EYdk<TakPBOn5ggbPk[cC0mHNSM]TEMKKIdnWVUI]k_b6
+_@_GS1LXKhi1VcKoK>_2?oH>`7P?RW]W41BWl@>>=CeB:9i>NRG7Yk\jbELbC`:93gbnT3;RV^1_
+[kgIX]6blQXm2a_5;ML\W]odBXJk2HOS<F?lK9o`Ckf25ZFD_d;S=ffgCihR8Ac3ZcY9hml9XAo=
+lfgl4Z8hl:7jV@8O?8RC=>P@1GZjM<VWGWhWThI\d=LUcG0V[I>nWDLYI6m`5XVk=LO`3HLbJ\2g
+GEhfAF4NKY\<^JnQ@Ekin>kPhi=^`P67PaMLUSiEhNnc`gRPcm\d_ceE6cK5611F6DMdGS1\Peae
+n;__6<m[5YON7k9c2hOeE[5<HKZ>jKgmmXFN:M_TkGCPl9UOC?[ggB;EN=CbCKBfVL?m1Y>G]C0O
+_M5[KEFSOO6M_OL79nGS2ic;hTgOeo2o4KM=kcX`G97ABKTa65Pm;n7a5f3j8kWW53dX4J_c?T\f
+O6iK>?c<D_LCO>lJK^Q;_knP0OWKA=[K;Hcm:V3k4@dV3nkLP<5n\\SWT;>6m@jO9>eO2]RCYc_G
+k?_dJ]LBeFo4[]EDaGS_G\6[NHHnoGlRdnaZTeKT0d7L]kK`j\lMNajEhUk]=J78SV4Ym^DmN_AV
+n`3OiPKL0Q1LmX?RoMNZX0mb_853=nfJ7Jal`9T5RZhlWF1=X3<S@lm>\F;j1cS``3ldn0AXOHQk
+NNbnkl5^bn`7`>9AcL_]?=i^nh41^mkT^aC@3]^7^?JlgoTc`>42CB:4<>0nQ2W7NLRYn\Vlg2[i
+@]c0N^=o5?iS2QQ<P0>oc7D:B3\i]=MaFQa8?]W]P`I\l\n1QI60_2gK_1__aVO?hR6>5Z9QPJP1
+;fmNg?nN5_Djg6_59JV7mnlO>7DkX`A:VO?e7OKJgIgVWE:iDL9LRL<_KiViIanNm8:n3m=gJkmX
+kBMQ_973oZ0ZXeP5dNZWJ?EJ6:jm]gIADk5kBU7_noigckT3ilJ^3G5_e:f1lfGie`3G=PJjGbI?
+d2mGF_kMGoU5k?1n[2n7IDY`a7j7@:CQFg7Nl:EIi:@f`[mW\QVU^MG`gnWZnM]U790_Ef`NngG6
+VDMRW=g`lMW\bCU4?7mTV:<k^S;e2kI7_P\[O@jY<=b_Q5b^gjn;Mfj]=^19g1=IP]oi=>9KjROW
+TUc=?C8?3S_XPLaJ39a8V<DUG_JQGM8?6FMgCCekkkjB`ika_QU?ZY@6o:T9OohYU^R`iQ_Z?;\f
+7RY=^Yh8Ln_GD>nnMh\o^G[GgnGB1mQVInbM9NJSi`DFEHccl]BaPeD^5b`fh6d5[HAdeD[>n^9?
+j7UJ2C99:`6lQeJR:KDBWE@PgHH`F\TihhH<Vd`[0Gad4Zg4Rd8]OQ^WmZR2YN^1@OLMTJHEU=c9
+VbAJV]<MSlLNTN=TV06]4^N><B@AaMRl6aa@5`g\4Nc41McZO16VaDahCXKKJ4:Xa6>oi0VC=e6V
+CgMB]CRLOlRfYP5fIM\NYVo[LNMnQ:PFn6618Hob:\AKcYa847eh[8GWH\\A7aCZ46G4d79E0cBl
+Eg_PnIRm8jMm5Oc\iUoS]82n[@@NK6B6@dEW=JPmBjUNnJA>acEV`6OoQL]fkWN8`k<ahQPUdPF>
+nj=_]V<MliL<NZWUP[4[c`75\Hi??3:kI>XPdKX6f97ScZC@XlkUWAi`i:]L9j^dgW<TN\aN=^hj
+iH\dK5La:1=`VW7o@gNhgFKm`SEmHoBn?7kG>HhdM]B5FoL5;EOWg9fIB\4CNh9UCYOHR9enHLPc
+]GZ5FkiUehlgQlM_fG8Re[7CaiJ>jgJ<37EaYVBi1nNMnTd^kIiRJ>=]jgkWoc0fmnfiC]@J[L\D
+RQZXINRjSn;E6YYE2kenaPa3hN1S1kmmX]3b\nU3gJjELL;:cJWEa37SHdDoa8Z`>AU:m:Ti;=Y1
+4RDmgk2eaW0Q`<>glSHLW>eb]6\?_b6`Ima?g0P\>_WiIC7R[Rjml9D8NoKOaF7B1gal^>74Xb\Q
+W8_?oShk;<c]lSE[32^O32TOdZc6nn`aB8;Ym`CJ=P;7?bSk5A?e0XlnGN[`fIiTn9O[`4b^Y1DI
+O_b=dJeCKC?mlH<IimBMdC][C:PH2kY?G2CV_V4_Qkdg63_iR5G2OW7FB;N6iN;X[klZU?a2EC7d
+aZVoY1l`^d>;e^5Nm`ec^V_NH==nAJd[jm=;75nH_VBJ@b>emEoeJO7Jc>ac>??9^=EkgnRIZdg^
+_F;fQPU_I:ARY`II8bcd`FlYU;okeZETo`Bg3bG[Tk7bceC]TVT84oLnTOA=nPEGJlf]>SF7^1nk
+]6]YjdlaG_S<DcN8nDZelfjQEKMP`:\>OoGWm[f>iAClmAI<BYM`EGXi@0AikE3KakfZkW;gC8S]
+JJUQKA[\QfVFO0oKjDNJ<gT:;AZJkNWg2bgg55dhG<8^hDe:h?nFLEk0>o\fO4XnlD2RTUDjYQ\M
+O]9j9N6BUGV_aQdn^;Z1E@gk@KagG>cg<gZ<S_TPi]cChK>f]>6NZa6TKJ\`PLIgJeWfb0HQd2ag
+olhm\kKSQcQSfO8F7N\4OoQTAkPWHHNoc[l_L:]GOCKUK10ReJ]:Ykm529mXBGRb0>AU6g6P`9T6
+G4R@_=ZHmToREiOC5jR?0adW[dTj?mNMSoYh@_@l]NY_dK06^2`7:9Boi2^7lIEAPQd<\7c7O@?j
+DkPBZ=h=3eW\kM=I25W6ebanT10ij4:11nk98oCL8_c@lk6NTiFO1Rc9JlL2ag<nmT3l7;XgC_Yo
+jj:n\bj0dEL5bKhPMj]0=ICd@Kj=i@=7d6>0MmlZ=Uh_6;1gmGQI;\eO>Nc6]gQG3_NTH;IFf9Fl
+R=6kgAGXgBQeLmR]Zef0cWOCFoUeF_M<OFJOVHSVG^c9gOl5NS^i^7?:b4CJ=ZgLo<`O@`7XGkI=
+PKBaT]l7n7kKHLnU=EGc\V=[M=^j8CNKmMgm4hmdlHgnYWjB`S_VL3m7?hkW`<`IS896fRlNDJ0?
+j4lJ]fWJ]_i?]7Dh2G=Gb`OI`KCcgWOoOomcEZUci16_l:><dN8nMPS>7;BS`X_8nFK7^IU^g[Yi
+cgIdT8472Y6e@:6k?8ci9gl2X11B:0i@2<Pn@27=0QCZ81A070c]Gc]KZ801PD;0OP4:UKA@db7i
+Mn00acYl<@H9^3@N5S=iV4cmhSCh=Z9MXXDY>Vj;MBS3b@73<W`:gCQl21gYbH0M9hDiWkiPg0Ka
+PonbH=993nDXTcoR\bOSeUJhoc[0\Ak]0UlhGjEdjck[DmJChEik6Ln;od4XoC5UdefGMD?VGj?`
+X]n^Lk262E;1PKTPio82D\;]@g10c[jQ[aUbBhjhlQXBJoJ`ND5eB\?S?g??N1<fCc`af;@ggnP`
+kdNl<[CeVR2K?kI]Z<K=\^Who1>k`TnI>>aN>kSdBNicSGK`[><b@^e[VV7<PdlnjC<l7Q>khl]e
+^M=W`6<G^9HYlnd\lKOGg_@Pc[^2CA^n39^_LH3O7H[W>gfRh@hjLMXW]F?d:Na5aHZOl?>3h@kD
+`?4W;c6\ANJhD]`@Sjf`Agm?5OKA`]VQRdcR0FbJj62=YPD7o=llX_N>6XdlgRI3AMCelkHn=TM[
+SAO^h[?WXSOJnZ5K]5KIOoAlWBISPcL6l3CaiMI0n5]_So_h^Vd^7go<o1<g71fdhLCUmP;PHA\O
+gaal?4Alkn3n_QV>mPoD:BIE\?hN@BNf5L9[UXGK`l>\GWOckMK7efh]\FW7ZJagWTWcEbliiUB1
+lfDRP;jjJ4gnOoeBgZeH6ek?7TUD:N:i?bE_?\UJ`Hbmj?BCE6ob5\[H^n6?Zm7RojgOl7UGR7ef
+h7FiP<Hk;LOT[EHZfokSmAZ^gQVbNKFFgn;on57cJeZg?7kOj7T[SC[l_ej?8Yff<O^b2V6:SocD
+YgS<[aoS_njAjV[5lRWnWkiIlD6>ka77_SkO?P9C?WaHQl<OnO;fgGM_fgL[en7GeCNnJ7bgFT=W
+3QKl<O_eWS^9PgajUoi3`c]_HYG^gk9USN1QQgh8nkg0S]8aNZk=TC_gT8iaAUMJi@<M>g?hUMdo
+A9bI9e2K]6F2=@dHHWTJY3eXo@FO5neAXPMLD23oV>`jkik5J>_M7;OOMfRkOg0KbW_=jo9jNZGG
+OD:4AY:nCA3G8Z=Q\PB3b0LSUNk`1LEhG:HUTcYifiL=N26O1>@gZC6c@hKO=V3P3gj[02[dWnfT
+2Wd_C]d>0WG^\@lFI0\AQ8om0JL]3;lCm`Clg[Q=fk`KklI[9jM]UbK2X@66L7WcH_nYQ>7GjHl1
+bPOf?cIV]C_MV=ZK8\bV@_7D6iCQOKCBjh:^kIei_K7WHfW?g_262bCUlL]MJ_KY1aD=fcoiMimT
+\@Ga_I@FHLm?4g:fm1F\GS\fOnbacaKiO]momi`kL2hIO\BmDKL6cZnFn^2^KAAd7ilom4\gm=om
+UUo8iYAXNf;o>a`ajYBDCX5l]N6;<lU:Fn__6Feif=eeUHkbo6dc6jAM]^QLmV^=<ho`hSIlO3Ik
+\Xk@i<Lj`=2d9cBeH]k7bemJHP[dWL;d=JCN4dUAkmaZKL0C^BNd2;ocJL@geDo>:KVZNj@N]hn4
+7]0<N;Rg[d\lEbMM>FANbf5_bcjhDoY1HcAjMHNdcnB`I`PY6F1gH@glF@Cejkn\bOo??gKUOXH^
+HJ^\o]oojZgmogm][GYlH;JjEi^]_I5Fi^g8k8\Nm5oo[\_GaPg807hlX4\<XhCT=D[^U^5el_e6
+RD``BUaZC1VR190YR983;BA:NYG]lho4MN]D?a@`\502k0nQi9CC`PK4ad>R3PN@gVdhk:LAi0S=
+2m?2V4djf[P;MX`JL_3H<c6O=;@Y<hk=hA>L`=>O34NDo>SdP`eiCZoX_4\XIAW;i7_hk85@F[Vn
+D7[hH8MhK]Xi?N_SHCo^TlgY[KfTABH0m;1=HYfmU^C<mQP]\ieoUB72\=YMEhAFd<LaidCYP954
+BC3^k168dZ<=gi`gBZLHYHV=dVHC7WLH7_oYSIJ9B\CZTKLPdA\^[e?BgHOGBQf^lb7BZB=EFKPI
+]VMXf7c0N25Qn0Do6g:4]nkNk:__jl@[fnAFRGDI6jK1B\MP9KOm5jSf0jadCMXN<H]V7CM``[PF
+nI7PVl:HKS[lAAH6`<0cTd^US;jmmk@cRLOT;gSUg\1iK`RYU;116RN0GaCf`QgFlDF2LG[B7O\k
+CUf>M;KhDcRI]]LX7HI>6?okaO3M6GT=[N24KG57Sji85agQFh`N^H_?WQnlhJS[FVW=5IkhnAZA
+E6dlAH9J^ja77nhj9OG:]iaM]=d0>EZT`hW;kVgI8nghN3oRiIWA^=M7R7So`6AQoTjMmg@=_YaY
+hnJ[N^`l_@i7_MkVFbZOj2j9dfDJ=Fo;aSV3TlN;mbg7[UfQdke9_;m8e^6gR]oXgJ_K_[1Ic?J[
+QhI]WI6TLXB9aOfTKB9DoC4aF[c9hDgQkcFEigbE:`Vd[B8B`o2oVN3g=3ian90:j\:7?cIl_`\W
+K_mm`;[;@^gOR6UWE9T_4WLX:iJ>n9Sgd=KmlMJ]F]AoF?a?FNLdk_AX?8gmG?jmhh>lnm?]G`8o
+H1=D6Nf7bLGRcLoL]_ndZL?gW9mG_l2]_J7K5eajG`@no:4MnjYe>oB_C<fooKnooAkPhkTHgGok
+VFOgK3D@BCnhMXkQ2Vg><Jo^amnhILj\8_2nj4boQd>O7K?hcba86>GYe=ZKdndn=n]3n2C11PKh
+9ge48oFH?<6k?6jomn2fOf7IkZ1M?Rn_Fb[Jj`l9V0noID1gT;k?jlk7H^l[T>52e>m42@0`MkQ1
+PIlK2:<4[IF39Wf0^QUIHHn]h[c79[aaZgOSGGW\T;iC8n7@05F2Ua<3oLm@ajmS9SL:Xg[L_go2
+[=g11011fCmIGHInGhOko4df9P0R1W2n^D_>?VD8XOfCOo]1H7mThZlLmY;WdoP0`NZ[6nj^7I\o
+m]SWIV:d]ongckT3ilZf9G6_e:f2mBo@oD[PFSHUSoE3M2kPiMonUUo@9Zl;og>IK?Lg_?dM3S6j
+jmfMM\[JMYFOLTJIJMKj7@f@2L0\`O3iffHjh78FWM=n3Cf>H94O?Sj[GAVedHD7_`bYlb2ET5n7
+E2k0?hCl6@i^h0WM4eb8goUDhQ_[9nNHG>EMTXoKAd@?L1Ih<^i_CYiK7UL>VNMbf5]B\3^V7cSF
+m\ZjM]mn`PEW8V8Oe7LDj<6O>IQooj[Aoim:NV9OP`naKjBgh`oaTgjHLOkOok4S=ga9TKUK>1cj
+d3UekZiH4GU6ikWIJma==J]5S`MaPaTUY;43YlfM78`;S1;TSE42I26SA9<`L4[8`:59j^cMdc]P
+R_D5UA;0k2RRU>ia8bZUChWJ4Y[KiKNDTWHX9KZ12GIH6JGTo8fE4PMDBVP;37RUa?VEdQM:2KI7
+:L4B:BDUJ;<mFE>l^>BfoQD73<UdNffQ6PdR?9\Fl2`j7GUdCn;`4CYZb5lObadN9PleKn4H1F;;
+egV6acjBhgo:`bDS5KQll1E2G:?S^o==3eC326oZ5^_iP6T\inD_B>T6Y8AfA4Zh3e9J12T1nQ]B
+8\6G8RET0e8BWA@Y0M@QY:CZUA:52OigC>6kQk1b6M`TJHLgN[@51kAO4@d>k8H61cacRkEfim4Q
+5QcGXb4OgfO1lIhf6Mho:3\hOm?V>e^7@@RmY\fmCCMbOFZC\FjglbCTN=^^5kkd>4Fbk[m6]?ad
+Tbj_7S70nik56kkJiLCoWIf]U<=_n>];Q>mKDmEol>:^2Cgncn7gG`GN>Z^nT7K;PZh_`RF?m2`5
+dMY7ZVjOIfJi@ckYPieFInlBQdgf<oWSSdSfKdc]l9dFIOPBW`8dhO@<gfLaO_o?R>ZeSPMK=d^:
+ojaC`jU_RjCmdBQbnQl]U[A?LG[cc_ek\\nimjOOi=_oWjm]?jiTV<;kGcO^GALWn0h[[_2iG8gj
+1I_IPJiiOF7n`]8KQQnjDCoan_ioYTCn1H?jL=oEn<NnK@QomneBP1fJ?[hEh7c^7igc?:ien;`@
+h9>jSD\nd66C1:^e6AN`o<`3bHj89JE;?Je\SD2]fnMJOB3?Q5Q10T>1@Gj8e_9i^Ie=gVdo<62G
+FWdYh3fQlO?Jlc7JoH@h2cB940;^OPRESh?:IM;9AZ<M`QOR1WjkhCm3niRQ`K`BR_SKl2cUlPd6
+80B=oGW7_E21i\I1h@3oAn40loU?d=eFX8N[X71kQ;=jaM9E7F;d;ALHQo__11U^]H6kPeimObjM
+E5`UC9RninJZ[5?;IPW@8]aO\8A\1T\nLK[@[PAPRD@0BkB=E`9T9CH@H\8QVGNTbG8]H30C3Z3g
+54VZUGa79OeZeEY0kc58OfTUoM1:3Zg5mC6_?aaVAXS6\CXNRkL`J<=9LAhWK]EC8om@8ekC;cW=
+neDT:l@@Uni6_;ZZmMl6:]9dKZ37Zhm?oOK37B?_lk1[LgdI6j`\XJlJ4WKJUc@\760oRJ@Ci42N
+GKkiPBY_`cBChiN_>BG7gHAfX>eRUIPDK5ih152SNgbgg^T2FMmeDXO[NH9\jQRciN<`JMo4Z?TP
+lMT]QeoTZd<a]cD0lPEM?n32LLfF@h\Fnm@cg\7SdjAi[mKSCQlQBec1QL>1_OiPlc<>j9cTnLe^
+HK:mkgAG0gkhS5bc;fBn>i1VS_0Vj=Q]WcZ7J3Hh`kVl@B8Nkkhmn[\N\HlFcQI]I99<3Gh51L]?
+3@kh_k=BfH6=elW@K?^>_M6VaJ\H_^7``E]jk_A:Hjc]4gOX[;7Wh_Dj;LL9Pg]dbjdg6MifNkbW
+Ua7gE^[^KnQhIKUmKOZP6aoO57alLYS@63^<@1gam[KafMmWRk5QF\`J=oLfgM3eREjljnflXoGb
+]YFkVaj[f;k3gX;_^dc\5Voed^PmRjdM?^ePS=kc[\Cm_WMJk3]3FaLJVn5Og\9LnU^1mYM6DAnj
+O7mQXJ^Ria>mmX\PnjWhQcmE;YoQlL;66oQ0gLIYFhOOnCJSkhj[Lb?6SSelII?_XE>__Y>k`Mi3
+mni9L1<U\3=nOC7ihnF<AnXWBY<oIi<oHjXaQ3NlZ]5kO<FYCW^kEmnLk1F7?giCXnZcAc5Nc1kE
+NaT?iohmMJc3mcjMOHn?fo3]k^3M8bH=_dT5^=fAEom:jg1n[l?YW@jW>[d7EFVo^\2hmJD?c2U<
+=]jOT:17UbB[lWMA^E7`oSNUGL1\BF^4>ADXIJWGZoK>k7Z_boD1?A=T2A4L1o@30o2DQPmb;hoM
+megHkAoJ3WaPXLoEmLCb[_^21;gNl>YY[@B[OTo2fD>TGlcD8g6O<?G;6nk=4[b0VC;oCIIMZhi^
+]3^UDVek6fTk>NUk8bURV_P]B8<Lj?<^nj012`X?]8X=lQMViF7I_M8G=mZ>GKh]mn:cIhG<A`O5
+Z12d@9Lg;nioWhkTIoEbKUJkn_km0`Rhhf@h<<XLOSi8k8jofkX?_hd<Ai0hn_9FVG_ePoV`_M:7
+@3D0lh^eOn[OOXQ8jIDNUD9<:hGXNFYomDY_gKSldBoLLmQgIOgO?_>6c8^mo^b;]ReXoREhg`9I
+eaCH3ZL?f3M[;?V_o;;dF`[\;1AL70j>n>ieKho9h6Jk]BI_c24Wfh75=P6o8UB:m?>gbfV2K[UB
+lmR_<ldj1\_<HHF:WlRUaiAYI`XBOYO1na?Ndd<Z;kf=nSUjf[KZPYc1>o6ego<\bS_ZInJAFL\m
+:Qnkal0>HFj7_@JlEm[I:ifJHO9I@KibCnbAOE3j^jFN_Flo2A7?3_^6T=Y`3oCCQ3CLGUO5DR=^
+h6OQ1YJh_Te9NP4\oO\^l[RCkOogN`[nh2HSJbA[DkeL]k^=No21;QQLX=\;ZHBTUTXNKJ[g0dPU
+B1`I3R1cB2EXl[]_[QL:650Z0Ca<odK[@cKlKYCN@>A^X9NPkPb7^`f[6JOQ^PQeRV9HPgJldEY8
+Vba@S6=c7>XE1F\d6K3SI;2>KHlmRQIlI]]`gLgO=FBUDY`58;_E[?leP\EClGk9N>ga:AEkm]P@
+i\>]bne=G70bXKMJ6;SYg\iYSlDZ^oWGV209YgeZgfI<Q]2MB`Mh=Rm@TTM2Z<=?i;QGl>_SL6;V
+n@30E`20AIaiV`<0m`00>PL0T<f4aeh30>Um0>1b042M>m9d^@d7[FS3XC7K1ib\oXjSCIM5SA[K
+Q]]VlH7BSO3?^ZE:`BVEJkb86^;Ih6n_\Hbi5VCT0fki>DK`C>GjCVoPmWm?Nj>hQG?`b]f1loj8
+X@0KkT2=fnfCIaSF8W>HaaL:a^WN^f>oajW;mc]d<@PB=Gh1Qn`:3O:oJAC_GCBC_5_<Q6ebAhnj
+j=;?jDh9k9]C0_RD@Th9\:OVKIQ703cZmKKNDG]lgKH\hWBXH7TX`>6mae1POZgAXWSo8JgN065o
+3Qndg;63JCN=j]iaH?3mPl3h1aZ5bM\=JCgnk>4]Ta@4^NkGEg6JUV\ENm[oQBgJohZeY?F_n=4Y
+md5\Uc1U`clERlD?m>Qc^3MUQjlo=jAJcJ`NfQ59KmBJT7i7eL@4o:4[Qoj;<B=1]GJCNhajg7o4
+m<:e:Sk8dgTh5fCi6?gb7UekCm37mOlD^eCXl8<oI=eklOn:D]oN]<na?<>gjb6K`Nd;oeBO__4<
+3_=TjOc[ooi5PSAa7XSoWPAkGHHgbei4_9USjnHA2>?^Cd7NSn]aVH5kgDRKioJ376Gkg2Qe@bPi
+HkVJEGMWN[gWiOX0W`ZdR13n\@lO5=[@3g@_Ungg7B[iPm^1=JcUW_E?4VS4jchQ@Q>DKa?4IH6M
+Wn^>A?an@YP\@O\nl>R7\i`Zg8lN8mGK2jVoS96;lI40jMXaQc]ZkX3[81gfb`4F::68KlTW_A5\
+7bcQM9?D2?K]6bk<LgIgR]0o6PREPb5M9og0^`Jg5d?N^>GKLBlnMbHaMf``;4[02W5cil[nmnV=
+_Y;l\Y38gclHh3kf0h6Pk>N2S[7f1OKiM81n84@YnENgbMVW7aAERO0?Jdn<D5[kWoVg7`XQSQcf
+d@6h=<2\TihbZj]iS=^bo27Qco?M:Oion``MiX]K5lJnF;\Ri]n0mb^4KAdQkAMLF[m\<OVoiU<9
+O]?PhYBg;L;KOAdaO_MjMlNMb[Y]MOQR3C?EMZAg]7HoT9BBlocMLSYPfjcA7=BKHlhY>>Ifn7P]
+MfHNni7h>=@4cehNDWGBdi1J3e89nFM2?[\ZS[3P7KNbkoTDha_]:o>XK>DMThoMBe0W<05PEigD
+SWb7c?^dC9;?P[aEnf2?jPN>^KgBc]fgWa2a=KRm4O7>3Al@<9K2oK4h_QM^d\m13gAlV5lW?ICS
+l8oVHJZoJUXVmm7KgJ84SQlialk]5B]TkKPlEk^=^jYV^A3@S_i5:B6gUI8C9;UgMH5BP\ca0`7P
+8=SgaYMCBT4hP8`:`P4_3<8YZ`Io=@Q7naf;_c0\23O@hb@aSfj??@:4`gKc\_PO@3R>3L:Y7@S7
+[D4hN10@c^]0>6<h]kl0hI3B81cn2<:92>@:81bP<h1`J10@3Sl5hG@7Q0>j20Q7>\H=?_W4cN9P
+`4M4>;MH<cS5\XdGL\Dk6oc]=K^cJh76kA]LOYHQG9<i_m<N77KgGNd>gc;l3UjiFk3N7mP`1`DN
+\77K?J0gc8EV<Hl_69CSgKM7Odl<k[6R6E@j12Ya=JRTMe095WgAZL>W4V:TB2UEWXm36GDm57Mc
+aIdn\3DKSPk^0;U]a[KIJ7OLMGNjSjoMLWKAMWn7YHTj[=S\GYM6e8jGm`B1<L<a9SmBg3m@kVh6
+P7ni[=527DhM>foUJi6?[d40ZRl2d=Md7@5hiLODE<4d8J^nL>K9h>Z><MjG3M;`gFD9I]n4DMho
+RGTme9D=Ok9n7E4ln[F4iaCikaXeCUf<V?54[b[E5\aLGV5SSa_m9?QI@oL9DWY]jWU3JbWkbkiY
+l\BmnRcZN:`leBhJj?RM`doNHa3>UWe6cjN5gjN50AgBoTC:^XVNc<bGLnW3^?EcQfnn8`nJ]g[W
+LjWCWmjo?nkBA^6cAcRNKeoQT?dLY9E?E;jkO4FO;F_bYB_fjo<XBKoMA4TJo]6FoMogGOYG2XCc
+Ma1>id0hIKiWL<l9L2iglW1Kgcd9:BK\>?I1c=J?`jO[VRm@d<T3bXjn5SRC7_cd^SF2cZaj[f]e
+3@kTSJ_KlD2:^YT4^M?9^nd71^aZEBh9c7IfOUikWU1Knn62e>o1lAjWm:9<[`OJbBUI;ilEN847
+O7bN]hlNj6S=7J5@Vif0_Kd_FU0WAd`GO_<@6[C?RGZWm:]1G2QBJ0f>UaL?3>Ufi@E87`KYA?e5
+YNcbKKXGWcf;fDL7bK0Pe82G=bo^OblVOFg@c[6[@ZD3YfhW0d4XhoSi36YPM`WOPO_9@:`7@Rm_
+VKUWWaP;JooTgof@`ohXeJ><`TkY9j7H:NfUEfoM^?aaacfO`kkgoMnmiPg80:oQ`Z9]2iao4NkG
+P=He1[HG8@KjeBZ;o2^oQ1fneNm4Pkcm;BhC<6:dNmgKHdm[1;OFj9Dii2BW]1n<EhTOE`o4cml^
+Za6jiH[=Hko>>?>8K[kAhg=I2U0BccfNDA=lUe?j6E:MdUj4W4ImOnj`>kM0l3^5Na8[l;^NAAB<
+WiY7JSGgb;a\7`=1o=:j5WRjKTjNZV7bF@egEnjA?I:Km^b^ZFO_gDm2317aCKchk?01OfiPPOIk
+6oComOlkXilA`Yi>1_[oK@@eln8@6<0O=\Q1]`cDk^2H^H<R]e]h8O\64VFgSI^X4^QbZ^C2mF^=
+WD8iiaVd4U<UWlXdYPaF0VB;1R@LK1d9Ak=OK9=lGL30EPV`T9ifNZXVYh<?`>F7@TLMd2k1^[b=
+@RM[fCgfTH9=>X@_4ZeiP2\56hV1YoA`=ahcFT<JVV8]Tf0Ec5]kF4b^o5RFaf?b5MagXjOA7Vi>
+SS\\g<555dAF:TV0hkJ:m9n0OHkiWV6[30[HXfgk4;n^IYekodmP>nGiG_5O4nDQn``?5n_aQnMY
+:?3W]YZhh>@A;ffNQML7WZkI<o?h0F=bo_62;5aa`91Lffkg314Vjk20jMZ5edRIeTRSL^b;N?IA
+a>Co4PHmN2c>_CSOh?REYnBKgCS?]h0a1[eLWFGHUHL6m?FW=`JMUFGRR@@kM^@]53[[P6H9;9bK
+KgJ82PNKM]ME\72?V4dKYG[D^g3XMT\WK=PneH;EKP]FahoNWM4WOjl7]nh5CQjkIO;Dh3cbf3=a
+NYB9>NIJhPB7J\K^?h<?>>7\F5[al[QW]PCSRS=5?4<1noa0cCZ_1\HLF21GQ;[S6PMhUo;mYS>D
+O_m^jFJj=mVnH>g_V2iN[Wi@c51VmU^U7H9?OTDhljkQW9hg4Xn?fOe>oAfW?Sg[?ZaQf`PUVTAm
+4SiQb?UDkY:O4nB8_`P_`Z?QaNMR5LVGj70T^OQ4`[OaV01jTnH1i2S1lCDJ7KcA]>fb]<^^0g6?
+]?HI7enkeC5`WgmdbVRA3RL^^kMUSkCShod0nI6<LI8>5g6gY7o8QYW=`_`^KQBTkd<eVSI^m]D=
+n?YT<OIe<IK^4V>iEYQ[0_SS`oN>dc?OX=>k@kboP>DLg3:n1>RSFCnbG>CZOOag2SGle90=m5Zl
+FUW_5AhAZLk@I?423_mNHgW>E`doWXab9M7nJo6okoGdha>7bkjnl>6?3Mo_SQK_?PJgk[:m`gn5
+J9mQIKhmQeh?3[7^`MZfQdNLc7]Xjoh0beI=`P:<obW\W<JM;XeGhik;\7IlT7]o^_m;l;USV0iC
+kdE876MXWSaK`dnKbV4Lg_W2QGc[2mfnH7Cj8AKn\2kme;TKmTn>e[ongmmm3nAY58F=]@:kkM=E
+@KZ?Bm_V4H^lao?<bo]d3DlQ1MVS?nVI9o3;K@eo3iYa865M6foE:dP]USmnUh1i0WeMgO3ACAGV
+g0L=?annLB1=gVmRhnn6cg;9j1\mfQ2jG=cQQ`KBHKhJfCo0]=egcTDko>Inn@0kGmGXGhnH[mgI
+mmX_:NQgMCk=jQXoCZ8L@NODC_O^FXkPnF<Mo_dSC;jnK^i`odNNmF0^?e3=Q1kRdhn`bA9J`L>I
+gF[mVnnY=JkAHBKT`P?^QZ`oh74c9O:gTL<W_2R@im3B0lgZg0mHDjCnTgofc>]U;j@:Ze9^Jb5C
+Xmo\n<<1IaHTZ?Qdd\VK4dmmGS_U3ILoo`mTSZ@oiF>>NgW\_^o1KQ]hO7E^;Raih[DO4ZCc0]`b
+`02oGIoGWHo5gULP`hEXg@G^Ng5M`W`iWgXWQ_NUFe`fX2RFh7i3hfMf0\5_`jQgHk0AXgWI@<R<
+cP\6o;cC?VS06[dE?<3o5Ca0mblMG\7ccnQ[^XNklP3;Gao26c9<`hLIioom7c]b`aMUaOKV[F3b
+XEe2[LWj:?:2LPg?MOVH^=FTUP\;3NSo\N22G5]0?2@kR>Nl0`8nF0;RT@TP7XWSh@5T4Pn?W_?`
+J0HSn>GY0PKdl00VolKZ@lheR3jRm?PKSRn8=3cfTT8=>X@hTRaiP2f5VYoI5W[7Qn<aXodN4Sel
+QA\ngP[1HS6AC`k8N`=^?G`U0BS?hR7?9?i@TKeUU\0MCWL<7GQ]TOXoVPc5>MW\ZG[nmbP_aZne
+K??^o`>Hgo6nl=mjNCHT_cmL3_M7YfWg@ZOZ^Z[Hh>B91fAhn^a1Qf_ejcb6lhO3hlJLL:E1Z6ie
+hISgFQd><9f1Wn6SaCZbH9cj8IkmY>\EOOL=8O;ANFLOY>[UMKMY?Pe2667^eNHCK\e;57WWcg89
+<`jKU3=8l^K1GaAZ\R7DTNBe^DSJM7^]=eW?1dkcYURMlRlJ]VlHLWb6kC\e?<gnfE73ldd=Kmok
+_CDlCZgQ3LeWNn`93Ll]=Kb95VQhC_5UTR_=g;Q\fbR?MdhKL2eGd48iiokMlb=dj[TE4VLn4LC9
+jX`Ka3g:D=HM[0KjXfFk@cWWC3^CN6892Vn<@?V3I0cm=dS^SXgKkYUc:>KL<f;fg44j?TkgNoCg
+V?GZh=3?[5g\m8kJ<o1:`\`Vo8WiVP@??:K`gD<TOSioT[C3=O8]]FXjN8NOWm6X89\iB=k5ei`l
+aadj9nkRLo4^_PiC8gNH]E^>K[We<E^<\MdNknUe^eb2m_=?g;3bgJCUm[DYQVilS:iASmeXk>3m
+4Cb]lA^VADjm_Jf4Vl<3JQV7ag573nlma\Om]J8dSCo`CI_84lJnRE35lDRgDbc_7W6]4fk@EhlR
+a1PL_RhUC<P4>kce^0Sg4eK_j`QSM=iU0[goAJgHohJ]2W?hCoeo@l]TgC4Pj>O`4IIW3Q=jm9WL
+2ik?Z7jT=:66J9CeC5jC?UCc3Jo>7d^mZWR3n:4[SojC<L6<Ak6COHajo7o4M<?ff10Eo3A]QV3g
+3QkO\GOgfB<IcjCGnB_Dj0>ZKmn=BEmQj]\kmcX:c6oGASXCX6CQ7n_C=nIb?gbbM?keOf1]Qf3A
+7XCo?V37MB1RiBhQg\c9MO=8CQ=D]OOkdLfVO42[1[5:nlAS6_L8=W;[PjS9\KAUeYK9]g;Hff[A
+hUm]fo3OeFKahQcZ4JCGYl?G1ibmD?]J`8Um0Mb=C@1OI_`F;cCInfPk5BIDnB5PjQg1cZGRbB<N
+B=TUV@;nS[\7ECa_gag;CAbloJkL9ai4jQIYC<4Xa`96khhGgf`@nG_71nW2_EK`Ek_AnnSBhINb
+[0_L8^cg;S>D<0nlI:R_3SlK]_21RS?eo?Lf<Z4oNoLQG[A?3i:VS?LPKO[e0`k^63IPE[^17IIK
+OjcjPgH1Elk>E3kPc0855Ym>>GTc6OScdVT2W`BAoXNB^T6Cdo01knJhoNko]_o1K]RUZj9goQU^
+hJkkP@;1n7nG2=hC83ng?HmNnB@`4VSc7PKNQc0S27HO=OmTTA@_og8QK^2g`Xig?nI@nZBOO5:4
+N=o^\1HN3;4_>hGWVOVid^]L>HYN`j==WPECR@7BQChYEo29CkZhhKI\lfjl8h?5J;M72m6`@=B0
+UcL_kRlF3knNhJhPf?7no@>WKYLk]HHLa[]YMkQCKbS3fJc3G[_kOC3okk0K?Cm6NfcJfafVG<7L
+<W???V8^k?k9_o\RQodaXgdD9WBKl5<okeXVM7]_gKSl\LLmQH;gODLIcadh=gI]R7^SKPfL;l^o
+1[Rf<M3m<WV2O[WBl^onbRmRQfmUCBn7gDk\o@hSA]o]gQik^X6meHH_cB8WgCW\kiU\B_kLZcNl
+dmGc]l]\R7JiHW<OJlJIAmR26chnVcdiaofH`cjNbAkMdIDYVKOm>RlT?;_A^elGkmaJKL2C^2Nb
+1;ocJLBge4o>9KVJNfBN]Xn2<YGBF]\Fg`ikSQmG>E@nbn5^bcjdBoXQhnb^ZFO_gEMbf3?N=a_3
+fA3oCdghkonXS?oGOjZElT27fBUnO9P?n\<h3OmT7]JZJjIULCn=jO9fCf20eT4oJnbSZ0F^TZQO
+;R[f=<WU@T<3o7ld^43G5QHNT]k2LkE1:KmHN61c;3b0c6;Q>G122dlfj\5WObC=lNk:<`\_3QJP
+kRD:eNSoR=CSL`c2l<JRlClYR>4=L`@7jbm:f6Vf1G^Gin:aX_\OQ\GcYh]`Hd[0HO_3I6Z@L4c;
+gb;B8G[h`a0?U^5a1`4mWGA0_IS]4SKX^V;doc2B[XfoI:dD8TS4[O\B_jjB[G_o3`CHfN^nj;on
+n;HN_cllFiLoG:GKQi^Ffe[R@Y4W26fl2Zl?7?QiI>Oa0kgRo0^B>N6:0hGReVjkKdPb3hn3<ldN
+gXm5?Cam3AoiOhEQka^7Jan]MoH1:fo5;k]aG^d0J`Yf[cZcL:\^8m8mOkYSd<5H9IhhHLn9ec3X
+Z0>ihO3KgWbc8mBmR=?^]^Y`?DnHCC[X7FWVXK^7A>]cj=jc?61___JDT62=WkaK`nmmGaA^gB?4
+W;E;iZCe>LMUcb3AKVRF^LJh`B6K]5UlZGBS26O7I]eB[N2I^@7GM0TgO7?^gcdoA3>2GM2c@HF`
+@k8g=V?V7]GkcOIP\K]oU^Fjedc[elH\gf1Hn>47`aCjGc3PWAZgfbOO<:aiic2?cafDLYoNmnS_
+\N_3<no9G;[5X\99eROX6b;=CINao<b01ci7n=j10J^CXH74776dJQe>9OcTQCfQFkb2hE]l7IH6
+Rmk@b]kRlo0]_M0lYFjK\Fff?FN79Ji;IHjgkO88V_dCW6l4g5Q]GiOb`Nca?F7HSSkNPaCQ`==V
+lgUCQiajNi\\K5elCLH6Jc9]g=c[M8?G9jVmmFd8>hK[f^5CSeVdo<S0kP]8b8dG_0oYn>lkaG9O
+ATXKk0iF^l7l`?<?n^b[QkJZdBm>WZR=acLOdGV?7oE:hCi38jBj<gaYDJ1keXI_jKg6^mlHoa5R
+NWd:g=EeK_A=;a0?g\F1_O5Q`jOEZlEoS8?lZK\;o[9SC=hLCgn7S4[9YngLNbSkTc3[9WJZ<co>
+Y`oSe\nEYgMREWb@N^NcZM>OgZPnk]?6h;=7f68dmi3m6MjdO9;bKkK]?e]bLSC4>Ho<V=nd^>W3
+TeWgOmmgjEnYVWokOgok?L37La;NggCS_D2?kZH=U3]i_:g_WXBn3h0j]\[:3lV[kUXCn4E8`f_V
+]L<]oc[0dm8cNUOnnB3Rl^e`ieHSg9eK;70oIIgO8m><X47M7B@H@=dAL4\Loa3jA=4?HE?o>Y1]
+ikIhbM82NI\GMT1^nkgda@cO]Yk<GHN0^WO;l]lG]bckgj]_io3Ab`N?gS=>h?@4R0mOGn[gKf6Y
+0l4b7ZREI0`J80;^ala[lTglOZ1ZiSCi?gDko67RmH2QgVP55h`@^k?EO7:kmH<42J<ob9EPD\OY
+G`lDkBAnf=No0[GL5NB`7?Ukk>X3Jk@>Ln=9QYQCPVJmn2g[iY@Hg\XH7^Sk3Vgg3fi3NH4oPK]T
+^1RgoL20G@7QPY4eJ;2dMId\@OU@bG:mel`ImZ=8GTj32^:mG40>OM_Q_c?0:7ODo3BF7lCkjddf
+9_ag_l<QA\>G=dSmZ:OUDSmZ\kVcbSmW`8lB]>4K0nl7_QbBk\<:nZWKRh2gJI]ghmehkEX`H:N9
+L6Q0Z\3;QO3oNlGQef5kik2kR?a@aV3Ek[1P@E1f7`?_MD4GLgMF2K=PhIC7;gNY6@NRU`]CP?kM
+alolD@LgiK2GWYoFlo9P_g;Tehk=7n]an`BQL?MkS7<7cXeM:b8>n=K0nAOTOQF@CaUdgh`NXEn^
+^?bkgo8;O;1G3_ML5[\m\OlMSQRmfkeMmW@DmZ]Ra3?9BU_[KbA\5Rck>IjoKFH3>\15ik9OJiai
+15Z`hN>cfI=e943h\AHZ6FY?K@[V_Jm=Gh;Rli3:Bem3jSdFC=@k]eXKl4C^2Bg2kg`JlDee2LbB
+ZkY7jW7kB>P1<YS]X75O0S\6j9fE@nKiX;l]nn1>j@N=iMcE\oO^<cW\6D;Jk71gH@gl^N5o:=0]
+dOn3R9oDfcR`bHenMIB`oflY:1F?BBb6cLB=dG=9b5E[;igDD`N]5^]Sb0]^f01UQhTKBfJi\;20
+4o@206\]2`niKn4ia<PBUJHWh>`:Q=W2djTaHC0l@5IIP>5aDPa?<=PG2^Ac`LG`W>e>fKN[0PK5
+l02INPZ6Yo^;L83_JP2_>=akF>a16]Z96[1S=\7QET^hHmC@QC[<eTQ_\T0aS\g[>7a:HCNVW?1T
+^8I^OOH>7c9l6Oj[lkk5HDmU;I?oh[>GhmIF^4ldI^[A;_25lmE;_7kkh@h;hR\]mH6^;b>7VZdQ
+[bBEgcd9kaL>7hWi]gRP2:OKK@gIL43aP2kVX1_bc2]iM4oRl24jkRSlnURl\cWG1JYeKN[3HHo6
+i_N;eKC3hbFiE7Q2UZoImQjoU>=Oldd?TW@hGS<C1oWlPf`cBkL^oj?WS\=Q;lK[dfGRe7V3TXjA
+NJom>I>_D=dLCOL6;K]Ue>?hPD8MTl^?i9WoNTG7omV3<GZH9g?J7O313K8hih:CN`3Hiek4[;In
+Foj<0g[^G3`gbjS^og>=NA`fbll@c_cc]MX[2Tkh1\NWa7W^AhZih4b>=o\?7Wdj>oS>=fWSW6Qb
+l4]XUGUZ\<1^nXA_kkO9N?061k:9]4kelJg3gaRnhO31FgW^o088E]^gk=3ERMLnSLnOe<7g\6Zg
+6]fJE?Q6`e\be7]ifbh_VjI`l_oEl0;ll4g37FI]kQ_Igbn;\Oi1fL;5;glGl0F0mMLY=jnOEL1m
+[H0kE`7WOC6[abbBLnWm`NDCRC1o_9PMM]>lPSmOI_SC]FfGb>=0lUFMeQMl]ck3_k`7UVLYQh[S
+G=k`jD_g3mW^3`XcM_bPagL2k;h;m;oT2ajXW^85]YO^6:hlg;[ZKHg^:_C8Ho5kK8JggBMl_1NS
+GHRXIcZM`n?O;CQ>aKhjg?>^XOOV7MGl`YcJ28QEFoYQKh_Ohc1Kl=389@e_EiiA^ed4\7k`;2VQ
+1^kA[G?OolQkon2iVfTOi9Wi86^YiaNjOTWCl_:d9NeB0l02L6VHn`JfA?G2OJ?XS=foIk_EKeSn
+Hhnni^K3gW=km>Ga[oo_KklSl<dM`N<m^WCkihOX\Aj]g1PVao^hHIm7X>=fOQ8RKQbZN43==EBH
+?Df2Jlm:P5:A;Y[lM=:EjcJeJk?[lFEBoYlN?VCHDa`nd;eL]]o;EkOod7KPP``]P[blWV;]]AlA
+XT_cF`Eb`mGi^^idoWj2F0[2g`lQhSM>I1WbJ0lYCF_2cWjM4>:Ah5h=NZ3?^nb3^=Ia;RC0;\Zc
+EB9ZMC8ol`0k2YTih=ST@?g:KSlTUa=A7jVDdiCMYijZk4CD]feJoR0Si[WNfbCnkoW<8F?M4:_5
+GM\UK8_KO]Q]9MmJXi]Go^_m2jSL1_Rnj?e5ob\>AKmOMGQOb[mBeYNgS@9WE_KjQ7[iAH;<O]ja
+FIJojY]H0;5<mUU]<b?3Kg7g8bKO^mkM=O96[<\j2Mif;Jm_=CV_VY\Y`oYKd\^cXO:nH<7o=f]o
+cg5WiibA6_Y4[FJOV9OmDj07<Nee;B4ejYlCdU@M\keKTo_GSeQUOgSM<=jJJoL09LSW_d^3okl?
+YKfSd`IoXi?n7]>I9Uee]CHB_G^J9K5k;5Z@YbhJnNWIFBnG3AXGl5H3T8CHL47BU_VVmZ^`02B1
+U`59P2`3TVQJT0A9TCeGeDh10h<T0:<;]hO;>h>TSmB@:mZl80Wj0R@1IRm8hW`IWcd5BK0:9d0B
+OLKd9P19N=SVgRDcYkdEXlOPo2\V58[Im][2=1U2C<Rn?L6fh9=?i]S>Y?lH;_^8_U3ccNEI3iQa
+POf7Vnkb9moT^=O`n4Pho1mQliJ;l;QOlOQW_]D9<Vk6jn@EekgW4EiNfKKU0f>?`HBIn?bhBiTf
+Fi5gSV6JkllLOZ;dmS3K5jcL=[5>h`T5Jici66Ghi;mM`nEomX2A;i`cFL4HjgR1:Lfca>Aj3nBl
+6cSEeFo7WfD8Wke;ifDCboeoGW5>`fGc4hJI48n?fcE4YWRg7nCLKbAdb;DO7WOjSaak=SOhWWOX
+hYYQI^@KR<Aj`H7nMi;TgOf=9NlFdh>I>g[dakOHQ0WOI?S@SEGc;C\LMOg:3E^SM6GcWcoIL7A`
+P7SKS6eKT>8HgGJgkSjn=UAKLWRk_e9Ye675I_Nj]:<g@lT8`gdc<[hLU_Y7i0XG_oam9T0=9D0i
+Km=\GCoGJ;C[kKcWmAcRmL>Z7Z]HnFlG9?:mK6gbQ]ibn=[Tc1=jm<JTiO98R1lD[W<lh_F242D=
+K8d9bg>4f1a^K?<6;aWD_G]EoAMZVAUcKI\HOK?0]?nkgl3UIElm;53SBMHcNElkjng]Io9\2g7h
+iIL7MChVBY=_MA=:gddTC9YTInSNkCW>HPaYhO@EeRH[Gn5bAQ5_YjUO^KQS[oIHTomJV<=?OYk9
+giMZ;;5eCIjDQOh=?EYUKjSKmC?lb_HiG;JQ`lMmNa0kj=Zl`g9Ch?oZ]J3Y]=g[QGeG`eL[Um@9
+G_;kQD[?cjc>LCae2C;HJ_TCMUVghNOe[b\bHJEPe8Hofknod7;O\7c73S7HZnoPL1mlMWCAMS^J
+m\]oM>VMTPoBYJai8FS2R_Mbifb>UCQTg?RKJQdn^HC6O7?<S]15QPG<USM=\:H1hla?\``;?e>G
+M63YPjQP2Ob>U?C1kL07ZYc?eOE1U>:e7aBXJb9\6N0mgokcfW<eMYl1;ANTOSn<[]b<`@JAH48\
+f7;DOOUCe=Lgg3@N1C5nk[4?5Z@Ogl2X7H`l7OL3lWCLGWIYhiI_akghg;UHk8iNZ542EXRK>eOR
+dkGHMGV^C@eVePSlG7TNKUn:M?k>6F5JITQ>AEGPP3SKGH5Cf9LcB]a`:kYNh=[H_EI9]j^b9LMO
+mfn\EB9\RJdBIT^\aKkVU4ZA^bYkggb3l;Qdf\^Ua;RGa3Qj>A]G@Q6kNmgK:iSHJfW?LkUClmR?
+7CGW<:\4PS;m34;>JH<ho;hQoC]eOnNaYfNNV9nlDk:ENdHnkYlPGD0BmZkKHKoIZ`E^YnFAfkdj
+_7om`2Gg1ik=M_WZ[=\WVK49o3MOg[WQPocIh_o??k@KGd`1O3Si01A[oolobS@7BhlM^@fFmXXB
+hgFbUdD;D:3>KoWYfMT^7_S70kc;89J@2V;9LkMm>]M2;86m4D^0k2:FT41R2LTBKGOlb05CP6S9
+4^07LlPB7K;SA2hO`6?_hPF;=n5o^NiKC?iR:hLO4i=__;XZm]l6`LZ7Q@_6O1DcKUl\k;5jE1[^
+Tg1k4cFLc0;NZV;PgS\kRbGHPSER2AdYUP00MXXUKa9;X2O54Z2:AoX>UQ@XeN5?<OhL2oS\gKP^
+Ue;Noo<ZlIP\UilTW1@RN<5Y[b8dbK_m@>Mn6_6BHBdbQl^MoT?7W\d>_^\M^]RVV1Wj1]Xe<D:3
+o>lRaK_kfdZHVbSN5WOdj8m_6oj>@9;fb5elm_c:K<;[EfkD6YG[O\GWCn001flhMK]<kFXUL?;L
+MKO^:eCWM[UIIG9gOi?A;C[;KC?jhA^7>ecC0=g@oWjIS?D?c1XfO_WkK3bLH>;G:CN_5a97_MkV
+Fjj?[m_fBK@^djSi0^:6[cmg7=MTK=DCfNIlRmme[8Tn2n?;jlMj?W2lVCUf]gQ_m^d:6JoXl;=K
+_hDHFi?6^OMKn3ac8^L]7?o16ROXg\gQ09MF]=67\d__?CbbLDHfNYbhOXBg^VhQo1mQhddU^?=?
+6=DQAYo6kBMlfBN]WHlKi6\IoaLGWGK^=GcPoaGm<e_]]A]n:a3kBZ9cUjlTCa7eB^9f8_7MO`Nf
+GjUeXfOVmQL\<@GZ?UInjoUJBKSWLoPmm@9B_5VoQe]2`7fcJOoQQA;^c0NJC<ijXG3?Ljf?EaQo
+l?nloO]bWI;b_PkOoP3W2FO^g<BF^^Cg]ka=Wf=iQ_lmOXLno;3mWbjQj`mKWJUooKmo\PHnOk`;
+<^nnKOZ4CS5jSfnA>4j`YL??oH]g>\Ne3IooU@XA_NHoR?5b\WQ[3^d89`B:UlJK5cSCP67UYiF]
+4GAVeW]M[\OK5[S0P?iL^i2oIc4RiJj>MTbj]7n`6i@76e0>RA`d8QL7W0FbPnKO6YY9?VXS1hRk
+FZF_BCT:oPN[]3SZ0?59e07R;QjUU?_>gV5ODFl?Z?VjaciHX7Jl0k:;LK^XY@mU7c_\Bi]\abkO
+SZ^b?V<j7ad<Tb;@PUcM^QBO]YGFbgE5`Ljd8OQiPe:<nm_oo9dca;SDP6oOY]MVO`BaEPikRM75
+^9gDa5N1Gd^3BS<oWoFngn7nh7hi`l@=Ke\M5V<SiK5kBKkZl3H`hRd;Imfo\L?mDa6lhKeD\NRo
+:7m5>Nkk:2_Og3D5V[T`b_J[Ki1PoAigG3KUKoTUN=JE`cjGGHIVI?G]Ka2CMk^gEl`M^5JK?2ca
+4aWPHhi:1[aEd:mQNRec<fEHn>MT]7_>3TlB:7Foik6WIii8H7aB]W;?b<On5JPC>9\h]MNgQ?B]
+S[ML\[\:]>\7;[To<0oCRIQenbBmd@7mSDc\Xco@[dgnOofIgPcOBPCfQP6__^ORoYXCo9lAl8A\
+CG=l\P:lEWKBZ84nnkk;CLnnl^8>ln9Nl^;P8oBB`fajl[Pi091<d4\T3Uh2I0^lA?=aLI0dOEhg
+FaH`81L7<?Ug1;=;OXZU?27<kM8k?<PAQof`BbYVUcc4;[UE2Rh>;n7RB<^V=g[h]8GoiZ@2nVFT
+IO5FO>iM_=Z:mUl73:QQO_S2??;4jkLOkZQ=;dWY0eiOPZo]M>i:2MYgGmMdMh6OfoYG?30Tdnfe
+QFXdR7RPOO^1KAZnRITlfXLan@lZho3[Hmc9c8JLM5gF6ieiiTjM=N8G7AnECI8mbZ^fA^^@SWo>
+=ce@hQMBFS;FfoT7fRJIMVeNQloMa?E?7PGXa:Wc1RUU5jC0oCVSci2MFjX<FWJ[J<Oa0h>f]@<M
+HPOb2C_@g7JP?ne0KTmTcQDd\Ad8RAm1R^<WDQbM:<EiWQCW0ZWXhPV3HD3g1IkMXNO^8iT;c^Qh
+\oOPdJNCQNn<TJJKL7;`2`ONaPOoNjO`kGdg6[>T9d<g_;5SMka[lC>6KcQll=k1WEnA0=L200iM
+aD4i:LnOJAR\4=;AS52gFfoK[P2b5N2<K^m_=3X8RU]^Gi]fn<IQ3bVlka_LgcNSdOj1>L?6;gn_
+3D[D]\_G:SN_WiF?^nkV^jj?[mgJdKA>db3?7^IYn2L3Ffo3m?9nc_S^Xhglf98=Gj]V_e3WoJ1K
+7i>VbC=\bN5cSA7L7fOe3gX\b>5Gc`_MoI74SUo9;khc[lN@X9MV3:NKCiA;kL<=]N3`hhDbJkMg
+Qjln9O4nCRUga\XT?`8oL]_mQJ\6JoPlKGHXJPIHOm\[N\hXPAZliP6>DW7hSQ\cn^E]d^KSdDe_
+4ZABTUL_5[[FXZKK`jEi>[cUSZ:7TQcndFa`[3dU]boY>ZO\eMKQl`oZF:k<a2>Y=UO[?ZUFSAia
+0dJmfFi1b>8EIWn>LGOI[aQ8`M=GgZA;mkTo1c7<Z?gKk`@nWZ?QSnoAY^nh3T;^S9F:oF3\TlOf
+cbU<17mn@]XNWHoeWUd7k_kLO\2^[9nKGAm`IT62b4nWHd4VVcdkg@j4?g[gOcIb^_?CV3c1^ca^
+_oOP]WmQ=n@9VVAMhTlA^[g^4b;d^\=_4l@e4\k?MNOS\=_7U`eH_boV\7mWB9[MHMRWM2?_OD5B
+R?lNB?[2[]Cbkb@kGj8nC`SLYib>>TSjmPf[Wg_L8dGX`3LH^0mT7bHkB>YFgP=9KmcZgGRGWOkR
+\3]hnm00EH:G>cORdkFM;^^i=C>BE@_`dooe=VZZl_VkIX5SUL4H\md?>N`?B3Z:ZVKPOV;dJQY\
+YWG[a^D2^I6g[\OKoYoWcB9Ula3h@]K5kNU0Q8?cjof;jD38EcX@S;8_KadAQRgboO8;1Ybodbk;
+YOT[_mQa]g[BUU\dn>e]f7lATk_G^ke:gZ1efN7S\mbINNb7?QoGL1\M21QUof6TiM[K0GmWo7oC
+mWLNMg[F:OW9>b=G]DoDhoj9d0>JfN\fLFZ_Ld7BUC3lGC;Qe`mJIWo@^NbF[lghQ;kLoKdPjAe\
+69kOogoon<W?gKUKQi<?LWbHci4Nc]7RN>EDKDie_;_Yg:KiZeK4XV>ncEOWi[YI;BXlR5\=8b4a
+<9:ScZ\I8Si60YlS`@7P:O^gSmo;8[D30MBMAQ0LjDiC;h;Pm0TSZA]6lW083WX5PR=g9T9`bW8O
+k?lV<JjhV^77lMWCLVd]g7m=P9<?<I8:Hb@b2b=aVD`HbJd`T]=QY8G3AfSn=Dj8`VUgGA63YD4?
+m^e7]0>O>V8TiD]hk2=6L^l\cgJ4K0o5oQlVNiFF?c<?SkdValMTTn8<G;kbDYcf9akoW7Mj`<C;
+LI^lbWXWXYFaJmZenB8nndcmTYhO[aF[eR_4m8a>Nng?6Gj6k?I`fYNHfBjU7]<WF>IdRBMlj[mf
+hO4oMf9L5V7f7nc0lAD7S^620KO<FCSnC9J[5lo=:Y[kon`R7HO=dXPc5@c`@P6nD9SQ4<I`KA8n
+nc;Q;4ek_>W3L>WCg<Qk_V6;JhFCQFf@16A<T2O>90D>o;T21l1Vb2g0jN;c\0f7F>[12jd^G?cL
+hN^`<;O;eb`k]`l;]dDAPJB>H`[?gCD]Tc9g41li>:=ofJc3?gh;\W=38A3`IUf7_bl`XoN9ho:l
+EjXKC=0FhK918Y`_>KgQ_l8anjL:73kUQ`eoE>Po8?C3hYe?6nMh`WMLg54jo_Yk7=9dUKQ0;jDm
+DC7jaQ=M5nZ1;dgKBJbEn<]4c;RRD\XgnH:f^SETj=QGlFX:P3k_6^JOeScodZ7\lo:\;oBd_eml
+n^V;Q[g6i<kk9LO?2:>kc3=Sidg10MX61_Y73`5f5V:M]VO]XIHVg_Me<fBjdi;8nCmO[3iM`Uhi
+7g1HbcMA`TMNMBkUZD\iQUIOmNmCfM;QC[E?f;UcgX;GGTETmQGM?o7mhg^fFmj`HkoL?On5fiHf
+:\2n8oRh3XLo_T^KkW`?9>K\2fVR;1bCT`^da[\22bmNcg`VGjdOQdo?:CePD[<5TA]=?]2\@XBC
+Wdjf3Z2Ck\KhgNV1FZOof2TC@nFP<=c;HoL]W6goa6k@8eC>inEf7\U>1@;?M^eGRe2o7liXolHX
+KaIk]56>1?X:XKg^U<:M3mGjLJPkYI=AWb^DXnkgkn`Mm_F==WLjQ@PommR72]6>Ke193dZDH@Fd
+?=C41ReE^W7;=bQVcif;`nkHD3QDP1GQi\j=n7B]POSbg9XIbZ`9n9W@jm]a0D3=bS<2lhc8Wm[^
+Racf1ka7dN9j[DlUa[D>K4I_gKSl\LLmWne6PDR?NbI96bmA[ANd;WI?C]b:RjOQ[oL_I\B;RlOk
+^7QHn>F]8lBLkaD[nkki1@?>g`49UnJ_o39fn5JNm7;;fN5HoNe_a6Cg^[MGbQfh9\2?eg9Wi[4O
+7CD>R=J81jN<oYBTLnhe>d`Fj]CmWLNNWWUBO_;>b5G^5OVhOd;d06L9JE\3^[gVmZFEAfk_JQBn
+O^2B2ojcfBeOWFgkI4Hkmg\cDkCc@gaZojmaIokokmngDPo=HJL7E:3oRdEh>2iJS9]C7Ym=D;aV
+]U:YE5Y;F7Ijm]G;I\G:4K`TCd:2l2B_NY6WeejNA3;`958XeYP`@PV@3H@BCCHQo10^7YkaKi\X
+Y`865DZ0OB>D=;G@f4b73]CP@CmdSdkh`R^oHO@O3W\`AY=5>@jnSU2WJ:4<Sm]TCF857S0<>\ca
+J8i:GR;dV0WCYTUP3abn9KoIOc56fkLeNRLnNcE^[FGk[`EXlZ5>l4DE7TfY2YL[Z9gR3`[P1kZn
+S1]Z=]5MIdC\^kMW]Zn@[ngl:adla=\[Dl7OJ91h`;gkPF_Lk`VDU0LXOJS58cVdN;GFh\o@hYDc
+L?W:[Nod?ccnFNmdPHXoJIb`e[On<?VPU[F=HII=SoN7bb`4^\UXomb_FOb4jMY6KM2kG8G7RE=U
+PdV>09>^PdUn0i?82iST9lfca<`^TaAH2?BB4>SQ\QgS_5aBNOo?:leS]5`nXW2B2:46YgfBh4J8
+eRKZIgOR]O\HiT:c>=gZ?GPT=`nnlbgJ^2FI6[`ZF<47i4OQkWhk76cXQSMe:Xm?W@d=iDP5OX>T
+3FOD6YC[M[R;[l?4g3ISfgjd>TJak3@lK``cGlWHX;\;[lGWX;PQ1c@L_>3J`\E`@^VJ]fUf[YmH
+o>]QEQmO^nEaS9E_@m`lTC>_gcQ^kKS1BM6@_PRGmjg2IVi=]4joF73WmnY8jA\flMQEj`Mog]A@
+03iZZ7`DjIH=6ohWKM<XFZ_=hONmb_0iAng`gIL;L?mE:9iGUhJO=1i=O;e6ocPA>\n<DW;h`L?3
+d^l[EZ?OZj=o`n`?5C33^:9dX:f:<PFWmQdnc2o^Ncm>eBIEVJ1GQhfMOa8@n[2VQo;NBQKoLjS@
+JAkU>Ob\hYT]XH^6GEYXeImHJb\M6IO`n8j=nfjNgKkUEMAb:V>J[[lRSa8RZW23gkiA\]6ImLMo
+C;o^\:k=nQP0nngf0@:lNeRM`k__2]9ekho8`iFDMgl6NSjlcaFcmEeZLffO;e3>i@?:c_hAiUBP
+\>EZE]fMjDRj=[<nQ4lBK60011ihVLo;jebncYC1\oLId791j_O3]10gQkGZfh60mgC9hL;g\O87
+:>E`[QH[odSDPh3g@YfFg\m[QXSjnXJkNhLW:gOL2aGXc3l@l1h4oD;IYO8WC3f=N5^fNCONnIeI
+6Vj?5Z9QPJP1EMR;lX10N\2l>UW8Z@?bDD6EoCi6ng_VP6>C0oD[^of@^T_USm@M1;b?E3iE8iK:
+gkIYnN=>nccGNh?aog\nLlQH296eo2e^ThSK>_3Teo\G=o04>O3hZP<?no:fDN3<7U7K;km8T?Vk
+3fRFiJoj6XCOHXR=X3W4]ko5gHnHO>mjMmM8=^=U?nOIk<Tjk\\Lm[4?5Dl0Xhck<m;;\loLj8^G
+o[mIng^>>c_WS?cD?E6[fBOVIOlDj0766G\]8IG:Wa?BE1fc_M>;oQ6[k8lhUm_V[KUfcnB`k[NG
+b[_K2@=oK^P7nFOOan4o>mK9e2=TWnQ:nH9S]c:>>58kdian@f:lCVJ4Ff3ghO\]=cgkf^EbXN01
+GVmPb\PCY^`5md[\7k20:D<B7F;:0>o3U6UZYPa9N7EO_U]<6F0B?FC:J[OQd7d4jD>Z=`Pm];=o
+5@9_LCXaGO\Xm8PEC;djGcV6YdlhY^Ec9W4AZ>cBH`J__AVWgL<73Kn6oo:l`k7HFe[=j=Whk76Z
+S2bn@9G5mNK5@_a7UCTbEEHeZ^b?m7kQl96HOh\7RW2jJoI^?6fP767OOTR;`_iD;^g367d:SgdD
+_ej6Kbg?MXQd=o5Hd6gHUcneelYcJ6Fl9<OMR\LoiidN<;4=i<T^[GLU1^YgeJcEcbWVTkI;lOVa
+E[kVBlCdSL>j`Ci[n2WBnl=YKlBkk:DnLF[\V=<SW^207@<7?;^NmHjM>\;SG\4fGTPLdl9Lm]T6
+8FV1Da\n3L^OhG:=hkUJAWWo[lKKHKLdN1OXnC[]UHATVOj9eohTFNKj3nL`hV`hH6G60G]Ud883
+oVl[@B:XA^e`Ahl>nKCQn`PFOY:1geM^>9aQjiF^^aNG?dVBIk\LkEZUL8M377\Oc`UbfOB4Ton_
+3Q?^jm8>gk;dI05_V25<QRhDcRamk^BE;PH`SOe`ZTobW<HAWPdngO3MehjGSdN_ES0RA_jY=\`H
+MVb6?oe65<laMW3h8PCeakRQ`inn\n5WUe5]h\c;7Gk`I]bkkCmHX;fJ\^cWl6M^IOQnMWChChde
+Of]=IhZ`kbdMo^ic@BYeMB;Xiff77dmA?l:TbfKkgCFajF27o0`ckJiOg@J6fckPl<ikQZJO4g1_
+94Gn<bh2i2fJ^6OTfUObeIdFKc0Oh>NDDjlTK[Nn`WXPl?joGgg9<c5Ko3\7daNLmb_B]ndcnZa>
+TkMZT]dQ3jmB0kN6WbjUi02N]NG`VI_g7ikIU7?V]=JgM7Uio`g:MILPJXSPZCM6NOnfMkj6CZX`
+S\\eOf6>iAWnIMml9]kkQ_eFi_mJJfGOo^mo5K]l8=Fjm@76GXg10GadjMMZbn:NNd7b5VQ<Amgn
+8=NfJ>M^C0fWa>eL8lS=EW>27\[AN4cYP3<;55Yn>]FfGC;ScJc7<`jhT22ndGT8:kGa3gPgYngg
+7C3@F:TNiT4lo_9j0JFXnh841A=N>gk?KOnlm[c2oC?0i@85em_3ncN7XL4MGDi>1WhEYbL3kj2C
+7ZIBNYdog>[T4WZ[I]C9`3\9i=MAaf<>n>VA1`gHZWMPkQgh5f@W0nm4UUkLL3]fnCKMDO1WIKPm
+>TR61J46_;ai<Ej]jdCFW5LW1cUe87jn`egmOflWo7_V@>>B0o<W^oe@gDL>njR@UhKRTh6OHW@b
+l6kK\_aYAd1^_ENUf?<bQh[1R;`[f9Jf[c1hQk_U`^]_mbm]<7SZ`U<<W[S`m5NgSI`D1ZSK;koH
+l7n??CJ[l]Ml683OU\DnVffV1hlPmZigMh^l2M]b`dLklN@Lmf<jjYU\63`8bYaOQ?KIIfgb8K7o
+_eWkNdjk>^N:o<`m<F]I67k\W`4k<626_FJ]I>2M^@;WV=fM;gBO\<WnQ6_9HEackEk9HNh3oCaN
+3Wk0Wc;VWomn]ocoo_[?LWCJ=jg[FjG9eUdLgkfG2>loJiJ;l5=AH6iU>kOE^@L6MPl`l61D2NU2
+UCb]l<kAH5ZZA2m@9C99:P6l_EBRFLW0UT[n9YE8UUhPfW]B2M1OY19?JS[43?cnX]Pjh[h9enFi
+53_EP7H:JLR`l`jTVG1SBn2CHLM]^W>DQch^DmT5DDNdJkN`aK2C3L;TNAJ`R`Qhg><72_^U[GW@
+WhK5TAnSVl<`D>of;9:[L81EG;273gQ9hn9Dcl`QMIo:F_54T8a@l8eOElWF_On7`<V5c7_3o1Uh
+]?7VhoN7InghXf>9h9ER9aWPa=oAZ\RQiH47P2R7e`^FjG?9c><?K<VcYe3<5@BL`kOMMVMAi:`=
+1i@?53>6RId2VDZNXF>Oa;<?aBYi:>6^6dLRg[TG:OJ0JDS_lSfIUTOa`]bI5`_dC65TCGH_ebE_
+cTI^fg_l4RIWWo==3iCh>3KKji[5MSOoIP2iM>_@on6oanRL_DS[SiN:gNkIYdjY6HOKiB<0?OcZ
+jNEQJ:1ALhXA\Ojaic7N<PAYSL\aeaA;57?2[eO@F_k\XISQ1^AhnkCSWM<=F\L=E77>ZBOg>Van
+T61Qo@^I=TaKog37Vf<1_gfKL:an1KAeA;?BWeNLJf]7om<cA9<ZWfmh0@J\<;SA`[Ebi]TON^i;
+TSTe6o=Y1Z9lm>U\4Dj4__]lKJ@CCGZN2AedQ<4lDPDhAka8lN`hac4JBe24j_5=IQgQ1YXWk_09
+QFo9a:>3^e1[KBYh:lo3]o5LP;QBRCheQbF60Mk=`oWUdQ73]_Lk7<f0WKS\gYIelXj?MbNQ26b<
+2GcWkan=`iA8Tg78nHY1Fg`N]ZFGLJEf<cK=d>dS4[]6j^Kc\83jdKA>Dj_`m7iQlh`jL_SaXSKI
+C_D<oWb90NC1gAO:iAB3GWGUl>oEGZ3S>j@l6gW4hN=IgVS3b?<3]ofAh<1B;W__0M5kNhak<gcI
+4NYYG;ZhIK^49egdGn]:cHo^5NXX8oeJ^?JCF>lC?]j38H`0B9o>7Miden2hC5iH?OLZNZoNDNj1
+hLjYcL>^B\3]_BenSl>KkaMZOSc4]Y5;`>BEImA^5d5=?7PFC7__8<0oMoj?c7;i^U>U3c@e`6fe
+]MCnnXFNcLdIZmRU_MFk2mEFc=OU:lRjCeiZei1fojkM;Wn1RGfWWP[@gFMgk=GaKoo_Kkl7J9hm
+P1VkE^f6F;R?jiC=5S;d^1g[0gD<Yb3>i`;dVIbV_?::``n6IQi@I6FKo:O@oNKhA7l^:;3k[^40
+SGBU5Pe^oWCY_OH?=e2\[K_QY4<gcP]H_ON7F<7VPkEgUDZA?obC;X<7G<^g;m3?J4CLBca_^MH3
+?^Ko4FkbZ`LijeJKlXh@]aicn>2LmcYgWL2cNhC?G>Y1YW?IacD5Tmjma?g41iU?9^HjNiec0XkA
+OmaI8NN[6cgVZX@G_iWA;oN=3n7NGTPF?^V2KP4Bm2WM>_bR\A\naoPMOVFagPDBUkLcMfiDOL2I
+1BceY`?=LnIZTBWU[OXW0eI<oe48FD8n1@Pgmo;HOMn5gOjQkL076EX4F9Z_L<Vjk@L6k0YVGa9h
+Sdon_?HlRn2WP<\6[1POiW3oI[4O0d<BjRLOOgFn<4EoT205<gI1lcnf>KGB;jRGAkegf=>Xec<9
+OU?GiaggA0Vjn0JFoh4L5L_Oai>BQ>n=7GKSE^o6^o;L^CS\CXf4@`=D2Ek^g8Q?egIJaNOFc4QF
+;L1?QT3gOJS?gcD;7:\<E\WP33W\3iIo51dEbon9dK7l_L3R[A^G?jKecgFaP?:lFJA\APaOb;Zh
+_@]5KR]@GnmOk48QGedX66EOgSXRc7TBYk;O;kmP`?TkkK9LV[ob2a1iZijmiAIHg?i6]kn8bMg[
+gEhU1nW;3Qo_8IeiS<[f>4OX@P6SK2SHk>GJ`i2o<ojoJO\kSc\mjiClY=RhZWfR7_LInP7=k1G;
+gmMNid[CUDM^kh8YGcmXVOe1ik9K_SKKm\VG^kmgM]Pk87mhO_moo]^Dn?okMkoMjNbYl`4NP_W^
+>0i8cj@gH[NY^>?S\E2k\dCMU;a0UlEm]jN:gCEbfM3AhY7iB1\bge>K5Y4ZbGc@<V@n80\d8?<i
+;iU?ai7i97FOD<WB1@a<iP=dFX;eH]RA1c9>^1k_IMRY1I;CZHl<6kF78HRBEPFZ[lV=>ni\?5IR
+Bj2=HNmNBA_QaQZoO]21Q>>0H7Ol44PcS^f\PkQ`7mUJF\\nG@CkjO3QZ31^\MXkN\CXEGS]E@E^
+LQkecV8[QW`iM^g[n;DEK]iEeS3cHPojT_UCl:SSc\O_5f?oV8LW4l@^dJIB`0@da9D6i3WS0^Qi
+hoJ8doFmT?5Cj<:WSbBL<KK8X0Pl`KJW4VJh5R?82E8O5^o6hAnI:PN?ORSW_XA;iREB`acC<NkI
+Q`k1T6dSOS4@C\fc97_ETfmbg6\DNo;8K9n_CLZ7@WX8UghBGjU2l[<\]mNFSOG^XmCN=]VdJm47
+iKoCl<cMRF:@;F>gWH[0C2U3g_4c_a_Xk>W]H]FnD>EQfbG?L9@9>nk<O>YPhc;==TKQ2aIn_D9J
+lfNWikNTjTeSSgN6`EoC9FBacZdWmg`JY^VPTckTZF>fmPmk^aV2Oo^GHIUn<M6W5<iDObk`;@jg
+OgbRL;;U9>;T5D8=RAdeK=^?Lnhc`i<9ImLi?3kTP3iaj]GL<:a0_OMiFf`[W?QLPaYYRV90UYlI
+l<272MnXeTIFHi>Q6mkDZCnNYkdaG8c9NKlPNAMkdPdlf4=G;8Vkn5blRe21EHQ8oZ=KU``o?:=A
+e]^emoBjGFiF6CO26A^\bHC>[ddmO>?Sfd>a<cDL6IAQgSl\`i51Qf>DnAZQf_PL[H^_<Ji]<8B3
+]jOc?6QKcnOel[IM?jcZ\HZEogHi6>MN=ROdd4CdJi=1L7]h^O>EBGdc^;mW?M>9[kfddbB^URCU
+^@2UN`L:YRH]CmCO?YSk@mD\Jo:fKW3hiJ8gnGo_HkmFnnY:`<M1e0gOeoF3_K^?B;^QF?cbb`<m
+7a7fG^6ZVa[n_W\\g^C`3_ZgN`\=2;RfL8GCEe:GW7`UbiVnQN?T[E^he>>^m@C8G`MWn9V_LoSk
+_@F8J@UYZ13g5nK[FFoXTCYo@mfnWn5G_\oQ\PgE8Gmk43]8faYm^WdMo^E[TM=YfmNgJ[\L_]YP
+kK8NB66UMNVHbPnd\2L_jAQZMO`9^gA`nk`>nB[<mP[_>a24JhOj4Z_m`_4K=n`]>oEMn>`@aPd_
+d?Qm3nA1Xak8lCoJm9K91nah7RaSV:75Nkak>RMLcIeg1SIN_:G\SOk=M`iofD9Z[iI`n=Mn<gY]
+cWDPeoeSlOlL^Q]dDoB:?c8l_]TQO;^6`oM]MO1V_[gQ]lYeNY5dCh5LO@c`^b7]0ALS>N<WN91G
+a?\PolA]lH9LOi2TG[O9kILN88;F@QcFl7FQb0nbEf:0og:mJm_3HLG`1k`FT0KLeWEWmi73_nOY
+?n1nTa^m@PCO4FI4d1hQbXDMO^F]XYinNkg^h@4[om:lnEgbbg^gKcnFImk3WBAiV<H;B\J\=[3A
+d@`ZWU9fC1\Xn>k6nG=nOGJloX5V5B:^j=VT8`ooI;Q=if[]oeBPD^To@?PjX4mST=>GakCaH2IU
+k0Hm@^DX\9;f5>>f7aR`jdf^DmmW];>WWKf`maG8LR7:a8Lcf[oQlM=hAo?hJKb_o58Yk1ed^0o1
+DPa@B2P`XPi16_Gc2Rf=moF==Y]W1PUnkW6?56S03HbXPeWl>Uh]Jc\ao5hjg\H]ghiklKUc\MPM
+6`b;@R:=Vc]Gh]>eW\ENWV]CPiTe<=c:>mamMKccMlh8dc93lRNgnbB;oA4\V=;F6Ad?MZN>Ul?J
+k]ZanGKhWlmfgmm`?`GfbaTUKPP5^UkPf]Rm:QiYFbgn^WmSECcTZXX7Xcan^F\9<X=Q^6nn@H7c
+Mmaa^EBoiIO0CQMicfFGUMb\O_\KH]:mk^dEL`N^YCg?iDk=CBcObcU<a@>J\Sm;^G?^LO7cHMoo
+>gEoik6WIijHWkaC\YEkASk^Wd0W?9^@DV1o\eN?]m?bb>ehd5hoL<WmPFjHUjo>^WgBbWaff3MO
+gQW9V=l1nWonXMeZm0llI4OX0YgS1?\F6\Ik2>7ooBm;cQ@[7ig;6c9g_j2cJ<BA5iA[N7k;eL;m
+5[GNhN8QPE`l:`3gF7c8a@=mhn81\_l25`l=i>8Q2OK;oKd3YUQOd08;h947=:K[leYPiaY@;Tkk
+TF477TQTPOdUd4XDK0\\:Fb1eC\;[8mJH3d]H1P;;1[70X];[MkaXIZ8>^60\S7K?Gc@l6FhkEF6
+UIVSMCn=]O99X1VgkVgl^RYfk_do0TkFD=HKeZo0XhfG;io:dNQOi^5A1[A=^:U4T46a]bdYTjUC
+S\3QHgAmd?7j_SX@hK@FHhAQKK962U5Ha[\mQDAJXd5T07Ni63S:l0m6UXYC?lBc7b<VonNR_VhL
+YgSW7RGJ1JYMY6mf06[iU0CfC[eik3=X`Xo:k_VjI?b0beLNL_iTf7\<;?o4`;X^1_JN`QgUHPf\
+7hcG`2Z91_He3NbVOCF`JfQPGEh3nmWCfaYHalaA^bD8m]QCMCB`^:P65Qi<0o_=HPd\SW=;0d\g
+Cl]h]666L4FbQiea8=omBc5>_h[A[V:HTofjASbk>>cnl@W3n;5cACQI<OZ6=UFbf_FMncWTB>Q]
+>hO;DbcPQhhmVj5j^]ik]Rjj6FIdcX4==\?<0o<e2AkhT3kOchKCY6R7=gK\UmL_g2SNhO2Loo2b
+SZm1i[UK]4DC^_7hNo?hN\?S>m[EBO7S=Aaa_Fdk5]bf^Ac6]oN]O6lhLKUm[N[Q6aoO7Z;=bF59
+XPk_mbo6hDRQ`cC<O:EP;@[<]AjN:30^Gk=<g3d`F=elcV?l^VeOa>XaRiK;F3]loMUS>RMY]JkP
+U^M2jAZIH<cU9>RiOUc?4jIgn1mVjOLFS2Ln\N4Wm`LS[\k`_c[ScbL?J[jRlAlloNk`KFSV;j]b
+Qemh6_hk>JIU3WH_hI7FSn8^[jMUk_lXFVkHicOo5;4LfCnVkJMhdjnO:=O3`\e:CmBoDFdQ`=a[
+n<3o:oYW]YVQl850Yee9M8kQCihRjYG4kM9G^?__`7H:o2?K3VAoDG9n_n7IILJ_Ga]?^ijgCKjR
+c`T`7gg0`WkhOTOGY9SNm>Zo^>4<oWV1TfC]1gBOJed_OlV[oAo4?i;aVTBm_DKcOX6:m0acm^cE
+Mh6[GTUoZm_d>EBHoOOd7O[`DHdkRCL7oemeI_keook5OU_aCgL;noON;BV@3K`k_Pg;Z8KYhWko
+L<kV\I@doi<UGCJN=G?>nK;Q`gXkOjb[O^7UF`ODGJ4<KkNI6Qd?oDWjU5c`e`86_IOQdlGA3n;T
+9[1FAT4=F?Y;YWd3B\L9>QQ9gWIMbZ1C>l@XG^51fZWCh^nhebO8iab7cl`YnfQVl@5;6mKXFkgS
+l;EI=C2oI<`G:6aQC[oL;7jIicfKAgb@k2JA=4mF=WVNEcm20D5fR1KQMHNXDI]S2DoX8GcfiO19
+fle_UO1jj;HRhgR5n=NknPlboYdfnE7B=OTR`odohiH^l;5cS9kS;`iO\VF_G0fS3U8CRGk6Y<jL
+8TBE?9]V?8SF==>NEdeSC0]LH43o6>e3f<C567eGangg7]c^7na6?:emAk5m9H96_4I`AZlko5J1
+g6STO6K>af7_9hSE8W@Z:Pm0];]gn42OMmT73GRA88:>mj1261knl?XCBi79_1^gO3_NYNM>]7G7
+Q\:Q0Z`8=gM^a:M[>hNm?;MVQS8hc<n4GQl2GL0[Pg\VF9HITCnegALik0mhSf9Cna7Qe7OF3__:
+j:dKUcof^>NcgBZ1i=3?96VC^mJ6]jdG]2ifKdg^EY:_>[a]MOS[oEfLnh70ohWnb`]O9[R?lUnD
+_j8LMl[3;flM8NIl^j2bki]O<>1l7f[;YOT[_h`M_YFMmG;;fN5HoNe_a6Cg^[MGbQfh=S]l_9H6
+k;4O7CD>bmoZl5I<_kK6g:8<oHW>ima[MQP6YE?gMm;4IochTgM6[W:_b<Om4j87>4]8f`kkKJni
+OFWUTM^kVSV_7kSDo\2cfBeOWFgkA<CXOVmV^U?ZSTo]onLOGQTVkd@[_@^Aiml;iOeO6@7jo_le
+=>2[XgcoFCWdQc@GZZFH6cP`6oQb0`b7SoK0bT<NFGW^n6OYn`mF7ZUPiN4hE1hPRe=i=241QWjS
+l_2DeDG21@a8P07Xo3^2BGTCNf6m;SlD<MB0JU;NST3N0bVT_5\2TgW7BGV;7W\XiBfk8::D]mg2
+5<<>BWUn5W2:U4NCBGWWV7RU?9nAlXIaPWnL9Tn^_P4VIO9k?W`X;YPkc<PLE>2GTUHj4KcRe]f;
+GeO9e[goQ`RQPfC_nJ;oZRGML_cnl8cL`hD<\:U`l`SQE:mJhTFE<nL8<8XAolWe77ndc3mg=4]L
+lL2@_=]^MaUAi^Z`P7WTl1L>giKQFiR9?o_<:8kRcC;iAn6^6lLNg[T]O\2dZ[3lSJIUcoaHif0l
+mSO2gCPUYhoK<W77^W7;[V>Q:[RkWoUF9lRh5YOK6A5KKn_OM\^UfSGZMOSOKGSVo\?faiESK_\O
+?M:]3;O7;oh\@]l9m2oM6KAL\e_UTV50?Xlm=]NNJ66>]HhHHUR;O7\<jFBjM5SQN@Ai]<LkY`?9
+L`E=W7?ZBA;PH9T>=UWCf1XfR25lkX`3n^iHTW7jT`agGMb;oWc:?5=6g3m>XIQA1e@A@5hA[53H
+CL>foBkGm^2cma7>^12?3cV@;Ucj=3<:9dSOON6F_PTWALn@9T[VMJ43mCTA3XTmO7_O3LNA?=8=
+bI\?b@=KPNA1[TB:7`g90eHKbO=^96m998nf@?:L1LWk1<T3JRjBigDaTK`5LhYHHoB7BC^5N0=B
+7aoINL6a3?MSCE;1;k[i@YggPfim]:1_:=6ZC9hW]Nl7]o=nZ5=hkhMFagJ?j95TC=i:\`kOVMMS
+B93<>HJ?ONkWCgdVCjP5Qal_K9>Wfc_nWbjLlcQUVo`a:]dJlZk?`Fbg_f@]J7Sb]=Uck\o`]KIM
+^??40\VDe1Tn5ZGg[T]QPSN8L?<fRO?aQ8HcH=U_\GIU^;F^e^6?aKO_b78WdH=8=HX?jO=SF<W\
+C<4H3l^lXNGc3nIHWZk4XjPEFWn:E3cjR@8_@ZdkgCG8bUe3k\mhmSKkQN<ok]EKg[1SmmTol]ah
+D_G__POa<[CB2oHNGOY>jc6iMnh:NZ3D[B3MB?3o?99ZVLP3HamnI8AiIRNA?n7K79=S7dQL]WF0
+`B6:1kRMKDfP_>DKOTSoO43;mUK8DlmmgJXG_?F]A_2dEcj4_?gc@iC@f;S3G1S[Z<CQRcAG2Km<
+eO3S621UjMSW1jc;nX=87_g^Z1L6`?=@\6L6KdcQcKL_l9J0\[cGc0`o6YcX4CKC5b[oYYPOX[JJ
+SOBBHKM[fBi?a>Ocn[^aHco8TnikbSdKoUl<8H8KE`kmjlDJZQAT_G6l`8OZ=gXF2;8UA>;i1BJ6
+[EaPa_4KODjgN14c@lYMHmH5c9JkAYQCPC:6Cc<Yg9UUHODPKG70o^To3_\`9_\D67[^iESTMf6g
+OfPkl46ZnI]j?lUaELh7fm5mfH0Ehl<Lk]l<R_@M=_lWWV1eWZ183gNgeh?^`^IoC19Tlgm17I>R
+<<>NA[gNhFkOA=c?>nj94[aPP84VGSKo2k?d\5W:iWmaXngHiM]b;dHaaVR[MLNX4;A0UcL_aV]0
+fjEcGYdLe;A1N920_b>4nce[T779POVCfgkP2Qlig6=Ik:E<o[AHK4IOgG1gkESm\R_R[?OHo?o=
+OEW3a5Yh[Q^hE[J_@UPJMb\ZgOd[Va0FkBn4QE5fGddjh8bbGkOD;km2Q?V[EII=nF\n5FK_bV4U
+PVD\i[o3fb?6Mk^gFm@]f9HK?CjG?CVWoAQ7=A<:HH6V?3iHfNGIIb?LO\[dFkFoik:WJijXcm`C
+\iImBSkfSaaT<3KoJg^mCDRU\4oQjGNC>=hGK7:oh5VdiVZ]fbLig9W=Oi?6:h@ih8l7n?onlDGi
+lnc=AfmkWBm?LSSoQg<aDeli=Bo=TgNi_dke`KkXPmgZLOT]C`_;J\\5R@hDHO>ACfbn^mHnDbd6
+V`lfQld7I7dQ;7c1h_hiPQAlmRM^VOC;=`HH<^C?b6Zc\PK10eiljDGBEDLG3FZMN4:IkKWO?3[`
+:ebdde=?WLadZ42=MQW3CSb@LL;eN7k1X@GBBa2;33_O86:9=[=\o<>>efbGj767hc4CG@Qg97_f
+2Ul:=mP@;5kW0<=bg0kgn851FRc[>:GH`m[`6ILoFI_77JOaH=FE1j_6IJmmVW1R\Y7ZaEGC3:PL
+^oJeO5]]o=go1lSDXmgW2om[W7SClO_3\gGjaHTDL<^`L`WRQ6RgJV:6T`LNR;PKGQlhl7_9c^<?
+K<Wi<@BJSg^=B8?V8om2X?WKXOTn4XE06mH;DPChfI<9Mh9\7o6[oHMCLb_57_GTG9af6l=N?3:k
+an^BL@H^GgV9`Ghbk;VOldh?V?PiE]][blIf3n9`KY]L^WGXQo7OIgSF_\Ceaf_6KS_eHlNDSL?^
+m8doLoSEdm_3YWfAbNBoe97YW9kSc\\_Mf:>^IIhHYP;OM]b^9<oNaQVN84hgM3HLDkNR>DfGRV^
+2K??Jb24k<4Ndo5V6Caaf>?=HWFooc9<dkMQ\ZnPl^k?=^9IaF7gSdlHE[A1G47NH_B=K:MRgGjK
+Ll?`fIL:dcllC^TKQDNOcQKQA>RkcmM6>m6TiiW@HNLSSB4o9lPAIe:l^ko3e<PMIX:ANOCXSfmE
+KRioS1hXa0C3]oP4UQ\gK8Gk]o@lO2\_7eIC]lgH]VK2claQk51KMam_@[iLLWPkX3Uh[d\kN\O;
+Zf=]E2K3n_]XHl<j]AYmJ_5glKDHVM_VKI[__IWoL:74jn>9NLLdRX<TgCR1Q_lVGi;88_Tb]b0M
+K^X;=@9O;kSVW0Kf`oAMX\mT`0e?h3fhJMn6G`g?m8UE1PogDhG5?b\`<L\?7Ok`\=^>PSillnWR
+6Gf2<gXlRC]lOdo6Jfc?6;Y7mijQ4UC;6Fk3B@7\RJ4oANQVB\\4Gk^RDTYW3m9ieY2QHeo5ZcR^
+EKS^5Lho[M7cKi[4?AnOnY:^n[OhLC787oHFRc__Ei`n8h[^7ej_hA8^llL7Xim5eM72Y7TP\6<I
+UJM[EW^HiEb6kn]V><Rc78\_9XjK;eN`Fld77<kb;EC`TE^KAgWb4\^lVZf]VDc?fcGkQ9eKibeh
+gCG4ieiGL_l<U_ghW^fE=n`@dooi7kaf^57k]ml9O2aS6@]RaiKMNQnXDnLN3ocB@0e?gSee_9>E
+MWc:A0gOSc?cWf`]59iLBf^l[TD^Lj]7d5e?3YnOBHMK\>oNm2^7cmZi9g2^_7d23d\G8fSJC^G?
+OMZQY:eXiR`Wo^6A7f:EUL<^D`ZW?MN;Lekn8?flJo665VghZAH7H=B4H_7]l:WRoGjLg`>gK0Ym
+73[l\[dK_SFkl^kl`P>EMb]QkUcfnmcfPQg[11\jiTO8DK<N9<d^E?JniXCMO__^kW@h0bU_gei@
+9NJ_87aoRbRUW=b;n_BFlnnM=_1Ueek1aVOkeB=dRfO75UZUCWF5CbLN3jPihMCWQE<Be@RmoOna
+f8Lbg0?F0NoV]?fn8m_mPm^23ePemLfo@\OGKA_eC^KO<Z2kB;3?jlk<kb^@iD;dZhNmm1kX?cBl
+dFg8J_j[@?ieQc^XnOg^^g5A5`PVIeL1k<^Xcc_LjE_\ja]^1VOBQYmkk4<53G6PH6:aC;Y@;PSP
+OJ:G;Vjh;M^l6no6IaMCKhlFXV61Z04_KejDIj^LO5OWeLU2CQf@[jmA[>WgSN;O<`LLVabXGmW]
+Qa[^Ml=m9:WCK33ML:MRe6jhKm^do76WOIk[_JGm_nLcQha52;Q;f1Jg[l;i]9_Gon^mTQ_>Aoo2
+nC3:o_:fDN3<>QQ]_hb2W_Tk2So;lUMm_L9_bfBOeCJc9_hFMcmRl[g[gEdSPO[;3AnOcIj\hkk<
+HAo?J0_W0j?\o_k\fFM^m3EaokmInk]H^g?>b4oM4mTIClc;oRW@PiSf^YJ@0WRO4m9D7K>m\d3k
+QlSk8liUP;7VfSfC`k[OgPfgNcJ=og?3oimo5O?cgklg?_>1TYW;i4m71?koBl?`DAoFBAbaA^oa
+FAXM7mQ\d;hR;f;OB?df8a;`RUT]LV`Zh>LSZoalaa[B<OgO17hnI1@K3Q15o7bJeLmG`P0Gf71K
+IO_l8eNU]m5cZN40IY@JC\4GQCYl>4Hk37K?HK4W\M`AOKAS=R615T^hHmB`AK5\]5L_3R\C9>?H
+g8e7MKPF<l6iC8EWm3llmThB7MB4acj=jhkakR^NL_Ra;43R[Zdlm3E211dDNl2Gc5Lbeo[MIg]\
+VUM:Nb9^[b:7[c7jmDCA_WNkEW\;23MHohX9QVBj_IK>kNA>d;iMPFMc1aeia>k3SnBhUo3[Hbmn
+]_lAjX3hoSCghK0oHo<Wjo2hjo1hBK3R1eVniRPlmVJLoYU_MXRDOo6J^E;YW@ani:ECUb^LMaL>
+NcBN[`ga^<gj1B<[fbRgkRLK9dc_5[=m@CmZXQg74cC>m4Q?V_cG:Oc?7QbK\g3>i;4of3T7Y]SF
+85?k[0>D=NSF8mD2IkQL^kPE>L[kOcGN3[_EIhPN\Fn`fR\:EOQf?b02HYikTf8^>9?ScOi3=aM<
+Ja?_nHH]YOW\`CI4R_Ec@[c`7l=;Q@i=4;baHgdTTkISn8I37^CkVRe6\fPKaVfod_9WVP`2V8e^
+3BYlXf6<^hn_gNYbZL5S3M03kf]E3mThk>4J3C>4bM0UeY@\ONh`n0MW^gb]L_?jFAWQ`kKL<7I;
+TSaLaj]ICVeXgbGbl:YDA1]joVRAf<S=5]OJLgOP\EGK:iA[?:UKg6Eoh^Dn42ccm7X9ScNndJ]4
+mhjWLhOk3d@ldg]c^QY6`UOAHchhW_KkQJ_5IWCkoJ;70aiZgC>agSFhgSWhkAVIkQbL]_7M_h?c
+_TD?1S;WX2:nlH>o=Z?k]7LACn`>mkUk\=ho<\[DafJo7Kh_CJW[7HKW7Y8?5KKMEOR^Q?mMQL]]
+UVf87^?a;]oGO:ff?<\kPoS8gFY[oVd=ooD_?Kng\6gLEc6neAGB9giAX>kE[OG;IaSolNjmg<Wc
+[oog[mm067?iP3ch6Mie;c0^ki_LO\1GBddm\RoUXB2US]MYOWefUPlaY`AYe6OCj0=YCZck_6[f
+YecKok2ERL<nYK>7NgW\O^o1KOo4KR2CM]Vl_<jRkKDOn7Zgn2d3@>S_o;cfO4bfLgfc1=gbPhWn
+6bb?:O8j]M=]O[3l:`LCbmX3;5n\d8?UCe2G`mg5A?n<>X6k5d>iOL>7n;W7?UR@j_h1R=h[kn:E
+?mBPS]FP]\Ufk?;]^1NO?D?eA`O3Y90Ain[FYORd[@Ia^Ji=3VKJ4?blG^ZEolKdo9dca13ibioL
+mX>PO>B\1\a;S>jEMc9[[`:oE^l4:Yo?NVo2:_KU31<g_6eef2\M^3If;lUG7MjV`;hUi:ok=cH6
+fjAj`o]GQoN;oX_bEiCS_Xnbl\eMDj2IBQB5_fn@H?f4a<^Vo2foY4gNUL<lj<_Ji6KekFl@4k?P
+mXZi1LQ\OlmUO_;\aabeLmR]PWh=df^IVbW3`Sl72mecMWRSM?o_e?eH@:MWWYR_g9>bUG]6?_J_
+@9g0f@ig]MNgQ=APOLX6N]LPM?g09OL7aXVG[ljjOI9=d0?m3CamM_Q0?cOhoo\kJPSOJm@abmA4
+booU>^kicZKIVSdL?ji3elTM5VV=MCLdc5@gIedoKl@349Q<6MW5U5fdEOT`VaL`IGZ1:N=9CQT@
+aIdbCN^DjCBWC;?W2QE\T5<6m1^WC:EXccOBG``jCHYfMK0gj<`2VJGXB@JMKA2SA9YD0J\<>UVc
+CMlk?AN?VKc2kXjmNDF[Q9]S10hgofnL]\<kO[0A?QHCa^QG9>_B76g0Q8<;cfUGaR]MTR5lh[@:
+RJnmXZ9OYZ;OCc`e2AF]JE@d^NGg?eohKn>\6i7OWajchlo>8X5GQTfMAbMM]:B<E4mTS]7eHN?E
+FkK]n1Bjl?`8`mYTSABRl>fffdo8fE7Bb0T0fVT5fcAl4bgUhM4?hmb?f:Soa`QgeS@Z6GIZPO`d
+RGne\j;?ZAAjTaG=@JlMFC;>I8J0_7cUXBU_<^QUWo=<T2DNS\gf^[9@L\7^]D\BYDNn5?nmYF2S
+2f4FealgB0X`mH]7MFcd7Ko^0`=?W^j=GGS1e`>gBij_dbh95WkcbifBIJhaYTSVPUnW5>h`OcID
+>7805gZaac^W7kRF:lRRVg=>kWWH7<\kNT7]^]dS?V:jLho_<RcC9g1mDYQ1?BeoR\?]7ilXW7Q3
+>?HC1l1;^enhMSnWGZ9cmM;?<h;cYG?iDUClo\X];_O9dS>R3\?1?S?P@OlA_K^ob@153gOdJ8m9
+6ci[7RIiX7PGGhO97;Y6RMk5inCUHSQSfh;a4L`aamk;Jg6FCAJ^]]lil=jFMI6>SflGhLKU<:Vo
+Oc`FXgZd6G]ViFoaMEPH5lBJiGLOGj?@QVimO>fFac66igPNNDfeZOJl@jQMXLMf7?k891nd:Z8H
+j;<ghK9FgCFXLic9>6_f1ao_1LPhImO7L;WS7NKbkQiGTd5]PgKS^c<k7FjG_\:>ll5b]]lgK0F7
+d`Ol`\N3<K[]WY4E85kg;;aKfWCWh;C<oaf\TJL;\nm@agH=KiZUJfWF]6kSeX6MSbOb6J7N^>lO
+?>lO?5KoKO5nS4amma11><8a;>Lf9Mc_G]BMQL_^VXG6;W2j`N31=En];M_bCXg;8kN][CWT:dKd
+F8b8[YG1cA=dKofZHcj7n1lG`[^YljookiloSW`PG\T7bJ<lRg_^ALCSN`fT=>ZEUKj?7[<``ioU
+d`ND6YG82O[VPAbGYlGN\n5ffZM[OMYT8`jOZ]enLlF6?kIMRioZO?M[K^9b1e<>j?UNYJhgkMFO
+D:o3UmRdhLoXd3k7J>b:ej=X`l?jm>k`gA_n7FWi8OJYcF7?HP17PN?^c3`lh:WNn@9GcJMdWWTm
+H7PNc^MESaO81S^>d9`WiK>`o`;O>SMOR[\gk\WQSkN2b?NmfaYljX8bLN\>ko`RG=X;VA?M^i0j
+`N`;>M^m?S1`cnO6FHTH9hi0a4a:a9aFRR`hn5>VbOlLE9XWN9O7kOOb<?n5gI0Wb:B>8O\<SKC[
+OZ10[cOl;Q5LBogLQPX62a1l^B3M@R46@=aeYP=n:[231Zcf38P1o?g_kk4KQkOIO:3S^_CCjZ<5
+M6?=k;D>eQm39@ed=VP7;?@h:Nj_VIMR1PkS41\RZPE8<kG0ccjTNgej0@h3BcEYC1Vd092Ud0:J
+2Bg@`P3_2ZCK46H`B9dkkhdaX`86EP\0:nUYYja>LUX57N]?59[W;YQPGIi7XJ9m6aik2T9:d1j9
+eSc0V8;5^]E;m;Scl9S9E=8ReM=7n56djL5DO\IR1;C_1XXIId27a9=312nhSf^Gh8HKB4j7`PEN
+4:=HkA<eH_@MDZg?ol=9afAndFYQQG29FgL[OVgUV_L3QSG85bE4^^TGcQn=DoddQKmNc7LQ4hoK
+_>gB^ndU=SAifR5H_0C_3bSMnf<NGe2<5b=1aQXE9>7KKKN1i4fIbXU`IKAWVhK5Dj=fC=6H;=32
+B;e;Yhk1I;ilLdn`g1Mn]AgcH?6KPUe[]BgLRP<dgKF=?l3X\dYlRE2S3Q9Td647\Y_heKQ_MX@Y
+=g7JgEHM[^OMnZYSe8ki6XDNhB5=\76J>]nCk5I3[GLl3fb_SQmk@X6FKg@TfoH29`oN_3ef1iWc
+f;=a:6fSHjdSGVPHOL:PQfUcQVSFj=;[ei_3iM]d^D3[f>WSC<ai^gf10BMWm1ScMMc5``?jkTQl
+mdk2VFMGkc_oQIMoNmkAnf2G7``[7j]`^;5iaciMdKQnRZJgJTnIgN]g]a3ZO>W3fJV;E8ZIZFTk
+FXbeY\TN[Ln9L<5[3=n^YXi68TjBMWRSAf=ZeSblH_S16Xd:lYa1lTDk72Ulj8I=1fma0kfUI1m]
+@YfjKLJffOGlkXS[kW@OGk_UiI:OG`i;TgAH\MV];YfX7Bm_<c5LlB>mO?HA0c1fgAeK>`b1Ogo?
+3DN7K3PUh;]f\=d=Aig_6V;=b7^8WaWARIeo7Cicd>aW_F?d>ONTmNEC=gYW[cW\J=H=cOZW[_Xi
+j?o0HnLgGm3`knPn1JlmRYb_M]P1SBLlbeAi`YUQda>6k_\ZgW68L;?KG[SC6DoMoeNLH?TGo>hK
+JY^4mm2`fD=gj\l?h`GKeg15^7<:n670f\aGAjd[4>_^T3>Ij`i97bYCekc3?nCl7f[3\Om>k_hQ
+NVk;@TN?5_e2S@oUDaoo\F3Kib<I3eHiT^UaeBLYUOhEoFKEFmPcI_@5<4jgH>mWPAL]O>\FK]hV
+oI>SljookgNoPd_hb8OPVC7^J?MZPLQk_7`nA`>iOIa3IB<OfIknG_=<O>CR6@gR6_WNo6\F[od;
+BokXaX7DKfC>5dT:7fRCI@fEnRe1\1a=\4a3R>8?DMIn3]nZOIoPH=C3KbML3mR^;NFkgI`O>Yg9
+=oAZQkPABT[d<iCD<om^n56GlJIMLInZRb=F>?TQa[GOcdCl?Mk<7Cj?[fAi1mLOL?EQS5jggijm
+^?a0gGm_l^GM^j^O5o;dkM<3e_nIOMfTMUkHVD3ZD5g2=LlhO6GFJ@=GGLg`[EWG1JFgQLTc[5OJ
+I[mbjG3eD;<^fA9jCmkBKhKl2Eo<e@OgKQ1Z5C;<g6;;QZgoRPboog7HQc7IYcAlT7]ik;k_`Vko
+X6INMR4>1keY`2a;Xkako2U:o[kkPPCmg_3K13?\\>OW]^]QEIh8?FmEoRe19mm5BEoSQ>LH1D7`
+3aJX6_ob7@4O`L73fnLSHj;nWXb9P?P0mN6XHjDOSISUL?01_3S^kH<mSagfPnO5?9Obobc@9d8h
+\N0?Laa5ZUE;WiX_5_bZU[K6eGcIHio?\=f4DZgT=mL6_ii[@N5NPKL]B3[Th8Kb;KB25>5k5>7N
+k?Q]U`SA]gIlG3KU;jc`N9B0cK`Jk]Hg^R76MjmgNmbMFfMW^<e5O\M5O\^_MER0VgM>[RHm6DeB
+?OT[NUmc^=^cf=lcCLc8XlE3cAe[`a_V=jX@7kM>T2kPK>9_Qof6[MfHnK8^=o02e`jlZdfn]go6
+9GQGM[P9nYfIA;JNjN1eU9fWHnO2G<9:XoK5k;`h0b0k?hTj>nmRBGTPk`3C[fXhiaPBo=cQO\Fb
+gM`jmOo_em7o_oklOFdN7NjSmlgMPVNN2F1_nlmj=AjUaUSdlY3;aCHfbkViIXjZNLm6^13_5Uf0
+M:<;G3=gfHBYj@8bPBhPKn@2@=JB2fPf^L21^HPLLkYEG8BCgWiimEc0L701@=eK53[ZP9I``KbA
+@\LJD<f9WS7Xb0=:`IYa0WD<>VDCAo3HPg6IA72SSDlg;f69C`MWgPEiTJif1LWDi=JoTd<2=kQ_
+9Ao9Y3m^aLkj;D;;;h5:W>hJ>W3h49m>cooAI>>`gR6[X>4gJM]^aJn[FNOjh9maH@h<N^IGc1n7
+Aoe\>27lhK`_LgBhe^eFgF\_hhFHTjK=adbOgbCXT:enWLLGlXIghlILL:E2Z6ie]mdSj0n7O=Qb
+H;_F:JA6O7ld:lNnR6NoaD^nIC_EVWe^g]T76\?=bfjLSj_WN^OJK0fgiRlB?GF=A`FKSddR4jM1
+Y1g<\?6`C]LmacLXLO8CYm]];M9jGZn_ACk]V0o<CcCN6>kKXIoe8[O=l7?GLBkagQbolc`>?gaS
+:Ak\1DFHS6m?gFWGiW6WhYLkAj<RSQdLH]N@j2UK[RR\4iiN?n`<5OaYl`;G^=VoBLUc]g\5BEKU
+l:oVJjB8_E>oaNC_8hJifKK^]oiV`^kKLc<A<fFKcdf3G8[AIEK03ceKaKQn;6JOhhERQ<Xin>fA
+Q9>[CAoFN6gT4TebC]ei>^bQ6^gBo9`@9mc7l>f@iSAPMhWJE8AcK=Xl?6?h:A^>3=k`;DBO\l>B
+a6]f21jfn3alBblMGjW526OK8`6Lf2Gh?]jfbl\V?eLRQ[^j]<:f?;g>\Z0>RcK0;72hAiNg]iG:
+kkG9d>aF[e<oY=aQ<?;CTK[?7]?XWY>odLbC;liT>kL]i7DMjMC;AcM_k5jSKe`^^i[kgX<l5^Vf
+2B3mP7G_iRj;MkZXRk9OQ:ak^[Z]kk1iBc=^ni`1GQ@J_?i5SaH6KeP[LI4o3HSRhA\n_ZXLO^bg
+35ok7CSe=72JAeNja@mendgZM^dkG0U@_L>J9?Dk;1GXnec=>Oajj?HO5_JndF]ZP2ikgWL>WkEe
+Sb;mOPG[fCQoRJVm07ElSeikYhfLRb6mgZ]cUK4en^DmN[EN^hCSV_HIGW5DnMkjGW\i5WG1c]8E
+ePoXOf7KWMQ0\5?bSo[e?OOVeXmB??n:=VlgP3cNPh_o?V37mWF2AfWD;]No?b7AkQ?AlnC<Y_Ao
+cSH]H;O>nl=_7Oj@;NlImn;`TEY]gga;Qe]Q[PTdog;kEh5S?\PH1X^l:]?lP6M>Vn>3JNC>M:MA
+m4:lHm6A`mcK4C;cZ`NYcZJZNG]WQiQBOOQlGc?LF?8So>MA3e;TE:J9MNSodWe?fE_jBiokCO]n
+X7Omh`>JUPmh]gNO8>4=c5mnSLWWi=iM>eN_kaSji6lJ;^PAH?n2>[W7i3o8N0ZCn\?lJ`<K_Lc`
+=oWE1OEFU<To>m7Qoo?_3OPg=o2[P=7O3mhhIl_m`2MMZ;o?kZ_IINk<<Q\2ULXAO6;4kgnPb\AT
+T8<7_9_CmW_cJ_LOg0iLMT6>465>1NI@;imB:7o2J^ng7aR`Sjn^_0l^P8n22jZ90ecV`mlik:EE
+?Xc@X`C]n3O_\Im4NGX5o=iQKb?mKWU?]g`e6;?^\<m>U?JQd<nSkWGg@7dajSKW4mBG=m`Anc@<
+7[YoB_230AhJhHhLm]4\G=Yl7KfN_WdeR307H^377@D`@g<Af[ZXkj`;OC^_2Y9m@NiFPFZDRAgT
+feRcP6_`1KYN<61_8O@\UnJ_77H3ZKmRZ<]R\`E`a;kK_EgfKSJh@ZQKEhMk]RJO1^ICOYgF?E<O
+=o943omRCnkn;m1YH?MgCQVIbMc6;50h_X3oIM]4@42JUae[AgQ3kVF7gmdolBSLTa_mCIe?g7h<
+A=3ASa_hfOTWHEjMT=<i3a9bM]j5WCoV2\iUFE4_ScX`?Hej?@C0aB>TW:0oJM`nH>5;A45O__ao
+o^;W]_cXTKQHW:BCoYNO>;c@N;YP:jZcanD>^e[<F]3XhI[>[CKefmBK`kTPKaJj05U75cSKS]D3
+e]<5h77X0T0fX`]X>S@2T\=3WFEI`81f0L3Tga5lDF@dH\^4jNb2TE<=j1JWOLJ@M\7l4FK>2B`0
+VeN=84T_Q5HSm:AXX`\Q2hOm6J=m2TX:aQjimK4J<MRQD?LgO23KhnKY^>GjSH;;YDnLmTZJ<?TB
+YHkGon4TYOa=e\XYPUCL^Voajb[G^QlXW06R3A8mm8\M1A^<BoedEX4<Hkh_NGRjMSL;L[^93djN
+>WInL_YlQh8WK_[TG=i0O?`G2FN5;AYPNE<CJ\>0hcHL:U:[@NeI`kn4N1cfb<9ajHMdY\4]jBDl
+do3\Po?=Y:@_3koLU_UlP`PUbZd^Fj=]>DAnjeZB2C<RUh`k:7;X0GdBjXc1NOUNEINBSRCYKjn]
+6>_i^[dE4jM;_ZM@YaR_RRC;M<S\7W:kC;ig6cTPgiO;Umh6mnFKF\>^_HRI8`mOog5kK2?_mRPM
+BOIY0Sh^:N0kZh3_]08nk_5PeYjgN`<5C]K`DHI\^BO\WO[]boS^9HJef;K^Moh=hg;OW__4T\L^
+cn6<dc9<[RaAIA0[7=^OhOBcG15>YPWDh3L;OY>ZN8AG5k\D<aLN\A<N\ATN<A\NXAmh1>a>;CbR
+1_hY?4:ml@P0MPDNPAk6d^JIdKRe6?3LgGKnOTK@Xd>jmka=2l<Rb:?>NaJaa^@mR<nHl7CT\A3?
+2bIZ2Z67XiI^\G3iY?9HhA?CmhFeh`hkU_53nl0k?m@l]_i3eN^[Am@JU754SoLlk7??d]h;m>K`
+km@6gZcm2Ym>KJ>o\N]Hh<\S[UPh7iWk_Gk3<mdho7B@0Gc76U[8^c_f79j8R_UTkI\l@mlnRgh]
+jhcBmccb3^^do0E6MH]NZWOhAaekTjd2hldDSfjNa>4oK=:moi2GHom5J1SjHKa^mb<F8H?m7_?a
+[Sc1agBJ7NCPlPdMKme;l;USV0iOLhI^=6EWZ1hcGTE\\>IEY;fkLim;NHH7LOZ<<9>6OjaKkmRY
+ni>VmJoo6`;k@8cJ0o9[Ji5HMH:jF5]4_9TW\1SdL0;^oPBE?Sbk=RcnX><7\ZA?B_HFc3bPf;F4
+1g:gW=bk5`=nn]4KoWjSl2MXWRk@Q6_`AaYan7><dP=65Z6jSn`8>cWnP:=QV`oHW0?hM7D<KmLB
+BM^SeAhejRfj^_F00eMWm1TKM_RCZcSP9jKf27FF1GG>oWf1?eMZn651S@OY]WN;>iFBOegC8oC\
+fAefg`io^ja1^^b=6S5nnSh=?khYo`8:_L:5W56>aK\@]FgP3oL_i1SO^\3;L>D;k<ci9Gb5jUg2
+KPki0P?eM\O\1AXB?\`Tcc_gAo1U?b8Dco0QgoUl=L_<B_g527EJQABYanlgFanZ3AgXGRkKKbUk
+NajODbNOFJ3Db^8MD_dIMW_OoD21OVohGB9hCiKdg?Hl3GLo2GZnOGdM7oA\bgOIck_5L_U[1Olm
+?e2>U<InebSmYIO?5o]Yo=mAicXkX7hHMA[o3mBC8gRMj0O^eFHQgZGaom2:4g_>PomW@Kh@`D<>
+nd?S7fDnSOnCnCCnGR9QPo27n;77?YmAFj>nomM2o^KJh=Mc:bCL6o1fQDR76]a`4_[AKfeh3a7L
+2a7l]R]4j5\k?RjKl[M<]^<bIQ[oFGbX4=i:hdB<gkdV^WLc1<nZhJoEl6Je`[CGM?JjNNOT9oNJ
+S<i`=bHFVMj_0G<Fh^nI9FI@^1^3H`;Oc0_PoG7[Q>P1cV8[SOlg]^IViYEcdOWN^WKPgFca^od[
+7Z5k\\=oRG3;7>i3hon<BW>ZX>4R=]P^H?XIMD[]aN]mha@:o1c2WCRfd=lfo?okcF2PjkLhMG1D
+SPOO[YfnBnEl?fWnokn[4EhUc4D_;kDJF7AAa[>cCQiJZH5IK<3W2SHn\\o6mmVU`M_^]_71imSh
+P:aThm=<;7QXlZe]bWfClK?P0NY^8QJlAJS[lSd:CN>_aH9O<NQ48g0Fo3V1<[;PEOCHlg2IRRj8
+`H;GQdmW1eDMmT:6W8@5;a?nPmjQZbmP`O\UR;B0R3[[[`P]^P@>LKXS2mhM?YeW`G?O\5E>1Cc2
+PWn21@lom2]IQ1Z;GO2KCH0BicgXP\OAG?3C1CQl9>j?>66WClh1]aL^^J?Ih8X5T[?PkNXaEhM9
+?WAId9e[6Pkgh]hO5N?ASn;I<MSc;]di5^MNV6lTiW5Ol\e^W:MK`1^3GVfi=Nc:c`QeeSKnb<Rc
+C7bAH6<>?7OX]0?ZRN7ONGbc@hbiL>iMeaj^jmWjf^=CSoXLRMi`g0ngL>RW?LY^>Oc\MKaRlKhl
+O_8ICQc_j0Qc7AQikX4hie=gg?6i=`an_<PQ6fLMlB;3j145>dbK<BAcaII2h3N7ajoILT7F\M>o
+5IWcM_^20Tg>i1L0?=hYnZImMb:nXlPih:oNKoh[g_7N0>`PV@^gg50hnMR4`h_=>oKYB\KeDc;m
+73<TDnH0:o:a>I>fe01>MC7:\48cJloaFFN>1]?>cjAEZYA_TMJS4?PWoH8gMRb>EZg3ZhBOY\FH
+H4@]67hT4=i7K]A\l3INQfoSYOaXjZI]UjEMMWdVjfI1Xo_J[BjGn_a22cAafJd]Rj8M7emcokD<
+AhK\j[VWIhISem^UMK:W1L8[Hl<dVA1`[eDm^>i6Xleg2b?Q?KO`iDQa=ZJL=A5Q3[ZAjmgjJ=V_
+`oE>KEjCOc\Ii]\[VcoD:ISn@jVFJO;e[aEZEk_5hLO]g?1oJZU64KJ\jACiK>7`Cel<dHVKkYd^
+8Alg[7^5den?gR]a]WbQ[g>@j?TR_<UK>gcmnL>QP8?MJmQ\NHHolfJ7OcU`B<]W=GZf>;Hkm7H=
+k3]SJgMh7jacQolQmO2?OHTQ9IeCJ^oRg8O8_:U3[2@SGgb@NRLVW_kdI_GaBT@;c8keHoNnU=OD
+lcim5J]YbEJAkYfNoB;`fQNejomd@WfCl4oej?nn7bomI>UlQK7Oo@kQHaci4?cgPJahl7GZEa\H
+]g>o80nW=PTM;dk>\`dRcK?6Uf_d;_]`n>7WK^7m9HL_Oc[_Em23`f=GRaLQKKk04Gd8cc<:egSM
+9eVW1mW:K@nUP1UiDHX?\I^Oj17R6lCi_[2@nG_;h@nF5ci@XViiQWVcVWIUjck1XT<`CmIXGcZk
+2?cji`N:5\ihX6VMhP>ngIWAOLZ7B=Tg?dSK<;X6_Ygoi>g[0K__dOYo=@kO?]k^oH>;GP^lLD5A
+`fhJD`Km@Z=eDBKV3C`E0McH8ee8N:I_X<=d@C=oS]T;6]OF?CoJg^Ub^nK=OdA\>;kReBkKVVHj
+4<V<7>1CPWcoHLHQ1RT\9<3>LO]mQkJZgRI\]P4?4VA>4O9XTT_S2]Oj=n9g7iEH1?5]P[S?H\o?
+MNOS\?LDJMhXoE^46aA`VE[H:[e\@PmSU:L8IHKHNba=a]\gn=1`I]Y^gn6nZ<m77B7mP7Yae>f2
+9ggX7YPMI<PO>>;2W]\5CgQNk73o5>5AoA196SW\8hehVTI\5ibjhMkJHFnaf^377_Ml5^dko_mK
+5oVMML6_ieE2]2o@kDZ@3C>bQG`K6bjha\0Wj`H5n[H^Cl^UnB^7gFSeFa4o@oR_KgSK>aaRM=Lk
+<f0=MFNW<1OBIaeP;ObWnCG=^bHo\lm<Q>4_i\WMod[_Mhb8cbXUbc\<;[21SondKA;d@6I\[Hf]
+]l>N4nEEc\df`goK^T7g\\?_kYlXD9iTfDem<U=]h?gSj>?P<=WiDnCG\G>kX<IhSifoT=OSJWif
+oQ;eNJkLTTi7ONn`ng3n0CoMnHUSm`:oW_KonkNnkOofXb>fa>ACQjf_okoo_H<eNUF_k8=7nbeJ
+D:916all:NR3glG0AaXJn4JZAjkHVL30QjdJ4lK01bAOf<17OO3nh8<W>J7XENL538[P0aH[CS]]
+iKB`0CeihM0mR\Gn0nI\>>a_V>`kI>WQ=>=Pd4N\JiA`a2R0X5V0IQ`nXCRFLdSDHBDjSiW@?5Z]
+X@>73bUJoef<`nT>5\fGN>g=^;FFKOPAXUWPQ`D6?LPKi^^@Ca]n3HoeL?>VGGLC7i`L>m_QgR5R
+Yce9kaT>Ve7o5PdDhGBk[OA>TH\AfW1k5QK^i=68F[_S=P7LH_W3=n\AYV_3<BMk]?bR1QakBhj_
+8a:GS7C00a:8V2MHacLk`YBKN:glhCXOXZlg8>hlK:o3X_D85kU]QYnQS_?ENk=]Aj^oAD]Gn>BJ
+fBfS7^>QScTOL@?KG:7Sfjc1:e=inm:lacB4SI_N;G;Sj24iMZI;JNMm2;mmB>lmAE22FfoT_M;a
+gYgg2Bkg2iJiDhS>HWg?U\]0jKk62big3WikA>4THM>7hMI44dhD5Q4cDE>52OkgC^6kQo18m4g=
+6Sf>F=ga`Uel7QjXeGXgiKSol3n=E27`:CKLfVD=K[NcGNkSJkNlG?;c2oZ0W[S\eYIEdXjMgj5J
+S1jU`aOXlJWQF1MR[B>5J^F1PiZ5L;EK_Dkmb7XkC;GN<h[F_MP\h\A8B@K7KAcUO9GY8[;S7eOT
+NCZ?>gbeeL:K2;BcWf_8Pi[PNLM@bB<>?dk;nnDm4W_KkA>i\;Ra6]il]n1lee3[UN:fn`JgoN;2
+GmRAPNcUcQ2kEDh4iNeg3Hig3YKkAZi]^MKd>cS]GMS]7oZg7MkcGo@H6=cM<]RgSnBiUo3O3Ijc
+<5>j^_NhGJ_kKUW\EPkKW>O`iFM]gWnjY?GGZeaK075=GSkW=c8n2W7GW^^c;_d[EO=_onm__`MX
+fO;OQg1[7lBh_J1hcN]n5=lj4C5?_^H<Ml_\0CKGW=4]fh=8mGk[\NOE[;ZUk]IW9mL[i86ZoRMP
+QSSLDl8LN5O7kOL8V?f3gHSE=^210\dZa0XBM5;=bnoZYWkk8D7jgN6g3>S>doMigOUHk7d5jWb=
+n[]0U`QQ<i>aCIm3T?^=1`]DBKalQaEmf5>^LKd3WdYlE6M<MkR[@OnJJn`kk3GZ6=PkOg\1@0?g
+K1o<lfba7gXneW>Rm]>0OGU1h>n?7?IAPe\JIHEPWP8OP]U]6jhnk[SWLnSNN_go[H_jc[[@]o>Z
+8=TGi6hEZ4JIf46nSAgNVjYnZl:64g[15PcH^gZl;9OVniDg_\FSlON4H;JndFg_L<CXgNk]\WNS
+E;abZaWcfIYl=keEhYoF?E>OfFLV8_;57Z?k_d1_ia1gCQTigV4XeQ^I?bJDNYGo\Vd:m22VB[af
+0mGcLfU=eK`\C[H?=ONb`no^WgPDk\V=oZIn4R@E@^gWj<Lc60A`L`H[SkX^?HfjE[3mhQ45i:cI
+Wc@FH8m7H;JjSl3hmX7lKOIcX3HUXdKC:gmGlb5g^fVVcgXeh>VfhfI\V[]Y@mRK2@H5b?mSH0<d
+M8><K3C8o]EW2EI^T<T5Plb]DZEBb03_8L5@?:i2iP\5\[bBH9bRP`_R<h@<j2l8nMAEEE<e7F9P
+_Y=`j?k2HFo5J3L1I5`h[7CQ<O4O1SeB9Efhk1fJCiA3Si0\o\193Em5Z1HcHKY<1FXnoE0TA[o1
+Og?NUOiE]6Ka<W`FPjjfXogG0@dOk0QO]>3CB@]GMmaK>gOZ]INbA=[f1B^h<5CCGJgCoX[A<g3n
+5@L:a@C1Q;1^H5UWe@Q?i7`JYoJa31n3aajAK`nKlOB0UImRW9Te30cd=0APo2O_6To8lZ4GQGUk
+ldd:bXk3:dEM]b7BjN9CQdikL>Ud_?j9GPPP3X_M4`8co8Cg>DM9n1OU>3jPLJI7VL8WWkSmQhEl
+h76?N>^3YU6^i@YJ>>V2_`cae7<kHUJ;g`1_S]Gj`_>KkJS25AXngAiVL_P<oJ<_J;hkL5R:lDKX
+f6fOO?=C1f\hYeN8a>?N]d]oYbT]_U4[LhBDPeL6;CSPojHA_GODJ;110g_dljPHk^4K3YF8gb=g
+V<bQDaNOGKjVASSKiFRGgfJ@ToJjGFiFcF3UWkC9T?_Jm459?[hOn?RT6kP@6@]nFOYDPko?3X=g
+2o?ikKG@`n;TNk0khjQiZjKe31JNXWdKbFmleSIQg2=Md^B9]RKL_gNM`gMo?KAe5JggFb^PlN><
+_WO4c]L=GjlZLSaQiY43mhcjLOQkflG9aHoAJmfdP1TFMM<CWToBmMKJQ_loO_bnnnJAeC<og;Wi
+87>JYA^:ig3@CiM1o_P^GOYEFc=l[KLJ0WAiUSf71afnTgY<o_5T^;oO9Pkg^Rl:k_X;fgJFck1:
+So_jOojoAjKdKYFdM]l7FN_@cELc_>mNX:TZc]6jGU03ojRRkk[Gj8L3nR3NRlo_`k`]@<VS752Z
+8jcjM39mP9kY2ch_Fb?hY<051_Cg::2D1a]@KVj?X16_:@17[c^lMWh>4=TFjN62C262b<SP_GRT
+0kmY3<WcMP9UCkQi=MVX<Mkm5UNPA4boYc2CGiHN@m^9XgIAgWEY9KAgfPL=^:500YIn<9XEm`mh
+=hRdUd[I^>GKLMCJfLWL\L6`:04[a<fM:o]O6WEO=e5][mkXo_f31o7aY]gQCV6=ZCNl`O9BQ[^9
+b>gHW[MCZ6ToAS_U_kY=eX640d;Vg`K;`;?lHB[WnBjFo[mmiTfH5kL^S7faMXF1<N3m2V5KFmdH
+cP?ebaJCof^nPEA0d^o`MUm7S:V0fZV\fk`QWCECKI?BA<`QV@@dg:\gNOi^>Ad@3SiJagfKHlhY
+>0K;7JoUc\aSXFWk>8Lk@]?C\0Y=O`TEF3M2oYV@cji:RP_N6EbPkoTDha_]:o>XK>DMTn6T2NX4
+1]9f5DWO:[A_5N8bBKchfE]Y11oE3aacNjFM^flodLO=o;B860gk@g`mg?o_Gbf^oh_V34N6Oj3M
+mokooiTHkF0KiIO:XoZMTDOL7CbPkS\On:VCaPg<c:>m_7G\XiG;QXL;N;61DDI>6VGo613Tj\01
+W=TXTdU66F0?=33:=8EAEX?5G^0eOnC_f_?9;j3\md2IWRnliMj[K[GZ;U\NiEN;;k]2]][HH\6\
+4dlRYcgg>lO6;V2RBeWUKA\:f=LFKQ8VPhigC:I2g7C;jo11>`jn8WG^NYhhK95J3mG6k55J[PgL
+>VA[8>b[1;0FkBino2a>Tb6iC[`J^7]]QYAkee`>ndT9>lSSa;\Oa3lC87>HK5g?1GRK;7^Go85K
+QG\Lk=f^4KU;3\i`o1H1k;?\=c;7jK3lFhR6flmHh7Kh6CQ<i>1m4eF_;G36b1dj4<TiLM^1a\T?
+IcPhkf2eVKT2CPPFN\2aVg^KI2iNN?o68NLB=U^LhnbVe@<;SSf@9^:ig>6KF\Som1kM7Vohmn_4
+hJ^nLR9VWg2SgXcnlAiYk3gg3GTTIkkM?MfDZd;`Goo?obL?OooM]U3=^n]>`7DOHZgC83[0m`fW
+@6bn:o3Z?R6?iabnhgZlVcFAn;42M]2a3`UDh=5P8g7_2R?WQidF1B0H=i\d836U`A?_;:dCD1Y8
+1VWPDiVX0O2?=]A`>XXkeMA\6cI4_kI`Dk0H0OHNPo>RW;Nj3Qndhn2[L>kP9R>f7]I2KiORLZeP
+=JI]RaV_\CE0_Pf82@f092U7]7\=3CM00nLXoBK^^1bEO`OAVilEj92Scl1Q8@O_VlSWgU0hC5`W
+\P7ZRM\=<[hN46o;b@]Qo=Zdfm[G37?a`]_=7BL5S;2ihYaV=j\NF73\f=Ya7E4PdldLo_R>F5Ye
+iO3k=Dg2K;coCZk=302iSaV03U2aMKLAcT07]jO0gK6`h8[fgd>X16lfA8T3GSJIl9gBh7>KLSlH
+9`g@E8M>7I86P5N@1YY36Qbh@FMa66ccQdioIhiY4bQDi7]9JkFh4ZW^?3;^gR]_]^`^FbhU2>k;
+;Y6^=[YH<>_44lUZcogF\M6=7;ECEPlmmA3;g81U;XQS3e@nAQ>noLC[>4V?QKo@l8DggG1UikYh
+eAAlcb92?K9i`hW?lNHBX>dFgFk3hb@99MAKo7Zfg6Fn7i@^F2iCkWd1oa`8K8AI]Lj3L9LJMbol
+8LN9G`EW=0QlM8kWo`h^F3lch8F7Kc8DbOYUi=Fn0l]TN9<V18JdfVfTOEJ>f652]EfgnDd`NSmf
+MU^PYnLnA1ZLHnR\<C_[W1nFJY@EK:P`KF;MN1ign:JG<gR8Ae_]7]]ao>Wj<K[=?]4VOAToIlL0
+:iZW?I<_=h?cJYGC5nHTJRaPXo^oofiKF1PfgA7h;X==O\EMdF;OiG3g^`@SL4HNeeTRO7]Xi9[_
+=;@OFQHJGJ7jkjhUYlF8R31OX`DT:BdhZ:\nCTL;Y08]D889\0D89ZccSY][Na1<0=64H9jbZ\Z]
+P`n`\UG1gEGQD6?LlUZlD8n3[lQa<UC3BHV^QeMckeQL]T7<A[E^=>TiWQPVD@=n2DJO`K974:Y_
+1FSfKC?HO;;QW\QS8>@@AXokC8JKeg<4gS;SkXDoHEOT7^?>4fZTbCCXlE\>:ckSHGXCNHj7iMm4
+3=_WA;SQO\R34[aODPX:GmV7Zkb5fgC:MR=<[`O1efIRJ>?D2=efm[G2FK[TKW>WbH0RJJhdYi1G
+kI0RhhjPPg8Nma?^JQKO4[KmFPd8^FlC;>iN;O6g\^d:\`0fU<]7l4VOoHXlI4b_J7M?;leJLbDB
+n_?o>jKonmmf1H3kgOH0kOL4Fcg5bNQnhJeTB0mhMCm@Aa?4MeV?_iZMm7^`f3lb;5RAiMfEA<d?
+=adJXTO`][J0A;D5]b`^H4iX2f1UN3:03V`;18E?Q1\`\2d0426WXJbG:o]Tc]GH9n^GCnHC?_T;
+=k=?;R6mUWc]\68ig[K9E108:H9DnW2Ka=23]FneaFFOES5kc;[g0oa[4;cQ`:bn@1ki0UW^2h[c
+dQN0:^L;J2mOX6mm0FC^TITNY>]h8WRP`W\7e4PlYe^lc]<Ko_POkCjOEaNNF3ZRJS<aHk_Q0DkD
+R2RDmWPN8MC@jZ\3_=1PWQ61g1aPA]E>AUV_W_GooCojL87iD]hgnOog6kgoG^2ZYc3TUL?W6iKQ
+Gmk3Gc>NY92NbbWnlA`72gOImn1`on1AXPJKOF]8klEW=R`>7n3U1V]0]UZ3P`bk7=aQhPWF@>8`
+C02ZCj[i^`86Y0H0O_i=e8M[b?BibGAH79;YTa5K3inX9ZmXQA]VHeYQV>OhJYTi317l\mQWT>H@
+GBNnIO?f[ZWF?X433gV\N7L@n1T\Lh`f[nL4_5FVgH]n`Jk4?AJlJhBkebKS`o4FOn8c7JKOb0fV
+lk1mCH8Gi\4m6:7kYJAM_`GeB1g\2KOUS=dVF=h>PJmIjAjG9^Rf\jlCc\XEMe\k3NA44F8<7_<R
+G^TSPOW@VcLHEo96ckI?6E`lhRB3Nbf3No<iYSk4TH_3?ii;43GhK6<H:N>;fSEk3Rhk\V;iKeoR
+oodO?88`O3FijU`6eb\Ig?\Oem`34Ikg8]cJ3c7]\3^>beoUI_XMN^g1X@SSlVhK`eM^8j^dl2d]
+`<_BPPOL>?>[72f0cj45@?I?X32A1KA0>mFN<TPF2VD0_;Y@eUfQC4l8IDdn99Be?k5@ER^Qk<5l
+Rc_b;GF0@Po>]fKQFhimD<SkkTO`c`7@HMRhW@O@RLON3GOPe^0M1mh]R[G[DX<g6Jm9S3g7AOXM
+_?6h:03^2=LQQ2ljO8^A:=b_8^Of7EP6h8dF9=_aa6d775lGX<oUi0Db7Qf`SD2P_?1HRB25cPK[
+>3M``W`3>VC8=D<X>gW3Oe^j2FF^9IBmA2P[G_Tm0iYT3AKeBIk>A1ViNBI@`jZ[iUoo9`=mDH_j
+k@kOlY;MJmin7l2D1cnnh_3N^`6Wk_=`OdRGlmR[FKW_b;4Oo3\48<`=89`38;RPWKLK;1a@h480
+FZ19M]72`UmB1Wja801?I]DBC8<h9]2`D2`;UkZ7IG7_97_KWUoRWTa`3ofc`3eM`ak\37\oRonP
+KQ?f`2iFH4oO\0N[`miY_Pj8<cd1Nn2a?k1G:FB1?<CN2gZ]8R_IT`S\XM5C\6MSPEIBKb_ZYYPE
+5ZP7oWb6NRHFJ2WeKYBdLKT:?]\lTR0Al^:734f=1K:FNcO40Wmh7120CEXR]GRBNi37g3_2dHkG
+=TPR\5AG997IPic6gT2@NE?gC\1]h173N7eBaSeH>?OnWfkOnBSL1]IaSG_JQSgH>oJnON1;ba[\
+PNf^`ik6H@lFT;doi5ZlZ0MkH3d2\JMcf8=5I>m^JmnFKV<890=kj;55k:TR00lYgc4jC0Rj7ma4
+?^C`9OWD4H2oU>oQ=eMOGb>OG90?[Ci:_YPX53h\:7c?1JB7bRLP=o18[n0[dJY>TNB3O2[OiEHL
+V]^0k05;UT^n6SEb3k:[NfMmlBOd??O0BPiccl@<HZekMgTHldmn\`O\c3?g]9321lg;2L[`>_Un
+]@7\ECJe@JT^J6=^Jg>WIGhC\hOL6lNN0Pc@cNamhWBQG@WH1[2\kMPcd05=[MjSl`hSTZ\7e_ZN
+NYIUd=_ZWB39_J\;e0?;7e0mlac@iEIAmF^=WD;DP3eYB=@8:85VMnnl0`8nF>:NP18TGTKg55VP
+jMVkfR0CI?I09bk9WRX;m3ikQaQIXY9Ea<Z2h<2bie=:3n@1:e[iY_IS1n`N<ZBWNj;;X1GLNnjf
+CnMJ^0MfjZQkh_E1AkQgV4e?7SOG^L16AWE?E@Td1W]7WELcA7cf`7Y^IDmE2C@8NjmjTJOGGZd1
+K6mImUC:1_i4_QOL:k5o04d5U_B]O9Y8Z87X8]oC2^lLCN8aC@GmW5Ln1A\Pf\3ge:I5YWf13jc0
+HOSH4T03`GNA>cdF7h8?[=ITn1PC@1o1MlLoBmmoJ83`PCOn39mX0^PWmniJndbe6>j1kEo]WW02
+j2[gSSFTHoZoB0OHW]c^jBQ_Pnibkj:]bXOI[1D2Bc;L?H4Fb6K`oHa4n_ZddP5FhcVCBD@A]9]k
+elaM=V5ZS0a\aGKge1=1ek5g]Qf[1jaW3bc4NOIDFJ3kf?_\DP78gNb1IIW?WVXRJ4?fcS1ji8ZM
+9P]HV?o\]H[YP]c8g[oj;6Ue=`4V0TmoH01k]l826ckXBOSn<B38eH4NN08O4S\2O4f23c`VO4nl
+\kA>@?S4HT8:EX0_TU`nl9gbOFiCkPOSi0?;TT6nDSVI`9;:Mm1P6Ajk`;3LQccN89o53B:ZAe;a
+0oDC^PMfk8=k8_I07B30gB<OAPa@PB3\HDHXh>bAZRD6R:4@mQM`C@Eh8mR@Y4<Yb<0:D4\310X0
+~21P12KjhD8Bhl3k44~27@P000L0~2A5I6;TA?@`d20A8S51Df=fR9V]\l1@HB4dC5mYKg@H88
+SZF:]Ra8\Ve16Wg[U^iLT67MTPE9e:YAUdFa5PF9dVYI^G?CF6n@<5gBC=U@@O2VFQH[b9T^HH8L
+DkkM_ZD;DVkI\6?APTaCofK[\VD;4Xkd;R>\dhI9gWF<W`gfPd@KIW_ClOJ`L>7:OB>l]UOhFUoW
+dPFcCW:]bWNKinffk9gY2Wjk7L^f;YWRONImSadkI]W;;5gP>ZbLiTd7jH=HUW;[UY6>>EkM;VMI
+5JnXjgZoKB=d_EgHjg[OCO?daJS_<lBjc?PMJaMNGHkBEWAm;feKo[Mecj9U2B9OAE_o]`fka\Qo
+\jcfUoH6JCN]G;YeTQ[FFXbnDWY87[0LfdHX2C;8e0LiYe_3bG_JWlIilEgM:^^BljiecA[:ZTY7
+BCK_G;IUlJHM0jkOTUVjgJK@1XMgfbfCm\_h?BL][SBCi[9OJ@[VSIN>eM=cDBmUEHm`hiZ^=H_S
+GA?7Ti7;VS5NbgZ<\H_=TjF^feI<mDb3]b9OFNXbbCYVCQW>nbe86F3G<_=?_1Md]:S=;S[Ye:LP
+LN:\VO=US:]ZG]<=djD:gfo=Z7Uc5N1oAmi1C4UI:bP\ghNRUM?TMJ\XO\ko>ZNT2S6n3NL;C;Ge
+`3FIl5eGCQQ?UffN84aoFEGIFRbKnhfVBR]GO`P^kG7VME5iOAcJ19G3m?_O<FGRK84DYN@beV79
+2;7n55nJUG50UVB69;hEg2nKA_LA[XjMcN@RUYTCVhL<YjkR?]1Mo2:klh8X_KV^]M^`^oS:knSi
+MNPLgVeN`9=dkWBKL<;\KlD0jFjbhLTDe]fLI\kYDTE9CKkOY^Wbm5a=FScQake>^n6\B5J;>NQ_
+\gRUkVCFcHWUcSRGMB>>^<<]iI]kh7=^V6V[397Oc9YncJIjdkV?MI?Y][o`:Zj=GBbKlY92SK7=
+YR7=VEXWKC5lE;QK>jRV:_e;AW^1WVILDgAj9173V72C]]KY]73RA]1^bVXYJ49W7JUGZaT6e1RB
+VhiITPiPR_lA_M^8CX9LhoCWF?icGUe@B[b>lH\WEC4hL?V6<eO4O\?U8LiVXc@kjlBaoSAUP_>M
+Am53b?DTCMEXTkGZ\FYFcHQcGV5XZ4`:dHbGlW9NXlTN^mLPNi\c<\FYI:Gi^3\P[g:M:O;YU6MI
+JSV]\\3G7@aGfFN6JDOddgAA2@<AIm_\Lb>eQJTR\o0D9XJ2Dh^]XmjfenOFWoh6OK5Vca74;1<5
+VXjZ[EHjS7T;oc?>^`g5Idme4T]0i6J3Z=hWY?0j@BjUmXL`a@b3;:Y\Sbe2?k7RDo1cd\J5;A1Q
+L2U4@K\aE^dVNUGgT9WkZ5[`dLXhI[Q]iDbWUE?V;1_WjKKSEILiNL[Vc[gA^SEfbBoGC3Z0T59S
+S2DPle3ZUnN\TI<<ZgPI[Nf[?]=^Af`ic>N\E=mSGD1Y:Wl72b4h_d9D:ODY4W]5gdeid:MFII[D
+JU2W@9=:IEXdZ5BW;\D4XNcGZAeUC9XPVaaiYk1c`ZQI=[DXhh;LKfYG@Flig:Zf?fKR;E=6R>D9
+^hK5[<8@_Hlf9XSR2G=66jdd]kPii]_GQ0I^cbf7DA24g1Y@B`<42P0000H0AXJ[5:Kbaj0g0`00
+[PT000L0~2BE=?;UA5F0d20A8S51Df=fR9V]\l1@HB4dC5mYKg^Kj5FmI]F[Lb@I:UJkJ]BkMQ
+fh;Tj[K\gK5_jkZUPkc7dVfXT2_L\7:n=aWbCKLWC91`Z3OJ^FWeU^eY4lCdfWjiHLnN;D_VNim5
+Tck8]eV^N<NRNMmcmiI`gUjmSX7O9KV23@XBi=R`L=?B3L\FQ?:nLkcAPSaS_nfF1AUfk1QZ>nla
+c_o4NBSQ^bjMllPbc]o;NJQSdlY9gfg=\Rf;Qcef1__kH@nEKUXfIaMhY`7n8\139I\fK5ViIL[Z
+>NBm1_T73C:lc4>Sl\n4Ma_Q\dQhi2;4Y^I6nbJl_17nHd4>0Dl>^E_X^IQ^]V76>`heIa7aI14e
+Pie3cG4NRYZQQe5cW8NRIW3593WH@dTbhYR`<`Ui<TWHH9<9>li32A]jVK3S?9B``CDCM[274SHb
+6L==_dk8TdkR04oVm`Wf2GSbRE3PT]5mWSP?ABQH<X6KG\i34@Yl<XVKO]Q3jIY0g1@17\YH2:O?
+9jb;:BoW76k?AA?N@YmPZh0WZi05E^Sca7TXI47SO7Xi3hD\L4RO8]Q36@XQm9j5?9TU7eQdb;Uc
+f<ZiKLcGnIjSZHMC_5V2?<:\X;NKlEU6E3e<N1iV;G3;P:ZEQgT7FlIC[Cc<FN2GhEAC3j<4^XbV
+VWLH8R>GLGb63L<E6LIBRND]mZdMI6[bDKo:hl]X:W8ICMES_?<aV0Zm3:Ij6O2l39S1\U@[3`=V
+J9AZiF7038jTVWZH82=0ZPW_=5fAJKX62oJF7T;Hd2SEdT<X6aa;=OL@dTHfPjW^ASagd`Ih<iKZ
+Kkcc=dB1JhIB[C`<D;1V9=G:`o0=_QU8=OD`EA>>J]iQ[T;HO;kIRgbSZ?1V5=G[N>Me\08;DJdl
+35K@3=G:`f053Z6JNYRl4B;_NLCc???0lX:Ea`g3FIC\Hg`SIANUMZZD@e=jCf\fFC^JF\4:Nh8D
+8kmSE2oK;Yao>Ua^[VHll[HdegOK=Z3i<>^JjagGZ7R?JL=n^c6ZaFb[n]WR_>:FI]lDY<\Ehi6k
+ag@=P[V=I84\cMQO>_MI0`o=aLSEOT=G_0FalLC_=<c3F4`?YB_O=@9@B`<42P0000H0jXB[50g0
+1OW7~3[`4000P0~2A5A6CBi>@Dd=0P4B8a@E=SMXRI[K?0D64Q=4aOJFmlVf5H\g9\b62XiW3N?j
+Q_6D@eg;VNibY?]L=]<egCC`aGdNDlIaKL>haV5Lic2^j[?TMIn?WC\6^BIKebfJi=Z\VN<bcG4^
+5TOAFXIa=KD2ig:bjaaBBaW7=@kSZ[ZNDd`M_hcS0RPmYkbNDekTaI8gfC79NA[TY0cTS;m<denV
+lBoS?9Ma\6\jlLGa_V5LEAO]_HheKIL^7N@j3G8VMbGWM:i<AJOYA9=dU6Vj>CD2D4\310X01P06
+00Yb[Q@TPd2@jBL0079^~21`0004AFARi@@E=Q2W\71Q\6^`a;0`T72`T;2@LF1`P61@H71PDf
+1aHG2`X620X;1@HE10HG1@X81@HE1PXU1PP760X72PP;1`\49@@U10X610DD1@Td1`HG2AX[o?cl
+no_k30\\2b`;?0\\:j`<0B8S51Df=fR9V]\l1@HB8aCUmYKgQK5nZg:]Wn0_UO^_nk`ek]oHjoN_
+kM\OQY7bLo>bl_iP8G[[mgYESk_nem;M^6YGhcW?L51_DG5bNc[\]_mce7ol\okhkEZFnoRENM^^
+^jkdeegh?`_cDg\JegT]ekgn_OIKMnPo>bngZ;RacfOm=nmOO_co4n6icZMiB\cWLeCWYb[fhb]G
+Xo;WmJIln\mb7OliBiFWNBm5aO7GD_V=Ne\NU[MNEokklIcoJCC^Hj7KSLZc?HgUg]HlnWgoi[=N
+SKl^fmaHi^d6fDG5\6mYfj_KDfIOej]L>^mXg\meU>K5YAolfTFcMGiS;`W__n`ncch_@;nXF>P<
+\YCg>UL7HbEOJo^a[5RMT^WnYOdjA>K85KCNlBFX5QG;[`oIj0m[TY?aHMMO;b<n0>]m`?Enkeg?
+oaO9\mfUlfVXk6JhX^:;n]oQBlnaj_nl7j^PZ;RX>0A3dIh6?HJOWY\N@gloS@CVOcLB[Z?jjmOZ
+gSEM[Z>ag@mfCekOMH?>a[hL^o9_c1_Z4oA8WmiCM_[;I_QQ:hj[dgB=mX=9S7Zi6GjB6d`b7Mk<
+_;blomenHcoFQNWG8QilOhgfK=\C;U9^GUifAXa@5MmV^>E>:bX^34E^S?a@a<Pbn4>3Wi<ORXcd
+o51TC`anKWhXLS=]3YGYLXRRhU1TIlPLVI4SNI;ULTBVbJ7lgQRB[lXifn6?54n\AS8Lg^QF0ngb
+CEJe8hB7i@P?G0bG`bBoc9<^MW0>>cOMiM1nPjG[3ULjB`jN8GVB[GS=EScVldZn@jTk`fAm3KiM
+hN[3HaSL=PLWnOXOUc\l^VR[oQ2naHi=CJHbi`cUPXYQLZQdTl?\Z]752j7I^5dQK<i6PfNK;:=l
+cD=TZ3I^Lk0i=VOMRLial`Rg^CP<f^F>[Y1`VH]mP7TV<CYWBB@R@o8@UPW>ik0LWf?6\D:7IkPd
+N9lWgNIPk0ZL`C>A^kX<b^JE?D:lABSPlPFg^DPDg>DRDGIZG>HBGNb8C;L65l?\=WQE?J;Thm65
+S_TEQ46\dA6BGnUHU[L?C]e5:1mcJYS>fJVQK1jI27NiA2l8A]iFQOB9cLgde\_eIgV2TK:iP[6f
+OS0:`E3dBJfZ_7Uk<hBPcE[[mGPe]LRH6^7JUQU7Vd<gZWWeR^1_O17Xi]>SN6UNAeiALONhiKF^
+Wn>kOR2SO^HA^;G5_Z7BWOeh?[i^WAUI=hda[cJEIWES]nmTd0PeX8E5=OkQF_LZnQ@ECg;BGHa8
+jeg_;H:E?^^JPo9`JVbR2_^`c4cFGeA<?hcl?Ql8o@W\aFDQgISG_mh=?CF?MclO27gMXdm1oOOC
+Z60f?1n`MA=m[LJTgd8]al;hK_LYXQc1FEe\L9[VQoF<X=36_ZW_dWkD\MB:oF0@31ZiZYeP40aZ
+]K`ooR6m]efaa6mbk_b:GVjOh]oRXUW?ALGegN@Onl:HGn^Bmg77<;Gn:OKk[JnjCJneZ=Q1KUfR
+mY73X9Q`cM5jXa>d8HGGJ9YXEHak[cFOGH[IK3iX1E72jMgkNNka_ZoPZbIA<6WGHlMnd3hZDTm]
+HHV4ammFOf8_IA8Skh_6h[icLj5njTG5=:ob^meUA>7:;oHgf4_lkQiOU8:5WV<^=f4nTZb[WC0H
+XC3lH_cJNRmOa[OFFkVZ5L@3De@\lB_kMXGD<FLlTTM8W0O>X:gCS?g8;=aI]iN1Kod5]iW]lF^5
+?kCO@gCjO@Mg;FgY_BBgmZf@4o=NcW]jPnL?^n2]c[`;Md5QoaY^GNhb7[oT_5;\Xn[g`D?cXCim
+7n42iZUYC[VZkL\[7:k0KP5n:CPEMg?DZ@B1ZglFBJ]h_7Y_[;iAaZbU12dRgEfKFf;1ikk:EnER
+B_=JVIKf4Pg_Ro3C2R;`@PW\6XnhGR6mdbHa\]>cPe7i2NlVL=XT=bLk65FN]A:a]5gU>bdm8d?W
+0OJRLaLEobo`=^MJa:J7Od9JCViF>\]WiWbO_mdJMe[i[FiB_]N>b5?=3eW8iV_93alno2Co^>=[
+4j^oQ2^IiAaiVQBOCBILO9Jne:DodfUFK_A<X]<@G>8_J]HFhnTTj:UMJ`]9W>dDLFcga3?F_9MB
+A8LU62Rl9ZOXCc1@N9G<T=in?b8GmcB33oS=Hj<QU@HSR?Z9a_[laYZo[_We=MZi7eFO7ha\JlA7
+c`cJMf:8FE1TSTZkB\of[dNhi=U:5TgfYMQJE0`FRejVcN0`Y\Sb_=b^HFek6:[@3DEjKVi^<<:c
+@VaChU2P:lR:kEj6X?n?^lYYQclY][_A4JEm_Hb>Zk^DJO:DB_LSHHdjl?TdhIX0j`>GIMkG?RQS
+UjL5lPIi2n]ZhLJbKn4:X]T`MEiW=UZ<K1c<bWTOeJFRJ]hR_<S6T[d9MfUQ]OD^ZGTCQgTbUUdG
+IU13ETM3QOe`F>Gmm9hnWV?82MFmk=9NhFl9CHQBfOlTQZjW@@lb>D:=<O7J5Tdf9AR]9^hgG3:G
+de8dNe>3DCWob2oUQd`iKIXHi;d25`8P]@7QU96:_0jYGhHdhZ@:Q3f8NPaX1k7BMAoH6moeMCaK
+>1e=VjBeC>[aZ:DiKlD5`Qg^eWPMkH2Di^=CNY8K;\WZ9]<h@RgfZVAY6MO:jTPa]ohMg[I5]H;G
+jTRfV3^cXjPJgRQCGXnRH\]7?MQdAbAfRgXT1DEhg[cO0mBFS\Fi<7hF_OMIafT3QcP@;lW9M@m]
+jL\<<nE8=NRcL`0BEZ;d>1S@5m=LL5:3PL?=LPJT9QRh>1Q45S75bYSQieL^QYLXLCVGeYMU0^;X
+92l?E9k2`B<lfom8C^6\iY]jAcc_2?OYjc;T]Oa4b;ob@bPo8Kmf:Mm?OI_T6TFn3[m^=1?OJ1LB
+\YdM1b><]iB?D9coc>4Q7S8beC2IbXJY_1Fk9d7QCXS6Lo`j8P[oO6a_QcLJXVfB7E6F69M7h_4=
+k7K:Jic?l=Nkb_A`_0j_aaLnI_DdJCn@WZNik^L\YDO\UGkSjm620MQ[LaSPlO>:5P`8YTh7nnSG
+2:_3Rc36N4_;Q]e\NXIiE@I]N6EkG0J]Ld4l9S<8ZL=T^]b7MV\=APh_mj5e;XS7^0lQM@BKMWi8
+@a[BO5MN8cKg4Uk1cO4];M620G5TV=>8M@RLN<LceCC[7@4MJn86h[EdMkSgLWh=;MGTBec[49L8
+=UNIa=aNV4ogF@j[eGe]j^7Sc0o4ZeVQ^:6mAZ=CPa<Y]SE6;<>?IVhEi[:Ho6P;WCC8YIVKgicT
+=g?bVmWicJclIVHd;@o7fCMXO^`AWDA7JnkkNCn7g[VIgfb8gAGiK0B4Kmf43W<\^E8a1ZgLh@\I
+?1L48d2_;]kVUnH=mfWO48ZFE[T:[`;W9b5JFPSm]K;m;8kWZ_f4\::[2>`WGYR@WiUIl>mc_CV^
+FNT5`@P1[WNQmYZ_:KD`XL3b182KC<bS04[kg9F6O[VLa?jaCEiSfb:5TECMBP\PBZ@ZGUJ<MajB
+iH9PQ78<d;;m\MPOnFFdR<1Q2W3V?`dOhCT;3h7P18GA44bJUaE>hKdT0aD[7H=Wi92VVYNG4^XW
+h8dTehL5ihAeNHm`Umg5^W`fOWn2?2oJ4\6gAiK6kf2m03?:UM3AX<LJ4db22Mc2>C?DF^YghBAj
+S9RIFC4eG8fIWQhcNVk<m>Pa9mWAHnIT>E`WjC4WVMTa<bWNBDa0iDU6c9aLVf\<VimSldjRIlJL
+L?b\V34POUJ6clm2nC5RI_?mK:JO@oL]WXbH<M9SQ\@TITifI\c\2ML[mVYM9eTaI1o>AoIDoBKj
+PSlW9m?^`GX]OjK`BDH^ni5T[oXi?B]VB>C4c<[6faWZ5l:_?g7<e^J3S^`IR1XnSd>@SZP0\S2b
+JT=fDnnSb^[>7X7:d?G>AG^WX1TBPSY`WeNCaiXUW;F:Vg`@Uh<NQ:]R=L=\E\Q@C=jHXDPIaGAh
+\[=SQV:DJo0c;Gj<V8ZVVVnI>gY<D^`a@c7Fn]4W<D>AVQ8c[6KChh=f@o4:oBbkkeb78SdeIRR6
+3WoXlEn7DciD\jBo`DlGnBVNKdi<C>b^9nU:kmS_AmOidGGnJo5c;Oih65?_BDVgn:U:SmL]M4mD
+7X=7LI:^m8aB]NmGj>MVaa@H92\b1\<41RWn6P`Y<4RmJFZ^b3e98L>H8[UfQBlG>_^Dbn8OPT14
+QN3WfhKWnb?ZJ`Qk2W<g1>i1RVl9WGnQA:kR_1l\A<g9i_8gXUF6>SMXS?f]bG4GEYkmNSFU?QII
+2o8A5WCQk20OF7aEh`GmM^4?0gA\=jXe@GJWEn>KOJIhNCjGZgB:PVPn[=T85`<Ua40G5BN4UIJK
+ma=YlhAK7LQ\1`n`[1Qo[DVaRm:I9QBTCGWJ1H;<3`m2`od60DSAg@6o2jMU9GL0YPTOFl:d1>JS
+H2\kH1lgmlK2e:45DPA6980\@ZIi?lWUR\9DUW]EOXT0jXi:kM`OA9@MW>Ck_^\9BgQQjm6MlWdT
+E06hKA2Z^mRDWAWC<i1o@`IH`IT?3SBVPNg_cOL18TZnUkeM@a9c[e8AGRZ0eFNeHDeKFgU3TR[2
+=WY?`kSQT0]ACKR^5FiRj?5QKclfm<Rfi?gfDco3iF?a?\8I0[RnHGd>FZ_7C\\B8]jNoGKST=hT
+[M2RX_Dn9<\=Q=nEHdUgjVmD=FD5[W[N2b=Q17N0HC:VZoOQ_ll?Oa[]Pm<Zi5j7amLJ\59aOnJ=
+2PXnhOWn6@hZZU>39fN;H[dfdNG]LMHdcR<dfC33hMQ=<XTC@_m<3>O<54Z?iY;jYgSl3097D`cn
+<<GQJ_DWZBRN0Ib>\S2Mf?USN4dWlQi1N:No:2j7HQA3kRIc2^`eN[K7=L?S6X?:mG3\mAgN699_
+KZkBEO=7ca2jYS3H\GT<gXWTVn=`CO4j]G[EGiL_nHO>5iFOZ_>:kJ75O`Eg^_Uo3Oh@gRf3MNkH
+hOIiG2kI;XoTCi7h`Y<gfjK9f>6J;SSen;Vi50iRSGm:k6YGOHEh>0aD9SX[UD?`3RlQl6Z:]6PE
+@OhCgAAa1S@bj36K549]^XV>UFZho2T44TfGcTBOAbN<B=DWGHEC8^BH>H`;:lYn@92:ji@f6OC<
+KB0MMRJCM_@LRf4A<8I`Y6T8D]Q3QZPND;@B9IB?D8S<ki?O34H7>Umo2<[:?VPTfOJbP3l>]_WO
+cDh[2En>Pg1oO6fPYE6i6`Vdf7ZiLD:\hXlS[Xb?;WAF64oZG6>0eCN0SnhKk9GeboYTcD<W:ARZ
+GK?S;;GPhMRZ<I9\UUQ2XUn07_E3Qb;Cn?F8SF7Tfn4MaRP0;bceZZ[1^DbI2RB\IHJK65LhY7hf
+0RGb:DGg2G[bSJ_Efe:h;ZXDANFc28o?`h__UEZ`WAf>aiOoLbj5VD`lB7i:S;hN6bJ8M0Rb?TZ;
+8OQ\i2GYX`X\SCHYA_T8=G5liK<F9J\0SFFe[kALKjjA>NMBLhg2]LOG82GB5FX`^Rc>ddVXiSb6
+`_T:RA2Rbm6^=Qbh52W1P?0KLAKTm1;SDRh>F?kRlUf>Z8aoKb0Z^2i5@U3WXeX5NQP\kjAKcaMM
+hC1MLFg^hMc\2a?2WV@Fl;5X2?h4L7R4[KLoZ]G]:EGFX:O2HU_2CVg`L^c1\F9a_aXGmm\I9hNB
+L86U[^__P6m2@C0274M;Ll17X4?:]\MScAJ[Egm258nRSbfO892EU@[nARFJ3XH]4@Qin:`LD[7[
+G6:hB<K3b\d7>lD4QUdLX47AIm><E2YL=5AZb;0L6J[;Qh8\[dR>^Pd^Y2aARSg:meK0LE[Q`9JL
+8W:W5I8KdGN5NlcW@K;Xh_22V4DeV_G638U3`K@]IdiNI8aM82R\IeUN<f98OI9]b9LQW]TLD4=E
+OhhN[aWH^\eNUbO3j8IaRn@Fd4KhZPGG1R8Ca]WURSP@REo04HZG`STT;Y6ORS?=5W<M?BFVNlOL
+d1bZaE>_clnf^VH0khV2Z]V_ek<BcRVY:Vf2aZ@Mad1M6;S=I><i:iO<9CS0Ad^[EH;AAoJdD<Ho
+_n;SfkiVl5Bm4ZTBZ]\Wl3B\G09_E`oYdF8FB_;JW;mLdVQY5oG7?SRHm`io0A:<iXW09T4:`6cX
+>ZaLid?j?QBgg:1=7flgJTN@cUZW[<R4:Sbe`<OZE?l1NQ@MdO7Dd4m]?TlFClbaXO76NTP^N6B:
+>R8eEh:AhISSe>]D[244?OUHa130Yh2XAN<9R`RXC\=Jn`k1Sh5W[<TUPNK2Xb1\BgR79@0T2PkR
+ZE=X@i0Z3Ji4[n>5_777>B4HhAL1^J5N?SE:\OWX7TU823Go09URGKE^gG62clG8]LT3OJ6j@m38
+59?K\=C:a9U<T7jjfSJ^Y5<CcYk>=[XmGHLP7m6XcSJg<3_GH@^21cdC<9Fj_CX\nVDoWW8[gklj
+je\KVi<@8\cI=eHO;R7Q2<2R`9B<`8iP^[93e\EmGM@1Z2nTo[4a\jK2l=[a>LDVefA865I<_bBk
+SFOFUh=]eYeKUddQ;4FCeAUL^B4jUcg0C@2P0^0Z0bc4Maj1RW5g4J34I5`@S;12jJ5Ei@@[FA?:
+`B2BcCWDO99;KZQRQe<l9]E2;gSS7LZfjFD@n19_RQh]F9mN6L33`[h8CjIGOTjV[0`1VQ5GEd_`
+<QQ5bb7@VAN]Q9:Yi?<bL_RT5G2ZT`A5BOcjia9d8AShURUC[8_Q^c<V;U^5`AF5onI0?Eh]hh<;
+1BNhM5dNLdX^He[m_WfnbY3Oa2U:bO]JQ;FJaUaU:4J_QHiFQAcKBnUl6^8PITP6FTAlJl8H2T`l
+2njE]@9Sj8:SIHG0Q>H8A69Uk[3BF0]QjFYTW5:;_R[Q4;D;\:gj6I^aH1:_hC9XPR^0gO6VT2U\
+UXc0cB]`ZIAOcJoX0M\CC:^No\`J2L47@3DmEh0h?E@0G>NSm[;Qb7gHM6iMFGF[f=A2^97c;SE9
+FEkY2n4XY694bmjDOQ5?07d:nD\W41QD\aB<cZMiWdikV`l=;Uh5iQn<BZEXJ@;2=4_2KNHi[OI8
+j4_2@XJPoUD77c52jL3nHJCTPb:IPfE;k8N0l7`KEc5PX6_:[UX9ga]b\:g[4<AJRmHBSKbD44c3
+B\<6;20QJ0IhVXLZ1@^<A_:kDYS3PJX3O7a\6j`V5T7^jY?6ZXl60Dn2WXP:mnYJPCY?j1M4Bb=5
+WI][`>dSnU`[i<eZ;<e9>2;JCBQ\1OaB:^XFdb`5Pgc8Jf?=WnA`1W^DP3`Q^3hAKX2Tee7K1JlP
+k?fnf;42AjQA3VF^J>f748\Rj5L@jHNIcM@5[LF;=K=>Km3CEXSOTO9l6T;in1maR112PL3Y>3DH
+;P1Dob__hC@?kFT2kAf2]\LB2X8NkTT8@S7HkeXPY^5L<_D44YN4kbhiM3<J`lC>o7dMWK<1Zh[H
+;;\_>5R1<`9j\jo59^b\@0R4nPi;241d@IFQF>:kC<DDNee38Pg\c9aV3d5nK:ndRW05DJ0GSeF@
+B:30m]PfFb@NhZ`AKS>J9]AlQ@XYH6PQPYlH?::e7QVgH7:3PH^0AAnW8>^J]Zh5USW8YKjVeD6>
+FFKC4=h2lE?c8hc6GR4Q4EISeAWA>]BWXe3TTh9Pi9C@I\NEb5Q\9DXHUOnmKO_6alOm1KR7[eL`
+dR^4dY4>PJ2:Y^ARK]cBUIQT@]2\O4XY3FO?kKZ\J0FgKhXIZLUY2<UbTIZi<SgXISd]jY2`J6Tn
+J>[>5g`:WL@X8?EHoi347875JT4`d0f^eKF7EIbJFW@][\PjbiBXAdZE`OSe=I;==M@db^@2\5JC
+4<mAkefi`hMW>h:J<<Z;Mj[ThAB12j\Q4EI^`KhIf@f9\48A8j_0g<96ne7cE1:Q9VhaJiTLO`Pb
+XNZ4ZG1okW]9BU[?dF>?J2MKf90@k61KhZl[UCn[_bIDVZRlNZ1K5oO02Z9SXHTWCae2B^Ym:69T
+1b>A[XSDL]2S<hVLLkBdD\UNo``6e^F\@XGK=W31=8]a?oD@VULE@3<42GY6bC897^dKNg_WTaRl
+8RgkR8e@dmcdY04<\NY6L2nnf28>@]Oo^GB=USJE^PBS43c^ZX^bRC6C3P7S:R]2>5aRhf6e;Loe
+\1fI6GUUC;fEO35<AJ5jDc_:Noe<`7I[hGFIUDh8]jYb<:bG9Eh<PkXl1OWeLReRRDFL8e:hBmTT
+d8?4Y7@N_;Z;mYRb`5aLAFS=mUe3@h6g5Ho6DgDDZbl8W0Qmn??4F38C2V4W02_:IJLGjFd^aWU>
+ESHDWad4:VP1@f<R^NZ@P=?De[MO1N4[NTCSC:kQ8HQgbFMhZFA7li6A=S;WDn7iX`7YlYBKZ\KN
+0>7kST2ZWe\BJok?^DhZ<oMHF2[gH>Bb>\\kGKeU5^::ad\[\iCIH2BZdQ0b832SS5Oa5<PZ3[cX
+fj?1L`Q1`IN3dbZ8S4b8QZgSh2M<W8>NUXaGZ0mIhKdTQ2X_eN9:OJU08T]mb]=LaFU8WG=5ii0B
+fl<^QP[FRf@d\T<XE>3VZVfPcXfcW5e4[>9k82ChW\;QfOM8Ccc<hBHS@M>1KLlf4bm>?U52L0PB
+GDQRVGQ\hF>:W?[SaO6FQ3\H1CdZSZ50Nb7c1><OdP0Kli11Sdk2iB@:h4=kL\TEJQ[]cMGPe7=G
+7i;L:EQCaWQH67k\M1ZQQ^b`]@@M0E\2gUi6Q3BT8CFbYk8KS1iTnm:bAD\C\1><H9f:O5mn3SnI
+V?bkEX^F]Vbc?8\BbcRJ[4KlF;7F=>gBje:\l]IE;XiSRPK:n3QTJ@PQU[4JCl=ZXQm<K=>2H>Al
+T;j7eQDG?UAH>ITaH9U0LeglQN>KgKU4MBP8YbM6U]Y`J9lW6I>`@`SKAdY]U6Ii<<YXdNa<70mB
+h8CZ37]X[;?J1>TU:4QT>0HC04n>i0S?NMGEf2ZQ9YAlX<A4ag2=DB0GfLZnSGf51XRgQNGoNfUh
+431:PjCC3PWaWYO<?iGAAfc^9I`5hn:T2Q61`hJkCROh5S:[`1;1c1PE`dj;4Fbgj:kTB9gPGG9b
+7NKh>ZRTQE:DU^JePWc`IVkM?L1G[T;I2;HPCLb6X@C<kF3MiBLX==bfX;VKA>M^X927h3_eR]3`
+Y0;d4aQQ\j@0:=UYSYF2H8BVG6fIR``UVI=90IaIa`>>5P?B2D\KikkbG=QVTM\;4D@XZ\TCGmoR
+j=5>:B6P@c0DPfW@<kXI[nB\kTQ`?AMVCDc<VHeQ9]NQlHHM>lnG]fUHl8L]BL4dGNI>@GE]=O\a
+J\gi>AMf39BkX7;`1j??KF1BF4mbVLUMkldIKeFL_G32I<H=YR92I;Bd`VK^E1Gh0QC4Q9nXABmn
+5ERQA:PlbHd6@<<\C6>jc4m7cXN98=3\EMR[_n[XhHeSicNQ]i@KRnHk_1olMDM\VBh[4=\Z6c\K
+RY@DAc627A>SC@9W6d?I>8<ll6bfI@G]EfmoS\fWn[LJWGfcL2mk;4]Z29WN4]k1B4[4e7RMi685
+E[^4d9@clNFc0ZcMmK8PVdg?R=0O1WOMkVGNM8S[<X=FFOFIWkON22_?e8;\cWn;_jB]=_8KSO`8
+[44Z48mCO^?JLh:fKT?G48@;S;16bb8d56TLR_BjdY1PQe;lE[513`A?CRcjYbo:=:l9GQfoXd>e
+[TB[U2Po_<h^W6AVi=N^l>E2VUN0<K<N;nPG?MHWWEQ?\5FA2D7LE;g1W69I3ifEcGYGF4lZngJ5
+U0iIf0?k?d`Sm@Y^SHI3RonWdKSm4JYYLBSBkk15[C@KUQHbao09`M9NbXLD5TXM3UgU4YDAbc3h
+T:0>=DM1oN@ooX?Onk`niNWe<BdKV@V9\2KVU^YL@lH?lb855ne;K<Zk7EZ_=@hmVPgU53I4jN`S
+iJ6jQlZXZ=Ii81l;5TO]8^>cbZOIX2T^[>Ukl8od4KoQhKX_?:`e6JWKDcMk5SZPem<A>WUo80N3
+4Ah6<>[5EmAGK8L@k6_S]gjO]dAH3\RaI5j6@IBOL89NbL2:2RJ<H1;oK0N7OikKeLK6J8Q4@90@
+o8W7NJn[^>?H:>dJBLoABPPP>Y?bKP;haK==AC=CcD2QDT1i8TA;lb;mA7R^dlUnneW1j:U_8?IY
+UM^=]8<cAe0`BVRN0YG0g[8VkOHlgOJIBUh6S0V0`_]`47Fm@W[_]L:j47D`[3XKRW@@V=TQ>]@Q
+m`_\D2jIPTfXe>9=P3PWZ2[20\S<E_APVnoXAOH9Nb9TJWh^iVg86>O<Mn@cQmLkR5QG8]cefoiR
+6K01XQ4f@eQQNOFURQ1\Q5nc<[@D\DZ=HlYZ[2li636PADi25Ui8V8[I:ABjQ4AVS098:GbF@DG:
+imTCcM@Ua=3DFb_fBekS`23aCbNi^H:RX=iQTb>6N43n=4MDSN5c7I6bd_?b<S=2]E6D5RHF8dR2
+468EbG61RQ01mHC4AB\SYIm9KRb;JmSJmaB5[kPGDgP2MMGVKSVf@2hjHLa3<Gjc<RJ`Fda6JYoZ
+>g6cfNl`a27\Cnf:aAeLI4<EQiFI:A^`@MU7_^B[]Lc:m[ToMBi_hT1l\RD0ghGR`MQ2LCUE3VYf
+TLcRO42kjk8EC^P]6X:3mH_H]D9dQKLFPC@]Z_MAGCab^hM9M5QDDfBHC[<hbaIo0UIhF244b8=`
+_:YA6c]JK5;hPYb4L>`2072Nn189I4KYW1MKoibCV@TM]7jC\:3GmJ[BBJ;FKkN;KPZQRhY]9F@;
+6kh4OlP7d32hY=dacLg;h[75Cdh>DPW7E=j[SQOj:oUEE10_0M@dj=Uf5io[a510M?nPRbn`?177
+Cd<=>GX>HK\fnB4_SWb4[1@4?OC99U=4?WB8XH`2L36GX@5HB8F0TCbIPKObA0g9HD^L\F[]F8J;
+e0Mg<D06Pk`f?^L6Xi[::Cn:<EiH>?6k1MifJmaY@JVeXE<6iTk4i0HS@2iKO12AkJnX;XM4F3UI
+6F@neX>6bWnF;dNKfWj_2CB[n@Eg4I37iGfT]OYVaGSiPb4KM<QmMAiKn`h6TBIIXHHmbGBQ\LVC
+6bXPRbd^h6O^EY=[<98O1R[@g[kLdN`QHjFd1\C_LB<\N29EFh;AGn9gE2SU4EWVDo<:106>BgdC
+>g6SAn`kO76c[FiB=7T@>CAQ8BaB_66182]7^2eARkbiNGVCW8aXN=6Fj=;iSEHHj`NCH?93I_7n
+7j]0F?`hSMTGQR9m53<D`mBHXDPMag@na`c5:2]V:;;OV0ACSioYlF?4=9]S5QF78XG]S`enkQSW
+ilH<ADJjaHmQlSen=^M?bC7i1So5i6LI_6o<D:Boe8oNCho>NIcSeShcEQe3\?YP58;M``jXMgd5
+PO63bkUL>[E:oDZROEC>3UgC5HlAWL:mgFeI\YHX?n9_k>GbS]d]gM:L<WIP\29WdTU>^V>[0ZMF
+j;SS<29?c2?Nc4D`6>dgLd<2lG\`2DQ9<=:PRNDY6H3X7PjOL14^PXm0LP1LQN]iLDR;jb@kfg=0
+6Zj:]7Xo]2@bbIZ8LY12]jekK]RjMJj7Q3^mZQj36T5WDG<F28KW43BC589Fi]SBK=L6[K[aKEYa
+NjN^;E<LmZH0[6XX@X6FP<Lh2Xg9bImTDoT2ShF<kXg2XHm7QchF7OY@Tjb<o4TVl8la<OPaT:nn
+;T9_V:=<WF^W5<D2<1`4P_\Pi;14jW\>2DNbP5WJaFG?QKcTI=E1:L^8DE?_0b4kOi:Ec]<kO4WZ
+TaQ<GHLBg`:Ng@HWL2:@`4nb\_AoM?W_l3<EMPb57@?J4c<;`Gd`:\>c<A;;=Sm4Y_G?=OP>[of?
+HOmSA3LoP6BI7l\b?d@<jhnOIc[l6?HoQ_g?b3DoPBX`J5bh`27AQUITC?;bL[:cn0bR1J;Vg?1l
+aZ@dD2\5hSDQ>d8mBKIgRk@?V@GkUJ1X:39ZH=3E0E=HG817o1iGEB0Dj\>F[4VXj[0RL<=00b\6
+PlQDmn1P;IW<1D5JP^MS\82HWT>P9HaFR4bDA2g\\iN3ZoY0c<W2=LGh9HN9XDTPAXhk_SJ9iYE8
+iI69GEnkn7fVN<nm\7HEQ<giJiM8Q9=`8WOe`EGgnaL1nK@W]B_\RGY20T<L3@ZLh:JeDRk7HGH9
+NHG]h\8l2nMi54Hl7X=18MR\6DWhl>7EDYb32l;>34KTXnc7[3i[hd9<Xg`ZZ90Y\6QYVI>LH0@Q
+C5Q8GhC95Qmih8V7=5RY?\];>e`b8\f>@1L2RgD4P018C63XooE45]OQ>ER18SNTLTWHfLJ=LCjj
+GN]8P7BaN`Z52Z<Q5QiVPKLPk2bm@fIcJ0;W@TP<]k2Ao:M0S^PLM`mDl;SoKAi2hI3dJ8PdR`=@
+=AXU8FPdKFmjGEW@X`]R3emcNFifmi:bX58NeO`@[ib5P2RRlo>:RP]S:G2G9aB9[n7UDCoQlio`
+57LmO7jMh__W_a4n?e:c5?HAJU5a23G2QoB7Gbc1eeIKGh7^nYEO:?U6;6dG6OVRh\II;bXnXGR_
+5meM_SNmOl8k:kce]EUD38T]lYlD5Coe^\@[oii0kcXgnIo;nf=2OIJ8cRC_^NlU6n8XglNIH0WO
+Z5CYEZleo19=Bb`[Yl2;;Vmld[a3jRb`@g2lCHkkh_SV>LM7VY]82`IRX3]lf64YX89fEMWgJSHf
+Na]UUQdn_d7a@nP8Z@Aln6jV?Y8\9Z62CRn_Qk8I[:5A>8OdNgj_[_K4m5BhoYj[aQ^=]N8nj^KE
+k7IHkIk;hKkAB\3jUNAN;miCW8kkAg[LGj]WaNd87`=T1ZkI8VWho48TS`_PA`Dm3IEio2?YA8O:
+UH:C>5Kec7m>k[eZCmMUUgUe^gZOH`fQYT?JXD^h>[CJECUN^6UC<B[g9MoV@S9VcMP>:nWkSDQ2
+fJDe_5mRE<N0oG[1MZDjMGROl4BW>226;^:mJ9aUC`AB;]f\bm]`C;^Ej;B2AfV4m`ld[6Jc`:`L
+cn@[Xg4`N\:WiHZd[Bi=]Y\OYXdC=UKR=8A2n^50ncoKUKX[lg=ToW<kAQ6H6dgUGbN0CSBJ\\M_
+a=LaO6@80GkA=lNVV>oeFD?jlFjk\n]a]Q>65oPDiN4hQF^RjJ]eeMb^f\iFOPbQ[efBPfnDPiHL
+D9HOl6nBPd4>1;GKHO4mAGTeC_7FAj12ETNSl:UcHQQ0eO8A5d5SIWH_=8N?FlV^:oQg5NYaN>7N
+]MUTN\5N?Tm`GSIWHYNRH0nE]9W;Tg]5NkBVhAF3ie?92H2=FEbKF;O@MeZ43RGh<SQ]\]a?WLe_
+ORkKY@5kW>Y4eQNZ1ngZM`5X1Ca5NjW?3D9;a0HRng[VIl448hNN:=M:O_dD\DcaEEkk[\B_D=ee
+ZU_<b^UcZEObVbO[FK=]J;1>JGR7FkN[D`U_d2JY_d1RhB=h>4FZ[Yh>a^fIgd<f`R_j^n23m^OK
+QU`DX3Gj^lkG;>8A]]Lla\kDYYfYBfFkKjFcWA7GF:DG[3F4<4bL[72GY8kf5BBC[]7d7Ef_D9Dj
+8]oS6[HFi`LkZ4mGohU6NdYl9>\=FKQ<e2KC834g1jY8Eknble^[VGbI=a[MT=HGWE6]fMXB]bmf
+UYRUSSmbal;>2ME65BS=3HIXel6aHU5<fY2f8;>D;KQ6@mG?o7[5kSB@351;0`@:~31P3gHJhD
+9G5bl@51~2T9P000L0~2A5I6;TEHA@l04P<T5CHW>3UZNdbMKQl91P4C=>GfU_NKJXDd?<2d03T2
+E7]@kNW[3042VIhYQ>6N6ck3\;<HmQS3KV?H]1ePTGTImU73SV[HF`fk\64o=^c<Q_gO\:<L<7b;
+HIlbk8>67M6`abd`_9eQgc?\hhKM^h5cGg1^`giSf7T<^i5QGc;\G8Hmc;2g6GHi`kiXf2\=^jIQ
+9cG\ZHHMe[3k6oH7L@f@`[1W6?HWMoVFHJlck7Z6oLn`AaYfBl>nJMQK3K^\HKlek<V6gMV`Ca_f
+L\>^K]SO3K^mH@lHHOP6`giQf1<=>jQQibQQN6c3KVkHYdhH_\^`RaUf>\>NImSm37^XHElek;26
+gMN`3a_fK<>NK]SW3O^nHF<[h@\<NhMQ?c7\;8IMak3o6?HZ`jiUf;l<^fD<LmV`Pa[ffQZ6ecG\
+_hHMfk071:PBHKMQWmaPn:Z9b`MV5cea_`@=GVg\bhmK_8Y;24?EC=B0m[l1e_@`CLH49We\1m9[
+CRO_VQd:h2HeVegPC>:B`YZaBNf9fGLECP2YZ7h`Nh:3YTj97m0o\E7ojcL^HSkjnLF5W@]Xm\E6
+2B9MS<lI9n3\>jROVd9Za^c4OBXG>12oBLD5XMR]C>aFQ0k>9_mi_ohI>XL=`Q\4_eDP`8Q9gLj]
+JmI\f[5YbkZU2e9Zd:HQX::9lLmHN<47Tk]dP;Vd>^IfCFHWKm@W]VX`=>n0<JG_>9k_`Kl=V9[P
+W2m?7J33ZnS1[JDY3G1?g:3a0?^]cflmJ@eX49Udc4GKVkU2Y67WXPEY]RiK]R4ODWgk5VCK\6kc
+PW@K]VgI^B4_;7EH\VGSePe;]bc8^GCUYWEka_RdN\]4AB>L2GbVm<E>4Hjoj?5gfh7lRm\Ub3Zj
+n87@Eek?bgoPMO7c?dZ2fo0d_cAa1L_[Rn;j0MhMV5hbP?^^\gnaEoe;XhlWoZV88OG:jC^SgDij
+h_\m8>gcCGn\6a0X@^1d4kRe_SUjN_40T\HU94gJYJ3=`XINCg>aCnLJW1oLbcW`:`iR]\6?BAL=
+`2BOg_no0nOGN`m5W3a?Y;@]Fm2N_^coo`JQJ`c\HoSo0nfh3lEMBOL?;Ed35En<O;6f\dN0o<3P
+4jL?Z_^o1oTfk?WoAkV3:ELoiD=c6ZePfMHbaV7lQWRDl_oHco[e86?]GSobWdoJ\KI\Bl^V]R:D
+7;?5EGgnG<3doZ2P1P275QSH8;NnASSHX[OR0k\TYfa@Chf\DWD4DYL\aN=B7T[F<9PkCHmGb17N
+n]]gP=?fe110Ua1cceDoef<Xh`\lCH4Uj;kB@?A@HOn3W9E7<1`n_>4EeVofOe\7L1IKmhc[d`9o
+0oZJHm>Kn1ek7iKFJ8?Pf^;RfU9db[IfaBX7CFLMP2J_bWo@\mX5lBm4aY;FocJ\8c8<ge8hB;=_
+1:_2nN5H]6G7[Z6\fh8\:eO^FkTQ6`jacWFNFiH\B;]Vig15Bd0=iKOI1P@gKWCND?\d_h7ajm^]
+mJgGmhLF=nQ96aXE8<WS1^5_10SX3?`go@eC7UL_QDCX@DK?X=\6gF6BNgYk]F7=B7[=i[_Kdc@n
+F_k6mA@lOg]9LoCZnCeKD=\?0:kd`6Ubh3\0WahhW@blid>C@`[9PMUg6UBodHjYL_c[3Sg\SVgX
+lEFG_1cEfSD0MoG3Z[jSgNU0OaU0<omO:iOFDYPW?^i8d?O[W[5AN:0noPf5VMVk=kVcZ\:jLXX_
+R\3AXihO=MYQgBkDc[0>iSAFdKbX`;Y;`:L7SSIHe`2e4jB[0PZ5Sgjo?^?b7SemOJc2Oi\SXQ4R
+B6MIUf`^ZT[SCfodGei4KUKFmRQ3bV[=J9K[LN;RN1gVDZ6ROkV?N:eHd4am8go3Bh:]JGaG9TKG
+g8_k;VMKf0bZ\;HgHDRjHh3lV<\_N6;k4MUgF_BohD]^<<3go92eWbUE6@gQ17Q@`3g9dT6lkB6N
+>\n7e_b=6cc`<<9Fh`G7c:Jl8CI_[oFf`JBZfS1a`mIKB=:3]@<HBiX5GA<G4;jZP;o`]o[P[0KI
+IL7eUIUjmU3>LGlOnWgY1@>4@Qge^RdI<@HZ79`MiN[ZGUoNSWo3f]Rd5hG0]T_4[EfSKP3TM54:
+d6iQcahMg6c5iSRN;bkZ;e\3I;LU6jLaO5\b[C5m`7h81eh1HY03dN?TiimbMOIiO7FLa6682ff?
+[?49_GfCPg\2k=\`=?X=ba:F6dRVO;]nSPQJ=D0KX@MfQ:kX74d04hbh<j0G]8[IXXCm:B61^m7m
+0=N7\7]oMZnXUAfALgbdQ0G_Gi7`::Q=IE6^gJ?Kh3=lehO?nN5S_NCll>7ihLl?Ogg5k`\;[WUm
+cO20oN`mGAI_6bG4kZ;TKM;;2bZJ1hSWn^8i_gR`n^91jh^WNRJe:f0Y1:c]QVFKUX`cZeP=lV86
+>Im=K3@fUK4j0O7K4]>cTaPH=]PN7`0d6`?L4boPIPmD9@M\e`\g6<0O?b<jFo4VR@U^TOEXO55]
+DKn6Ii[2\l=kMWW?[0Y[7>enPf5]d6K0Od4IfH1MU`=QkaomkGkRP1dPHK]T19WYM>f]bI8l>=hl
+AadLj=`9cUi`=H0Q`:oGh;_T^Ro@o;KQf7dd^5DBUN7\oOlF5KF:]1M5VZ1;XUJCX0@^<43@9;k1
+HJVnQUjaJ?T<BWJ2VCkPh?Z4P^\]0a0jk2Sen;ao3ILSW7033:_5=^9j1hfQMd32c747`8m[`Yje
+0GK^SBR11]`7k^]^L9<Ri\L=nQRIojMUG`o\;c;OGl2HcL990N5jC3jZGclPgj[9KmGBV4j`kSXf
+NlWo0A>4i1e\`ji7Ac;Q=9J@C0Q^[_V7<aZ0<cAP7iOTM2>@dd4SE9?[KiQCd?`0]<emGA;SS4?]
+gan7n[LbTJHZHYBBCf27=Mm:M\eH8h`XD4TUX_3Q5n^jXG21V=d03;MZ50C7>:cL\6=HfW91W1PJ
+E0\EI=hB>81F3XiV63f8kMi8LZhcn[?d62i]N`73AJ`cBRS@N_A1ahE=_eA068LGAQo=K_OMWNPJ
+4i^53Hh=ic\DYg:1jdO][ZoHYSgbm`27Rm]0OVKbPj`SodIX\oAhX4TGIhNN;WRj507W5cRWN\b[
+<d]NWk0eGOb[U5lOL?FZmaL_1aanP3N@H@Ol@62^6a6Dd[4fO?YHQhdgL]K@^VR^]Nil2Vk57]ZQ
+cHD68MZ\\c<DMjO;:Lla=aceG[nToL;oN@oNogkOndKl@8Ukj?@I1gO4mlK_SiLlnOiibIH7f<kF
+0Mh?OgWP]c8=L:;lROnF7fQlhSG^Ha>LSUjaN^WU5IJOE_ahQO?\7eOdf^mSjba>C?@LZmJ\Ro>E
+V3?_W5i7@XdMllkQM0T6WKCK\CD3bYUX`?DOP`IQG_;RHMQNUj3RL2CebD6dg@Rh9l;HCUGPbVOP
+:NR<k0[bLPIiTHob4^J6Ei0Gh6:j00TjPNCJn0DM0nQeN06fXai1PPSFZEVMDPf:EBM88[]SPieQ
+ckK\EYMTkJK]BS>YVDo@;]S<2]d[2<GBLd5TMSMd1LAS3]A^?]]LNiHPjBBH@F2OmPani5K_<ok5
+j=;[7RjK`RZbG6`NL\I2=O2N4cgM=3IoUb06G]=lc0UI_i^U8CKL=B^:8\[E92e3MO;bc9j;Nc;i
+1d6h[R9KDJ3=<6k>RaWJkO1o1dBHN5QoagPd9d;_[;FK3l9M@XCj=TeK4YAI;fKn43FP1A^3jYP:
+1SUSd[I`e8LCkfCKORTiW>dK6SbU?FA6ZVRN<V5CTnUi:n7?JK:3Q>VBYX]9`1T>4G=\bKiE5je:
+>DC3D>E`[S9d1n5Uc]495d<k_^9c2ZRaEKVKhDJ7U9RTS0JUC?R\CdYTR0KT@bIlDVJ;KnU3:Zcb
+ZZI<Jb3Eb]aKaMn60k8f6]1RWGkOQm@<`5?\i;6:\nJF4YK_4@V\\Il<l;O46kKZKAd<J>2fJDKK
+P1U\6c3[K@>VbPOK`1DR8F0dP8RWAdGh?7V16cDc7V1m;XUhc>fJ1BCk:1Y0:M40?RX7b3\GX1jZ
+h`4DJ9mB]J=7k^j778:2hJCOSjKFBFiM0c@n2GY\d9Ied0>1iX:PnbU1cea00n?>R1GJa?=A=^Ro
+G90m6>0L=X0JW::PM^H3VoDB[27BfQKNhbXHMJahV;1flaYbURa@O9@<E];F81i4P@XJWA[<g4Oc
+>1:b:f_MAZH=eabP]Yg:Y=4_OZLSU:j1\b^Nc0E]>VPcZ0e]2hRgl3Z^3F]R1YW<V5gcM`AkCjLC
+C21Y<M\4_KCG@6m3iai5K2QD[GF`?;L2GoF1`e_2:3[VgWFm=AID8mJe^0PZ6n7df0SW02<DIlJ?
+^Uk_@Mhn;GDWQVT6a\Ja0LJ@L:G`_PbKG^Bo:N\=?3XQ?>[CM_=CTkRR9=8P=VKAlFj1ZaYFMJiQ
+5O2kTg_[fF:a5?NoIRL2\AaDLe2c=FU1^`_V;:[oJ62SW9>\^?VPO@NbfjgAE<T3k]FnC[X;U76^
+MKIPbRDdSb2=^jacck[n_`?Xe`^kF9BMN6L5>1>GP3>aK]ZCh`2c`EFd=3dXXaMUMBRM7IVZj?2h
+7eAd7?:3VDJDVO]n0=7@M8>@COLR6niX`38:i?AKnDEDHQjl\[dQ0Nf=7m\Ko\?Nm3<`0k=0cOmH
+i5UWSCj]NoAVgBF^Ld_L_DF^V;Q6R3:G8SH9Gk8@2`WANaNQUU3aoXX=fUc>XoF9:jkFEUf=cB9@
+_bMicTkbU>Njf9EZDT2e9hA@kBKGADo=L;fX0m^oh8?;TFLeP17PH2`<i5STf]f`PIjf6H;?K^M3
+X7>jdabB9d2i;GWn_I^BlCIO6`794IWBmOaI:`B>ej3ZWO;UfSOZe?7fA=:NB=_Gedho1Sh4oR0L
+OP<LgSV`QC9jDC\YjXImCVUN6oe@nn]bVeiL`6K3[2PEV1k^oo@NR;i`gCE4ddJ0YX\62=X@<Pa3
+h0D1>_9V>9RdZHe<n]W8[6g:dcKj7cgeNVh3A^BLoSE1WX@HnS`CefF18Z0CX0R@4la[`_C=K[Sg
+_3nI;T>NV8H`ce3kK[Y^1C@C>Q7F2_J=ji[@2U@jR2cBMe`G1FaT?\0oUCn7bUNXjEicGN_0SC3c
+O2CPiTVI;TBNVHCbCT:i::7lM5d?I0HR1kQF?Y0WY7Z_E>nJj]eC_HnZMe@N\WXVD>[P@0oH5b0>
+_WmjAo]7fWM;nkiYgco]>jUmCkD?F3Ld9iRNe?iBmYNdkiOfWM>nPm[gD_^^^Zh>;H?dNZRX0E]:
+e0>8n]Eb;o9DOgM2;j5Kk>3a_:g3CemN@6SE4K9M>1o8dO^j_]WeRn_JjGcX59d?NH`1mOmoBQ09
+66EFXEiYN@7a0U<L0<E=X1f21hNb`D5\`IJfC5nJOoXYNLnhKPo<igA3C3X3E=XT1405[_E1U03d
+ln\f8Bc\4[Sh3Eb[PmDWAa<?2;ZH]Bn63RXih`L:PoK1;[AWH>_9o8I37Sf37R;Y2cX`ZMEknPUA
+7C`PCgb3L?CJZ_B]i=oGnDbDc6MRPS7iUX5eIg3B?<01:lW4e?ikOoXfBBnOS^Z]6X0NdOmHj8J_
+PBFjP6TlF9ZUC<m;KVnZ7GCWY8hkkA?b[H<LMC7TKV:N0Q@P]E7a7N8FF?=Ud5YUKmMP:>:X0SLb
+92Y`m:MPm`chaVaARC5Sci;Ag=5I<UY\n_F2dc^0Jmh0NL:_>j8]e14K43ISBcZbh==SbK@[VAno
+[PXXPbhaBbh^hEb@`9GQdjOl_oh\CoIe;e0=eK\3MDOB>E>Nm4@]KBS4mo@dBX1WlUAdPGV;bV>d
+Pf98R[\PP1:DA>R0Hn4a<4e_US]Jdb?EIl9IB2010kS4eA;\JS0X@YL:9C:Dge3j@n0AIdldGC7c
+ALHImfkLfS7ealHQmhklF[;YbIPY:jhDf=:lBnD`EL]dC=>]CJhhUN[4bM>TChY01@Z5?mAkDNI7
+MBM5_MAbdl9?jDJU>YEVEHYGjF?5[]DhEl5NCH8m7gK[f>MTQiZY423mOF:0TP5^1TPJH6^0\`7F
+1[P[]`KH700:nGN0j0761jP_g0L6I1R`@\Xjh8WCCOD7V:>A3S13gCBPeH1OVQe]@;D1g`JT6c3?
+9kDk0MP3;PkX>>3TP9P3MYX51d@Md7E0F^=fFngdQ`N`\2L?b:cIW`N<7_1j`>h1am7TV]em@8PB
+PaKL:U2TB?h@9b3SGY1a?lSh7fBBh<FPk:?f1mRa8LJQ>1d;d;oXlKP1m1TbkPDIoh><`O0o7^m_
+W27SGY3a?lRhGjNI<ig=9ChUoF@Y2QWgPXck@LKo89<0?kQOmJTNM`XImh:<om56Im6;lZ5?:36\
+d^l99a2[5f;e@jaoR;gQaK152EEiS@4aSQVok?M>ha6[5f;m@n`=9D84CKmo``W5g4\aoe?<oK[5
+;^S@Uo379`S_AGPo`_mm2i23ngF\cKeRkZFHobVFZ\o;=PSD4I_\0ah1P5gC8Qo@M43F0FD7^4T>
+0=Lmh?407_7V0J4enoB0e@=^3aPnh?V0kIYMW^b[B^`2AlPn@bJm8>=nT?4ob8C\`h?7>D3fGDdQ
+YLn@LBo8n1mTC?JoF]GO>4?6_B3SOi0afOoib@7\o2W?M4]Ab;PGI=`?<_h7VI1mg_nO>hF<Nd76
+ofRS\nQ5bChGKTgfSMRm4:\OH_e3K;;_V?gcTggfQ\^Fao__3AEc;lGlCc6coCFb\GdYERo5o4la
+\ogeTk9mH:c=mZeH_ACc?lERnmiGR^dKLJT>^=3DT5:M@2Jm8>=nT?4ob8C]`g^mU^[b0IKZ13;Y
+1AWoPhcIoSYAYCZ1C7Y1a_lPHkJoHf^YC^J=U>X4<^T56ON3S?m19VbOKijEjP@bj@DIoj>=cZ8G
+IO\lm3KK=f;g@ZanR?D?\MVnheNBjVSCSe;MR=d;\OhQ=]WgSKYTGh[EBc7oDlaT_jBBOF2\COJ]
+F;dDlco58__N6hW\6g6b3gP0ScjL0jPG;=_g_`431bB4nfKk]>N0Y0>Z6WOH0F_5^^l>4>\7JgIR
+_>o;I]eNOFg=oTgfaGP1Zo8nfCMTdP\bkPLIoh=<b;hoGb7k=7TLW83@IlRh5fCl3c8Vnc\:18dc
+I=`;<_h76I?mcRIT?j^=WB7SGY1a?lSh7fA2mYUN63;^1AWoXhg>PTc9OU`h31LBc_GS@\:YOZQ_
+fO]3OCbW8m@gH_M2[7n83OEm?4ioZ6o5jZFHobVFe=]=U^gd`@AmWNZ2SURm4>\OIihW[DKOR1]m
+`2<Z3PPiX>F0W32M64oC`oAkJC[AO;;@=dc7VTLgnZ[F[42P0baMT4T_b;POI?`?<S7jgVcdBI37
+AUoMf5kj31WgPXco@LI6On^2oHdcI=`;<_h76A_mcRI6?j^=WB7SGY1a?lSh7fARm9UN63;^1AWo
+Xhg>PTb=?_2G<oLK1;Sa>8=0R]E;<OmCc0J17a\4o=PPh<L60B^fdenW8dP7a]XPgH[EBc7oDbb\
+kaf?\;hA1nV02bd>Dj0WB6O8Y1MTg0lboPNIP7Ahk7EHGkEDK_X<6ON2S?m1aUSoo[kmSC=Tg0\b
+oPLIHog>9UPoZhfM8N=NT74ob?POI8;eVEhH<^h56OnSSLj2C;4nl3bOiD8d@T6@K\C^QESo41_Z
+>dP4T2k5jZFHobTFB7OlOB0M^>XPgHSM2k7nLNIino\HOB=^m07k?<3g0>n=__f`8``H<L1BS`c8
+XPYN<n0=e3YPdX1B0fiYM[81c@I<6i3=bWBi0N\6g1^Pk`47;2CYoXPTX\HcRLMjVGk;dUUcV;h`
+U^S<:=f]=O^fdMO8[6PQPDaj@LKm8>=oT0UJ21Z[1gd:6ON2S?m19QV<oQlQ7N^4Hm;;<OWWV?Yl
+6i_ho>^FPhD4<^T56ON3S?m19SjOfHDQhej@lCoJj2c8e>L3Kok@ij=P8N0f?Qm`U6nmOCj1C7Y1
+a_dPhgn@RLn71k_PlaEZU\lWT4T_b?POI>;c_GJ0cjN>JBo7i9mSj_=]K>;canU``>MCb:@GI=`?
+<_h7VOQlIQN6S7]1a_mXXk<PDil??54hWhnNN^WcSMRm4>\OH_]lKm[UljEH_ACc?lGbnMhJcNL3
+OiG6ia^aNb7F?lhl[nYUWfo4WBS0AojJO2lN4=TV]>JMOD:R4dj^fM=m_XYML:88I=8;<^h76On3
+C9`X^=nP:o\hD@@bj@DIoh><OOj3FohkDA@bj@DIoh><SOi5RI`XHZY>585<NT76oB3SOi29dNOC
+Ci`X0YWdPXcodDIWdH\jDH`TM::<f;d@ZamRoD=\[Nl]\KDnN_N^eSMRmd:\OhS=9`7NY8827>3f
+Y@93]3i39[dPhgj@lCo8A>_30`CDn\X4Z?@I<^h56On3S;Gn5;Gk6fO8^1MTo0lbe_[cCG@fJofo
+2UV:@\Jm8>=nT?4ob4C[LmIZg2UTg0\boTLKWDD_Z_Di@72]KlC^QESm4>\OHV]m=dVYmM53=kFn
+4K\GH_e3K:e_2m9Jgh[EBc7oDlaJ?b95486a=X9XaNZUV?lY5]UgP41TghRCOL25eWD]L8C\<fCB
+2c;^1aWoPdc8?_coOk:_h49nnP`Imh:<od76I?ojP?f=<fCL2c;n1aVCoM?R>i_9oP]];DDQhej@
+LCo8n1mT@_Hig6W^53;^1AWoXhg>XQLUncac=]TgH_M2[7j8m@nabKjCG27kj9F6I=n8g@^aoR4f
+fOO=VFjD5:^GH_jWV<WnVC?9?S3F9_]F[5j:nImRTGe_cTCfSCSI1e`XE3fCP40V_B3SOY3a?lR4
+k<>GabGk6[_@922@BBo8n1mTC?IgGMcO9:2@BBo8n1mTC?I7fF\BT0g]C082VOB2S?]1a_lP4k;?
+NFnJ10@bj@DIoj>=cZ8G9O\LICOI=f;g@ZanR?D?\LVnHaLSnnSPUVCOR=d;\OhQ=]Ug_]9TGh[E
+Bc7oDlaTok2;I1lHJi=m:eH_aOa?\LRnabhRndJLk0<^]3dJfBN@BBo8^1mTo0lb8O_`;D?9_WkF
+8o\4<^T56On3S<WnBjg9?X5<NT76ob1S\[oIE;9?dPHSn`@bj@DImh><od4VI9n[C2Ck13;Y1AWo
+Xhg>XQLUnobZ=mTgH_M2[7j8m@nabKj_[B?kj:FLI=n8g@^aoR4ffGNkiFAOR]E;<OmCc6CodHIT
+7aQ[Tgd[ERo5o4nab;i;7B;kAUb613cPVPk8:^Aj=R2kc0mEB3;C1TC26WOK0GW]A5Ac?O7V0JL7
+c9HC_EbcZi=m>Gj0k5?8Y1MTg0lboPNIT7ehW8iTGhEK^2:5S7]1a_lP4aWB5b<jePW7Y9MSl\la
+iOXV4QkPn]B0b_D9I=8;<^h76On3C;PnGo[1;PXImh:<om56Ik6;LWf^m9_[6k5k8EHoa?Z7f5cO
+ndY`OOCgCZi_a>j5F?l@Vn]Kg;Vn5:^GH_jWV;Wnf0Fi?S3Fi_YF[5j:nImRLGeW6lCeSCP44W2Q
+QU>h?X5<NT76oB3SOi09ehLW^<Ge]K0BebN@BBo8n1mT`_EM^`3GYhiY;lOTWf?:mEdS6]LWdDlh
+RT;6_B3SOY3a?lR4jo?XB5bO@2Jm8>=o]=5Ik:8@B>2?SR1m]=U3Y6o4kXEHoa0KjO_U3RaAR]E;
+<OmC;1[B=n?AT<0kiJ4QSMRm4>\OIijGm[3?=n820N01iBRj2iYlUaa`Dbkdd@5G1i`ML=L\M6H`
+U7\Kmo<1g`O47c2P@8D29`YXWZ=0S`9=2W@Yd:I07le^Q0`N5;P558Q09[dPhgj@lCo8a>Okdhgo
+?YmC[O;iNUe`01B8@RJm8>=oT;7?gjmdOn<<6ON2S?m1aTJo\hWAcfYSPBQTdP\bkPLIoh=<S3kC
+2d?6_B3SOkCAFI2YdDme3g^@kf[EoUBgHm;;<NWWV?acC4?POBo[3mUn_c<oEWma0?RGoJT0WafC
+GXk9?lODDD?lk[lO\Ti0a[dPhgn@2K9g`cGENBM>3F2M8N=NT74ob?POI88=jGfM^HQSd\\anNLJ
+co=<75>=2gS0=QcOi`Jd<m7=halh8:6:KQ>Ml_SDN23ofP5aOJkk3QR\fHUUM5nV0A3=Of\e<Eh0
+87n_L@fIm8:<nd76ob0CSN]oHnZc0>0^4==Wb;PGI?`?<]JhgL3k6fO8^1MTo0lbe[RMCCA^EQ\k
+@lJm8>=nT?4ob4CS<[d`I=`;<_i76id5VHXeh5Y8RcDlYj=H<f;g@ZaoR8d10?b=cl2G=K^ccbLj
+Og;=WSi0[;7K?jjoF6?8g0\bkPLIoh=<S;hkRCFBhc5m;bZhQCj5S7]1a_lPHj=O1K>oLHJ<Nd76
+ob1SXkl^>lO>Wc[E1cF5S7]1a_dPhgn@RM7W?M?Ml`W8^1MTo8lf>X]N547WkmdAM2=f;lCZQeSo
+45_[^lMS[HoNCj[eSMRm4>\OHV]mAajWmJEH_ACc?lGBn^J7FQnhc?L9a>Z5F?lhlkaR5kBn4AOY
+P0]]RJge2FCB2c;^1aWoPdbd?]c7Yo]:Jgd2VOB2S?m1aUYomI=JWd0V_B3SOi2ae_mT7gKjbMT;
+J7d:VOB2S?]1a_lP4jg?EJ_jVd;6_B3SOkCAFOBR8QghlSQ67idHdNPK\G\QeSo4=_[F0cCjDZaN
+R_VOHQUm_g]Wm87W_F?dSMRm4>\OIijg:;7A=n8R7G0QKW2L3PJj89=NT74ob?POI6;dgOe[OZ??
+Dj\KOOfWMOX<6ON2S?m1aTHo2K^oLHJ<Nd76ob1SXmoIa>QW]K4cI=`;<^h76On3C8`nd`]3a[dP
+hgnddEV@ZDSWLYU5^Q6k5f;e@jaoR2gBmDi<@5\]e?Y6k5j8m@na]Kk[M6@QY5Rm5?<oaM;j?RhV
+05=Mja^aNb7F?lhlKdhG[Fo4AC[P@SoC\hTD<^h56ON3S?m19U[OXJn843C25Zf_^=?410:Im8:<
+od76F_oSj682PDaj@LKo86>]gmU4jfNea@@:VOB2S?]1a_lP4jg?m<:@LBo8n1m]M1IT:]:1Nl@R
+7HdId^PK\G\QeSo4=_X>ETRTBk5j:NIoRVGd7NfKd@N^^]4gH_M2[7nL6HChAXG@6j<?^=3Dh0?2
+6gf6C7Y1a_dPhgn@RM5gDJ=?j[L`nSYeRcj5S7]1a_lPHj=ok?WnaQTbkPDIoh><SGiW4j>OeLK>
+T74_b;POI?`?<S7jC2l<6ON2S?oAAVM1YTHON:`OAQl]\=;X6k5k8MHoa3KjGY3:j4^aNRWVOhYU
+m?foV]47[[[A=f;g@ZaoW7UN`3E6ghPKOL0S31133VPi8:MKB8a?J`;T`1H8=mK\bD;O:\2_1n`N
+L5bcXa]mMHQDH:OAIlRT5fCL3c;n1iTHOFlfn^C\Bj>_a<A>Wb7SGY3a?lSHj0oN];maQXak@LKo
+86>SgmW4j6Ne\C=Tg0\bkPLIoh=<S3kC2d?6_B3SOkCAFI2Yd@MnoZeEB3gnIHW^oOOh5G<_aOa?
+<C_m5kIkQE:\GX[iWf9fn_\V303e@KUOam[L:nINR_VOHV5mobZ4mHdhB0ML:?P>9R21C7Y1a_dP
+hgn@2MKgIja?d^G2nT[m42dTT4T_b?POI8ce9of<5Q;8Y1MTo0lba_ZMCK1nEQ\]Y919;lRh7fCl
+3c;1nT`_31WgPXcodDIW@JIH7gR@hS0VV^<QB3MRmd:\OhP=mAd^1dRGH_EBc?lDRhXBS0T\>H`Y
+a>j5F?lhlkabNHbn4COjP0\mgf3d2FCB2c;^1aWoPdb<?Sa\9:>_i?N<?X5<NT76ob1SXooEKJ=?
+89=NT?4ob=SXMcHanUU]XdlQTej@LCo8n1mTH_BIGQPbkPDIoj>=cX9<SCk`6NF=?W[kX]4gH_M2
+[7n8KO@M:8_AUf;eD\co5<_X>g`jX`mLMJ=_a>j5F?lhlkahMHbn4COjP7dNh7^0mdKOO=PA1X`H
+H:U71VAA1JlIl0J8?@29GF[0;Le>=Z3I02AU=Rk:i@J\6j2:EK033US85_[SP9@3JQ[S0Df=>n^0
+\FBDgm:5[7UP=\Y^T9WQ@[OFk=]6Gf666Wd2VOB2S?]1a_lP4c`9M58;nQ@bkPDIoh=<<QSm\EHj
+ePW7Y9MSl\lamOTf=_7iIlkfn@@bj@DImh><od4V?YoIQB7SGY3a?m[X;<SDi`>?M=;WXg0Bh9oS
+:_]l0YWdPXck@LKo81>W47AI6Ym?89=NT?4ob=SWGi?__d6WT4T_b?POI6cd>i\Ho@\V733j53;Y
+1AWgPhco@BI6WnV58N=NT?4of^P\b=CX0fm@cBT4o<NP0hhB[jkA9i19;lRh7fCl3c9a2T7GAC7j
+13;Y1AWoPd`<^Z<o=>SD<NgUV?acC7fnSDeloT7[3CZ1C7Y1a_dPhgn@RLmWMV78^1MTo8lf>P\b
+mOW0ollc2P7o<NP0Y^cVkSOf6g1@KoRRgb0kFBRBe[QMo[lVgh\7A;HKe[bcgb1jHg;=W^kceFZE
+I>OgnHI<NT76oB3SOi29cgOfDCjOeX5fWnlMS`?@IlRh5fCl3c;fnI?7jFnL8N=NT?4ob=SXce[E
+fFcdMca^:@XImh:<nd76ob0CXll50W:WT74_b?POKG@F_JSAk`R7MHT=Sa6[5f;e@jaoR:ge7K\P
+0`ZMde7[6k5k8MHoa=KjkS>MQi9RmE;<oaA;jk]84Jd?G7F]KlC^QESo>?>lFf6e_Q7GnX0;mBZT
+m@UTdP\bkPLIoh=<]3hlnd:][omo]Cj1C7Y1a_lPHjfoHA^]Cb2CGY3a?lQHjfmOD^^CL;Ve?X5<
+NT76oB3SOi29e^NZeK@nPDaj@LKoJ:>cj4Fe?[MJ[OF=f;d@ZamRoD=\[Noh9KDnjV<2ad01doXn
+DD?[0eMMja^aNb7F?lhlkfYE[Fo4]CkP@QWb39SMf2hDI=8;<^h76On3C;BnRmZ595lk[Jl2M@?@
+IlRh5fCl3c;FnUMljVnL8N=NT?4ob5S[og3AfJce_gm\:@XImh:<nd76ob0C[LlMSg6WT74_b?PO
+KG@F_JSFiglfGHSM2k7j8MHoa=KjCYMCjj<5EVYm8gH_a?Z7f5[O1aI815:\GX[iWf9YONNoXOF1
+ZjkeSMRm4>\OIikGgjJ[_dd7O2R[`R:@LBo8^1mTo0lb\NW`7Tne_YK7]^T4<^T56On3S;En0\Df
+WD8V_B3SOi2aeSlP\4dW?ahD\>TD<^T56ON3S?m19UZOGjfdj@@bj@DIoj>=cZ8GeOZlbZH;\G\Q
+ESo4nXOHF]mCZfUme4D4G^>aCIMRmE;<oaA;jk_S4Jd?G7F]KlC^QESo>?>lZSIMEFdjh4?cQfUm
+0YWdPXck@LKo81>]3hldDn\[l6V]Cb2CGY3a?lQHjiofAN\Cb:@GI?`?<]KjVjCEnRAQNhV0@2Jm
+8>=nT?4ob4C[\dVceZN@BBo8n1m]M1JmZ=KWjZfe_Q6k5f;e@jaoR:ge?CjMeTM7:8U2k5j8m@na
+]KiCe=KjDZaNR_VOHVUm9gHcPBEf<hGH_A3[7fNNUgZ[eSORFQm`XGS_1Qb?XoD5VOB2S?]1a_lP
+4jg_2_6d?\g@E^\[;kOBIlRh5fCl3c;FnTofjFnL8N=NT?4ob5S[Yj8kVkEnb>@4I=`;<^h76On3
+C;@n:l[L6C;^1AWoXhg>XQOEn[`i\mHgH_M2[7j8m@na]KiG[M;jZ8OT4hSE2k7n8KKFMofTFUn:
+eD\aoe<\[No2;K@nL=Fe_Q6k5f;mhlccJ\kDnTILj`<^U5h0<O8h[Bo8Y1MTg0lboPNIJ7e7jJWe
+jJMjFUmg^IDn@lJm8>=oT;7FGnmMOn<<6ON2S?m1aU[oY9o>IZgoaV=;DLRh5fCL3c;n1iUXOOjI
+SS^5S7]1a_mXXk?XAKDnkb^]mHgH_A2[7f;m@fb]khXA]ChJ=:gF=f;g@ZaoR:gekG=[OBUF;lGl
+Ck6d_T><d?[0EMOjA^aNR?F?<loCNKFn4MOjP0_ekf9UDlRh5fCL3c;n1iT8844G1nE:53;^1AWo
+PhbeoX`UoT\453;Y1AWoPhbeoU@92dP4]<eN=i=09[dPhgj@lCo8a8BT\`ZHT0@bk@DIoj>=cZ8G
+5D02L^mh;a0ZP0Cl\d4>[DlPTej@LCo8n1mT8X04OCYCja?8Y1MTo0lbe_ZkQ=3j13;Y1AWoPhbe
+oYkI]3j9dEK[4lRT5fCL3c;n1iUXOBjEB>\Cb:@GI?b?=SZ;GU@02LSN0`B@P:?>7U9004TQTej@
+LCo8n1mT8X04oObC2D<Qhej@lCo8F>\_W^Jo09929[dPhgn@\MJo>e`10BA=_=EB53;^1AWgPhco
+@BIJWfm=hThQhej@lCoJj2ajD@4T80<M4402SYY:HA78^1MTg0lboPNI2211=iJej@@bj@DIoh><
+]OhHkDe80YWdPXco@LIJomBI=Ydl3VkC2FCB2c;^1aWoPdbd?_o_I]<9I=8;<_i76ie5;bZ016C7
+fA81:X04o7?X7Je?89=NT74ob?POI2:018ffEN\Cb:@GI?`?<]KjTM@B0H5<NT76ob1S[KocAZe?
+\XCFnP@bj@DImh><od4VFYoO9]?j13;Y1AWoXhg>XQLE@0;bmG6]S`XP0GM;>J3V025id`5I1nS<
+LHfk[mE7>f_fj06W1k`NL5_[nkSFaf9\mHo]eoZ6C7Y1a_dPhgn@RMKgab?m]Ci77ZoeUC`>O@XI
+mh:<od76F[nCL[maQXak@LKo86>]Od10k?ACl[P5\3=Tg0\bkPLIoh=<]3h_SnM_2QWgPXcodDIW
+dH]ZOIIOja^aNb5F?lCjQmQJgcTNB@ADiUofN=aoVElame;<oaBcf>o9aKhDZiMRoZMH2lCn0F0O
+M07H?f312L?^IMQJo`3fidF6]1B;j`<^]?\oebN@BBo8^1mTo0lbhOZPla]cO@:Im8:<od76G7nW
+7?fi?XE<NT76ob1S[[m5Q`9LWli_M83[DlRT5fCL3c;n1iU`OJkO@>MAb;PGI?b?=SZ;GYC[0c9F
+lOeL7o2Oi`6n1gS?mLfEAaPPPhRYB_h\`>0e0mh<23@00KKDP5^JWFa0\`7C1V@Snbhg`=G_3MS7
+]<a5[cSP8mY7SFOkaiX4OS_09;QG\`?SOH]1Iak0m[OFk=]LGnE>5`20MA85VOB2S?]1a_lP4jk_
+d4hRlDT;L7eW74FO@\Jm8>=oT4T6[_mX0lLjhISdLTcn>JIDglHVE7o]0PL`cI1a;lRh7fCl3c:Q
+n\`^31WgPXcodDIW@JID?bTLAPX9IoY98N54?m3gX7]j8EYcYUiXa>j5F?l@6nNkFC<IDH[EBc7o
+Dbbmd<nJjHG0dicA2hgH_A3[7fNN]cVcGVS4OCkP@\=N70QI`LXDI=8;<^h76On3C7bn?o]l4VfF
+cmOCPPGX<fCL2c;n1iWhO4oKk5PW79=NS\ToamCWfmS4P7@[Ae78^1MTg0lboPNIn7aV5hJ<Nd76
+ofRS\b1CW`nlmAROSlJe48GH_A3[7f;kO0O_hO>UF;dDlco5l_V>5<oW0enBanLK\G\QeSo>?6og
+HIm_a7dnh48Yno\=0YWdPXck@LKo81>O3glla^M[a3Ro@B2CGY3a?lS4io]5M[m17M=NS\ToamCW
+fmS4ionIaVl@b:@GI=`?<_h7VOQlIQN6S7]1a_mXXk<PDil?_4LXWhl^oNScSMRm4>\OH_]lYncS
+ljEH_ACc?lGbnKhEc^L3ka;7ia^aNb7F?lhlkoASWfo4OCkP@Z^[ng`2VOB2S?]1a_lP4il?_cC3
+ib]C<Im?89=NT?4ob<CWnfMmWdlMdej>bCo7e>OKf<CW?i;3ia?8Y1MTg0lboPNIn7aV5hJ<Nd76
+ofRS\b1CW`nlmc6OSei<jO>=f;d@jamRngaO:NGcYERm5?<oaO;iGWO=i`>o^lKW6k5k8MHocSa_
+DFFOKlBi9<03]Pd`^Ll=J4LVnMn0P@<BXTWf@=6N0i8>Z6[LH@N\II=lM`2KM;1V9ak@64jb1hYZ
+o]_WRg6OCb2CGY1a?lSh7fCRln5FFYl_>MHnWd8V_B3SOi2acmoaN7oS31WgPXco@LI6_k>93^Dh
+UZ:@LBo8^1mT[4<I<Q]mYQN6S7]1a_mXXk<PDj<?G?KnAQlk4Hfn4K\GH_e3K229n`=9g1m8h_i0
+4Q]mbK:=?XST1Uf8g@^aoW7VNC\<^WHHM<1hP@57fKek`;PL91A3Y[dPhgj@lCo8a>PkH0PBRZIJ
+IO@5YjE?8N=NT?4ob=SX=e?g=lj@LBo8n1mTK?@kVaSm[3IfQXak@LKm8>=oT8WAIgYQb;PGI?b?
+=SX;<RFQ^4Qa4\Z8g@^anR7F?lCFnVjD@>^S4b=ZOB=f;lCjQmQJgdN:J7dYERo5o4na];kO_M?j
+`5GGnTK\GXSeSc??bg]7ja]a[@lF=l3P09D3W0j@>l3b0=g5@Ph`H8:Y3kPa8<V0;KkP=P<LX0L=
+Z3CPe81LV[e\`3>C3[fWmZgBmE0]m<H18NFnSFliH>J0W0=nnWd_eNbXB]eK1bSeI`NdeNbiFUl4
+^06d?XE<NT76oB3SOi29e\N^m10FF>h9I=`;<_h76E?maS5Tg0\boPLIDogHlBO\63;^1AWgPhco
+@BIDWkUSb;PGI?b?=SZ;>n7XH0<h^WFnF1O4=So[Q;_lUXN`W72?gg;2HM1fn62PVmQId5I16`G]
+4gk9lnaQa00Q0l@<45@E1nPZUoZ3[LK30Bk[Pfl7>1kP>SghO83kF\<G^?L7JfiVGF;`KFKM<f2A
+IX^=Wm`\[aX@blib[`6TNTc?P\Jcn3INhl<dmoQ;3UQYdGeC:kCV@aEJNgSX7RnK`njHm79<nSTV
+oaaCMX2C_hPlLDaj>BKo71=bj9\h9[dLTgn>2CMdCShi9hi9;lNTWf?bcc65Q]:_TThLTej>bCoG
+N9IdJPb0Gc@<T55XFQWf370d`59Yh;@2ZI`j@><0V@>D=PK73]0k@?80e@>43m1N\o<[1Dh`X8;;
+>Z25<A[DNkQ=Eg6:MY_c32ST5?e8:]Y^WVDESJUjiW76oLi9]UCDAe^`iSNUXXl>V3[PZh=UcAf\
+2HbQ8>R4H^jUV?\YiWn:MD0F?]d82ncl8^N\V7\YiWn:6ABjI\GLBc7oDlb@D3Mod\f:^IMRkZNH
+obTF?_ImUFmFc;dDlcoAM1Hi\^o3k=;oVR_VGXZiWf;nYiQO:1HR<?C;X;=RkZFHobUVD>RJ5G<_
+aOa?<N=2gOa==b_VGXZiWf;nYeRjf?Me_UTame;<odCCNIII\@0n32U]6V1ZP:lX=S>USeU\WbH7
+cjJa_Ia[NSaGh_e4S1N@CB<aG`22JO6?0DGHYZ<<^3:Pbh0a0li0O<nQn?j3lHd`AQY`bKPk3APe
+8=F0E`=Z3MRUfL465:?iSXKcgDfca`5l@=1<^<07_0I]0@iRSX3KW3=7EZaNR[VOH_jWV<ga@7=4
+X;=RkZFHobUVLnbJ5G<_aOa?<I]SgOa9=b_VGXZiWf;nYeSVb;iI<OMBc?m4deWWc17`cG;Vb8[E
+Bc7gDlco5;?CQT9WaMa;<OmCc>KH=B_VGX[iWf8fak[iTfiFc;dDLco5o4nac95m\f;^YISoRJJc
+bYTSh?oV23RC22?1l;ZS9WB\WK51EWfjoF;R1BL2S4e`>W[6dPL:7fEC7Vdhh4030OWAR8Bk:Hlb
+<9\<;A1PBh0@Af_bHIN8dmN0>;N4R3aoUjaYef`N<W57aTD53Si>D3alS`hojWIFX;`4mKZ[7CoR
+F3\MCn9HH\JhOackAm`BKGZ44Sa^P`8M@WF8?Z>2h@\[V?k6=7b1JKN[L?Wn`L@=HQeloV?PhiH1
+0^JOLnk0goooGjE=ANPG\`O\i:>?MF]F[EjoM_ehl3U^j03DOOe0g<P1I]fjoR0^dg]VlYWK]\cg
+ScI5@1ilhG2j7d<EQ1L2Ya_A<G2C>ce214SG`9>WT;VgIcalYHLn?gPma<@>=^B9?GC8RG]8TC<6
+1^lCI`8OYObX2o1A;S:_3W3E1ZL^dh]]]H^g:>A;:UPBI4V?aB^4fIBTlD<moD83CdlgiNkg0M6[
+N?4M=GXIW;fohSd\Icej835fWNQ`T<XMO@g[1`Y4Od1LJC?agjGRP`[@fR1jW027[Ylo?3JIK8n]
+41dOGdm@9WWkl@W2Q1:dHeE<O3RDhM4MmURQc67Yj=4?@9kTPneijY@[T>11aM1Y6cRj1Kg0SB=9
+dZaYlbK>W3Ygl^cYlfMMZGGMdTgK]Rc8\W;U_YD;4R38\7B8MmU@PI\6O]Q0VElnf0Oa053_iJ6<
+CeoKof;j=QdC5M2V>XSo7^A;hOR2LQl`^d6n29`k_RP1W9BCCPJ3g^SLEl:Gfc2@2ke0^@MgfWCe
+X`fk0N[dM;3WcURkcN9g5MXTo]NPcLE?2O:OC`X::f_kaLPGJel<Ok7nnn6QBUe\o?khaMPG7e^^
+NZeH1dhO67eieLGY5jjW2gKQM\ii5Mj?OWojh61OR=5N:<eIXMnG5VRaOSSnaO4Gkb=mkAdBH?CX
+dJN_M;kaneb20ie?o5ho>_CXdY_FEMlik`=n1?<5ecO\m0oKMGVGe_?dco\?3_mQSDMG7afkN?g;
+UVU`obgKfoMaQenfi8;lDH;X5:DaikP_WZk<2N=:hDh?^Mle5NJO6TSLdJWFLPLZ=i1MQSVmWFbi
+l`A3Dl:]4aL<iE^NB;AFCQ10=FebLL5Af;i8>\bddcD:;Vdk_0DdjLGGRO]XOZD5jeLJ27o^b@:Z
+\m;e8Dd>^><VEb2QhnihSnSU4Va1_13X2lRiKg7M4BklGgLkNZH2Uj>?7f1Xd326iR[J_\_@gUGP
+C^eb=bcOI:QG=_3?Bd=L0_eMPg8AkTAFMETFYZW8oEoQQkZc3i2d[Wn`Sick1Ia^Slj2O[7caMmj
+Zk;M@MVV=5:4d^iadK@_f[K8mf1aXNK\RJ[bmEbaN3M0_M0QZ<jJ:UBXocd\7aW[N:E9jcYNW7fH
+ER0kN]XEFMn0:1OP=1@FCOPZXJ<6jbJ@7:dk41d>>5Kl`o<?BgFOHA[e3F7[7G:H6=C_M910;9OR
+3ZCl[T<icHW9YS<cOg9OdHdMGmninYd=iEiPMX=gKhQgW5COOA4DLKQ5U_1Fha9IIn1Kkd8HUlQb
+195_VfoAHKZIRGiU]]Im@;J8MJ8YNJ8Y6N[UJRfV9d[jA4mgNBIOTCLhO95@?_Pm@[XI5mg>kX;Y
+PCIH\LP<O[\54g6KUGfa3N?iVb`EC;5kXVO3IfYka9Dn>I5M[Fc_^OYTZECh<6RM:g3V?jPOK?iQ
+m7O1m81^gnUScdJGKAdN707EZL6R3NVQUg`8@;4\V0mCn2il\C;96_iPl@lG1Qo>[m7IkX`PdYdP
+JmF:TL]\inS\M^IgjV1Ij`a^Ej3RH>=81KJ=:bhPb<FSX6M@k`PEFK;E^l65bOl>c<FJ3hbo<[SL
+RD2>U^Skm7Gb7Da_07=NUca`EJ:Fda`1d2RVF=Dg>7_F9SAjB]jTlH;ol=hnm87iSbY6iQGB`mT2
+5:G^he<NIFGBUi]2N]KbGMOUn7Cm1j1N77dUM;TAQH3]Y^TjG8V<Z89fYGGQcOejQ2_aMLXfEhcj
+7ni6<Dg8_N8BI[]>IVafiPZCiEY]M]=e1NXT9QKf94W4EM]Da;lZF3>jL0E0^h5JTbMS\IH\cch`
+^enj\Jn@\\F[a?dZ=7PEEi:6^]RX@B@Tcj7kRmi1M<PSo0O^o\39OeGZi9RgaoHg_7]odbB2iMoL
+h^Fk:VL`=CkHSmOk7I8eJ0AIZeeoD<==n`2hQd8ecHEZcd@e1DeWZ9[U4D5TlR]1aLo\_4cPleSo
+ID\n=TREbeDnFfk:34Pd`M`@>Yk?Gkg<BMBBE35fVOmSILK[m3CPl0Nn]7C`9Q46l9:1L`CPA^iG
+2JY``Qom2e<77SX`B>3nUMNUYk\P=DGaXJG4M^6VMPA9PaAB8X]2G8AJg][T`X:[aNNkK;Q]>8No
+bA7MOZlKJ=\\7nScCmD>B6bC[f0_Z5WgEkc7A_>l`Lb=iSehN02Jik1KZ]YX9hbMd>E>:Q[;kc8h
+W^?LPh>=4oBO_2ikol5Q_o@?g>E:SRhgL3ng_\\1b4m0S]]EMI]Sooc[bVLoHnFJM`8<GklPH4\Q
+JZ12=7e@4J5:n`A=R:Dk@38l`AD<6h:f;oQ<JKKfn:`V0OMLBOM0\KN\Fm3XdJCSTBPkBKY4C?^>
+P=O[13aLhEbDmhD3Q5lgiQBA[E:Q5<^`KQdhO>_4jE^nf75d>Ej9AlDgMeYWIl<m@VWJmAf]nl>4
+k9PNa=>dg0G7GcSNh5aXc7jK`=8ZUk[oigG]:gQOO?Ce^W13fTCb6n_E^65O6fj6OiFb[ekM^2SM
+eHbVGOH2hi59Nfh7IGbEYOmT<HKmi5HYbUVEK8SPL@F^:JTXafkPf1TL>h9SMh1O\BF[P]IcgK6_
+^OZjIA4oD?O\JbPC4iWg\9j^a1kFdfgH8jSY@S`fjFj68DiBRV@XBH1JQ=JZ0Xc6MeWnj9Ed>3f6
+Gg^;ik3D@ci0df@PB8iYag0\Cc\2YOG<maRQkU:`Xa<NRde`Q[\i:9l@P3n:k88gnCo3`o411mJo
+7QcFb4cY;RVOWhVj1mAd@mP2oaM@][ZV:i0fCl1mH@1e`\IEH@ShiChAfN=fc80mS5DjWG9aQoZ9
+H8mk?0=NWO5bnl81gOc`VLjf@1bg;gFf]gGETZO8^:W5a4daS=`e@<maH8?V?JSi3e8IjaUiARm@
+R=6gL<:3]@=HV@F^[?anOUf;]CN^M7d^hIZWoH>iP6_MKmn9CLD=J=Xe7;T:\cbCUR^NRd5D=>6d
+dPH2H`gf:C=M_2X3Plj0Y^E2`::HdHc:l@L@U2CKk_QjMnm`@fobL5>49Y2VF:^1emWS;\?>b84X
+`<TDj^<M1nlW<8WCmY5=HE^3YQ7@PJk3<dCOZbXdBK`_`f5iD3A1_@jTC^NPQl4UfRoVEgCWXnoQ
+m=2VlhaQJiS]o^5UoB<9o:?Co;\96On@XCg0?aWEZXLJUV5dAi3kM5L:^XmJ75M0=>a7[eV7lDFQ
+Sch:@9lRN[SoNGcaQT=i=^2TdI=IGX62N8Rm;Ng[Bj2SdJ2_47H36N[o\2Jh0Ooc9Pd@RAcLEd=L
+3mPcfUi@74=@cRhXGgn>J?AhOdl^P_foW:oaIFmnOCe00<Lc[MckUOl`ZMn4UV63A6oaWbI]6Cf4
+]`V`[N>j1hlgPg:ok;nHcCfGheng8W[Ho_C:IcETEcPdZ57417Lj^@R_GaTO<H=jnV>GU4gMTinj
+_TBn;b:O?b^0dLb<^[?M]KncEdcd7lA`i><?G8oNdk?e@`iV3n9o0ooVlOI5]hM4_h?^h5hS3hP@
+iRSj5\f3]<]`j63o8>W>Ab`D_94@?7mZaCaNHV>oh2dNL9S[nkc7:`1lEI=;=]]f\Emf=AF`O;5E
+1NDdC7eUdOWkeoe`<>aam]]0QWETH_T2ZJcY6m\55o]m]Oonh_61CIH3Bf@IQ4ef2i\<E=2fH?1k
+i6InZ3KWZC]0UhG^GYNMRV\d0FTdPULQJD:15Lh4E\IZ8]BhA0nRiPHoC5H`Z<lel?TJDI:]bW`G
+b^@bEa:Y:=ZG1]C[>_P]fbejC^C8KZ7AbLYe;`0VV@0`aI\9<PXYdT0[dl<TOEdlkoD5S5igVKRX
+`iWKi;cAXmCREPgD>Q7dFSmdF1_dSUYHdUIDA3okIjijW@ddEcd94KfYnWnL]H;>LHhNXiZlGlJ7
+7IW@<e@l3VRN1NRd_;CZja9XOFL\O<7O[O16P<ma1oad;b38fRaIfcJ:46R1\gL@5JiTjd<h_UE=
+<DV@O@0X^hU@9\;<^gPliPS=YCiH>4cJ@I0XF28PSd?el3TKL;aQFdPLj`<h]5HPKm]>fdZm5_2S
+DX32M]Koh;O]l<>8GeG3_jkn3cF9BX10kkbGd2>aj_AY?iD2R`11bDPB5FQEmUJD@DhHJVUO7WdB
+?QEF4MmiF5:e_MbBSPfb0T?4\`S\oce`jba@<fZ4aZ1OCbo_1kC`<LH1UXmDX?IXP2U7b5me9;7[
+;AN02fcF1cQifKknBP@]:7hT4c`nPDVggS:InCgmV6Tkc?chB^=d2@hYD7\O=]8\66f@K5^aN6=<
+X1U[SF9nXmSUA4nPf6\@j`eaWl\6>V>WVbJMHVKf;P>NfbSV>8YiCPC5hRk835h?83mfkQQXC[J^
+FcCkg:`IHcZ=<BVVGnDlcHZoDKOJ85HLa9[SKfYKS3^GhZCiW7eVk3:<ZK_4>70nabPY3\^2c<V>
+<HXQWnHH;N>Hj38k7XLaQCDM5`LgSe?=Q6ajRo4gRSV>HYjSf>\\cNgBYG?<da`;flX6VJA3I`Jd
+dS76S^IdP^IdLa019QR0:@3`dE1;0`@:~31P27C:hDR\5j?eLR~2]fL000\0~2A4e6A45D@Bi2
+BDh?018391Df9cPiJW]<WFhO2@H14cCUmYKg0@>L:e0]`Jh6Pb9dZE0R@oT=YCl47W7fA=<E<emT
+W77_aZdMDgm\77;_b:lUVij<VK;RBX4]cK]D3U>eC<LdgM[TRU>YCY`lCOZT25BPD?Q3_AMUOUAg
+D]A;;CL]o9A^E:YCJEJUN9DnE^aJSG<Ek=DTf?=Q]himCWJXVKn1C`a@<\3=04T3K0e`=\3J07L3
+90j`>D3[0;l3A0l`?T1mhCh`8<>05@=j37Pb8<`0cNL<^3<PdH1=0eX=n:GId@ID6o1]@;X1l`Kd
+6g1``<@15`Md771b@<`1>`LD7A1e@=L1JHfkkX300`h?J3aPlX3<V_ei`>P1[`O\7W1l`7C=kShP
+A8U12fhE:58TOhPCT74_b;POI?`?<TW`HU3fDO\3k=P@he2LSPGXGoAhg03j31WgPXco@LHU9Wdl
+g]lh@lJm8>=oT76oCS=W>Y];O4[jbE8D<^h56ON3S?m19P5nL;oZDcg^53;^1AWoXhg>XQL=<6=2
+RF6EOTlhPERm4:\OH_e3k0d_QRe:Z<Y[38Qac?QU_gLJSeRm4>\OHVlX4B9Xn_dKCRSVGX[iWf;^
+ebef`@03B_SS4hCg8[`OhOnn1LS1oC[FiUhame;<oaA;eNMU6`CZR4gf0Hm8>J3VP:03VPk8>Z3\
+P;S6gGM0hP6?1e@N\7U0J<dn?F3eP=\3QPmh?V2kIYLWnjXB^l0A\\n@BBo8^1mTo0lb8O_`h74>
+T7eG6cb0?T?6_B3SOi0afOmZEGoS31WgPXco@LITonLW1k3cYccC;DDQhej@LCo8n1mT@_Iiogo^
+53;^1AWoXhg>XQLUnebh=MTgH_M2[7j8m@nabKiSm\m?m]TK;U\NkklgE<bm5?<oaLcfelS6mZEH
+_ACc?lG<m]M?b_J1\CKK]f;eD\co58_]NelY]Vo4YC[P@U=3BWD2VOB2S?]1a_lP4kH?koEJZV_j
+BJU>89=NT?4ob9S][a=EZQ?8Y1MTo0lbI_\k]YKZI=i8ZDhPTej@LCo8n1mT`_KiiUVYCR2CGY3a
+?m[X;7YA]\m3Kk=m8gH_a>Z7F?l@VndkORFYSSKm:=F=f;d@jamRTggOZ4_fYERm5?<oaDcfBb[I
+1lKJI=n:eD\aoe<\\^nmTLRn4BOkP0M\6a1^`;T1kMRno`dH>20Qg3OKYcd791e@eKS33UP[eWeg
+P5PoF;<ChgeO=^_fjV][mVnb;lH;F9GgbKhQTej@LCo8n1mT@_Kmn@[IYlWSh0B4?T?6_B3SOi0a
+fMmA86RL8N=NT?4ob9S\McHQneU]k0`Imh:<nd76ob0C\\od`Y1a;lSh7fed5VA:m^?2HKR@L:hO
+5a9>mD=mbmhOj^<i7J6n4K\GH_e3K:S_hg7j@gd[ERo5o4naY=i^\VbW3bKXje@GM<CZQESo>?<l
+JCGjA]cX0aiALD380Bd7i8CYa7RJ7ZKOBm>9iY>5_V4jeSbjdENeIPD27F3YPTaj@LKm8>=oT8WA
+mfJSCh8l=_[Za_KBIlRh5fCl3c8fnU\Gk6nL8N=NT?4ob=SXMcHanUU]k0`Imh:<nd76ob0CXlod
+`Y1a;lSh7fed5VAZm86oW;WO8<2=aaT4DZaNR_VOHSH8o=PPh<L60Clf25RaWOhj7D4j<=H6jEJ\
+GX[iWf9QONmhQ?F=>4P7G6QaV08m@CY39[dPhgj@lCo81:C3Hjo3nZZUL]=Wb;PGI?`?<\KjmoO]
+Ki`Qhej@lCo86>]g=\7jFFg\31WgPXck@LKo81>\coC2T74_b?POKG@FI8[ePNOi;1NR4@Z2M2=f
+;lCjQmQ@gd4RP7@YERo5o4na@;[Sk`?Y`5D7jDK\GXSeSc??fmo7j1]aX`oHi`6n1gQ_m?do@8@1
+8`IHjY41FEC1J`JlPEX7C1Y@J\0]cDhfX=V0J@>bFIT^=f3MP7\3m3gPP8DTgAnAA=Ah9_5H;m=_
+FCY[3]<GaQ:M6JFk]FKO=_XJVAD]9919;lRh7fCl3c912d5SmJ1?8N=NT?4ob2B3dOlSY6>ML4aj
+>BKo75>OKf<CWgoML[2@@2Jm8>=nT?4ob<CW<k\`I=`;<_i76id5VOYlh<dOnW`D;0CLa^L3S_:]
+]llWT4T_b;POI?`?<_7il60GO;i2cO;i13;Y1AWoPdal_]L>l?WD<NgUV?acC7fnSDeloSPM3_Ql
+2YWdPXck@LKo81>Ocnc2T74_b?POKG@FI>[cPBL:io?ADbmm_Q6k5f;m@fbOkdfkO;hDZiMRoZMH
+?]mKXoUlh:oBn7`SMRo4n\NIieFmk?>=^1<5n<QOTno50b;KQ=Jl\dm8M<;9=G^jceNa2dhDPDaj
+@LKm8>=oT8TC1OLKM6DO9hY09[dPhgn@\LmoL<]o9hY29[dPhgn@\M6o:94CADcERB:@BBo8^1mT
+o0lb<OYlnXTCAB2CGY3a?m[X;7YA9hZAQ4jD4K\GH_E3[7n8[OFm9KKFAnoNeOY6k5j8m@nanBC0
+VeA@P0?L_UAPR=IWb:@GI=`?<_h7VFQmN820FUnI09Dn@lJm8>=oT;7FWj9fOn<<6ON2S?m1aUYo
+_XW>IZgoEb5;DLRh5fCL3c;n1iUXOLiJSC^5S7]1a_mXXk?XAKDn1`R^mHgH_A2[7f;m@fb]kbHY
+]Cijj:KF=f;g@ZaoR:geKD5Jje^aNRWVOhYIjdNT228`eTH@[ERm5?<oaB;k3Q28k1]a\Pnhd;Z^
+1Hj@OHI<NT76oB3SOi09fHOoodof5Ec8CilQhej@lCo8V>aO7k2oLHJ<Nd76ob1S\WmJO6LcfGnQ
+[JDXI=`;<^h76On3C<PnQc_=WD;6_B3SOkCAFOBRI9mWcRKkA^aNR=D?\OhQ=]UgTR]T7kgBT>`K
+\G\QeSo49_^n>M>=TV;eD\co53?I?g<Vf@O6fVCOR]E;<OmC;;;_cIW8_Q4Wnh0;QJYW4Q38Y1MT
+g0lboPNIT7ghl[QTGf<GVP@4<^T56On3S<Wn[X_kV`@D<^T56On3S<Wn:7]=0[:QWDU089=NT74o
+b?POI4;f>Nm=Th109[dPhgnddEWdXVBOXn`VndK\GXSE3k7n8CKIMnaRI1lMg9;\6k5k8MHoa2Kk
+cUNJk4^aNRWVOhZIk1mfTN`3HffbKlGZYISo:AKImmQ5I=n8Tgg0QKI78o\4<^T56ON3S?m19V@O
+_VDXfMO?NVBO@2Jm8>=oT37IOjTefBN@BBo8n1mTC?HgVd[fBMYPI9m09[dPhgj@lCo8Q>acUHUT
+Wd0V_B3SOkCAFOBRI9mOmBKkA^aNR=D?\OhQ=]Wg]GET7kfDTn`K\G\QeSo49_]^]ic\Bk5j:NIo
+RYW\?mZ@k0=SKK9_aNZUV?lY5]UgZD=TghS;T807G=<1FHELc`ITUoVQ2TUVfX18F>=^>b2_WHQZ
+[RON?>3dP=UbXYM[MWFb;lL?T7d:VOB2S?]1a_lP4k8?Sm>Ak:]`2eNTT74_b?POI293nV94ac[Q
+V?AbC?hiYUcOA<83G9lJD;TnPDaj@LKm8>=oT0WGid\of4DQhej@lCoJj2afDJk?UGicOB=f;lCZ
+QeSo49_[Nel9[Xong\WeSMRm4>\OHW=mRc_GUf;eD\co53?G7k\Pe`O6fUcOR]E;<OmC;:k_K8>h
+_Q67@08^e70:ebN@BBo8^1mTo0lbhO[`1;Nh_QIFh_X4<^T56On3C;RnJaOPn]@akNFHo7=<^Ki[
+A>?j9?X9Ae78^1MTg0lboPNIL7dN7HW[4lRT5fClScHjRedD0PWldA6TScIkR?B=f;d@jamR8gfo
+g84UB[5j:NIoRTE3nVHl6Q9hYc`dY16k5f;mhlccdQkfnDIL800lX1a5Md6Cki83K\Z5?S[PjX2c
+0njJQLh<QW9_hghnh?^0n0<65:Q@h4@1cG<Dj56PBH4^1MXDj:?ISI31P`:gP08Ab:@GI=`?<_h7
+VOQlOk[agnMcZUDnGjl;3X02DLRT5fCl3c;fnO^EkVnL8N=NT?4ob=SXMcHanUU];125C7Y1a_dP
+hgn@RM5WNV78^1MTo8lf>P\b=OZYkV4?lUf]fYoZMTaj>BKm79=oSVT8_>mUoB7KkgOVanX_3P3o
+\SlEh;=Sd\\anNNH>VZ8gogg@mH9b;PGI?`?<T7fK[RV>^o4Z@6\<fCL2c;^1aWoPdb`8Kf_<aMa
+C7Xi9_mLhgVNRF>ZL@4?f8KSnmb0MRJjNO`31bADdFfRDajO6PoTGc\P[\meg`63=C^aS>k;=02R
+nFn]9\H;0>C_=JhQTej@LCo8n1mTXW7mKdam5P3L1F;j31WgPXco@LHJ]a]hOn<<6ON2S?m1aQZg
+\hW6cFYSIlRh5fCL3c;n1iUXG:HGQXak@LKoJ:>c85>a1U`;JK66ig@DJdK\GXSe3k4a082olAWh
+\VIgm_U4idn^fM<7R3EfnlOe5f\<VG]1a_dPhgn@RM5g9k56LSbVkdD5]m2WT74_b?POI6cdZf3f
+=lj@LBo8n1mTK?CGINOHnE>WnZ2VT74_b;POI?`?<S7j_6NjNch16ON2S?oAAVOARb;Xo;dkPVk4
+kXEHoA3[7f9[OOMh[?GAndVe_Q6k5f;m@fb]klSS];hDZiMRoZMHF]olD>\3UoTnPERm4>\OIiiG
+k8;F=n8R7G2Q;K6e?X5<NT76oB3SOi29eXOkn7AOJJe?89=NT?4ob5S[[giBja?8Y1MTo0lbe_ZO
+k<=>?cUk0Je?8I=NT74ob?POI:;e^FYEOe?8^1MTo8lf>X]NE:@3Gak7j:<C8aYm8gH_a?Z7f4KO
+NX16Gh[EBc7oDbbSkgO_S3k`_7N<_Q6k5f;mhlcc5RDfnTILY0<^a0f>dl505fCB2c;^1aWoPdb<
+_[]ocFodNFYeXjoo]4jO8N=NT?4ob=SX9f7g=lj@LBo8n1mTK?@kVaSm[3IfQXak@LKm8>=oT8WA
+IgYQb;PGI?b?=SX;<QGYG2jcB3MRmd:\OXSe3k55^]j92FR[QE[OR=d;\OhQ]]IgWHh\Q1B[Uf;n
+YeQJglO5162ZJgdSMRo4n\NIilgYX_F=^4P7G>QWNSJA@\Jm8>=nT?4ob4C[>o@E4H96f:;e5GNJ
+V40PTej@lCo8F>]o75e<8919;lSh7fB\mC^KJ?f\]YQ08I=NT74ob?POI:;eVEhH<^h56OnSSLj2
+C4DjL8mHY:<a@aYm8gH_a?Z7f4KO`@Z9M2UF;lGlCk6<_Z=m<o[0ECOjA^aNR?F?<h<@gjP@NV?d
+0ANJ6Wa0N:??T4T_b;POI?`?<S7j;V[dBOdFAUnWK]6WT74_b?POI6cdScgOgcQ3a[dPhgn@\M7_
+K6;d\m[H6C;^1AWgPhco@BI6WnV58N=NT?4of^P\b=CX0hoe`nRS1EHJOB=f;lCjQmQ6g`]B6GdY
+ERo5o4naS;koEc?j`5DgnTK\GXSeSc??2kS6j1]aX`mhQ05Rb04]1nAd2hWaJDf07=P2hLJJ?EWX
+F`GhmH3M0hi[MWBS[`jA2^`dnPbIm8:<nd76ob0CXno=AYnLOFWdUISHjC=Tg0\boPLI6og1VoHg
+cY1a;lSh7fA\m3^K6?f\=WJ6S7]1a_dPhgn@RM5WNV78^1MTo8lf>P\b=O[0ckne2ZW7_bcA_OlN
+_f;^YISo:FJWol9f[e2:eD\aoe?<CWoOQ06P?RSgjeRKNlGLBc7oDbb\ken5\;hA1nV02`GO`@@T
+T4T_b;POI?`?<\7joXceBKYLF5nY7j:513;Y1AWoPhbaoZBOdD82VOB2S?m1aURo\`WFcfZSQA@b
+j@DImh><od4VF9oYQB7SGY3a?m[X;<PDj`<?DQc6A7<l1>U6k5j8m@naXKk3i@3YDZaNR_VOHU5A
+PS619HLaQMRm4>\OIiiG;XoA=n967g2Qia^<?X5<NT76oB3SOi29dHN7SFCdUObNdBN@BBo8n1mT
+K?Bo^Vgd2FCB2c;n1aTKoLhVASn[KO@YI=8;<^h76On3C8`nd`]3a[dPhgnddEV@ZM47?Z>ldDM_
+GcCjA^aNR?D?\Hfn0fDanU:\GX[iWf8IOHM?IoB1ZfkdSMRm4>\OIihG[hkA=n967k3?0g`?l=kX
+V`lk`X0A0bceb80\Z^0e0mh0\@LP\D\=^:GIb@Hd6h2Tc<I5^Mb0M@=D\@Yf`04;fD9o791b@4eS
+?:2YLFLM<9J<lU^jT3D?c4KI3C8cG>SFVWgKj2_<D:=?89=NT74ob?POI88WPDiZ@Im2a[dPhgn@
+B@JS?mI:ac[QV?AbC?hiYSkOaRHnolcI?Ym09[dPhgj@lCo8a>Lc^c1Tg0\boTLKW@FInWcPTDkj
+O1A>0_acG6FOCb2CGY1a?lSh7fCR588^Bn?c2FCB2c;n1aWko6_boCOX53;Y1AWoPhb=OVLCXgo1
+Q0=6Wd8V_B3SOY3a?lS4j3>m<6CL2c;nAa^M1ITJON0=ZSV5P?lHM<1Ah]DenP@bj@DImh><od4V
+CR7X^RQ6Wd0V_B3SOi29@GOdQ`JM>ZJm79=oSZW?]k69ccmX_D4WT4T_b;POI?`?<_7ic2h<6ON2
+S?oAAVM1YShOn?miAR7P?`HM`9CMg?g6OP<>jPeOm1]T9`]5dQZgbooGi7_aP<Qf`iYgmQ]4Kdb^
+fM=m_UZ]T^cl?]n@BBo8^1mTo0lblOW>?\[Wdc[@k_>mhg40nP`Imh:<od76?Wob>?f=<fCL2c;n
+1aTKoEV[>Y^=oXk7;DDQhej@LCo8n1mTH_Bi@43^53;^1AWoXhg>XQLenQgQ\2jahC5RmD:\OXSe
+3k6e_V<GI42QLcYZOB=f;lCjQmQJggfVle1B[5j:nImRJGdG:J;ePJ^^mHgH_A3[7fNNMb^\eSOR
+FQm`XEj5]3j1C7Y1a_dPhgn@RMJ7IenXmOGo[mHWT4T_b?POI:ce=fbSm@UTdP\boPLIJog]BfYm
+4RjgeRN@BBo8^1mTo0lbdOYL]I[F9i19;lSh7fed5[fXe^MFZkFn4K\GH_E3[7n8[ODM_jCFAge<
+h1PXH5[O9fYXON2ZJgdSMRo4n\NIief]Z_F=^=H7G2Q3WP6c6m^5PTaj@LKm8>=oT8WFMe6kT>A[
+YoEEX6h0nP`Imh:<od76F_n:Cof=<fCL2c;n1aU[oAl^>Y^eo_N?;DDQhej@LCo8n1mTX_Fihc7^
+53;^1AWoXhg>XQOEn_c?YP^aNb5F?lCjQmQJgnUbJWfd`4Z]KlC^QESo45_[nl02RD2:eD\aoe<\
+[Nol=k@nL=Fe_Q6k5f;mhlccn]]dmKOYP0mUEEP4<^h56ON3S?m19SHMg^>Ye]Obf3JM@2Jm8>=o
+T;7FCj3HYU?8Y1MTo0lbe_X71;KYi<N30SJM@RJm8>=nT?4ob4C[lj^E=Ye09[dPhgnddEWdXUZO
+EmUd8GH_a>Z7F?l@Fn]kJSF]SkZ8`6\l]^UB[5j:nImRJGeg?:;ePJ^^mHgH_A3[7fNNEmFVZjY=
+1gaXoS2]Cb2CGY1a?lSh7fBRmN6AIVYm1Cj]m@UTdP\boPLIJogC_VQm0YWdPXco@LIJOi>dFYlT
+K2lA4<RT5fCL3c;n1iUXOCIYe_XD<^T56OnSSLjR5mGjG;feeSMRmd:\OXSe3k6e_\NWdo[X22EA
+R=d;\OhQ]]IgR]YJGh[EBc7oDbb]klA^9[34KZH@^aMRoN?<le9_eOY6G>\3;QC_gH3SLKBn89=N
+T74ob?POI:;eGB6NeZLIfVYmiNEFnP`Imh:<od76F_o9?_f=<fCL2c;n1aU[oEAdIk?F3iVLP8ak
+@LKm8>=oT8WFIdFI>d?6_B3SOkCAFOBRFYlgImKjA^aNR=D?\OhQ]]KgZUEJ7oF@O0:aNR7F?lCF
+nZjOE>];\GXYiWn:YOEM^8GF1jjjeSMRmd:\OiaiG\fIF]n8Jgg0QM8;84HNYoD5VOB2S?]1a_lP
+4jg_:3fe?_eDCn_[;[OBIlRh5fCl3c;Fn^^mjfnL8N=NT?4ob5S[WoCCfJceggQ\:@XImh:<nd76
+ob0C[Llodg6WT74_b?POKG@F_JSFigfU]KhA^aMRmD>\OhR]mEdaX]I7PjKEnTK\GXSe3k6e_We^
+[Bo5jZFHobVFeWN84EXO^>YJghSM2k7nLNIi>ZoF=n9J7g2QoUf\K0XImh:<nd76ob0C0BCXhZ1L
+RD;6_B3SOi2aeYnaa7n9P48V_B3SOi2aeYlZH@69P;KIjfHBb:@GI=`?<_h7VIR@M5H14i90Y[dP
+hgnddEWdXP98@>hMk`E21I20OcK8XOD9I=8;<^h76On3C0B@X4mWJWd2VOB2S?m1aUYoUa1JWd0V
+_B3SOi2ae]lcVmHW<MYZO@:Im8:<nd76ob0C[LnU4VUm0YWdPXcodDIWdH\:807INh004W3DfD<:
+220YI=8;<^h76On3C0B@X9mo<V4XI=`;<_h76F_maM?l5d1Bb:@GI?`?<]KjMhL[882TRKMJRT;6
+_B3SOY3a?lQ4jo>]BM`YI=`;<_i76ie5;bZ016BP0`98`55C:B`26ON2S?]1a_lP4`4Tj<Jb=Ye0
+9[dPhgn@\MHOXkd9BB2CGY3a?lQHjiljdjJCal5]>X5<NT76oB3SOi29e^OogF`jPDaj@LKoJ:>c
+j4D5T83\>5\R@0F@P7l>_J?e2FCB2c;^1aWoPd`4T:3A]VYm0YWdPXco@LIJ?i9J8R2@BBo8n1mT
+[?EggZSeBIK@FYm09[dPhgj@lCo8A>_cffAJWd0V_B3SOkCAFOBR0TQ0_Sj^mE419>1^:@OD720T
+KcXPj`2M>JiamkGjJ6O=7SgPm83G0fi[OAoGnUR<[OjaoE[OT4T_b;POI?`?<]7joWRT_mKWb>>e
+_Y;7XDlQhej@lCo8F>]gD^hgcY1a;lSh7fB\m@l8R9enBQjg07J6S7]1a_dPhgn@RMKWiO7lCB7S
+GY3a?m[X;7YA[LobJgdSMRo4jXMHoa1Kjc_78hV0b_c;7Xok;o<[iUj:nImR5_\m^MRGH_EBc?lD
+Jh7H?`3\Pbh0n`L\>67H_@aKjao0o[c8T9IRLGg0QGKoioX4<^T56ON3S?m19U`OM7iS[TlPTej@
+lCo8V>__U:<oejN@BBo8n1mTc?Fgj520jm?iS@i`O@ZIm8:<nd76ob0C[\oe6nPl2QWgPXcodDIW
+dH]bOD36:[jOj`?nlcc0m`3_^KjilPP3I10aELVO1ARlI\2K0H468<2F6W1;\i<=J3IPfX1\I=oU
+1[Sj_@7kV9Jij1D7O4CkZ?5\oeRC`6l7V0CgJWIP_6laj<`3f?kFVWfKjj_Lj@80\4jR89=NT74o
+b?POI<;e7MY993iY0Jk_S:?XDlRh5fCl3c;9`?DOKN1H9abCGXk9?lNDj]_HQ>Z_GN00YQTbkPDI
+mh><od4VE9oIQB7SGY3a?m[X;<RDjRN5`dPQhD`o:BBLj0Oj7WA?;dA[c]@;SMRm4>\OH^=l=f\V
+8dZaNRWVOhZU5oYI<kd@N9XcNZ4A^aMRoN?<lcIWeP^=^<l7G6SHR`<Q:eRIPTaj@LKm8>=oT8W?
+mfNOCj;=l_UjF[00OHJ<Nd76ob0CWnmYVag[Q6?Bbc7iiiSjO1^K691^iBP:6ON2S?]1a_lP4io?
+k<:@LBo8n1m]M1ITj_>1]akSlm6h5Z8@^aMRoD=\WnoP?Gbn5:^GH_jWF3kOTN;iO>1;l_Ql8gH_
+a?[7VNO]?^ccSKS?1e`XIGno@B2CGY1a?lSh7fCRln6?aoQlSASW=`QTdP\boPNIn7bob>hgZ6?J
+bc7iiiSjO1^Kn?`odoP=0YWdPXck@LKo81>Ocnc2T74_b?POKG@FI>[cPOL8iO?AYAmm_Q6k5f;m
+@fbOkiAmO;hDZiMRoZMH?]ng`_Ulh5gRn7`SMRo4n\NIiienk?>=^<l7G6QeMIm?89=NT74ob?PO
+I>;chIMVn7aU:^Kc2FCB2c;n1iWhO?n\ko>YHm[;<OWWV?Yl6i_ho4Mbn7`2VOB2S?]1a_lP4io?
+k<:@LBo8n1m]M1ITj_>1mckVlm6;:Gfn4K\GH_e3K9o_:jEl_QB[Uf;nYePngn^^nGcPMmOhO2=f
+;lCjaiWW;J[\lhdhU`Ah`;H19_Ni0Ng89?lK<710@SC97RSJLd3B0EF=>nb0]FbBk`iPT`kFk<@3
+6\=9mT1AcGokO37^l`UTdP\bkPLIoh=<O3kLB^_c9LOJie?8Y1MTo0lbm_Tk7^m_W27SGY3a?lSH
+j7LfdJ4Lae8D<^h56ON3S?m19TJOjHDQhej@lCoJj2c8e>P3UkfodLM>A:=_a>j5F?l@6dSRoT0B
+m`NB^3n@a4IO\VbS3b:i@AMRmd:\OiaigPj3[Qd67C1NH<1AM^lN<2h72LF@JBo8^1mTo0lb<OX>
+68:4XZUF6Gg1JNUCb;PGI?`?<SKjcMCmSC=Tg0\boPLI6og>9THoZhfM8N=NT74ob?POI6;dVEhH
+<^h56OnSSLj2C4TX;U:LQ39Rmd:\OXSe3k6e_Q\Ud?[Xa8QJghSM2k7n8KKFmi4RFUn:eD\aoe<\
+[Nmgkk@nL=Fe_Q6k5f;mhlccl]kAnTILjh?53C0h@>D0Y`?T3[0l@7NaT0<<V63Z0fh<B39PRbnh
+c@07j443:Pdh=B2GIRlKl<bT@nnYOJ]d?E@;_G50B;U_he\>V3TPih2OO]m;=C^ZD_OF0D[mf@5]
+=G^^eQL1KP2]Cb6CGY1a?lSh7fBRmK4[?H@5UW\26ON2S?m1aUBoL@`Imh:<od76E3mfo0TkQXak
+@LKm8>=oT0WEInhH<^h56OnSSLkRCSPjf02>KYd_ePFacLljhBjoiB4\9mcS]ia`6;@M?QSX9WHF
+]5G@AT7kQ5ob?7\H<D38034315G50K[:YOiPZo5`P<_jh=\1SPNhCPln7n2ne_05k_g1VY]IUaQl
+VeWg35RTfF;S9cO;Z`K4\[?LJ`2Y7]>cX?4\_XgGn33=?OjB0eIJM=oD2ZgiD8GF7Qjjal_V\3\V
+_AbCOXk9?lND7N3T;b9?79=NS\Toah@LnRJ>BBo7i9mS`PfMTdo>RF?Bbc7YiiSlLdbQXOB[Y1?7
+Y9MSl\leWRFM6P?P5`d3I1BJEXHm0a`=\5@J>:e0:ZL>d3Q0iP2USL6a0o@>T3a0m@3Q0kCGk?a:
+PA<<Z>2b3VQQS0Ke7VkCEIbRgNHl0`XiACnBR[JKIeU5HjZNNIaa_g>B;AGedAJ\nDfYj:<3YPkh
+jV1IL`M[0V<X23ZQV7\YiWj:nImR7I25CcO20S^ob3T[iUj:nImR1XF^FC7gD\co53<Te<fOM;=R
+kZFHnbWVOhZ5SgeOiI\ELbo5o4ldWDF>k?\`^oBoiXZiUf;^YiSo:NHGRXD83?dbj:bHNbWVOhXI
+5;YVaMa;<OmCc;Q@=goCcHZiUf;^YiSo:IH^mWfMKeK<_ACc?m5dWVEF;80?@dZK1YPJh2^:cDcY
+HaKKYlW1\fU\;nNJ7\nEN3lAh`ETddS<5h1PF_aS@16fjBP3[PcX<V3<P3<@gg<X__mPO2><T@IL
+<^i>0dH=B3GPeH1J0gIYM[01aFRnXn5lMm?\L@0O43@C;_01[d5KP8>H8n0filbA5J^GH^jWV?lY
+IW<ld1`Aj:bHNbWVOh[I7;]VaMa;<OmCc>IH=goBcHZiUf;^YiSo:IHi\VmFc;dDlcoAM=HiL`Al
+\i`i\V;eD\cm5?<oaNbdXM1I<OMBc?lD\cUfcHZiUf;nYiS=\FknY9\ELbo5g4laoe<\LfCO[9Qk
+:NIoX^V\L^H8n;li0\hDD4\10P\02P0000H09fb^54lESG<BcP0040X100T0~88000~5A4eOETH^
+FTU@D4\10P\02P0000H0dV^^5?U7PEQ1n000FB0100X0~8800003W>~2A4eOE4I=;UY9D51;0@8;
+00X0~21P12KjhD8Bhl3k44~27@P000L0~60@0P~3X\H104AFARi4Cd=@B`422`0:~31P16QZ\D
+Y_;7X3L3~2[PT000L0~60@0P~3N<\104UCCbiDAEQ@B`422`0:~31P3ZQ:\D3L05nLL0~2[`40
+00P0~60@0P~3e<h104ADATd^CT5=D4\10P\02P0600H02W:^52B3@93Y9`00LVh000L0~60@0P
+~3`Ll104AFARi@@E=@B`422`0:~31P3gHJhD9G5bl@51~2T9P000L0~880000<og0@14ETH^AEQ5
+D4\10P\02P0000H0Qdb^58[1NSmG8P00]fL000\0~880000?Dh0P14CDI4@EA1;T99CU1;1@H0
+~320080;81~2ME\2~5
diff --git a/systems/msdos/sbtex/dvf04.doc b/systems/msdos/sbtex/dvf04.doc
new file mode 100644
index 0000000000..364624e282
--- /dev/null
+++ b/systems/msdos/sbtex/dvf04.doc
@@ -0,0 +1,35 @@
+ The dm Fonts and DVF.EXE (Version 0.4)
+
+TeX 3.0 cannot reach its full potential until it has the appropriate fonts.
+In time new fonts including acccented characters as true characters rather
+than composites will be generated. For the present though, one can make do
+with virtual fonts based on the cm fonts. As a step in this direction, 55
+dm (dyslexic modern) virtual fonts have been created from TeX text mapped
+cm fonts. These include 58 characters referenced by numbers in the range
+192 to 255. The character number has been based on ISO 8859/1, details of
+which were sent to me by Chris Thompson. The TeX community needs urgently
+to establish a decent standard for character mappings 128-255. The 58
+additional characters in the dm fonts are either single characters remapped
+or character pairs possibly with positioning. TeX was used with the fonts at
+16pt to obtain character dimensions, which avoids some possible rounding
+problems. The width of the virtual character is exactly the same as the width
+of the last character in its expansion. This simplifies DVI-DVI conversion.
+Kerning for the new characters is based on the principal character in the
+virtual character. Thus each accented letter is treated in terms of kerns
+as though it were the unaccented letter. Those who wish more subtle kerns
+may modify the TFM files with TFtoPL and PLtoTF. The check sum of the dm
+font is obtained from that of the corresponding cm font by adding 4.
+
+In addition to the dm virtual fonts, this distribution also provides
+the DVI-DVI translation program DVF.EXE. It has the 55 VF's built in.
+For a DVI file which contains references to the dm fonts, one may run
+DVF on this file to translate these references into their cm equivalents.
+
+These are experimental fonts and programs. Please send comments, bug reports,
+etc., to
+ Wayne Sullivan
+ WSULIVAN@IRLEARN.bitnet
+(14 May 1990)
+
+Please destroy the earlier code page 850 version of DVF. DVF03 has incorrect
+kerning for certain characters.
diff --git a/systems/msdos/sbtex/te.doc b/systems/msdos/sbtex/te.doc
new file mode 100644
index 0000000000..870f16f8c6
--- /dev/null
+++ b/systems/msdos/sbtex/te.doc
@@ -0,0 +1,38 @@
+TE is a small Turbo-Pascal-Editor like program intended to be used
+for quickly correcting errors in TeX-files. TE loads a TeX-file
+and the corresponding LOG file. The LOG file is scanned for
+all errors. Assuming one wants to edit a file BAD.TeX together with
+BAD.LOG, one must call TE with the following command:
+
+ TE BAD/L
+
+Then one can use
+ [F8] to display the next error
+ [F7] to display the previous error
+ [Alt][Keypad-Up] to scroll the log-file up
+ [Alt][Keypad-Down] to scroll the log-file down
+ [Alt][Keypad-Left] to scroll the log-file left
+ [Alt][Keypad-Right] to scroll the log-file right
+ [Alt][Keypad-PgDown] to scroll the log-file one page down
+ [Alt][Keypad-PgUp] to scroll the log-file one page up
+
+ [Alt][S] to save the TeX-file
+ [Alt][L] to load a TeX-file
+ [Alt][C] to close the Log-file
+ [Alt][O] to open a Log-file
+
+ [Scroll-Lock] to resize the log-window
+
+Pressing and holding the CTRL or ATL key will display some of the available
+options.
+
+For all other keys refer to the teinst program.
+
+For the syntax in the case that one has differing tex and log file
+names, or for starting at a specified line execute
+
+ TE -?
+
+28-Nov-89 Peter Sawatzki, BITNET: IN307@DHAFEU11
+ Buchenhof 3, D-5800 Hagen 1, Germany (West)
+A new version of TE is in preparation.
diff --git a/systems/msdos/ted/readme.ted b/systems/msdos/ted/readme.ted
new file mode 100644
index 0000000000..cba1886736
--- /dev/null
+++ b/systems/msdos/ted/readme.ted
@@ -0,0 +1,481 @@
+% Diese Datei wird mit \input{readme.ted} in TED.TEX aufgerufen.
+
+
+\section{ Das Wichtigste im "Uberblick }
+
+\subsection{ INSTALLATION }
+
+ TED ist ein \LaTeX-Editor. Er ist voll funktions-f"ahig, wenn die
+ Dateien TED.EXE, TED.1ST, TED.CNF, TED.XET und TED.KEY in e i n
+ Verzeichnis kopiert werden, das sich im Such-Pfad des Betrieb-
+ Systems befindet. Der Dos-Befehl PATH druckt eine Liste der
+ Verzeichnisse auf den Bildschirm aus, die im Such-Pfad liegen. \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ C:\EMTEX
+ \end{verbatim}
+ \vspace{-3ex}
+ bietet sich als Verzeichnis an, wenn das \LaTeX-Paket von Eberhard
+ Mattes verwendet wird.
+
+ TEXCHK.EXE stammt nicht von mir. Dieses Programm soll im TED durch
+ Dr"ucken von [F1] aufrufbar sein und wurde aufgenommen, da es
+ nicht in jeder \LaTeX-Version enthalten ist. Dazu: TEXCHK.DOC.
+
+ Zur Installation unter Windows 3.1 siehe README.WIN.
+ Zur Installation unter Windows 95 siehe README.95.
+
+
+\subsection{ Enthaltene Dateien }
+
+ \begin{tabular}{ll}
+ README.TED & Eine Datei, die in TED.TEX eingelesen wird. \\
+ % README.TED ist die aktuelle Datei.
+ TED.1st & Falls ein File noch nicht existiert, wird der \\
+ & Inhalt dieses Files eingelesen (`Maske'). \\
+ TED.CNF & Enth"alt Befehle zum Start von \LaTeX\ und dem \\
+ & DVI-Treiber, sowie f"ur TED-Optionen. \\
+ TED.XET & Eine Liste mit \TeX- und \LaTeX-Befehlen. Sie \\
+ & dient einem spell-check beim Schreiben. \\
+ TED.KEY & Definiert die Belegung von [Alt+[Buchstabe]]. \\
+ TED.C & Quellen-Code von TED.EXE. \\
+ TED.TeX & Die Dokumentation zum Programm TED. \\
+ TED.EXE & Die ausf"uhrbare Datei. D a s ist der Editor. \\
+ TEDgoDVI.BAT & Eine Batch-Datei, die in Zeile 1 von TED.CNF \\
+ & anstelle von VS angegeben werden kann. \\
+ TEDgoTeX.BAT & Eine Batch-Datei, die in Zeile 2 von TED.CNF \\
+ & anstelle von (G)LATEX[209] stehen kann. \\
+ TeXchk.EXE & Ein Programm zur Kontrolle von \LaTeX-Files. \\
+ TeXchk.Doc & Die Dokumentation zu TEXCHK.EXE. \\
+ \end{tabular}
+
+ \vspace{2ex}
+ Dies sind Dateien f"ur eine Dos-Installation. Welche weiteren
+ Dateien f"ur die Installation unter WINDOWS 3.1 notwendig sind,
+ kann README.WIN entnommen werden. Die Installation mit WINDOWS 95
+ wird in REDAME.95 erkl"art.
+
+
+ \newpage
+\subsection{ PROGRAMMSTART }
+
+ TED wird gestartet durch Eingabe von \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ ted [Dateiname]
+ \end{verbatim}
+ \vspace{-3ex}
+ Als Beispiel kann TED.TEX verwendet werden. Falls der Dateiname
+ keinen Punkt enth"alt, wird "`.TEX"' angeh"angt. Falls eine Datei
+ ohne Suffix eingelesen werden soll, muss der Dateiname mit einem
+ Punkt abgeschlossen werden. Das MAKEFILE z.B. wird mit \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ ted makefile.
+ \end{verbatim}
+ \vspace{-3ex}
+ eingelesen. Um TED.TEX zu "offnen, kann also eingegeben werden: \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ ted ted
+ \end{verbatim}
+ \vspace{-3ex}
+ Dann sollten nacheinander die Tasten [F3] und [F4] gedr"uckt
+ werden, um den File TED.DVI zu erzeugen und zu betrachten. Diese
+ Datei wird in TED.TEX mit input aufgerufen; um sie zu bearbeiten,
+ w"urde man eingeben \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ ted readme.ted ted
+ \end{verbatim}
+ \vspace{-3ex}
+
+
+
+\subsection{ MENUE }
+
+ Das Menue wird mit [ALT+X] aufgerufen. Der Auswahl-Balken kann
+ mit den Cursor-Tasten [auf] und [ab] bewegt werden. Durch [Enter]
+ wird der Menuepunkt ausgew"ahlt oder mit [Alt+X] das Menue wieder
+ verlassen. Alternativ kann auch die [Esc]-Taste verwendet werden.
+
+ Die Menue-Funktionen k"onnen auch mit Funktionstasten direkt
+ aufgerufen werden. Die Tastenzuordnung steht in der Status-Zeile
+ (erste Zeile des Bildschirms), wenn gerade keine Status-Anzeige
+ erfolgt. In jedem Fall wird in der rechten Spalte des Menues die
+ Funktions-Tasten-Belegung erkl"art.
+
+
+
+\subsection{ [F2] SAVE, [F9] END und [F10] EDIT }
+ \label{save}
+ Falls der erste Menue-Punkt ausgew"ahlt wird (was gleichwertig mit
+ Dr"ucken von [F2] ist), erscheint das nachfolgend gezeigte Bild.
+ Dieses Bild ergibt sich auch nach Dr"ucken von [F9], wenn der Text
+ ver"andert wurde. In das obere, breite Fenster kann ein Datei-Name
+ eingegeben, oder der bereits eingetragene mit [Enter] best"atigt
+ werden. Alternativ kann mit [Cursor ab] ein Name aus dem Katalog
+ ausgew"ahlt werden. Dabei wird im unteren, hohen Fenster ein File-
+ Name "ahnlich wie im MENUE farblich hervorgehoben. Dieser Name ist
+ dann auch sofort im Schreib-Fenster zu sehen. Die Cursor-Tasten
+ [auf] und [ab] sind dem Katalog-Fenster zugeordnet; die anderen
+ Tasten schreiben in das Schreib-Fenster. Gesichert wird auf den
+ Namen, der im Schreib-Fenster steht.
+
+ Der Katalog ist der Inhalt des aktuellen Verzeichnisses, also dem,
+ in dem TED gestartet wurde. Wird der erste Eintrag (..) mit
+ [Enter] best"atigt, wird der Inhalt des Verzeichnisses ausgegeben,
+ in dessen Unter-Verzeichnis TED gestartet wurde. Umgekehrt wird
+ bei Best"atigung eines Namens in Gross-Buchstaben der Inhalt eines
+ Unterverzeichnisses des aktuellen Verzeichnisses ausgegeben. Namen
+ in Kleinbuchstaben bezeichnen Dateien.
+
+ Ein gleichwertiges Fenster erh"alt man nach Dr"ucken von [F10], um
+ eine andere Datei zu "offnen.
+
+ Mit dem Katalog-Fenster kann man sich also einen relativen Pfad in
+ ein anderes Verzeichnis zusammenstellen. In das Schreib-Fenster
+ kann auch ein absoluter Pfad eingegeben werden. Dieser darf auch
+ Laufwerk-Bezeichnungen wie A: enthalten. Benennt der eingegebene
+ Pfad ein Verzeichnis, wird der Inhalt im Katalog-Fenster gezeigt.
+ Bezeichnet der Pfad eine Datei, wird der Text auf diesen Namen
+ kopiert ([F2]+[F9]) oder diese Datei ge"offnet ([F10]).
+
+ { \scriptsize
+ \setlength{\baselineskip}{5pt}
+ \vspace{2ex}
+ \begin{verbatim}
+
+ [F1]check [F2]SAVE [F3]LaTeX [F4]view [F5]CUT [F6]COPY [F7]NOL [F8]COL [F9]END
++-W---------------------------------TED.TEX------------------------------------+
+|_ |
+| +-S A V E CURRENT TEXT IN FILE: / ALT+X------+ |
+| |TED.TEX | |
+| +---------------------------------------------+ |
+| +---------------+ |
+| | .. [| |
+| | KEINFILE [| |
+| | makefile +| |
+| | ted.1st +| |
+| | ted.c +| |
+| | ted.cnf +| |
+| | ted.exe +| |
+| | ted.key +| |
+| | ted.tex +| |
+| | ted.xet +| |
+| +---------------+ |
+| |
+| |
+| \title { \LaTeX--Editor TED } |
+| \author { Timo Baumann } |
+| \date { 15. Oktober 1996 } |
+| |
++ 1 ( 579) : 1 -----------------------------------------------------------+
+
+ \end{verbatim}
+ \vspace{1ex}
+ \setlength{\baselineskip}{\remlength}
+ }
+
+ "Ubrigens gibt in der letzten Bildschirm-Zeile die eingeklammerte
+ Zahl die Zeilen-Zahl der ge"offneten Datei an. Das `W' links oben
+ deutet auf aktiviertes Word-Wrapping hin; siehe unten.
+
+
+
+\subsection{ FEHLER }
+
+ Bei der zuletzt beschriebenen Prozedur zum Sichern oder "Offnen
+ von Dateien wird "uberpr"uft, ob das angegebene Laufwerk bereit
+ ist. Diese "Uberpr"ufung findet nicht statt, wenn das Laufwerk das
+ Laufwerk ist, auf dem sich TED.EXE befindet. TED.EXE sollte also
+ nicht gestartet werden, wenn sich diese Datei auf einer Diskette
+ befindet. Weiter ist diese "Uberpr"ufung auch nicht in jedem Fall
+ sicher: Eine schreib-gesch"utzte Diskette wird manchmal nicht als
+ solche erkannt. Dann schreibt das Dos auf den Bildschirm \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ Schreibschutz-Fehler bei Schreiben auf Laufwerk ...
+ (A)Abbrechen, (W)Wiederholen, (I)Ignorieren
+ \end{verbatim}
+ \vspace{-3ex}
+ In diesem Fall sollte eine schreibbereite Diskette eingelegt und W
+ f"ur Wiederholen gedr"uckt werden. [A]bbrechen f"uhrt dazu, dass
+ TED beendet wird! "Anderungen seit der letzten Sicherung w"aren
+ dann verloren. Der Rechner wird beim Starten eines neuen Programms
+ abst"urzen.
+
+ Im unten genannten Word-Wrapping werden Auskommentierungen nicht
+ beachtet. Wird vor einem Prozent Text eingef"ugt, kann das letzte
+ Wort einer auskommentierten Zeile an den Kopf der n"achsten Zeile
+ geschoben werden. Damit w"urde es im .DVI-File sichtbar. Vor und
+ nach Kommentaren sollte sich eine Leer-Zeile befinden, denn leere
+ Zeilen bleiben beim Word-Wrapping erhalten.
+
+
+
+\section{ ZIELSETZUNG UND ZIELUMSETZUNG }
+
+ Es gibt schon viele Editoren. Zahllose sind m"achtiger als dieses
+ Programm. Und davon sind einige ebenfalls speziell f"ur den Umgang
+ mit \LaTeX\ pr"apariert. Warum also noch einer?
+
+ Weil es nach meiner Ansicht darauf ankommt, dass ein Editor nach
+ M"oglichkeit genau das k"onnen sollte, was man von ihm erwartet,
+ nicht weniger. Aber auch nicht viel mehr --- denn wer sich durch
+ mehrfach verschachtelte Menues durchqu"alen m"ochte, wird mit den
+ zahlreichen Angeboten der freien Markt-Wirtschaft vorlieb nehmen.
+ \TeX\ und seine Epigonen sind ja eben Programme, wo man einfach
+ hinschreibt, was man m"ochte --- und nicht lange nach einer Maus
+ sucht. Auf eine Hilfe in Form eines Hypertextes wurde verzichtet,
+ denn Hilfe-Seiten sind im Unterschied zu einem Buch zur Knappheit
+ verurteilt. Und die \LaTeX-Welt ist ein Parade-Beispiel daf"ur,
+ dass Computer-Literatur lesbar sein kann.
+
+ TED zieht sich beim Aufruf anderer Programme nicht zur"uck aus dem
+ Arbeits-Speicher. Dies ist bei heute "ublichen PC-Ausstattungen
+ m"oglich. Zu beachten ist, dass der mit TED editierte Text sich im
+ Arbeitsspeicher befindet, der Text-Satz aber von der Datei auf der
+ Festplatte ausgeht. Wenn eine Datei ge"andert wurde, wird vor dem
+ Start von \LaTeX\ immer abgefragt, ob gesichert werden soll.
+
+ TED soll dem \LaTeX-Anwender von den ersten Anf"angen bis hin zum
+ fortgeschrittenen Text-Setzer von Nutzen sein. Dazu werden einige
+ M"uhen umgangen, die der Umgang mit \LaTeX\ oft bereitet ...
+
+
+
+\subsection{ Man kann nach dem "Offnen eines neuen
+ Textes einfach gleich losschreiben.
+ }
+
+ Dazu dient die Datei TED.1ST: Diese Datei wird (ohne ihre letzte
+ Zeile) als `Maske' eingelesen. Die letzte Zeile kann am Anfang
+ eine ein- oder zweistellige Zahl aufweisen. Diese Zahl definiert
+ die Zeile, in der der Cursor bei Programm-Start steht. TED.1st
+ kann jeder Anwender so ab"andern, dass es die Gestalt seiner
+ typischen \LaTeX-Roh-Files besitzt. TED.1ST orientiert sich an
+ \LaTeX2.09, nicht an \LaTeX2e. Die `Umr"ustung' auf \LaTeX2e ist
+ aber sicher schnell erledigt.
+
+
+
+\subsection{ \LaTeX-Befehle werden
+ `Rechtschreib-gepr"uft'.
+ }
+
+ Falls der Cursor unter einem Wort ist, das mit \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ \
+ \end{verbatim}
+ \vspace{-3ex}
+ beginnt, wird diese Konstruktion mit Eintr"agen in TED.XET
+ verglichen. Ist der Cursor unter einem unbekannten Befehl, wird
+ dies in der Status-Zeile angezeigt. Die Status-Zeile ist die
+ oberste Zeile des Bildschirms. TED.XET orientiert sich an
+ \LaTeX209. Befehle, die mit \LaTeX2e noch hinzugekommen sind,
+ m"ussen nachgetragen werden. TED.XET enth"alt auch Befehle, wie
+ sie in GERMAN.STY und BIBARTS.STY definiert werden. Ob diese
+ Style-Files auch im \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ \documentstyle
+ \end{verbatim}
+ \vspace{-3ex}
+ aufgerufen worden sind, wird nicht gepr"uft. Der Befehl \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ \vli
+ \end{verbatim}
+ \vspace{-3ex}
+ aus GBIBARTS.STY z.B. f"uhrt zu einer Fehler-Meldung, wenn nicht \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ \documentstyle[ ... ,gbibarts, ... ]
+ \end{verbatim}
+ \vspace{-3ex}
+ aufgerufen wird (aus: tex/ctan/macros/latex209/contrib/bibarts).
+
+
+
+\subsection{ Das Programm TEXCHK wird zur Pr"ufung
+ der Klammer-Setzung eingebunden.
+ }
+
+ Mit der Funktions-Taste [F1] kann das Programm TEXCHK aufgerufen
+ werden. Es "uberpr"uft die logische Richtigkeit der Klammer-
+ Setzung. In der Datei TED.CNF wird die Belegung der Funktions-
+ Taste [F1] in den Zeilen drei und vier definiert:
+ In Zeile drei sollte \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ TEXCHK -v
+ \end{verbatim}
+ \vspace{-3ex}
+ stehen und in Zeile vier \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ > CHKFILE
+ \end{verbatim}
+ \vspace{-3ex}
+ Damit wird die Ausgabe teilweise auf dem Bildschirm sichtbar und
+ teilweise in einer Datei CHKFILE abgelegt. Diese l"asst sich
+ durch Dr"ucken von [F10], Anwahl der Datei CHKFILE mittels den
+ Cursortasten [auf] / [ab] und Auswahl mit [Enter] "offnen.
+
+
+
+\subsection{ Von einer Klammer kann zur zugeh"origen
+ Gegen-Klammer gesprungen werden.
+ } \label{tabulator}
+
+ Wenn der Cursor unter einem Klammer-Symbol ist, springt er durch
+ Dr"ucken von [Tabulator] unter die korrespondierende Klammer. \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ < >
+ { }
+ [ ]
+ ` '
+ ( )
+ \end{verbatim}
+ \vspace{-3ex}
+ Falls eine Klammer "`nicht mehr zu geht"', erfolgt eine Fehler-
+ Meldung. Klammern in Auskommentierungen werden "ubergangen. Auch
+ nicht als Klammer-Zeichen anerkannt werden Klammer-Symbole nach
+ einem backslash. ` und ' sind f"ur "`Zitate"' gedacht. \\ {\small
+ \vspace{-3ex}
+ \begin{verbatim}
+ In { \} } %} wird von der ersten zur dritten Klammer gesprungen,
+ und bei nochmaligem Dr"ucken von [Tabulator] wieder zur"uck.
+ \end{verbatim}
+ \vspace{-3ex} }
+
+
+\subsection{ \LaTeX und der DVI-Preview
+ k"onnen gestartet werden.
+ }
+
+ \LaTeX wird mit der Taste [F3] und der DVI-Bildschirmtreiber mit
+ [F4] gestartet. In Zeile eins von TED.CNF sollte VS und in Zeile
+ zwei LATEX oder GLATEX stehen. VS startet im Gegensatz zu V
+ einen DVI-Treiber, der wenig Speicher in Anspruch nimmt. H"aufig
+ wird mit dem Befehl LATEX die Text-Bearbeitung mit englischem
+ und mit GLATEX die Text-Bearbeitung mit deutschem Trenn-Satz
+ eingeleitet.
+
+ Mit [Alt+F6] kann dar"uber hinaus der Druck-Vorgang eingeleitet
+ werden. Zeile sieben von TED.CNF bestimmt den Drucker-Typ.
+
+
+
+\subsection{ Zeilen k"onnen direkt
+ angesprungen werden.
+ }
+
+ \LaTeX gibt seine Fehlermeldungen mit Verweis auf die Nummer der
+ Zeile aus, in der der Fehler aufgetreten ist. Nach Dr"ucken von
+ [Alt+F2] "offnet sich ein Fenster, in das eine entsprechende
+ Zahl eingegeben werden kann. Nach Dr"ucken von [Enter] wird
+ diese Zeile angesprungen.
+
+
+
+\subsection{ Mit [Alt+[Buchstabe]] k"onnen
+ anwenderdefinierte Strukturen in den
+ ge"offneten Text geschrieben werden.
+ }
+
+ Mit [Alt+F3] wird ein Fenster ge"offnet, das eine Liste zeigt,
+ was unter der Alt-Tasten-Kombinationen ausgedruckt wird. Das
+ Fenster kann mit den Cursor-Tasten gerollt werden. Ganz links in
+ jeder Zeile des Fensters steht ein Buchstabe, der zusammen mit
+ der Alt-Taste gedr"uckt werden soll. Mit [Alt+K] wird z.B. ein
+ Klammer-Paar {} an die Stelle des Cursors hingeschrieben. Der
+ Cursor steht in diesem Fall dann unter der zweiten Klammer, also
+ so, dass beim direkten Weitertippen in die Klammern geschrieben
+ wird. Die Alt-Tasten-Kombinationen sind in TED.KEY festgelegt:
+ [Alt+A] in Zeile eins, [Alt+B] in Zeile zwei usw. Ein Prozent-
+ Zeichen am Ende des Eintrages bewirkt, dass der Cursor nach dem
+ Einf"ugen wieder um eine Stelle zur"uck-rutscht. Es steht also \\
+ \vspace{-3ex}
+ \begin{verbatim}
+ {}%
+ \end{verbatim}
+ \vspace{-3ex}
+ in Zeile elf von TED.KEY. Das Prozent-Zeichen wird nicht in den
+ editierten Text geschrieben.
+
+
+
+\subsection{ Die "ublichen Editor-Funktionen
+ sind nat"urlich auch vorhanden.
+ }
+
+ Mit [Alt+F1] wird die Such-Funktion gestartet. Falls der Such-
+ Begriff gefunden wird, wird er blinkend dargestellt. Auch das
+ Fenster mit dem Such-Begriff ist wieder zu sehen. Mit [Esc] wird
+ der Suchvorgang unterbrochen. Der Cursor steht dann unter dem
+ Such-Begriff. Mit [Enter] wird statt dessen weitergesucht. Der
+ Begriff, der dabei im Fenster steht, wird gegen den Such-Begriff
+ ausgetauscht. Wird der Begriff nicht ge"andert, ist dies also
+ eine Such-Funktion: der Text bleibt w"ahrend des Such-Vorgangs
+ gleich. Wird der Begriff dagegen ge"andert, wird der ge"anderte
+ Begriff gegen den Such-Begriff ausgetauscht: dies ist also eine
+ Suche-Ersetze-Funktion.
+
+ Mit [Alt+ab] kann Text markiert, mit [F5] ausgeschnitten und
+ mit [F6] an anderer Stelle eingef"ugt werden. Mit [Alt+F5] kann
+ der ausgeschnittene Text vor dem Wieder-Einf"ugen nach Zeilen
+ alphabetisch sortiert werden, was f"ur Literatur-Listen sinnvoll
+ ist. Die Markierung wird mit [Esc] ausgeschaltet.
+
+ Mit [Alt+rechts] kann ein Teil einer Zeile markiert werden.
+ Dieser markierte Text findet sich dann automatisch in der Such-
+ funktion eingetragen. Der markierte Text kann mit [Alt+F8]
+ gel"oscht werden. Mit [Alt+Y] wird eine Kopie dieses Textes an
+ der Stelle des Cursors eingef"ugt. Der Text im Zwischen-Speicher
+ kann in einem mit [Alt+F7] aufrufbaren Fenster modifiziert
+ werden. Ein erstes Dr"ucken von [Esc] l"oscht diese horizontale
+ Text-Markierung; ein zweites Dr"ucken von [Esc] l"oscht die oben
+ genannte vertikale Markierung (falls gleichzeitig auch vertikal
+ mit [Alt+ab] Text markiert worden ist).
+
+ Mit [F7] kann die Zeilenzahl des Bildschirms von 25 auf f"unfzig
+ gesetzt werden. Das verschafft oft "Uberblick. Diese Funktion
+ ist im Fenster-Betrieb unter Windows 3.1 und Windows 95 sinnlos.
+
+ [F8] dient der Auswahl einer von neun Farben. Ganz links in der
+ letzten Zeile von TED.KEY kann eine Zahl (1-9) stehen, die die
+ zugeh"orige Farbkombination zur Standard-Kombination macht, die
+ bei Programm-Start erscheint.
+
+
+
+\subsection{ Ein Word-Wrapping kann den
+ Text beliebig breit machen.
+ }
+
+ [Alt+F9] schaltet ein Word-Wrapping ein oder aus. Wenn es an
+ ist, sieht man auf dem Bildschirm links oben ein `W'. In Zeile
+ neun von TED.CNF ist definiert, ab welcher Grenze das Word-
+ Wrapping einsetzt. Diese Grenze kann auch in ein Eingabe-Fenster
+ eingegeben werden, das man mit [Alt+F10] aufruft. Aktiviert wird
+ das Word-Wrapping beim Dr"ucken der <Space>-Taste, wenn "uber
+ diese Grenze in einer Zeile hinaus-geschrieben wird. Es wird
+ gepr"uft, welches Leer-Zeichen zuletzt vor dieser Grenze steht.
+ Der Text hinter diesem Leer-Zeichen wird an den Anfang der
+ n"achsten Zeile kopiert. Mit dieser Zeile wird genauso verfahren
+ usw, bis eine Zeile innerhalb der Grenze liegt. Falls die Zeile,
+ in der man gerade schreibt, mit Leerzeichen beginnt (einger"uckt
+ ist), wird auf die genannten nachfolgenden Zeilen eine gleiche
+ Menge von Leerzeichen an den Anfang kopiert. Und nach dieser
+ Einr"uckung gilt: In allen diesen Zeilen werden mehrere Leer-
+ Zeichen durch ein einzelnes ersetzt. Das Word-Wrapping wird nur
+ in der Zeile ausgel"ost, in der gerade geschrieben wird. Falls
+ eine Zeile dieser Funktion unterliegen soll, kann mit [Alt+F9]
+ diese Funktion ein- oder ausgeschalten werden. (St"orend ist das
+ Word-Wrapping sicherlich z.B. beim Anfertigen von Tabellen.)
+
+ %% End of File README.TED Timo Baumann
diff --git a/systems/msdos/texshell/readme.ts b/systems/msdos/texshell/readme.ts
new file mode 100644
index 0000000000..e5649a366f
--- /dev/null
+++ b/systems/msdos/texshell/readme.ts
@@ -0,0 +1,153 @@
+(english translation follows below)
+
+Wichtige Informationen zur Version 2.6 der TeXShell:
+Es ist keine Neu-Konfigurierung n”tig, weil die Optionsdateien
+nur wenig ver„ndert wurden; v2.5-Optionsdateien werden fehler-
+frei gelesen. Also: Fr Upgrade TEXSHELL.CFG vor dem Auspacken
+umbenennen. Fr alle: die Datei TS26_.ZIP auspacken mit:
+ pkunzip -d ts26_.zip \
+Dann ggf. die neue TEXSHELL.CFG durch die alte ersetzen. Auf
+jeden Fall die Dokumentation wegen Upgrade lesen!
+
+Wichtige Informationen zur Version 2.5.2 der TeXShell:
+Es ging mal wieder um Fehlerbeseitigung, dadurch ist keine Neu-
+Konfigurierung notwendig. Nur diejenigen, die die Environment-
+Variablen TSTMP oder TMP fr die DSK-Dateien verwendet haben,
+mssen [Directories]TempDir anpassen. Folgende Dateien haben
+sich ge„ndert:
+ TEXSHELL.OVL
+ TEXSHELL.HLP in beiden Verzeichnissen
+ TEXHELP .TXT konsequenterweise auch
+ SYNTAX .TXT
+UPGRADE.BAT sorgt wie unten fr v2.5.1 beschrieben fr den
+einfachen Umstieg. Neu-Einsteiger packen die Datei TS252_.ZIP
+mit dem Befehl
+ pkunzip -d ts252.zip \
+auf dem Laufwerk aus, auf dem emTeX installiert ist.
+
+Wichtige Informationen zur Version 2.5.1 der TeXShell:
+Da es im wesentlichen um die Beseitigung von Fehlern ging, muá die
+neue Version nicht auch neu konfiguriert werden. Zu ersetzen sind
+lediglich folgende Dateien:
+ TEXSHELL.OVL
+ TEXSHELL.HLP in beiden Verzeichnissen
+ TEXHELP .TXT konsequenterweise auch
+ TEXSHELL.TXT in beiden Verzeichnissen --- eigentlich ist nur die
+ Zeile 48 ge„ndert worden.
+Das Entpacken der Datei TS251.ZIP liefert die Dateien README.TS,
+UPGRADE.BAT und TS251_.ZIP. Erstere lesen Sie gerade, letztere enth„lt
+die eigentliche TeXShell; fr eine vollst„ndige Installation muá sie
+im Wurzelverzeichnis des Laufwerks mit emTeX mit PKUNZIP -d TS251_.ZIP
+ausgepackt werden.
+
+Die Batch-Datei UPGRADE.BAT ersetzt nur die oben genannten Dateien.
+Wer die alten Dateien ver„ndert hat, sollte sie vor dem Start der
+Batch-Datei umbenennen und diese Žnderungen an den neuen Dataeien
+wieder durchfhren. PKUNZIP muá ber den PATH erreichbar sein,
+sonst klappt es nicht.
+
+Wichtige Informationen zur Version 2.5 der TeXShell:
+Wer von der Version 2.4 umsteigt, hat keine Probleme: einfach mit
+TS_UPGRD.EXE die Optionsdateien in das neue Format wandeln, in
+TEXSHELL.CFG den Namen der gewnschten Textdatei eintragen (vgl.
+Dokumentation) und fertig.
+
+Fr Umsteiger von „lteren Versionen gilt:
+Der residente Teil der TeXShell heiát jetzt TEXSHELL.COM, nicht
+mehr TEXSHELL.EXE. Die alte Datei TEXSHELL.EXE ist deshalb unbedingt
+zu l”schen. šberflssig geworden und ohne Nachfolger sind folgende
+Dateien:
+ TEXCOLOR.EXE
+ TEXMAIN.OVL
+ TEXMAIN.EXE
+ UPGRADE.EXE
+Man kann sie ohne Bedenken l”schen.
+
+Alte Konfigurationsdateien der Versionen 2.1 bis 2.4 k”nnen mit dem
+Programm TS_UPGRD.EXE in das neue Format konvertiert werden. Das
+gilt nicht fr Beta-Versionen der TeXShell V2.4.
+
+Entgegen frheren Versionen ist das Overlay nicht mehr gepackt. Wer
+einen schnellen Rechner hat, kann TEXSHELL.OVL mit einem EXE-Packer
+behandeln (dazu muá die Datei ggf. umbenannt werden, zB nach TS.EXE;
+danach natrlich wieder zurckbenennen).
+
+ACHTUNG! Der erste Start MUSS mit der Kommandozeilenoption -N durch-
+gefhrt werden! Und bitte lest die Dokumentation, _bevor_ die neue
+TeXShell gestartet wird!
+
+==========================================================
+Important information for TeXShell V2.6:
+The option file format has only slightly changed, so you won't have
+to reconfigure. If you want to keep your current options, rename
+your old TEXSHELL.CFG.
+Unpack TS26_.ZIP with
+ pkunzip -d TS26_.ZIP \
+Now you can replace the new TEXSHELL.CFG with the old one, if you
+like. Please read the documentation in any case!
+
+Important information for TeXShell V2.5.2:
+Again fixing some bugs was the main reason for this release. Therefore
+it doesn't need to be reconfigured, except for [Directories]TempDir
+since TSTMP and TMP are no longer used. Normally, you just replace
+the following files:
+ TEXSHELL.OVL
+ TEXSHELL.HLP in both directories
+ TEXHELP .TXT just to be consistent
+ SYNTAX .TXT
+UPGRADE.BAT will do this minimal upgrade for you as described below
+for v2.5.1. Newcomer can unpack the file ts252_.zip with
+ pkunzip -d ts252.zip \
+on the drive where emTeX is installed.
+
+Important information for TeXShell V2.5.1:
+The new release doesn't change too many things, fixing some bugs
+of V2.5. Therefore it doesn't need to be reconfigured, just replace
+the following files:
+ TEXSHELL.OVL
+ TEXSHELL.HLP in both directories
+ TEXHELP .TXT just to be consistent
+ TEXSHELL.TXT in both directories --- well, only line 48 has been changed
+Unpacking TS251.ZIP leaves three files: README.TS (the one you're reading
+right now), UPGRADE.BAT and TS251_.ZIP; the latter contains the TeXShell
+and should be unpacked in the root directory with option -d of PKUNZIP
+for a complete installation.
+
+The batch file UPGRADE.BAT will only replace the files listed above.
+(the last three in both directories /EMTEX/DOC/ENGLISH and
+/EMTEX/DOC/GERMAN). If you made changes to one of these files,
+you should rename them and apply the changes to the new files as
+well. The batch needs PKUNZIP.EXE in the PATH.
+
+Important information for TeXShell V2.5:
+If you're upgrading from version 2.4, you will have no problems: use
+TS_UPGRD.EXE to convert your option files to the new format, modify
+TEXSHELL.CFG to use the correct text file (see the documentation),
+and you're ready to start.
+
+For those upgrading from an older version:
+The resident part of the TeXShell is now TEXSHELL.COM, no longer
+TEXSHELL.EXE. If you are upgrading from an older version of TeXShell,
+you must delete TEXSHELL.EXE to avoid version mismatch conflicts. The
+following files from TeXShell V2.2(b) are not included in TS25.ZIP
+and can be deleted:
+ TEXCOLOR.EXE
+ TEXMAIN.OVL
+ TEXMAIN.EXE
+ UPGRADE.EXE
+
+Optionsfiles of TeXShell versions 2.1 up to 2.4 can be converted to the
+new format using TS_UPGRD.EXE; this does not work with optionfiles of
+the beta versions of TeXShell V2.4.
+
+In contrast to prior versions, the overlay is not packed. So, if you
+have a fast computer, you may wish to pack TEXSHELL.OVL. To do so, rename
+it to something like TS.EXE, run your favorite EXE packer on it and then
+rename it back to TEXSHELL.OVL.
+
+
+CAUTION! The first start of the new TeXShell version has to be done with
+the -n commandline option:
+ texshell -n
+And PLEASE, read the documentation carefully before starting TeXShell the
+first time!
diff --git a/systems/msdos/texshell/temesy18.lzh b/systems/msdos/texshell/temesy18.lzh
new file mode 100644
index 0000000000..abf1e1f5da
--- /dev/null
+++ b/systems/msdos/texshell/temesy18.lzh
Binary files differ
diff --git a/systems/msdos/text2dvi/text2dvi.doc b/systems/msdos/text2dvi/text2dvi.doc
new file mode 100644
index 0000000000..c93526967f
--- /dev/null
+++ b/systems/msdos/text2dvi/text2dvi.doc
@@ -0,0 +1,665 @@
+===============================================================================
+Dokumentation zum Programm `Text2DVI' - Version 1.03 28.06.1992
+===============================================================================
+
+Inhaltsverzeichnis
+
+1. Allgemeines, Einleitung
+2. Hinweise zur Installation
+3. Aufruf des Programms, Optionen
+ 3.1. Zu bearbeitende Textdatei
+ 3.2. Konfigurationsdateien
+ 3.3. Optionen
+4. Arbeitsweise des Programms
+ 4.1. Interpretation der Textdatei
+ 4.2. Erzeugung der DVI-Datei
+5. Fehlermeldungen
+6. Verschiedenes
+7. Autor, Nutzungsrechte
+
+===============================================================================
+
+1. Allgemeines, Einleitung
+
+Mit TeX und den zugeh”rigen Druckertreibern steht ein leistungsf„higes
+Satzsystem zur Verfgung. Oft sollen aber auch einfache Textdateien (z.B.
+Listings, Programm-Dokumentationen usw.) mit hoher Qualit„t ausgedruckt werden.
+Jeder Drucker sollte natrlich solche Dateien sofort ausdrucken k”nnen, aber
+die Einstellung von Papierformat, R„ndern, Zeichensatz usw. ist von Typ zu Typ
+verschieden, es stehen nur bestimmte Zeichens„tze in festgelegten Gr”áen zur
+Verfgung, eine Informationszeile mit Dateiname und Seitennummer wird nicht
+erzeugt - man ben”tigt also ein spezielles Druckprogramm.
+
+Zu einer funktionsf„higen TeX-Installation geh”rt nun ein Druckertreiber, mit
+dem die von TeX erzeugten DVI-Dateien auf dem jeweils vorhandenen Drucker
+ausgegeben werden k”nnen, das DVI-Format selbst ist ger„teunabh„ngig. Es stehen
+verschiedene Schreibmaschinenschriften zum Ausdruck zur Verfgung, mittels
+METAFONT k”nnen sie ggf. auch in beliebigen Gr”áen berechnet werden.
+
+Das Programm Text2DVI erzeugt aus einer Textdatei ohne Umweg ber TeX direkt
+eine DVI-Datei. Es kommt dabei mit nur einem Font aus, Grafik- und
+Sonderzeichen, die nicht in den Schreibmaschinen-Zeichens„tzen (z.B. cmtt10)
+enthalten sind, werden aus anderen Zeichen bzw. geraden Linien m”glichst gut
+zusammengesetzt. Da das Programm TFM-Dateien lesen kann, k”nnen auch Fonts
+verwendet werden, die nicht standardm„áig zu TeX geh”ren (z.B. cmpica). Jede
+Seite wird mit einer gerahmten Kopfzeile versehen, die u.A. den Namen der
+gedruckten Datei und die Seitennummer enth„lt. Das Seitenformat, die Auswahl
+von Zeichensatz und VergrӇerung sowie weitere Programmfunktionen werden durch
+Optionen gesteuert. Immer wieder verwendete Einstellungen k”nnen dabei in
+Konfigurationsdateien abgespeichert werden.
+
+Text2DVI ist mit Turbo-Pascal 6.0 erstellt worden. Es arbeitet relativ schnell:
+auf einem 12 MHz AT-286 setzt es seinen eigenen Quelltext (68 KByte in 2300
+Zeilen) in 3.5 Sekunden in eine 78 KByte groáe DVI-Datei mit 36 Seiten um.
+
+===============================================================================
+
+2. Hinweise zur Installation
+
+Das Programm Text2DVI stellt keine besonderen Anforderungen an die Hardware und
+l„uft hoffentlich auf jedem `Kompatiblen'. Es ist kein numerischer Coprozessor
+erforderlich. Als Betriebssystem muá mindestens MS-DOS 3.3 verwendet werden.
+Text2DVI wertet die Environment-Variable TeXTFM aus, um TFM-Dateien zu finden.
+Die entsprechenden Pfade sollten also mit SET TeXTFM= dort eingetragen werden,
+falls das nicht schon in der vorhandenen TeX-Installation gemacht wurde (emTeX
+z.B. verwendet dieselbe Environment-Variable).
+
+===============================================================================
+
+3. Aufruf des Programms, Optionen
+
+Alle Informationen, die Text2DVI fr seine Arbeit ben”tigt, werden dem Programm
+beim Aufruf in der Kommandozeile mitgeteilt, nach Programmstart werden keine
+Eingaben des Benutzers mehr erwartet. Das Programm kann somit auf einfache
+Weise auch im Batch-Betrieb verwendet werden. Eine kurze deutsche Hilfestellung
+zur Arbeitsweise des Programms und zu den Optionen erh„lt man durch folgenden
+Aufruf:
+
+Text2DVI ?
+
+Auáer dieser Hilfestellung erfolgen alle weiteren Meldungen des Programms
+in englischer Sprache (fr's TeX-Feeling ...). (bitte keine Prgel ... !)
+
+Es gibt drei verschiedene Arten von Argumenten in der Kommandozeile: 1.) Der
+Name der zu bearbeitenden Textdatei, 2.) Befehl zum Lesen einer
+Konfigurationsdatei und 3.) Optionen. Zwei Argumente mssen durch mindestens
+ein Leer- oder Tabulatorzeichen voneinander getrennt werden, innerhalb eines
+Arguments drfen weder Leer- noch Tabulatorzeichen stehen. Die Argumente werden
+der Reihe nach abgearbeitet.
+
+-------------------------------------------------------------------------------
+
+3.1 Zu bearbeitende Textdatei
+
+Der Name der zu bearbeitenden Textdatei erh„lt keine besondere Kennzeichnung,
+er muá vollst„ndig mit Erweiterung und ggf. Pfadangabe geschrieben werden. Sind
+mehrere Dateinamen angegeben worden, z„hlt der letzte Name. Beispiele:
+
+Text2DVI TEST
+--> Die Datei TEST. wird bearbeitet.
+
+Text2DVI TEST C:\DOCS\TEST.DOC
+--> Die Datei C:\DOCS\TEST.DOC wird bearbeitet.
+
+Es muá nicht unbedingt eine Textdatei zur Bearbeitung angegeben werden, wenn
+man z.B. nur das Seitenformat anpassen oder berprfen will (sinnvollerweise
+in Verbindung mit der Option /i). Nach Abarbeitung aller Optionen beendet das
+Programm dann seine Arbeit mit der Meldung:
+
+I have nothing to do! (Help: Text2DVI ?)
+
+Wenn die Textdatei bearbeitet wird, wird „hnlich zu TeX zur Information der
+Dateiname in runden Klammern und die aktuelle Seitennummer in eckigen Klammern
+angezeigt. Ist die Datei nicht vorhanden, bricht das Programm ab mit der
+Meldung: (# steht fr den Dateinamen)
+
+I can't find file `#'.
+
+-------------------------------------------------------------------------------
+
+3.2. Konfigurationsdateien
+
+Immer wieder verwendete Optionen k”nnen in Konfigurationsdateien gespeichert
+werden. Es handelt sich um einfache ASCII-Dateien, die z.B. mit einem Editor
+erstellt werden k”nnen. Argumente in Konfigurationsdateien mssen durch
+mindestens ein Leer- oder Tabulatorzeichen oder aber durch einen Zeilenvorschub
+(CR, danach eventuell LF) voneinander getrennt werden, Leerzeilen sind erlaubt.
+Es k”nnen Kommentare eingefgt werden: nach einem Prozent-Zeichen `%' wird der
+Rest der Zeile ignoriert. Aus einer Konfigurationsdatei heraus k”nnen keine
+weiteren gelesen werden, als Argumente drfen also nur Optionen und der Name
+der zu bearbeitenden Textdatei in Konfigurationsdateien stehen.
+
+Das Lesen einer Konfigurationsdatei wird veranlaát, indem dem Namen der Datei
+das Zeichen `@' vorangestellt wird. Ist der Name ohne Erweiterung geschrieben,
+wird .CFG angeh„ngt. Beispiele:
+
+Text2DVI @TEST
+--> Konfigurationsdatei TEST.CFG wird gelesen.
+
+Text2DVI @TEST.CNF
+--> Konfigurationsdatei TEST.CNF wird gelesen.
+
+Text2DVI @C:\CFGS\TEST.
+--> Konfigurationsdatei C:\CFGS\TEST. wird gelesen.
+
+Existiert im aktuellen Verzeichnis eine Datei Namens Text2DVI.CFG, so wird
+diese automatisch vor Auswertung aller brigen Optionen gelesen. Ist das nicht
+der Fall, wird in dem Verzeichnis, in dem das Programm Text2DVI.EXE steht, nach
+einer Datei Text2DVI.CFG gesucht und, falls vorhanden, ausgewertet. Wenn eine
+Konfigurationsdatei gelesen wird, wird zur Information der Dateiname in runden
+Klammern angezeigt. Ist die Datei nicht vorhanden, bricht das Programm ab mit
+der Meldung: (# steht fr den Dateinamen)
+
+I can't find file `#'.
+
+-------------------------------------------------------------------------------
+
+3.3. Optionen
+
+Optionen bestehen aus einem Schr„gstrich `/' oder einem Bindestrich `-' und
+einem Buchstaben, bei manchen Optionen muá noch ein weiterer Parameter # folgen
+(# kann z.B. fr eine L„nge oder einen Dateinamen stehen). Zwischen Buchstaben
+und # darf dann noch ein Doppelpunkt `:' oder ein Gleichheitszeichen `='
+stehen. Gltige Schreibweisen fr Optionen sind z.B.
+
+Option /a: /a /A -a -A
+Option /f#: /f12 /F12 -f12 -F12 /f:12 /F:12 -f:12 -F:12 /f=12 /F=12 -f=12 -F=12
+
+Ist eine Option falsch geschrieben und kann nicht ausgewertet werden, bricht
+das Programm ab mit der Meldung: (# steht fr die fehlerhafte Option)
+
+Error: Invalid Option `#'. (Help: Text2DVI ?)
+
+Manche Optionen arbeiten als Schalter und k”nnen nur gesetzt werden (z.B. /b),
+es ist dann unerheblich, ob die Option einmal oder mehrfach angegeben wurde.
+Andere (z.B. L„ngenangaben) berschreiben die zuvor gemachten Einstellungen. Zu
+beachten ist, daá die Option /f11 auch die Einstellung von /s# „ndert und sich
+die Optionen /l#, /w# und /x# bzw. /t#, /h# und /y# gegenseitig beeinflussen.
+
+
+/? Hilfestellung Option /?
+-------------------------------------------------------------------------------
+Es wird eine kurze deutsche Hilfestellung zur Arbeitsweise des Programms und zu
+den Optionen angezeigt, das Programm wird darauf abgebrochen, d.h. es findet
+keine weitere Bearbeitung statt. Die Hilfestellung erh„lt man auch, wenn man
+als erstes Argument ein Fragezeichen alleine eingibt: Text2DVI ?
+
+
+/h Hilfestellung Option /h
+-------------------------------------------------------------------------------
+Es wird eine kurze deutsche Hilfestellung zur Arbeitsweise des Programms und zu
+den Optionen angezeigt, das Programm wird darauf abgebrochen, d.h. es findet
+keine weitere Bearbeitung statt. Die Hilfestellung wird nur angezeigt, wenn
+/h alleine steht, normalerweise stellt /h# mit L„ngenangabe # die Texth”he ein.
+
+
+/i Informationen zum Format anzeigen Option /i
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Wenn die Option /i gesetzt ist, werden nach
+Auswertung aller anderen Optionen einige Informationen zum Seitenformat und zum
+Zeichensatz angezeigt, das folgende Beispiel zeigt die Standardeinstellungen:
+
+Lines : 66 per page
+Characters : 86 per line
+Font & size : cmtt10 scaled 1000
+Line skip : 3.6 mm (= 0.141 in, = 10.2 pt)
+Top margin : 25.4 mm (= 1.000 in, = 72.3 pt)
+Left margin : 25.4 mm (= 1.000 in, = 72.3 pt)
+Height : 246.2 mm (= 9.693 in, = 700.5 pt)
+Width : 159.2 mm (= 6.268 in, = 453.0 pt)
+Height (eff.) : 244.8 mm (= 9.636 in, = 696.4 pt)
+Width (eff.) : 158.7 mm (= 6.247 in, = 451.5 pt)
+
+Height und Width stehen fr die L„ngen, die durch die Optionen vorgegeben
+werden. Height (eff.) und Width (eff.) stehen fr die L„ngen, die sich unter
+Bercksichtigung der Breite eine Zeichens und Zeilenabstands tats„chlich
+ergeben. Es gilt immer: Height (eff.) <= Height, Width (eff.) <= Width. Die
+Kopfzeile hat die Breite Width.
+
+
+/o# #[.DVI] = Pfad/Name der DVI-Datei Option /o#
+-------------------------------------------------------------------------------
+Normalerweise wird die DVI-Datei im aktuellen Verzeichnis erzeugt, ihr Name
+ergibt sich aus dem Namen der zu bearbeitenden Textdatei, der mit der
+Erweiterung .DVI versehen wird. Mit der Option /o# k”nnen diese Einstellungen
+ge„ndert werden. Die folgenden Beispiele zeigen die Wirkung der Option /o#,
+dabei sei TEST.TXT der Name der zu bearbeitenden Textdatei:
+
+Text2DVI TEST.TXT
+--> Die DVI-Datei ist TEST.DVI im aktuellen Verzeichnis.
+
+Text2DVI TEST.TXT /oD:
+--> Die DVI-Datei ist TEST.DVI im aktuellen Verzeichnis auf Laufwerk D:.
+
+Text2DVI TEST.TXT /oDVIS\
+--> Die DVI-Datei ist DVIS\TEST.DVI, wenn DVIS ein Unterverzeichnis ist.
+
+Text2DVI TEST.TXT /oDVIS
+--> Die DVI-Datei ist DVIS\TEST.DVI, wenn DVIS ein Unterverzeichnis ist,
+ sonst DVIS.DVI im aktuellen Verzeichnis.
+
+Text2DVI TEST.TXT /oDVIS.OUT
+--> Die DVI-Datei ist DVIS.OUT\TEST.DVI, wenn DVIS.OUT ein
+ Unterverzeichnis ist, sonst DVIS.OUT im aktuellen Verzeichnis.
+
+Text2DVI TEST.TXT /oD:\DVIS\OUTPUT
+--> Die DVI-Datei ist D:\DVIS\OUTPUT\TEST.DVI, wenn D:\DVIS\OUTPUT ein
+ Verzeichnis ist, sonst D:\DVIS\OUTPUT.DVI.
+
+
+/b Gr”áeren Zeilenabstand w„hlen Option /b
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Normalerweise w„hlt Text2DVI einen relativ
+knappen Zeilenabstand. Wenn die Option /b gesetzt ist, werden gr”áere Abst„nde
+eingestellt, die ungef„hr denen entsprechen, die auch LaTeX verwendet. Die
+folgende Tabelle zeigt ein paar Beispiele:
+
+Zeichensatz Abstand ohne /b Abstand mit /b
+-----------------------------------------------------
+cmtt8 scaled 1000 8.1 pt 9.6 pt
+cmtt9 scaled 1000 9.2 pt 10.8 pt
+cmtt10 scaled 1000 10.2 pt 12.1 pt
+cmtt10 scaled 1095 11.1 pt 13.2 pt
+cmtt12 scaled 1000 12.2 pt 14.6 pt
+
+
+/e Leerzeilen auch am Seitenanfang Option /e
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Normalerweise unterdrckt Text2DVI bei der
+Ausgabe Leerzeilen am Anfang einer Seite, so daá die erste Zeile auf einem
+Blatt immer Text enth„lt. Wenn die Option /e gesetzt ist, werden alle
+Leerzeilen ausgegeben, auch wenn sie am Anfang einer Seite stehen.
+
+
+/n Kein Seitenkopf Option /n
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Normalerweise erscheint auf jeder Seite
+eine gerahmte Kopfzeile, die u.A. den Namen der gedruckten Datei und die
+Seitennummer enth„lt. Wenn die Option /n gesetzt ist, wird diese Kopfzeile
+unterdrckt, es passen dann 2 bis 3 Zeilen mehr auf das Blatt.
+
+
+/g Deutscher Seitenkopf Option /g
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Normalerweise wird in der Kopfzeile dem
+Dateinamen das Wort `File:' und der Seitennummer `Page:' vorangestellt. Wenn
+die Option /g gesetzt ist, werden stattdessen `Datei:' und `Seite:' verwendet.
+Ist gleichzeitig auch die Option /n gesetzt, bleibt /g ohne Wirkung.
+
+
+/c Seiten vorher durchz„hlen Option /c
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Normalerweise macht Text2DVI nur einen
+Durchlauf durch die Textdatei und weiá somit am Anfang noch nicht, wieviele
+Seiten die Datei insgesamt enth„lt. Wenn die Option /c gesetzt ist, erfolgen
+zwei Durchl„ufe und in der Kopfzeile steht statt `Page: n' nun 'Page: n of m'
+und bei gesetzter Option /g statt `Seite: n' nun `Seite: n von m'. Dabei steht
+n fr die laufende Seitennummer und m fr die Gesamtzahl der Seiten. Weil zwei
+Durchl„ufe durch die Textdatei erfolgen, verdoppelt sich die Bearbeitungszeit.
+
+
+/s# Skalierung Option /s#
+-------------------------------------------------------------------------------
+Mit der Option /s# kann die Skalierung des Zeichensatzes eingestellt werden.
+Normalerweise werden Zeichens„tze in ihrer Entwurfsgr”áe verwendet. Die Angabe
+der VergrӇerung kann in Magsteps oder in Promille erfolgen. Ist # nur ein
+Zeichen, werden Magsteps angenommen, erlaubt ist dann # = 0, 1, 2,..., 9 fr
+einen scaled-Faktor von (1000 * 1.2 ^ #) oder # = h, H fr (1000 * 1.2 ^ 0.5).
+Umfaát # mehr als ein Zeichen, wird eine direkte Angabe des scaled-Faktors in
+Promille angenommen, /s1200 hat also denselben Effekt wie /s1. Zur Vermeidung
+von Rundungsfehlern sollten m”glichst Magsteps verwendet werden. Achtung: Die
+Option /f11 setzt automatisch auch /sh !
+
+
+/f# Font Option /f#
+-------------------------------------------------------------------------------
+Mit der Option /f# kann der Zeichensatz eingestellt werden. Text2DVI kennt
+bereits die Zeichens„tze cmtt8, cmtt9, cmtt10 und cmtt12, fr diese sind keine
+TFM-Dateien erforderlich. Diese Fonts k”nnen durch # = 8, 9, 10, 11 oder 12
+angew„hlt werden; /f11 wird intern zu /f10 /sh umgesetzt, beeinfluát also auch
+die Skalierung. Andere Zeichens„tze (z.B. die Standard-TeX-Fonts cmtcsc10,
+cmsltt10, cmitt10 oder Nicht-Standard-Fonts wie z.B. cmpica) k”nnen angew„hlt
+werden, indem fr # der Name der zugeh”rigen TFM-Datei eingesetzt wird.
+
+Ist der Name der TFM-Datei ohne Erweiterung geschrieben, wird .TFM angeh„ngt.
+Ein Pfad kann vorangestellt werden, die TFM-Datei wird dann nur in dem
+angegebenen Verzeichnis gesucht. Wurde der Name ohne Pfadangabe geschrieben,
+wird die TFM-Datei zun„chst im aktuellen Verzeichnis gesucht, danach wird die
+Environment-Variable TeXTFM ausgewertet und alle darin genannten Verzeichnisse
+durchsucht (Mehrere Pfadangaben mssen durch jeweils ein Semikolon `;'
+voneinander getrennt sein). Wenn eine TFM-Datei gelesen wird, wird zur
+Information der Dateiname in runden Klammern angezeigt. Ist die Datei nicht
+vorhanden, bricht das Programm ab mit der Meldung: (# steht fr den Dateinamen)
+
+I can't find file `#'.
+
+Es k”nnen nicht beliebige Zeichens„tze bzw. TFM-Dateien in Verbindung mit
+Text2DVI verwendet werden: Die TFM-Datei muá kleiner als 28 KByte sein (was in
+der Praxis wohl keine Beschr„nkung darstellt), alle Zeichen mssen dieselbe
+Breite besitzen (Fixschriften), die Zeichen 0 bis 127 mssen im Font vorhanden
+sein, und Entwurfsgr”áe, Zeichenbreite und Zeichenh”he drfen nicht Null sein.
+Ist eine dieser Bedingungen nicht erfllt, reagiert Text2DVI mit einer der
+folgenden Fehlermeldungen und bricht die Ausfhrung ab:
+
+Error: TFM file contains more than # bytes!
+Error: Characters don't have the same width!
+Error: Font contains less than 128 characters!
+Error: Font is not suitable for use with Text2DVI!
+
+
+Einstellung des Seitenformats Optionen /w# /h# /l# /t# /x# /y# /a
+-------------------------------------------------------------------------------
+Es gibt zwei verschiedene M”glichkeiten, das Seitenformat einzustellen: Zum
+einen kann man den linken Rand und die Textbreite als L„nge vorgeben, Text2DVI
+berechnet dann, wieviele Zeichen in eine Zeile passen (nachfolgend Modus A
+genannt). Zum anderen kann man die Zahl der Zeichen pro Zeile vorgeben,
+Text2DVI berechnet Rand und Textbreite, damit die Zeilen auf dem Blatt
+zentriert erscheinen (Modus B). Enstprechendes gilt fr den oberen Rand, die
+Texth”he und die Zahl der Zeilen pro Seite. Die Modi fr die horizontale und
+vertikale Richtung sind unabh„ngig voneinander.
+
+Im Modus A mssen L„ngenangaben gemacht werden: L„ngen bestehen aus Zahl und
+Einheit, es k”nnen die TeX-blichen Einheiten verwendet werden (cm, mm, in, pt,
+cc, dd und sp). Im Modus B muá die Papiergr”áe bekannt sein, die Formate A4 und
+A5 werden untersttzt. Die Grundeinstellung von Text2DVI ist Modus A mit 1 in
+Rand links und oben, Textbreite und -h”he sind so gew„hlt, daá sich auf Papier
+im Format A4 rechts und unten ebenfalls 1 in Rand ergibt. Das Programm geht
+davon aus, daá der DVI-Treiber ebenfalls links und oben einen Rand von 1 in
+einfgt (TeX-Standard).
+
+
+/w# Textbreite Option /w#
+-------------------------------------------------------------------------------
+Die Option /w# stellt die Textbreite ein, # ist eine L„nge. Falls der Modus B
+aktiviert war, wird wieder Modus A fr die horizontale Richtung gew„hlt, der
+linke Rand erh„lt seinen alten Wert (vor Umschaltung in Modus B) zurck.
+
+
+/h# Texth”he Option /h#
+-------------------------------------------------------------------------------
+Die Option /h# stellt die Texth”he ein, # ist eine L„nge. Falls der Modus B
+aktiviert war, wird wieder Modus A fr die vertikale Richtung gew„hlt, der
+obere Rand erh„lt seinen alten Wert (vor Umschaltung in Modus B) zurck.
+
+
+/l# Linker Rand Option /l#
+-------------------------------------------------------------------------------
+Die Option /l# stellt den linken Rand ein, # ist eine L„nge. Falls der Modus B
+aktiviert war, wird wieder Modus A fr die horizontale Richtung gew„hlt, die
+Textbreite erh„lt ihren alten Wert (vor Umschaltung in Modus B) zurck.
+
+
+/t# Oberer Rand Option /t#
+-------------------------------------------------------------------------------
+Die Option /t# stellt den oberen Rand ein, # ist eine L„nge. Falls der Modus B
+aktiviert war, wird wieder Modus A fr die vertikale Richtung gew„hlt, die
+Texth”he erh„lt ihren alten Wert (vor Umschaltung in Modus B) zurck.
+
+
+/x# Zeichen pro Zeile Option /x#
+-------------------------------------------------------------------------------
+Die Option /x# stellt # Zeichen pro Zeile ein. Falls der Modus A aktiviert war,
+wird Modus B fr die horizontale Richtung gew„hlt. Linker Rand und Textbreite
+werden so eingestellt, daá die Zeilen auf dem Blatt zentriert erscheinen.
+
+
+/y# Zeilen pro Seite Option /y#
+-------------------------------------------------------------------------------
+Die Option /y# stellt # Zeilen pro Seite ein. Falls der Modus A aktiviert war,
+wird Modus B fr die vertikale Richtung gew„hlt. Oberer Rand und Texth”he
+werden so eingestellt, daá die Zeilen auf dem Blatt zentriert erscheinen.
+
+
+/a Papierformat A5 Option /a
+-------------------------------------------------------------------------------
+Diese Option arbeitet als Schalter. Um im Modus B die Zeilen auf dem Blatt
+zentrieren zu k”nnen, muá Text2DVI das Format des Papiers kennen. Normalerweise
+ist als Format A4 eingestellt. Wenn die Option /a gesetzt ist, wird als Format
+A5 angenommen. Diese Option schaltet den Modus nicht um, im Modus A bleibt sie
+ohne Wirkung.
+
+
+Beispiele zur Einstellung des Seitenformats: Beispiele
+-------------------------------------------------------------------------------
+Text2DVI /i
+--> Format A4, auf jeder Seite 1 in Rand, Informationen anzeigen.
+
+Text2DVI /x80 /y66 /i
+--> Format A4, 80 Zeichen pro Zeile, 66 Zeilen pro Seite, zentriert, Info.
+
+Text2DVI /t20mm /h25.7cm /w170mm /l2cm /i
+--> Format A4, auf jeder Seite 2 cm Rand, Informationen anzeigen.
+
+Text2DVI /x80 /a /y60 /f8 /i
+--> Format A5, mit kleinem Zeichensatz, 80 Zeichen pro Zeile,
+ 66 Zeilen pro Seite, zentriert, Informationen anzeigen.
+
+Text2DVI /x80 /i
+--> Format A4, horizontal Modus B mit 80 Zeichen pro Zeile zentriert,
+ vertikal Modus A mit Grundeinstellung von 1 in oberen Rand, Info.
+
+Text2DVI /w170mm /x80 /y66 /l20mm /i
+--> Format A4, horizontal Modus A mit 20 mm linker Rand und 170 mm Textbreite,
+ vertikal Modus B mit 66 Zeilen pro Seite zentriert, Informationen anzeigen.
+
+===============================================================================
+
+4. Arbeitsweise des Programms
+
+Im folgenden Abschnitt wird beschrieben, wie Text2DVI nach Auswertung der
+Optionen die zu bearbeitende Textdatei interpretiert und daraus eine DVI-Datei
+erzeugt.
+
+-------------------------------------------------------------------------------
+
+4.1. Interpretation der Textdatei
+
+Text2DVI verarbeitet Textdateien mit einem erweiterten 8-bit ASCII-Zeichensatz,
+die Belegung der Zeichen mit ASCII-Code > 127 entspricht dabei der Codepage 437
+(manchmal auch als PC-8 Zeichensatz bezeichnet). Einige ASCII-Zeichen erfllen
+eine besondere Funktion: CR (Carriage Return, ASCII-Code 13), LF (Line Feed,
+ASCII-Code 10), FF (Form Feed, ASCII-Code 12), TAB (Tabulator, ASCII-Code 9)
+und EOF (End of File, ASCII-Code 26). Alle brigen werden als druckbare Zeichen
+behandelt und mehr oder weniger gut gelungen ausgegeben.
+
+Die Zeichen CR (13) und LF (10) bewirken einen Zeilenvorschub. Folgt auf CR
+ein LF bzw. auf LF ein CR, werden die Zeichen paarweise zusammengefaát, jedes
+Paar erzeugt nur eine neue Zeile. Folgende Kombinationen erzeugen also nur
+einen Zeilenvorschub: `CR', `LF', `CR LF' und `LF CR'. Zwei Zeilenvorschbe
+(d.h. eine Leerzeile) werden dagegen durch folgende Kombinationen erzeugt:
+`CR CR', `LF LF', `CR CR LF', `CR LF CR', `LF CR CR', `LF LF CR', `LF CR LF',
+`CR LF LF', `CR LF CR LF', `LF CR LF CR', `CR LF LF CR' und `LF CR CR LF'.
+
+Tabulatorzeichen TAB (9) werden zu Leerzeichen expandiert, Tabulatorstops sind
+in den Spalten (8 * i + 1) mit i = 1, 2, 3, usw. Leer- und Tabulatorzeichen am
+Ende einer Zeile werden ignoriert (d.h. Zeilen werden nicht gebrochen, wenn
+sie durch Leer- oder Tabulatorzeichen an ihrem Ende l„nger als die maximale
+Zeilenl„nge werden).
+
+Das Zeichen FF (12) bewirkt einen Seitenvorschub. Die aktuelle Zeile wird
+beendet und auf einer neuen Seite eine neue Zeile begonnen. Falls die Option /e
+gesetzt wurde, wird auf der neuen Seite eine Leerzeile ausgegeben, wenn auf FF
+noch ein Zeilenvorschub folgt!
+
+Das Zeichen EOF (26) wird als Ende der Textdatei interpretiert, nachfolgende
+Zeichen werden ignoriert. Eine Textdatei muá aber nicht unbedingt mit EOF
+beendet werden, Text2DVI liest dann bis zum physikalischen Ende der Datei.
+
+-------------------------------------------------------------------------------
+
+4.2. Erzeugung der DVI-Datei
+
+Jede Ausgabeseite wird mit einer gerahmten Kopfzeile versehen, es sei denn, die
+Option /n wurde gesetzt. In der Kopfzeile stehen der Name der Textdatei, die
+laufende Seitennummer und Datum und Uhrzeit der Textdatei (d.h. der Zeitpunkt
+der letzten Žnderung). Wurde die Option /c gesetzt, wird auáerdem noch die
+gesamte Seitenzahl angegeben, bei gesetzter Option /g erh„lt man eine Kopfzeile
+in deutscher Sprache. Die Kopfzeile hat ungef„hr folgendes Aussehen:
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+³ 28.06.1992 / 01:02:00 ³ Page: 1 ³ File: TEXT2DVI.PAS ³
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+Bei Verwendung der Option /c erh„lt man:
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+³ 28.06.1992 / 01:02:00 ³ Page: 1 of 36 ³ File: TEXT2DVI.PAS ³
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+Und bei Verwendung der Option /g (und /c) ergibt sich schlieálich:
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+³ 28.06.1992 / 01:02:00 ³ Seite: 1 von 36 ³ Datei: TEXT2DVI.PAS ³
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+
+Bei Bedarf (groáe Zeichens„tze, starke Vergr”áerung, kleine Textbreite) wird
+die Kopfzeile in zwei Stufen verkrzt und sieht dann ungef„hr wie folgt aus:
+ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÂÄÄÄÄÄÄÄÄÄÂÄÄ¿
+³ 28.06.1992 ³ 1 / 36 ³ TEXT2DVI.PAS ³ oder ³ ³ 12/36 ³ ³
+ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÁÄÄÄÄÄÄÄÄÄÁÄÄÙ
+
+Wird die Bearbeitung einer Seite begonnen, wird „hnlich zu TeX auf dem Monitor
+eine eckige Klammer ge”ffnet und die Seitennummer angezeigt, am Seitenende wird
+die Klammer wieder geschlossen. Leerzeilen am Seiteanfang werden ignoriert, so
+daá die erste Zeile auf dem Blatt immer Text enth„lt. Ist die Option /e
+gesetzt, werden allerdings auch Leerzeilen am Seitenanfang ausgegeben. Zum Ende
+der Bearbeitung werden noch einige Daten wie Name und GrӇe der DVI-Datei auf
+dem Bildschirm angezeigt.
+
+šberschreitet eine Zeile die maximale Zeilenl„nge, wird sie gebrochen. Die
+Fortsetzungszeile wird mit drei Punkten ... begonnen, um den den Umbruch
+anzuzeigen (die Punkte haben im Ausdruck die Breite von nur zwei Zeichen!). Zur
+Information des Benutzers werden bei jedem Umbruch auf dem Bildschirm ebenfalls
+drei Punkte ... angezeigt. Text2DVI kann beliebig lange Zeilen bearbeiten, es
+werden Fortsetzungszeilen in entsprechender Zahl erzeugt.
+
+Da nicht jedes Zeichen des erweiterten ASCII-Zeichensatzes in den TeX-Fonts
+vorhanden ist, mssen viele Zeichen aus anderen zusammengesetzt werden, was
+mehr oder weniger gut gelingt. Zeichen, die das Aussehen eines Textes
+wesentlich bestimmen, wurden m”glichst gut nachgebildet; andere wie z.B. die
+kleinen griechischen Buchstaben und einige mathematische Sonderzeichen sind
+lediglich `identifizierbar'. Die Grafik-Zeichen werden durch Linien erzeugt, in
+der gegenw„rtigen Version werden jedoch alle Zeichen nur mit einfachen Linien
+dargestellt. Control-Zeichen (ASCII-Codes 0 bis 31) werden durch berstrichene
+Groábuchstaben oder Ziffern dargestellt.
+
+Auf eine lange Beschreibung zur Umsetzung der einzelnen Zeichen wird hier
+verzichtet. Am Besten l„át man die nachfolgende Tabelle oder die Datei
+`Text2DVI.TBL' (die auch die Control-Zeichen enth„lt) einmal von Text2DVI
+bearbeiten und sieht sich das Ergebnis an.
+
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | 032 - 047 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? | 048 - 063 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | 064 - 079 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ | 080 - 095 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | 096 - 111 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ |  | 112 - 127 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| € | | ‚ | ƒ | „ | … | † | ‡ | ˆ | ‰ | Š | ‹ | Œ | | Ž | | 128 - 143 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| | ‘ | ’ | “ | ” | • | – | — | ˜ | ™ | š | › | œ | | ž | Ÿ | 144 - 159 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+|   | ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ | © | ª | « | ¬ | ­ | ® | ¯ | 160 - 175 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| ° | ± | ² | ³ | ´ | µ | ¶ | · | ¸ | ¹ | º | » | ¼ | ½ | ¾ | ¿ | 176 - 191 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| À | Á | Â | Ã | Ä | Å | Æ | Ç | È | É | Ê | Ë | Ì | Í | Î | Ï | 192 - 207 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| Ð | Ñ | Ò | Ó | Ô | Õ | Ö | × | Ø | Ù | Ú | Û | Ü | Ý | Þ | ß | 208 - 223 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| à | á | â | ã | ä | å | æ | ç | è | é | ê | ë | ì | í | î | ï | 224 - 239 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+| ð | ñ | ò | ó | ô | õ | ö | ÷ | ø | ù | ú | û | ü | ý | þ | ÿ | 240 - 255 |
++---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-----------+
+
+===============================================================================
+
+5. Fehlermeldungen
+
+Im Folgenden sind alle Meldungen aufgefhrt,
+mit denen Text2DVI vorzeitig abbrechen kann.
+
+Laufzeitfehler, die vom Betriebssystem erkannt werden:
+------------------------------------------------------
+Error: File not found.
+Error: Directory not found.
+Error: Too many files opened.
+Error: Access denied.
+Error: Invalid drive.
+Error: Disk full.
+Error: I/O-Access failed.
+Error: Disk write protected.
+Error: Drive not ready.
+Error: Hardware failure.
+Error: Internal error.
+
+Fehler, die von Text2DVI erkannt werden:
+----------------------------------------
+Error: Invalid Option `#'. (Help: Text2DVI ?)
+Error: TFM file contains more than # bytes!
+Error: Characters don't have the same width!
+Error: Font contains less than 128 characters!
+Error: Font is not suitable for use with Text2DVI!
+Error: Internal character table corrupted!
+
+Sonstige Abbruchbedingunen (keine Fehler):
+------------------------------------------
+I can't find file `#'.
+I have nothing to do! (Help: Text2DVI ?)
+
+===============================================================================
+
+6. Verschiedenes
+
+Die Beschreibung des DVI- und TFM-Formats wurde den Dateien `dvi.tex' und
+`tfm.tex' entnommen, die sich auf dem FTP-Server rusinfo.rus.uni-stuttgart.de
+[129.69.1.12] im Verzeichnis /soft/tex/drivers/driv-standard/level-0 befinden.
+
+Neben der Beseitigung von hoffentlich nicht allzu zahlreich auftretenden
+Fehlern sind folgende Verbesserungen des Programms geplant (gleich nach
+Entwicklung des 48-Stunden-Tages!):
+
+- Zus„tzliche Verwendung mathematischer Schreibmaschinenschriften (wie z.B.
+ cmtex10), falls vorhanden; damit k”nnen dann kleine griechische Buchstaben
+ und viele mathematische Zeichen besser dargestellt werden.
+- Richtige Wiedergabe aller Grafik-Zeichen (ggf. mit doppelten Linien).
+
+Anregungen, Hinweise zu Fehlern und konstruktive Kritik bitte an die weiter
+unten genannte Adresse schicken, m”glichst per e-Mail.
+
+===============================================================================
+
+7. Autor, Nutzungsrechte
+
+Autor:
+
+Andreas Hitzke
+Buntenb”cker Straáe 37
+W-3392 Clausthal-Zellerfeld
+
+InterNet-Adresse fr e-Mail: peah@ibm.rz.tu-clausthal.de
+
+
+Alle Rechte am Programm Text2DVI liegen beim zuvor genannten Autor. Das
+Programm und die Dokumentation wurden nach bestem Wissen erstellt und mit
+Sorgfalt getestet und geprft, dennoch sind Fehler nicht auszuschlieáen.
+Es wird keine Garantie, weder ausdrcklich noch angedeutet, fr bestimmte
+Eigenschaften oder fr eine fehlerfreie Funktion des Programms gegeben. Fr
+Folgen und Sch„den, die direkt oder indirekt durch Benutzung des Programms
+enstehen, wird vom Autor weder Verantwortung noch Haftung bernommen. Das
+Risiko tr„gt allein der Benutzer des Programms.
+
+Das Programm Text2DVI kann frei benutzt werden. Es darf kopiert und
+weitergegeben werden, wenn dies unentgeldlich oder h”chstens zum
+Selbstkostenpreis (fr Material und Versand) erfolgt und die drei Dateien
+Text2DVI.EXE, Text2DVI.DOC und Text2DVI.TBL zusammen und in unver„nderter Form
+weitergegeben werden (ggf. zusammengefaát in einer Archiv-Datei). Das Programm
+darf zusammen mit anderen Programmen oder Programm-Paketen vertrieben werden,
+solange die voranstehenden Bedingungen nicht verletzt werden. Die Verbreitung
+des Programms ber elektronische Netze, Mailboxen o.„. ist ausdrcklich
+erwnscht.
+
+===============================================================================
+Ende der Dokumentation zum Programm `Text2DVI' - V 1.03 28.06.1992
+===============================================================================
diff --git a/systems/msdos/text2dvi/text2dvi.tbl b/systems/msdos/text2dvi/text2dvi.tbl
new file mode 100644
index 0000000000..a148fafdb2
--- /dev/null
+++ b/systems/msdos/text2dvi/text2dvi.tbl
Binary files differ
diff --git a/systems/msdos/tx/copying b/systems/msdos/tx/copying
new file mode 100644
index 0000000000..e77696ae8d
--- /dev/null
+++ b/systems/msdos/tx/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
+
+ 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/systems/msdos/tx/news b/systems/msdos/tx/news
new file mode 100644
index 0000000000..b65ff3ac53
--- /dev/null
+++ b/systems/msdos/tx/news
@@ -0,0 +1,6 @@
+Version 1. May 5, 1995.
+ -- Corrected a small mistake that prevented the program from reading a
+ working file name from the command line.
+
+Version 0. April 28, 1995.
+ -- First public release.
diff --git a/systems/msdos/tx/readme b/systems/msdos/tx/readme
new file mode 100644
index 0000000000..0318d1ff05
--- /dev/null
+++ b/systems/msdos/tx/readme
@@ -0,0 +1,58 @@
+*********************************************************************
+This is the "readme" file for tx, version 1, a menuing system for TeX
+*********************************************************************
+
+This is "tx", a very simple menu designed to facilitate the processing of
+TeX documents on a pc. A small window appears on the top right of the screen
+offering the user the different alternatives about running TeX, viewing or
+printing the document, editing it, etc. The menu is completely configurable
+by the user.
+
+INSTALLATION
+============
+
+(1) Edit the sample configuration file "tx.cnf" with the entries and
+commands you want. If you have any doubts as to the syntax of the
+configuration file, you may take a look at the explanations in "tx.doc".
+
+(2) Copy "tx.exe" and your version of "tx.cnf" to a directory in your
+search path for executables. For instance, if you are using the latest
+emTeX version, this could be "c:\emtex\bin".
+
+(3) You are all set. Move to a directory where you have (or want to create)
+a TeX document and type "tx". Once you are in the menu, you need to specify
+(or visually choose) the name of the TeX document.
+
+License: This program is free. It is licensed to users under the
+terms of the GNU General Public License. Read the file "copying"
+for details about the licensing agreement. The program uses the
+"spawno" library, written by Ralf Brown, to swap out of dos memory
+when executing other programs. See the file "spawno.doc" for details.
+
+You can send any comments about the program to me. I wrote this
+program for myself, and am making it publically available just
+in case somebody may find it useful. Please note that there will
+be no further releases unless some serious bug is found, because
+the program as it is now suits all my needs.
+
+Ricard Torres (torres@upf.es).
+Released in April 1995.
+
+Note: If you want to modify or recompile the source, you will find
+it in the directory "src". For instance, you can change the colors,
+that are defined in the file "tx.c", or the text of the messages,
+which you will find in the file "txdefs.h". The program is written
+in c for the Borland compilers. Included is also a makefile for
+the djgpp port of gcc. The resulting executable takes up a lot of
+dos memory, because it is loaded by the dos extender go32.
+
+History:
+=======
+The program has been used by a number of people for a few years. The changes
+it has lately undergone are mostly of little relevance, except for the use
+it now makes of Ralf Brown's spawn replacement, that frees most of the dos
+memory occupied by the program. By now, it should be pretty stable. However,
+the version originally distributed in CTAN had a small mistake that
+prevented it from reading a working file name from the command line. This
+has now been corrected, and the resulting new version (which has some other
+merely cosmetic changes) we label as version 1 (hoping it will be the last).
diff --git a/systems/msdos/tx/src/frame.c b/systems/msdos/tx/src/frame.c
new file mode 100644
index 0000000000..72cd841d2a
--- /dev/null
+++ b/systems/msdos/tx/src/frame.c
@@ -0,0 +1,30 @@
+#include <conio.h>
+
+void DrawFrame(int left, int top, int right, int bottom,int DoubleFrame)
+{
+ register int i ;
+ int U_Left=218,Horiz=196,U_Right=191,Vert=179,L_Left=192,L_Right=217;
+
+ if (DoubleFrame) {
+ U_Left = 201 ;
+ Horiz = 205 ;
+ U_Right = 187 ;
+ Vert = 186 ;
+ L_Left = 200 ;
+ L_Right = 188 ;
+ }
+ gotoxy(left,top) ;
+ putch(U_Left); /* upper left corner */
+ for ( i = left+1 ; i < right ; i++)
+ putch(Horiz) ; /* horizontal stuff */
+ putch(U_Right) ; /* upper right corner */
+ for ( i = top + 1 ; i < bottom ; i++ ) { /* vertical stuff */
+ gotoxy(left,i) ; putch(Vert) ;
+ gotoxy(right,i) ; putch(Vert) ;
+ }
+ gotoxy(left,bottom) ;
+ putch(L_Left); /* lower left corner */
+ for ( i = left+1 ; i < right ; i++)
+ putch(Horiz) ; /* horizontal stuff */
+ putch(L_Right) ; /* lower right corner */
+}
diff --git a/systems/msdos/tx/src/makefile b/systems/msdos/tx/src/makefile
new file mode 100644
index 0000000000..e87f3698c9
--- /dev/null
+++ b/systems/msdos/tx/src/makefile
@@ -0,0 +1,36 @@
+# Makefile for Borland C++ version 2.0
+# Should work with any Borland C or Turbo C.
+# Check the include and library paths below.
+# Ignore warnings about possibly incorrect assignments
+CC = bcc
+LINK = tlink
+STRIP = tdstrip
+RM = del
+
+.c.obj:
+ $(CC) -ms -O -Z -Ic:\bc\include -c $<
+
+OBJ_FILES = \
+ frame.obj \
+ tx.obj \
+ txcomm.obj \
+ txdir.obj \
+ txexpand.obj \
+ txmain.obj \
+ txmenu.obj \
+ txprompt.obj
+
+all: tx.exe
+
+tx.exe: $(OBJ_FILES)
+ $(LINK) /x/c/Lc:\bc\lib @tx.rsp
+
+strip: tx.exe
+ -$(STRIP) tx.exe
+
+clean:
+ -$(RM) *.obj
+
+veryclean:
+ -$(RM) *.obj
+ -$(RM) tx.exe
diff --git a/systems/msdos/tx/src/makefile.gcc b/systems/msdos/tx/src/makefile.gcc
new file mode 100644
index 0000000000..be5759166e
--- /dev/null
+++ b/systems/msdos/tx/src/makefile.gcc
@@ -0,0 +1,37 @@
+# Makefile for gcc/djgpp version 2.6.3
+# tx is not particularly efficient when compiled with gcc
+# because the go32 extender takes up a lot of dos memory
+CC = gcc
+CFLAGS = -O2 -Wall -Ic:/djgpp/include
+LDFLAGS = -s
+LIBS = -Lc:/djgpp/lib -lpc
+AS = as
+LINK = gcc
+STRIP = strip
+
+all: tx.exe
+
+OBJECTS = \
+ frame.o \
+ tx.o \
+ txcomm.o \
+ txdir.o \
+ txexpand.o \
+ txmain.o \
+ txmenu.o \
+ txprompt.o
+
+all: tx.exe
+
+tx: $(OBJECTS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -o tx $(OBJECTS) $(LIBS)
+
+tx.exe: tx
+ coff2exe tx
+
+clean:
+ rm -f *.o
+
+veryclean:
+ rm -f *.o
+ rm -f tx tx.exe
diff --git a/systems/msdos/tx/src/spawno.doc b/systems/msdos/tx/src/spawno.doc
new file mode 100644
index 0000000000..8467c46d7e
--- /dev/null
+++ b/systems/msdos/tx/src/spawno.doc
@@ -0,0 +1,486 @@
+SPAWNO v4.13 12/12/91 disk/EMS/XMS/INT15 swapping replacement for spawn()
+(c) Copyright 1990,1991,1992 Ralf Brown. All Rights Reserved.
+
+
+-----------------
+LICENSE
+
+This document and the associated header file, libraries, and source and
+object modules may be freely copied provided that:
+ 1) all of the files are copied as a group (such as in a single
+ archive). See below for a list of files.
+ 2) the files are not modified in any way (including removal or
+ alteration of copyright notices or this license)
+ 3) no charge beyond a cost-recovery fee not to exceed $5, or a
+ general telecommunications connection fee, is made
+
+The source and/or object code comprising the public SPAWNO distribution
+may be incorporated at no charge into programs which are distributed or
+sold to others provided that:
+ 1) credit is given in the documentation. A mention such as
+ "This product uses the SPAWNO routines by Ralf Brown
+ to minimize memory use while shelling to DOS and
+ running other programs."
+ is sufficient.
+ 2) you drop me a line telling me that you are using SPAWNO and
+ in which product(s) you are using it (see addresses at the
+ end of this file). I'm interested in finding out how wide-
+ spread the use of SPAWNO becomes.
+
+
+-----------------
+DISCLAIMER
+
+Although both I and others have tested the code which comprises SPAWNO,
+it is entirely possible that SPAWNO may malfunction in environments or
+under circumstances in which it has not been tested. This code is
+provided AS IS, and the author disclaims any and all responsibility for
+damages (both consequential and incidental) resulting from the use or
+misuse of SPAWNO. Sole responsibility for determining the suitability
+of the code rests with the user.
+
+
+-----------------
+FILES
+
+The disk or archive you received should contain the following files:
+
+ SPAWNO.DOC this file
+ SPAWNO.H the header file providing prototypes for the functions
+ SPAWNx.LIB versions of the library for each of [T]iny, [S]mall,
+ [C]ompact, [M]edium, [L]arge, and [H]uge memory
+ models.
+ SPAWNTP.OBJ Turbo Pascal version of SPAWNO
+ SPAWNO.PAS Turbo Pascal unit encapsulating SPAWNO
+ SPAWN_MS.ZIP Microsoft C versions of compiler-specific functions
+ MSC.BAT replace Turbo C specific functions in libraries with
+ Microsoft C versions.
+ NOREPLAC.BAT remove replacements for the standard spawn..()
+ functions from the libraries.
+ SWAPTEST.C example program for testing
+ TEST.PAS example program for testing
+ SOURCE.ZIP archive containing partial source code for SPAWNO
+ _SPAWNO.H header file for recompiling library
+ *.C source for the spawn..() and spawn...o() functions
+ RULES.ASI shortened and modified Turbo C macro file
+ SPAWNO.INC include file for various important constants
+ SPAWNPTH.ASM source for the path search
+ CHECKEXT.ASM check for 'file', 'file.EXE', and 'file.COM'
+ SWAP_EMS.ASM support routines for swapping to EMS
+ SWAPLIST.ASM specify which swap types will be linked in
+ SPAWNENV.ASM make an environment block from an array of strings
+ SPAWNERR.ASM set _doserrno and errno
+ MAKEFILE
+
+
+-----------------
+WHAT'S NEW
+
+Changes/fixes from versions 4.00 to 4.10:
+ Now swaps to disk with non-NULL swap list in large-data memory models
+ Now correctly deletes swap file if child program changes directories
+ If the given program name is "FOO", and both "FOO" and either
+ "FOO.COM" and/or "FOO.EXE" exist in the same directory, it will
+ now execute either "FOO.COM" or "FOO.EXE" rather than "FOO", as
+ both version 4.00 and the Borland library functions do. To
+ execute "FOO", pass "FOO." rather than just "FOO" to the function.
+ Fixed bug which may have led to a partially corrupted environment
+ in a few circumstances
+Changes/fixes since version 4.10:
+ Fixed bug which caused the PSP to restore incorrectly after a spawn
+ when DS != SS.
+ Fixed bug introduced in v4.10 which caused a crash on return from the
+ child program if there was insufficient disk space for the swap
+ file.
+ Fixed error in va_start call in various *.C files. This problem
+ results in compile-time errors when compiling under BC++ in
+ certain modes (but the code compiled without warnings under
+ Turbo C 2.0).
+
+-----------------
+INSTALLATION
+
+If you are using Turbo C, Turbo C++, or Borland C++, simply dearchive
+the libraries and header file and place them where your compiler can
+find them. If you are using Microsoft C, dearchive SPAWN_MS.ZIP and
+then run the MSC batch file to replace the compiler-specific functions
+in the libraries with Microsoft C versions. Please do not run this
+batch file on your original copy of the libraries.
+
+If you are using Turbo Pascal, unarchive SPAWNTP.OBJ and SPAWNO.PAS.
+Compile SPAWNO.PAS and then add a USES SPAWNO; line to your program.
+After that you can call the function SPAWN() as desired. The
+distribution does not contain a pre-compiled version because .TPU
+files are not compatible between different versions of Turbo Pascal.
+
+
+-----------------
+INSTRUCTIONS
+
+As distributed, SPAWNO contains replacements for the standard spawn..()
+functions. You can use SPAWNO with absolutely no changes to your
+existing source code; however, you will probably want to call
+init_SPAWNO() from main(), and include SPAWNO.H for that source file.
+The initialization function takes two arguments: the first is a string
+containing a list of directories (separated by semicolons) in which to
+attempt to store the swap file when swapping to disk. The second
+specifies which swap devices to attempt to use; it may be either
+SWAP_ANY or the ORing or addition of any combination of SWAP_DISK,
+SWAP_EMS, SWAP_EXT, and SWAP_XMS (such as SWAP_DISK|SWAP_XMS). If you
+do not call init_SPAWNO(), the defaults are to attempt all swap devices
+and to store the swap file in the current directory when swapping to
+disk. init_SPAWNO() will set the swap file directory list to the first
+of the following to have a non-NULL, non-empty value: the environment
+variable SWAPDIR, the passed parameter, the environment variable TEMP,
+and the environment variable TMP. Note that init_SPAWNO is the only
+function in the library which uses these environment variables.
+
+After making the above change, recompile your existing code, but include
+the SPAWNO library in the link step. Note that SPAWNO does not support
+the P_OVERLAY spawn type--any calls using that argument should be
+replaced with the corresponding exec..() function. If a SPAWNO function
+is called with P_OVERLAY, it simply returns an error.
+
+For backwards compatibility with previous versions of SPAWNO, and for
+those who (for whatever reason) require the use of both the swapping and
+standard spawn..() functions, there is a second set of functions which
+take an explicit swap directory argument. To use them, include the
+header file SPAWNO.H. Then use the functions provided in this
+archive--spawnvo(), spawnlo(), spawnvpo(), etc--as you would the
+corresponding spawnv(), spawnl(), etc, except replace the first argument
+by a string containing the path where the swap file is to be stored.
+Note that the swap file path is required even when swapping to XMS, EMS,
+or plain extended memory, as SPAWNO will swap to disk anyway if there is
+not enough memory available.
+
+If you require the use of both the swapping and standard spawn..()
+functions, you will need to run the NOREPLAC.BAT batch file to remove
+the modules containing the replacements for the standard functions or
+arrange the linker command line such that SPAWNx.LIB is listed after the
+standard runtime library (for Turbo/Borland C users, the latter requires
+a separate TLINK command, as TCC/BCC places any libraries specified on
+the command line prior to the runtime library). Please do not run
+NOREPLAC on your original copy of the libraries, as the process is
+destructive and cannot be reversed.
+
+The spawn?p??() functions search for both .COM and .EXE files in the
+current directory and then in the pathed directories if no extension is
+given, but use the specified extension if present. If a full pathname
+is given to those functions, only the specified directory is searched.
+If both a path and an extension are given, only that specific file will
+be loaded. The other spawn..() functions check the current directory
+only. For all functions, if the specified filename does not contain an
+extension, SPAWNO will try the exact name given and the name with .COM
+and .EXE extensions. The extension-less name will be used if neither
+.COM nor .EXE exist. To force the use of the extensionless file even
+if a .COM or .EXE with the same name exists in the same directory,
+append a period, i.e. use "PROGRAM." rather than just "PROGRAM" as
+the name.
+
+When linking, you must include SPAWNx.LIB. A sample TCC line would be
+
+ tcc -mc <other-flags> sample spawnc.lib library.lib
+
+This results in 208 to 288 bytes remaining in memory (depending on swap
+type) while the spawned program executes. However, if you want to keep
+an interrupt hooked which might be invoked while spawned, you must set
+__spawn_resident large enough that *all* code and data which could be
+invoked by that interrupt is kept resident[1]. SPAWNO automatically
+deactivates INT 23h and INT 24h and restores them before returning to
+the caller unless __spawn_keepints is set to 1, so no extra work is
+required if those two are the only interrupts hooked by the program.
+
+----
+[1] Due to the segment layout used by C compilers, this option is probably
+ useful only when calling SPAWNO from assembly-language code (which can
+ localize such code and data near the start of the executable) or a
+ small program which uses a large amount of space in the far heap.
+
+
+-----------------
+ERROR CODES
+
+SPAWNO will return errno = ENOMEM (_doserrno = 8) if there is insufficient
+swap space available.
+
+
+-----------------
+ERROR MESSAGES
+
+SPAWNO: stack too small, retrying
+ SPAWNO did not correctly determine the stack requirements for
+ the system on which it is running, but was able to determine
+ that the specified minimum size is insufficient. On the retry,
+ the stack size is increased by one paragraph. Since SPAWNO
+ cannot always detect the problem, which would result in
+ memory chain corruption, you should increase the value of
+ __spawn_res_stack to prevent a recurrence of this error
+ message. For most systems, the default value of 4 paragraphs
+ will be sufficient.
+
+SWAP ERR
+ The resident stub detected an error while trying to reload the
+ main portion of the program and aborted. This may be due to
+ loading a TSR while swapped out or deleting the swap file.
+
+SPAWNO: error reloading program, aborting
+ The main portion of SPAWNO detected an error while attempting
+ to restore the remainder of the program to memory.
+
+
+-----------------
+LIMITATIONS
+
+After freeing all memory owned by the program except the initial (PSP)
+memory block and the environment, at least 384 bytes of conventional
+memory must be available. SPAWNO uses this for its temporary stack.
+This is of particular importance for the Turbo Pascal variant, because
+setting the maximum heap size to the available memory or greater will
+use up all RAM and prevent SPAWNO from allocating its temporary stack
+unless memory is fragmented or there is DOS 5 high memory available.
+
+SPAWNO may report insufficient memory even though the program to be
+executed would fit with up to 600 bytes to spare, due to the fact that
+part of the stack and all of the data used by DOS to start the program
+may be overwritten after the child program starts executing.
+
+Functions which pass an explicit environment attempt to allocate enough
+memory to build the environment block which is passed to the DOS EXEC
+function. If neither malloc() nor a DOS memory allocation request are
+successful, SPAWNO passes the original environment rather than the
+specified environment.
+
+As distributed, SPAWNO functions which do not take an explicit
+environment pointer pass the calling program's original environment to
+the child, rather than the current environment as modified by putenv().
+You may recompile SPAWNO to pass the current environment (see
+_SPAWNO.H); if you do so, the caveat discussed in the previous paragraph
+will apply to all of the spawn..() functions.
+
+
+-----------------
+SUPPORT
+
+Since I am not getting any money, I can't promise any support. Those
+who have purchased the complete source code will receive priority over
+those who haven't, but even they will only receive support to the
+extent that I have spare time....
+
+
+-----------------
+ACKNOWLEDGEMENTS
+
+Thanks to Gene McManus for testing the Microsoft versions of SPAWNO 3.0
+and 4.0.
+
+
+-----------------
+FUTURE PLANS
+
+The next release will drop support for DOS 2.x (which is now over
+eight years old) to reduce the code size and further reduce the size
+of the resident stub.
+
+
+-----------------
+SPAWNO versus THE COMPETITION
+
+Product: SPAWNO XSPAWN SWAP
+Version: 4.13 1.34 1.0
+Author: Ralf Brown Whitney Software Marty Del Vecchio
+Memory models: tsmclh tsmclh tsm
+Supported DOS vers: 2.0-5.0 2.1-5.0 3.0-5.0
+Code size [1]: 4.3-5.9K 4.4-9K 1.5K
+Resident stub (bytes): 208-288 1277+2*env 1.8K+env [2]
+Direct replacement for
+ spawn..(): yes yes no
+Use in existing code
+ without changes: yes no no
+Swap to disk: yes yes yes
+Swap to EMS: yes yes yes
+Swap to XMS: yes no no
+Swap to INT 15h ext: yes no no
+Multiple swap dirs: yes yes no
+Automatic unique swap
+ file naming: yes yes no
+May leave interrupts
+ hooked [3]: yes no yes
+Swaps DOS5 high memory: yes ? ?
+Free for any use: yes yes yes
+Source included: partial [4] yes yes
+
+Notes:
+[1] For both SPAWNO and XSPAWN, the amount added to the executable's
+ size depends on which functions of the library are called and which
+ of the additional C runtime library function that are called by
+ SPAWNO/XSPAWN would have been included anyway. SPAWNO's size may
+ be reduced by removing one or more swap types; the savings are
+ about 400 bytes per swap type (without EMS and non-XMS (INT 15h)
+ swapping, SPAWNO would add as little as 3.4K to the executable).
+
+[2] SWAP's resident size depends on the location of the object code
+ within the executable. The size reported here is the resident
+ size when SWAP immediately follows the Turbo C 2.0 startup code.
+ It will be larger in later versions of the Borland C compilers due
+ to the increasing size of the startup code.
+
+[3] For SPAWNO, enough of the program must be left in memory to keep all
+ interrupt handlers resident. XSPAWN has no provision for keeping
+ an interrupt handler resident unless swapping is disabled; it does
+ however permit selection whether a given interrupt handler will
+ automatically be restored to its original value or pointed at an
+ IRET instruction while swapped out. For SWAP, the swapper module
+ must be linked in after all code and data which might be accessed
+ by the interrupt handler(s).
+
+[4] Full SPAWNO source code is available for licensing. See ORDER.FRM for
+ details.
+
+
+-----------------
+Functions:
+ void init_SPAWNO(const char *swap_directories, int swap_types) ;
+
+ /* replacements for the standard functions */
+ int spawnv(int type, const char *name, const char **args) ;
+ int spawnvp(int type, const char *name, const char **args) ;
+ int spawnve(int type, const char *name, const char **args,
+ const char **env) ;
+ int spawnvpe(int type, const char *name, const char **args,
+ const char **env) ;
+ int spawnl(int type, const char *name, const char *argv0, ...) ;
+ int spawnlp(int type, const char *name, const char *argv0, ...) ;
+ int spawnle(int type, const char *name, const char *argv0, ...) ;
+ int spawnlpe(int type, const char *name, const char *argv0, ...) ;
+ int system(const char *command) ;
+ /* Note: the above functions return -1 (error) if 'type' is not */
+ /* P_WAIT */
+
+ /* setup function */
+ void init_SPAWNO(const char *overlay_path, int swap_types) ;
+ /* setup swapping options for the compatibility functions above */
+
+ /* SPAWNO-specific functions */
+ int spawnvo(const char *overlay_path, const char *name,
+ const char **args) ;
+ int spawnvpo(const char *overlay_path, const char *name,
+ const char **args) ;
+ int spawnveo(const char *overlay_path, const char *name,
+ const char **args,const char **env) ;
+ int spawnvpeo(const char *overlay_path, const char *name,
+ const char **args,const char **env) ;
+ int spawnlo(const char *overlay_path, const char *name,
+ const char *argv0, ...) ;
+ int spawnlpo(const char *overlay_path, const char *name,
+ const char *argv0, ...) ;
+ int spawnleo(const char *overlay_path, const char *name,
+ const char *argv0, ...) ;
+ int spawnlpeo(const char *overlay_path, const char *name,
+ const char *argv0, ...) ;
+ int systemo(const char *overlay_path, const char *command) ;
+ /* Note: the ..o() functions use only the current directory if */
+ /* overlay_path is NULL; the only function which checks */
+ /* the environment variables SWAPDIR and TEMP is */
+ /* init_SPAWNO(). */
+
+Global variables:
+ char __spawn_xms ;
+ Specify whether to use XMS memory for swapping (if available).
+ 0 = no, 1 = yes, default = 1
+ This variable is set by init_SPAWNO().
+ char __spawn_ems ;
+ Specify whether to use EMS memory for swapping (if available).
+ 0 = no, 1 = yes, default = 1
+ This variable is set by init_SPAWNO().
+ char __spawn_ext ; /* 0 = don't use non-XMS extended memory for swap */
+ Specify whether to use non-XMS extended memory (via INT 15h) for
+ swapping (if available). 0 = no, 1 = yes, default = 1
+ This variable is set by init_SPAWNO().
+ Note: SPAWNO should not be allowed to swap to extended memory if
+ running under a multitasker or task switcher, as other programs
+ would be able to grab the same memory used by SPAWNO to store the
+ swapped-out program. For this reason, SPAWNO automatically
+ disables swapping to non-XMS extended memory if it detects that
+ TopView, DESQview, or any other TopView API-compatible multi-
+ tasker is active, or the DOS 5 task switcher is loaded, or
+ MS Windows 3 is running in real or standard mode (enhanced mode
+ is not readily detectable from a program, unfortunately).
+ const char *pascal ___spawn_swap_dirs ;
+ Specify the list of directories in which to attempt to store
+ the swap file when swapping to disk. The directories are
+ separated by semicolons just as they would be in the PATH
+ environment variable. Default = NULL (same as ".": current
+ directory)
+ This variable is set by init_SPAWNO().
+ Note: SPAWNO will not swap to disk if this variable is set to an
+ empty string; if it is set to NULL, SPAWNO will use the default
+ directory list of ".".
+ char __spawn_keepints ;
+ Specify whether to deactivate INT 23h and INT 24h handlers by
+ temporarily restoring the vectors stored in the PSP.
+ 0 = no, nonzero = yes, default = 0
+ char __spawn_swap_UMA ;
+ Specify whether to swap out memory blocks in the upper memory
+ area (640K-1M). 0 = no, 1 = yes, default = 1
+ Note: This option only has an effect under MSDOS 5.0 or higher
+ with the line DOS=UMB or DOS=HIGH,UMB in CONFIG.SYS.
+ unsigned __spawn_resident ;
+ Specify the minimum number of paragraphs in the memory block
+ containing the PSP to keep resident while in the child program.
+ This value will be increased if necessary to be large enough to
+ hold the swapping code; it may also be increased slightly if it
+ causes the end of the shrunken PSP block to fall within a
+ specific section of SPAWNO's code. You may force the entire
+ main block to stay in memory by setting this variable to 0xFFFF;
+ however, the environment and any additional memory blocks
+ allocated by the program will still be swapped out. default = 0
+ Note: in addition to the PSP memory block, a small second block
+ is used for the stack needed by the swapping code (see below).
+ unsigned __spawn_res_stack ;
+ Specify the minimum number of paragraphs of the stack to keep
+ resident while in the child program. Default = 4, minimum = 2
+ (two paragraphs is only sufficient for bare DOS; TSRs which
+ hook INT 21h will increase the stack requirements, but four is
+ sufficient for most systems). SPAWNO attempts to compute the
+ necessary stack size, but this variable allows the computed
+ value to be overridden if necessary.
+
+External functions called by SPAWNO:
+ malloc() \ only when passing an array of environment strings
+ free() /
+
+External variables referenced by SPAWNO:
+ int errno ;
+ int _doserrno ;
+ unsigned int _psp ;
+ char **environ ; (only when passing an array of environment strings)
+
+Other:
+ This version of SPAWNO overwrites the PSP, so the commandline
+ will be lost unless it was copied before the first spawn().
+
+
+-----------------
+Functions (Turbo Pascal):
+ init_SPAWNO(swap_dirs : string ; swap_types : integer ;
+ min_resident : integer ; resident_stack : integer) ;
+ spawn(program_name : string ; arguments : string ;
+ envseg : integer) : integer ;
+
+Global Variables (Turbo Pascal):
+ spawno_error : integer ; (error code when spawn() returns -1)
+
+
+-----------------
+Send comments, bug reports, etc. to
+
+ Internet: ralf+@cs.cmu.edu
+ Fidonet: Ralf Brown 1:129/26.1 (or post a message to me on DR_DEBUG--I
+ have to route netmail outside Zone 1
+ via Internet -> Fidonet gateways, which
+ is not always reliable)
+or
+ Ralf Brown (this address will be valid until
+ 813 Copeland Way, Suite 26 at least November 1, 1993)
+ Pittsburgh, PA 15232
+
diff --git a/systems/msdos/tx/src/spawns.lib b/systems/msdos/tx/src/spawns.lib
new file mode 100644
index 0000000000..2b4f438c67
--- /dev/null
+++ b/systems/msdos/tx/src/spawns.lib
Binary files differ
diff --git a/systems/msdos/tx/src/tx.c b/systems/msdos/tx/src/tx.c
new file mode 100644
index 0000000000..542d3050e4
--- /dev/null
+++ b/systems/msdos/tx/src/tx.c
@@ -0,0 +1,269 @@
+#include <stdio.h>
+#include <conio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <dir.h>
+#include "txdefs.h"
+
+/* global scope */
+char Progname[MAXPATH] ;
+char Path[MAXPATH] = "\0" ;
+char FileName[MAXFILE] = "\0" ;
+char Extension[MAXEXT] = "\0" ;
+char **menu[MAX_MENUS] ;
+int NumMenus = 0;
+int NumEntries[MAX_MENUS] ;
+int CurrDrive ;
+char ch_env_size[6] ;
+/* Text colors:
+ normal -> yellow on blue
+ selected -> black on lightgray */
+int color[2]={0x1E,0x70};
+/* Alternative colors: */
+/* int color[2]={0x30,0x0B}; */
+
+void SplitPath(void) ;
+
+/* File scope */
+
+FILE *cnf ;
+char ConfigFile[MAXPATH] = "\0" ;
+
+
+void main(int argc, char *argv[])
+{
+ void ReadConfig(void) ;
+ int i, env_size = ENV_SIZE ;
+ extern void TxMain(void);
+ strcpy(Progname,argv[0]);
+ _wscroll = 0 ; /* Disallow scrolling */
+ textattr(color[0]) ; /* Set menu colors */
+ CurrDrive = getdisk() ;
+
+ for ( i = 1 ; i < argc ; i++ ) {
+ if ( argv[i][0] == CNF_COMLINE ) { /* Configuration file name */
+ ++argv[i] ;
+ strcpy(ConfigFile,argv[i]) ;
+ }
+ else if ( !strcmp(argv[i],"-h") ) { /* help */
+ fprintf(stderr,MSG_USAGE,Progname,CNF_ENVVAR);
+ exit(0);
+ }
+ else if ( !strcmp(argv[i],"-m") ) { /* monochrome */
+ color[0]=0x70;
+ color[1]=0x0F;
+ textattr(color[0]) ;
+ }
+ else if ( !strcmp(argv[i],"-e") ) { /* environment size */
+ i++ ; /* get next argument */
+ if ( ( i == argc ) || ( ( env_size = atoi(argv[i]) ) < 256 ) ) {
+ fprintf(stderr,MSG_USAGE,Progname,CNF_ENVVAR);
+ exit(0);
+ }
+ }
+ else { /* Working file name */
+ int OldDrive=CurrDrive;
+ if (Path[0]) { /* We already have a working file name */
+ fprintf(stderr,MSG_USAGE,Progname,CNF_ENVVAR);
+ exit(0);
+ }
+ strcpy(Path,argv[i]) ;
+ SplitPath() ;
+ setdisk(CurrDrive) ;
+ if ( chdir(Path) ) {
+ CurrDrive=OldDrive;
+ setdisk(CurrDrive);
+ Path[0]='\0';
+ }
+ }
+ }
+
+/* Set environment size for child processes as a string to be passed
+ to the command processor */
+ itoa(env_size,ch_env_size,10);
+
+/* Look for environmental variable CNF_ENVVAR */
+ if (!ConfigFile[0]) {
+ char *ppt;
+ if ( (ppt=getenv(CNF_ENVVAR)) != NULL )
+ strcpy(ConfigFile,ppt) ;
+ }
+
+/* Check for default file name, "tx.cnf" (or "progname.cnf" if the user
+ renamed the program to "progname.exe") being present in directory in
+ which the executable resides. This should be the normal case. */
+
+ if (!(ConfigFile[0])) {
+ char drive[MAXDRIVE] , dir[MAXDIR] , file[MAXFILE], ext[MAXEXT] ;
+ fnsplit(argv[0],drive,dir,file,ext) ;
+ strcpy(ext,".cnf") ;
+ fnmerge(ConfigFile,drive,dir,file,ext) ;
+ }
+
+/* Print usage message and exit if no config file exists */
+ if ( (cnf = fopen(ConfigFile,"r")) == NULL ) {
+ fprintf(stderr,MSG_NOCONFIG,Progname);
+ fprintf(stderr,MSG_USAGE,Progname,CNF_ENVVAR);
+ exit(1) ;
+ }
+
+ ReadConfig() ;
+
+/* Set working file name if not supplied by user */
+ if (!Path[0]) {
+ getcwd(Path,MAXPATH) ;
+#ifdef __GO32__
+ strcat(Path,"/") ;
+#else
+ strcat(Path,"\\") ;
+#endif
+ strcat(Path,DEF_WFN) ;
+ strcat(Path,DEF_WFEXT) ;
+ SplitPath();
+ }
+
+ TxMain() ; /* Branch to main body of tx */
+}
+
+
+
+void ReadConfig(void)
+{
+ char line[1+MAX_ACTION], **cp ;
+ int len , iscommand = 0 ;
+ const int limit[2] = { MAX_WIDTH , MAX_ACTION } ;
+ int ReadLine(char *,int) ;
+
+ NumEntries[0] = 0 ;
+ menu[0]= (char **) malloc( 2 * MAX_ENTRIES * sizeof(char *) );
+ cp = menu[0] ; /* Position current pointer */
+
+ while ( (len = ReadLine(line,limit[iscommand])) > 0 ) {
+ if ( line[0] == NEW_MENU_SIGN ) { /* Start new menu */
+ if (!NumEntries[0])
+ continue ; /* Ignore if menu 0 */
+ if (iscommand) { /* Error; were expecting a command */
+ exit(3) ;
+ }
+ ++NumMenus ;
+ if (NumMenus >= MAX_MENUS)
+ break ;
+ NumEntries[NumMenus] = 0 ;
+ menu[NumMenus]= (char **) malloc(2*MAX_ENTRIES*sizeof(char *));
+ cp = menu[NumMenus] ; /* Position current pointer */
+ continue ;
+ }
+ if ( NumEntries[NumMenus] >= MAX_ENTRIES )
+ continue ; /* Ignore excess entries */
+ *cp = (char *) malloc(len+1);
+ strcpy(*cp,line) ;
+ ++cp ;
+ NumEntries[NumMenus] += iscommand ; /* New entry if it was command */
+ iscommand = 1 - iscommand ; /* Switch text/command */
+ }
+ fclose(cnf) ;
+ return ;
+}
+
+
+
+int ReadLine(char *line,int max)
+{
+ int c , notin = 1 , count = 0 , wasspace = 0 ;
+
+ while ( (c = fgetc(cnf)) != EOF && count < max ) {
+ if ( notin ){ /* Skip whitespace while not reading a line */
+ while ( isspace(c) && (c = fgetc(cnf)) != EOF ) ;
+ if ( c == EOF )
+ return -1 ;
+ if ( c == NEW_MENU_SIGN ) { /* New menu */
+ *line++ = c ;
+ ++count ;
+ break ; /* Do not allow any more characters */
+ }
+ notin = 0 ;
+ }
+ if ( c == COMMENT_SIGN ){ /* Skip till eol if COMMENT_SIGN */
+ while ( (c = fgetc(cnf)) != EOF && c != '\n' ) ;
+ if (count) /* We have read some valid characters */
+ break ;
+ notin = 1 ; /* We have not read anything. Restart */
+ continue ;
+ }
+ if ( c == '\r' )
+ continue ;
+ if ( c == '\n' ) /* reached end of line */
+ break ;
+ if ( isspace(c) ) {
+ if (wasspace)
+ continue ; /* ignore extra spaces */
+ wasspace = 1 ; /* set space flag */
+ c = ' ' ; /* convert tabs to spaces */
+ }
+ else
+ wasspace = 0 ; /* clear space flag */
+ *line++ = c ;
+ ++count ;
+ }
+ if ( count ) {
+ if (wasspace) {
+ --count ; /* Remove trailing spaces */
+ --line ;
+ }
+ *line = '\0' ;
+ return count ;
+ }
+ return -1 ;
+}
+
+
+void SplitPath(void) {
+ int flags ;
+ char drive[MAXDRIVE] , dir[MAXDIR];
+ void StripBsl(char *) ;
+
+ flags = fnsplit(Path,drive,dir,FileName,Extension) ;
+
+ if ( flags & DRIVE ) {
+ drive[0] = toupper(drive[0]) ;
+ CurrDrive = ( (int) drive[0] ) - 'A' ;
+ }
+ else {
+ drive[0] = CurrDrive + 'A' ;
+ drive[1] = ':' ;
+ drive[2] = '\0' ;
+ }
+
+ if ( flags & DIRECTORY ) {
+ strcpy(Path,drive) ;
+ if ( dir[0] != BACKSLASH )
+#ifdef __GO32__
+ strcat(Path,"/");
+#else
+ strcat(Path,"\\");
+#endif
+ strcat(Path,dir) ;
+ StripBsl(Path);
+ }
+ else {
+ Path[0]='\0';
+ getcwd(Path,MAXPATH) ;
+ }
+
+ if ( !(flags & FILENAME) ) {
+ strcpy(FileName,DEF_WFN) ;
+ strcpy(Extension,DEF_WFEXT) ;
+ }
+}
+
+void StripBsl(char *Pname)
+{
+ for ( ; *Pname ; Pname++);
+ if ( *--Pname == BACKSLASH )
+ *Pname-- = '\0';
+ if ( *Pname == ':' )
+ *++Pname = BACKSLASH ;
+ *++Pname = '\0';
+}
+
diff --git a/systems/msdos/tx/src/tx.h b/systems/msdos/tx/src/tx.h
new file mode 100644
index 0000000000..12cc2a77e8
--- /dev/null
+++ b/systems/msdos/tx/src/tx.h
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <conio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <dir.h>
+#include "txdefs.h"
+
+/* Global variables */
+extern char Progname[MAXPATH] ; /* Program name */
+extern char Path[MAXPATH] ; /* working file directory */
+extern char FileName[MAXFILE] ; /* working file name (no path, no ext) */
+extern char Extension[MAXEXT] ; /* working file extension */
+extern char **menu[MAX_MENUS] ; /* Menu addresses */
+extern int NumMenus ; /* Number of Menus */
+extern int NumEntries[MAX_MENUS] ; /* Entries in each menu */
+extern int CurrDrive ; /* Number of current drive */
+extern char ch_env_size[6] ; /* Size of environment for child proc */
+extern int color[2]; /* Text attributes */
+extern void SplitPath(void) ; /* Split supplied path name */
diff --git a/systems/msdos/tx/src/tx.rsp b/systems/msdos/tx/src/tx.rsp
new file mode 100644
index 0000000000..6f8bb7dfae
--- /dev/null
+++ b/systems/msdos/tx/src/tx.rsp
@@ -0,0 +1,13 @@
+c0s.obj+
+frame.obj+
+tx.obj+
+txcomm.obj+
+txdir.obj+
+txexpand.obj+
+txmain.obj+
+txmenu.obj+
+txprompt.obj+
+spawns.lib
+tx
+
+cs.lib
diff --git a/systems/msdos/tx/src/txcomm.c b/systems/msdos/tx/src/txcomm.c
new file mode 100644
index 0000000000..f1806e3007
--- /dev/null
+++ b/systems/msdos/tx/src/txcomm.c
@@ -0,0 +1,45 @@
+#include "tx.h"
+
+extern int ExpandNames(char *, char *, int);
+
+int ExpandAction(char *action,char **argum,char *notexpand,int limit)
+{
+ int i ;
+ char provis[128] ;
+
+ if ( ! ExpandNames(provis,notexpand,limit) )
+ return 0; /* Exceeded limit */
+
+/* To overcome limits to the size of the environment, we must
+ execute the actions by a call to "command", with the /e
+ option set to a sufficiently high value */
+
+ strcpy(action,getenv("COMSPEC"));
+ strcat(action," /e:");
+ strcat(action,ch_env_size); /* size of the environment for child proc */
+ strcat(action," /c ");
+ strcat(action,provis);
+
+/* The command line is now held in string "action". We must
+ parse it to get the arguments. */
+
+ limit = MAX_ARGS ;
+ for ( i = 0 ; i < MAX_ARGS ; i++ )
+ argum[i] = '\0' ; /* initialize with 0's the pointers */
+
+ i = 0 ;
+ while ( *action ) {
+ for (; *action == ' ' ; action++ ) ; /* skip spaces */
+ if ( *action ) {
+ if ( !limit ) /* exceeded max number of args */
+ return 0;
+ limit-- ;
+ argum[i++]=action ; /* new argument */
+ /* What follows is a sleek way of putting a '\0' at the
+ end of the substrings */
+ for ( ; *action &&
+ ( *action != ' ' || (*action++ = '\0')) ; action++ ) ;
+ }
+ }
+ return i ; /* Return number of args on successful completion */
+}
diff --git a/systems/msdos/tx/src/txdefs.h b/systems/msdos/tx/src/txdefs.h
new file mode 100644
index 0000000000..aa192aae3f
--- /dev/null
+++ b/systems/msdos/tx/src/txdefs.h
@@ -0,0 +1,93 @@
+/* All the preprocessor definitions are here */
+
+#define MAX_MENUS 10 /* Maximum number of menus */
+#define MAX_ENTRIES 10 /* Maximum number of entries per menu */
+#define MAX_WIDTH 60 /* Maximum width of the text of each entry */
+ /* after expanding the working file name */
+#define MAX_ACTION 128 /* Maximum width of command (DOS limit) */
+#define MAX_ARGS 20 /* Maximum number of arguments in a command */
+#define ENV_SIZE 2048 /* Choose a default env size large enough */
+
+#define MAX_FILES_IN_DIR 400 /* Maximum number of files admitted in dir */
+
+#define TOP 1 /* top-right location of menu */
+#define RIGHT 80
+
+#ifdef __GO32__
+#define BACKSLASH '/'
+#else
+#define BACKSLASH '\\'
+#endif
+#define SLASH '/'
+
+#define CNF_COMLINE '@' /* sign to precede config file in command line */
+
+/* Configuration file conventions */
+
+#define NEW_MENU_SIGN '+' /* sign to indicate start of new menu */
+#define SUBST_SIGN '#' /* sign to indicate substitutable item */
+#define COMMENT_SIGN '%' /* sign to start comment to end of line */
+#define SWITCH_MENUS "menu" /* switch to a different menu */
+#define L_SWITCH_MENUS 4 /* length of previous string */
+#define DOS_COMMAND "dos" /* execute operating system command */
+#define L_DOS_COMMAND 3 /* length of previous string */
+#define FIND_NAME "find" /* find new working file */
+#define L_FIND_NAME 4 /* length of previous string */
+#define NEW_NAME "new" /* supply new working file name */
+#define L_NEW_NAME 3 /* length of previous string */
+#define END_PROG "end" /* end program */
+#define L_END_PROG 3 /* length of previous string */
+#define WF_NAME "name" /* working file name (no extension, no path) */
+#define L_WF_NAME 4 /* length of previous string */
+#define WF_EXT "ext" /* working file extension */
+#define L_WF_EXT 3 /* length of previous string */
+#define WF_PATH "path" /* working file drive and directory */
+#define L_WF_PATH 4 /* length of previous string */
+#define WF_SLPATH "/path" /* same as above, with / instead of \ */
+#define L_WF_SLPATH 5 /* length of previous string */
+
+/* The following are defined for readability. Do not change them
+ unless you know what you are doing! */
+#define CR 13
+#define ESC 27
+#define SPACE 32
+#define HOMEKEY -71
+#define ENDKEY -79
+#define UPKEY -72
+#define DOWNKEY -80
+#define PGUPKEY -73
+#define PGDNKEY -81
+#define LEFTKEY -75
+#define RIGHTKEY -77
+
+#define DEF_WFN "work" /* Default working file name */
+#define DEF_WFEXT ".tex" /* Default working file extension */
+#define CNF_ENVVAR "TX" /* Environmental variable: config file name */
+
+/* Messages */
+
+#define MSG_USAGE "Usage: %s [-h] [-m] [-e num] [@cnfname] [wfname]\n \
+\tWhere \"cnfname\" is a configuration file name,\n \
+\t \"wfname\" is a working file name,\n \
+\t \"-m\" sets monochrome display,\n \
+\t \"-e num\" sets env size for child processes to num (>256),\n \
+\t and \"-h\" prints this message.\n \
+The configuration file name may be skipped if either:\n \
+(1) It is specified by the environmental variable %s, or\n \
+(2) It resides in the same directory the executable is.\n \
+(See the documentation that came along with the program.)\n"
+#define MSG_NOCONFIG "%s: Could not open configuration file.\n"
+#define MSG_CONFIGERR "%s: Configuration file error.\n\tText entry \
+must be followed by a command.\n"
+#define MSG_NOTMEM "%s: Not enough memory. Exiting.\n"
+#define MSG_SCRSAVE "%s: Cannot save screen contents. Exiting.\n"
+#define MSG_SCRBOUNDS "%s: Menu exceeds screen dimensions. \
+Exiting.\n"
+#define MSG_CHOICE " Choose a number (press the space bar to restore \
+the screen momentarily)"
+#define MSG_COMLONG "%s: Command too long. It will not be executed.\n"
+#define MSG_NEW_FILE "Write new working file name/path: "
+#define MSG_CONFFN "Write name of configuration file: "
+#define MSG_DOSCOM "Write command to be executed: "
+#define MSG_BADDRIVE "%s: Drive not available.\n"
+#define MSG_BADDIR "%s: Directory %s not valid.\n"
diff --git a/systems/msdos/tx/src/txdir.c b/systems/msdos/tx/src/txdir.c
new file mode 100644
index 0000000000..5e4ca371c0
--- /dev/null
+++ b/systems/msdos/tx/src/txdir.c
@@ -0,0 +1,352 @@
+#include "tx.h"
+#include <dos.h>
+
+char *FName[MAX_FILES_IN_DIR] ;
+int num;
+
+void TxDir(void)
+{
+ struct ffblk FFind ;
+ int i,j,selection,memidx=0,baddrv=0 ;
+ int row,col,oldrive,DosDrives,DrivesShown=0 ;
+ char *TextInWindow , *TextInLine, NameSel[15], NewPath[MAXPATH] ;
+ char *FMem[1+(MAX_FILES_IN_DIR/40)];
+ void krqsort (int,int);
+ int ShowFiles(void) ;
+ void AppendStars(char *) ; /* apppend *.* to path */
+ int StripStars(char *) ;
+ int DriveExists[26];
+ void TestDrives(int *,int *,int *);
+ extern void DrawFrame(int,int,int,int,int);
+
+ oldrive = CurrDrive ;
+ strcpy(NewPath,Path) ;
+ AppendStars(NewPath) ;
+
+ for (i=0;i<26;i++) /* Initialize */
+ DriveExists[i]=0;
+
+ TestDrives(DriveExists,&DosDrives,&DrivesShown);
+ --DrivesShown;
+
+ row = wherey() ; col = wherex() ; /* Save cursor position */
+ _setcursortype(_NOCURSOR) ; /* Hide cursor */
+
+ TextInWindow = malloc(757);
+ gettext(3,3,20,23,TextInWindow);
+ TextInLine = malloc(161);
+ gettext(1,2,80,2,TextInLine);
+
+ window(3,3,20,23) ; /* L T R B */
+ clrscr() ; /* Clear text in window area */
+ window(1,1,80,25) ; /* But work in absolute coordinates */
+ DrawFrame(3,3,20,23,0) ; /* Draw window frame (single) */
+
+ do { /* Start of main loop */
+
+ if ( DrivesShown )
+ FName[0]=FMem[0]=malloc(5*DrivesShown);
+
+ for ( i=1 ; i < DrivesShown ; i++ )
+ FName[i] = FName[i-1] + 5 ;
+
+ for ( i=0,j=0 ; i < DrivesShown ; i++ ) {
+ strcpy(FName[i],"<A:>") ;
+ for ( ; (!DriveExists[i+j])||((i+j)==CurrDrive) ; j++) ;
+ *(FName[i]+1) = i + j + 'A' ;
+ }
+ /* Start mem index at 0 if only 1 drive, 1 otherwise */
+ memidx = DrivesShown ? 1 : 0 ;
+ i = findfirst(NewPath,&FFind,FA_DIREC) ;
+
+ for ( num=DrivesShown ;
+ (i==0) && (num < MAX_FILES_IN_DIR) ; num++ ) {
+ if ( ( (num-DrivesShown) % 40) == 0 ) {
+ FName[num] = FMem[memidx++] = malloc(600);
+ for ( j = 1 ; j < 40 ; j++ )
+ FName[num+j] = FName[num] + (j * 15) ;
+ }
+ if ( FFind.ff_attrib & FA_DIREC ) {
+ *(FName[num]) = '[' ; /* Enclose directories in brackets */
+ strcpy(FName[num]+1,FFind.ff_name) ;
+ strcat(FName[num],"]") ;
+ }
+ else
+ strcpy(FName[num],FFind.ff_name) ;
+ i = findnext(&FFind) ;
+ }
+ /* num contains number of files in directory + actual logical drives */
+ /* memidx contains de number of times malloc has been called */
+
+ /* We now have all names in FName. Drives are enclosed in <>
+ and directories in []. Drives are already ordered, so we
+ may forget about them. Directories and files will be sorted
+ separately, namely, the [ will precede other characters in
+ the lexicographic order we use. To help avoiding problems
+ in case of a future change, we also make < the character
+ with the highest precedence. */
+
+ /* Sorting procedure borrowed from K&R */
+ krqsort(DrivesShown,num-1);
+
+ puttext(1,2,80,2,TextInLine) ;
+ gotoxy(4,2) ;
+ cputs(NewPath) ;
+ if ( (selection = ShowFiles()) == -1 )
+ break ;
+ strcpy(NameSel,FName[selection]) ;
+ for ( j=0 ; j < memidx ; j++ )
+ free(FMem[j]) ;
+ if (!( ( *NameSel == '[' ) || ( *NameSel == '<' )) )
+ break ; /* A file has been selected */
+ if (!strcmp(NameSel,"[.]") ) /* current directory */
+ continue ; /* reread current directory */
+ i = StripStars(NewPath) ;
+ if ( !strcmp(NameSel,"[..]") ) { /* parent directory */
+ for (; (i-3) && (NewPath[i] != BACKSLASH );i-- ) ;
+ NewPath[i] = '\0' ;
+ chdir(NewPath) ;
+ }
+ else if ( *NameSel == '[' ) { /* Another directory */
+ if ( i-3 )
+ NewPath[i++] = BACKSLASH ;
+ for (j=0 ; (NewPath[i]=NameSel[++j])!=']';i++);
+ NewPath[i]='\0' ; /* get rid of terminating ] */
+ chdir(NewPath) ;
+ }
+ else { /* Now NameSel[0] equals '<', so we change drive */
+ CurrDrive = ( (int) NameSel[1] ) - 'A' ;
+ setdisk(CurrDrive) ; /* set disk */
+ NewPath[0]='\0';
+ if ( getcwd(NewPath,MAXPATH)==NULL ) {
+ baddrv = 1 ;
+ selection = -1 ;
+ break;
+ }
+ }
+ AppendStars(NewPath) ;
+
+ } while (1) ; /* End of main loop */
+
+
+ /* Restore settings */
+ puttext(3,3,20,23,TextInWindow) ;
+ free(TextInWindow) ;
+ puttext(1,2,80,2,TextInLine) ;
+ free(TextInLine) ;
+ _setcursortype(_NORMALCURSOR) ; /* show cursor */
+ gotoxy(col,row) ; /* restore cursor position */
+
+ if (selection == -1 ) { /* Leave everything as before */
+ if ( !baddrv )
+ for ( j=0 ; j < memidx ; j++ )
+ free(FMem[j]) ;
+ setdisk(oldrive) ;
+ CurrDrive = oldrive ;
+ chdir(Path) ;
+ return ;
+ }
+
+ i=StripStars(NewPath) ;
+ strcpy(Path,NewPath) ;
+ if ( Path[--i] != BACKSLASH )
+ Path[++i] = BACKSLASH;
+ for (j=0 ; ( Path[++i] = NameSel[j++] ) ; );
+ SplitPath();
+}
+
+
+
+int ShowFiles(void)
+{
+ int i,j,init=0,last ;
+ int previous=0, current = 0 ;
+
+ while ( previous != -1 ) {
+ previous = 0 ;
+ last = ( init + 19 < num ) ? init + 18 : num - 1 ;
+ window(5,4,18,22) ;
+ clrscr() ;
+ window(1,1,80,25) ;
+
+ for ( i = init ; i <= last ; i++ ) {
+ gotoxy(5,4+(i-init)) ;
+ cputs(FName[i]) ;
+ }
+
+ while ( previous >= 0 ) {
+ while (1) { /* Highlight currently selected entry */
+ textattr(color[(previous == current)]) ;
+ gotoxy(5,4+previous) ;
+ cputs(FName[init+previous]) ;
+ j = 14 - strlen(FName[init+previous]) ;
+ while ( j-- )
+ putch(' ') ;
+ if ( previous == current ) break ;
+ previous = current ;
+ }
+ textattr(color[0]) ;
+ i = getch(); /* Read character from keyboard */
+ if ( i == 0 ) { /* If extended character */
+ i = getch() ; /* Get character */
+ i *= -1 ; /* Make it different from regular ascii */
+ }
+ switch ( i ) {
+ case CR :
+ previous = -1 ; /* Choose current entry */
+ break ;
+ case HOMEKEY :
+ if ( init > 0 ) {
+ init = 0 ;
+ previous = -2 ;
+ }
+ current = 0 ; /* Go to first entry */
+ break ;
+ case ENDKEY :
+ last = num-1 ; /* Go to last entry */
+ previous = -2 ;
+ init = ( num > 18 ) ? last - 18 : 0 ;
+ current = last - init ;
+ break ;
+ case UPKEY :
+ case LEFTKEY :
+ if ( current )
+ --current ; /* Move up one position */
+ else if (init) {
+ --init ; /* Scroll back one position */
+ previous = -2 ;
+ }
+ break ;
+ case DOWNKEY :
+ case RIGHTKEY :
+ if ( init+current < last )
+ ++current ; /* Move down one position */
+ else if ( last+1 < num ) {
+ ++init ; /* Scroll forward one position */
+ previous = -2 ;
+ }
+ break ;
+ case PGUPKEY :
+ if (init==0)
+ current = 0;
+ else if (init > 17 ) {
+ init -= 18 ;
+ /* current = 18 ; Leave current as it is now */
+ previous = -2 ;
+ }
+ else {
+ current = init ;
+ init = 0 ;
+ previous = -2 ;
+ }
+ break ;
+ case PGDNKEY :
+ if ( last+1 >= num )
+ current = last - init ;
+ else {
+ init = last ;
+ if ( last + current > num - 1 )
+ current = num - (last+1) ;
+ previous = -2 ;
+ }
+ break ;
+ default :
+ previous = -1 ;
+ current = -1 ;
+ break ;
+ } /* switch (i) */
+ } /* while (previous >= 0) */
+ } /* while (previous != -1) */
+ if ( current == -1 )
+ return -1 ;
+ else
+ return init+current ;
+}
+
+
+void krqsort (int krleft, int krright)
+{
+ int kri,krlast;
+ void krswap(int,int) ;
+ int krcomp(char *,char *);
+
+ if (krleft >= krright )
+ return;
+ krswap(krleft,(krleft+krright)/2);
+ krlast=krleft;
+ for (kri=krleft+1;kri<=krright;kri++)
+ if (krcomp(FName[kri],FName[krleft])<0)
+ krswap(++krlast,kri);
+ krswap(krleft,krlast);
+ krqsort(krleft,krlast-1);
+ krqsort(krlast+1,krright);
+}
+
+void krswap(int ki,int kj)
+{
+ char *temp;
+ temp=FName[ki]; FName[ki]=FName[kj];FName[kj]=temp;
+}
+
+/* Lexicographical comparison, but giving priority to
+ the drive symbols "<" and to the directory symbols "[". */
+
+int krcomp(char *a, char *b)
+{
+ for ( ; *a == *b ; a++, b++ )
+ if ( *a == '\0' )
+ return 0 ;
+ if ( *a == '<' ) return -1 ;
+ else if ( *b == '<' ) return 1 ;
+ else if ( *a == '[' ) return -1 ;
+ else if ( *b == '[' ) return 1 ;
+ else return *a - *b ;
+}
+
+
+void TestDrives(int *DriveExists,int *DosDrives, int *ValidDrives)
+{
+ int i;
+ union REGS r;
+
+ *DosDrives=setdisk(CurrDrive);
+ *ValidDrives=0;
+
+ for ( i=0; i< *DosDrives; i++) {
+ setdisk(i);
+ DriveExists[i] = ( i == getdisk() ) ;
+ if (DriveExists[i]) {
+ r.x.ax = 0x440E;
+ r.x.bx = 0;
+ intdos(&r,&r);
+ if ((!( r.x.flags & 1 )) && (r.x.ax & 0xFF)&&
+ (r.x.ax & 0xFF) != i+1 )
+ DriveExists[i]= 0; /* Drive already referenced */
+ }
+ *ValidDrives += DriveExists[i];
+ }
+ setdisk(CurrDrive) ; /* Restore current disk after tests */
+}
+
+
+void AppendStars(char *Pname)
+{
+ for (; *Pname ; Pname++) ; /* go to end of string */
+ if (*--Pname != BACKSLASH ) /* make sure last char is a backslash */
+ *++Pname = BACKSLASH ;
+ *++Pname = '*' ;
+ *++Pname = '.' ;
+ *++Pname = '*' ;
+ *++Pname = '\0' ;
+}
+
+int StripStars(char *Pname)
+{
+ int i;
+ for (i=0; *Pname!='*' ; i++,Pname++) ;
+ --Pname; /* Point to backslash */
+ if (*--Pname == ':' && ++i )
+ ++Pname;
+ *++Pname = '\0' ;
+ return --i;
+}
diff --git a/systems/msdos/tx/src/txexpand.c b/systems/msdos/tx/src/txexpand.c
new file mode 100644
index 0000000000..a3deed7423
--- /dev/null
+++ b/systems/msdos/tx/src/txexpand.c
@@ -0,0 +1,64 @@
+#include "tx.h"
+
+int ExpandNames(char *expand,char *notexpand,int limit)
+{
+ int i ;
+
+ while ( limit && (*expand = *notexpand++) != '\0' ) {
+ if ( *expand != SUBST_SIGN ) {
+ ++expand ;
+ --limit ;
+ }
+ else if ( !strnicmp(notexpand,WF_PATH,L_WF_PATH) ) {
+ for ( i=0 ; limit && (*expand = Path[i]) ; i++ , limit-- ) {
+#ifdef __GO32__
+ if ( *expand == SLASH )
+ *expand = '\\' ; /* dos wants backslashes here */
+#endif
+ ++expand ;
+ }
+ if (limit && Path[--i] != BACKSLASH ) {
+ *expand++ = '\\' ;
+ --limit ;
+ }
+ if (!limit)
+ break ;
+ notexpand += L_WF_PATH ;
+ }
+ else if ( !strnicmp(notexpand,WF_SLPATH,L_WF_SLPATH) ) {
+ for ( i=0 ; limit && (*expand=Path[i]) ; i++ , limit-- ) {
+#ifndef __GO32__
+ if ( *expand == BACKSLASH )
+ *expand = SLASH ;
+#endif
+ expand++ ;
+ }
+ if (limit && Path[--i] != BACKSLASH ) {
+ *expand++ = SLASH ;
+ --limit ;
+ }
+ if (!limit)
+ break ;
+ notexpand += L_WF_SLPATH ;
+ }
+ else if ( !strnicmp(notexpand,WF_NAME,L_WF_NAME) ) {
+ for ( i=0 ; limit && FileName[i] ; i++ , limit-- )
+ *expand++ = FileName[i] ;
+ if (!limit)
+ break ;
+ notexpand += L_WF_NAME ;
+ }
+ else if ( !strnicmp(notexpand,WF_EXT,L_WF_EXT) ) {
+ for ( i=0 ; limit && Extension[i] ; i++ , limit-- )
+ *expand++ = Extension[i] ;
+ if (!limit)
+ break ;
+ notexpand += L_WF_EXT ;
+ }
+ }
+
+ if ( limit )
+ return 1 ; /* return 1 on successful completion */
+ *(--expand) = '\0' ; /* must back up to put null */
+ return 0 ; /* return 0 if limit has been reached */
+}
diff --git a/systems/msdos/tx/src/txmain.c b/systems/msdos/tx/src/txmain.c
new file mode 100644
index 0000000000..53d53e29bc
--- /dev/null
+++ b/systems/msdos/tx/src/txmain.c
@@ -0,0 +1,72 @@
+#include "tx.h"
+#include <process.h>
+
+extern int ExpandAction(char *, char **, char *, int) ;
+extern void UserPrompt(char *, void *, int) ;
+extern int PrintTextMenu(int) ;
+extern void TxDir(void) ;
+
+
+void TxMain(void)
+{
+ int Choice,CurrentMenu = 0 ; /* Start at main menu */
+ char Action[MAX_ACTION] , /* Command to execute */
+ *Arguments[MAX_ARGS] , /* Pointers to arguments to command */
+ *pMenu ; /* Pointer to menu commands */
+
+ do {
+ Choice = PrintTextMenu(CurrentMenu) ;
+
+ if ( Choice == -1 ) { /* Default */
+ if (!CurrentMenu) /* if in main menu */
+ exit(0) ; /* exit program */
+ CurrentMenu = 0 ; /* otherwise, go back to main menu */
+ continue ;
+ }
+
+ pMenu = *(menu[CurrentMenu]+(2*Choice+1)) ; /* point to menu command */
+
+ if (*pMenu != SUBST_SIGN ) { /* User-defined action */
+ if ( ExpandAction(Action,Arguments,pMenu,(MAX_ACTION-14)) )
+ spawnvp(P_WAIT,Action,Arguments) ;
+ continue ;
+ }
+
+ ++pMenu ; /* Increment pointer if SUBST_SIGN in first position */
+
+ if ( !strnicmp(pMenu,SWITCH_MENUS,L_SWITCH_MENUS) ) { /* change menu */
+ CurrentMenu = atoi(pMenu+L_SWITCH_MENUS) ;
+ if ( ( CurrentMenu < 0) || (CurrentMenu > NumMenus) )
+ CurrentMenu = 0 ; /* switch to main menu if error */
+ }
+ else if ( !strnicmp(pMenu,DOS_COMMAND,L_DOS_COMMAND) ) { /* DOS command */
+ UserPrompt(MSG_DOSCOM,Action,80) ;
+ system(Action) ;
+ }
+ else if ( !strnicmp(pMenu,FIND_NAME,L_FIND_NAME) ) { /* select wf */
+ TxDir() ;
+ }
+ else if ( !strnicmp(pMenu,NEW_NAME,L_NEW_NAME) ) { /* enter new wfname */
+ int OldDrive=CurrDrive;
+ char OldPath[MAXPATH];
+ strcpy(OldPath,Path);
+ UserPrompt(MSG_NEW_FILE,Path,80) ;
+ SplitPath() ;
+ setdisk(CurrDrive) ;
+ if ( chdir(Path) ) {
+ CurrDrive=OldDrive;
+ setdisk(CurrDrive);
+ strcpy(Path,OldPath);
+ }
+ }
+ else if ( !strnicmp(pMenu,END_PROG,L_END_PROG) ) /* end program */
+ exit(0) ; /* Regular way of exiting the program */
+ else { /* Command name begins with a SUBST_SIGN sign (!) */
+ --pMenu ; /* reset pointer */
+ if ( ExpandAction(Action,Arguments,pMenu,(MAX_ACTION-14)) )
+ spawnvp(P_WAIT,Action,Arguments) ;
+ }
+ }
+ while (1) ;
+
+}
diff --git a/systems/msdos/tx/src/txmenu.c b/systems/msdos/tx/src/txmenu.c
new file mode 100644
index 0000000000..58828bef3f
--- /dev/null
+++ b/systems/msdos/tx/src/txmenu.c
@@ -0,0 +1,130 @@
+#include "tx.h"
+#include <ctype.h>
+extern int ExpandNames(char *, char *, int) ;
+extern void DrawFrame(int,int,int,int,int) ;
+
+
+int PrintTextMenu(int MenuNum)
+{
+ int row, col , width = 0, height, i ;
+ int bottom, left = 0;
+ int previous=0, current = 0 ;
+ char *TextInWindow, *TextInLine, *ExpMenu , **mp ;
+ char *Entry[MAX_ENTRIES] ;
+
+ ExpMenu = malloc(NumEntries[MenuNum]*MAX_WIDTH);
+ mp = menu[MenuNum] ; /* Position pointers */
+ Entry[0] = ExpMenu ;
+
+ for ( i = 0 ; ( i < NumEntries[MenuNum] ) &&
+ ( ( !i ) || ( (Entry[i] = Entry[i-1] + (left + 1) ) != NULL) ) ;
+ i++ ) {
+ ExpandNames(Entry[i],*mp,MAX_WIDTH);
+ width = ( ( ( left = strlen(Entry[i]) ) > width ) ? left : width ) ;
+ mp += 2 ; /* "left" is used here as dummy variable */
+ }
+
+ width += 4 ; /* 2 frame lines plus 2 spaces plus text width */
+ height = 2 + NumEntries[MenuNum] ; /* 2 frame lines */
+ left = ( RIGHT + 1 ) - width ;
+ bottom = ( TOP - 1 ) + height ;
+ if ( left < 1 || bottom > 25 ) {
+ fprintf(stderr,MSG_SCRBOUNDS,Progname);
+ exit(1) ; /* In case you changed menu settings but were not */
+ } /* careful with bounds */
+ row = wherey() ; col = wherex() ; /* Save cursor position */
+ _setcursortype(_NOCURSOR) ; /* Hide cursor */
+ TextInWindow = malloc(width * height * 2+1);
+ TextInLine = malloc(161) ;
+ gettext(left,TOP,RIGHT,bottom,TextInWindow);
+ gettext(1,25,80,25,TextInLine);
+
+ while ( previous != -1 ) {
+ previous = 0 ;
+ window(left,TOP,RIGHT,bottom) ;
+ clrscr() ; /* Clear text in window area */
+ window(1,1,80,25) ; /* But work in absolute coordinates */
+
+ DrawFrame(left,TOP,RIGHT,bottom,1) ; /* Draw window frame */
+
+ /* Print menu choices */
+
+ for ( i = 0 ; i < NumEntries[MenuNum] ; i++ ) {
+ gotoxy(left+2,TOP+1+i) ;
+ cputs(Entry[i]) ;
+ }
+
+ gotoxy(1,25) ;
+ clreol() ;
+ cputs(MSG_CHOICE) ;
+
+ while ( previous >= 0 ) {
+ while (1) { /* Highlight currently selected entry */
+ textattr(color[(previous == current)]) ;
+ gotoxy(left+2,TOP+1+previous) ;
+ cputs(Entry[previous]) ;
+ i = ( width - 4 ) - strlen(Entry[previous]) ;
+ while ( i-- )
+ putch(' ') ;
+ if ( previous == current )
+ break ;
+ previous = current ;
+ }
+ textattr(color[0]) ;
+ i = getch(); /* Read character from keyboard */
+ if ( i == 0 ) { /* If extended character */
+ i = getch() ; /* Get character */
+ i *= -1 ; /* Make it different from regular ascii */
+ }
+ switch ( i ) {
+ case UPKEY :
+ case LEFTKEY :
+ if ( current )
+ --current ; /* Move up one position */
+ break ;
+ case DOWNKEY :
+ case RIGHTKEY :
+ if ( current < (NumEntries[MenuNum]-1) )
+ ++current ; /* Move down one position */
+ break ;
+ case HOMEKEY :
+ case PGUPKEY :
+ current = 0 ; /* Go to first entry */
+ break ;
+ case ENDKEY :
+ case PGDNKEY :
+ current = NumEntries[MenuNum]-1 ; /* Go to last entry */
+ break ;
+ case CR :
+ previous = -1 ; /* Choose current entry */
+ break ;
+ case SPACE :
+ previous = -2 ; /* Momentarily restore original screen */
+ break ;
+ default :
+ if ( (!isdigit(i)) ||
+ ( (current = i - '0') >= NumEntries[MenuNum] ) )
+ current = -1 ; /* default */
+ previous = -1 ; /* A valid digit selects that entry */
+ break ;
+ }
+ }
+ /* Restore Screen */
+ puttext(left,TOP,RIGHT,bottom,TextInWindow) ;
+ puttext(1,25,80,25,TextInLine) ;
+ if ( previous == -2 )
+ getch() ; /* wait for a keypress if ESC was pressed */
+
+ }
+
+ free(ExpMenu) ; /* free memory */
+ free(TextInWindow) ;
+ free(TextInLine) ;
+
+ /* Restore settings */
+
+ _setcursortype(_NORMALCURSOR) ; /* show cursor */
+ gotoxy(col,row) ; /* restore cursor position */
+
+ return current ;
+}
diff --git a/systems/msdos/tx/src/txprompt.c b/systems/msdos/tx/src/txprompt.c
new file mode 100644
index 0000000000..d68336f96f
--- /dev/null
+++ b/systems/msdos/tx/src/txprompt.c
@@ -0,0 +1,27 @@
+#include <conio.h>
+#include <stdlib.h>
+
+void UserPrompt(char *message, char *answer,int NumChars)
+{
+ /* Prompt user with message and put an answer of no more than NumChars */
+ /* in the object pointed to by answer (an int or a char string) */
+
+ char *TextInLine, *buffer, *ptr ;
+ int row, col ;
+
+ row = wherey() ; col = wherex() ; /* save cursor position */
+ buffer = (char *) calloc(NumChars+2,sizeof(char));
+ TextInLine = (char *) malloc(161);
+ gettext(1,25,80,25,TextInLine);
+ gotoxy(1,25) ;
+ clreol() ; /* clear last line */
+ cputs(message) ; /* write prompt */
+ *buffer = NumChars ;
+ ptr = cgets(buffer) ;
+ strcpy(answer,ptr) ; /* answer is a pointer to a string */
+ puttext(1,25,80,25,TextInLine) ; /* restore last line */
+ gotoxy(col,row) ; /* restore cursor position */
+ free(buffer) ;
+ free(TextInLine) ;
+ return ;
+}
diff --git a/systems/msdos/tx/tx.cnf b/systems/msdos/tx/tx.cnf
new file mode 100644
index 0000000000..957a367d05
--- /dev/null
+++ b/systems/msdos/tx/tx.cnf
@@ -0,0 +1,68 @@
+% Sample "tx" configuration file
+%
+% The '%' sign starts a comment
+%
+
+% Blank lines are ignored
+
+0. Edit #name#ext % use your favorite editor
+emacs #/path#name#ext
+1. Latex (2e) #name.tex
+tex386 &latex2e #/path#name.tex % PcTeX users should use #path instead of #/path
+2. LateX old (2.09) #name.tex
+tex386 &latex209 #/path#name.tex
+3. View #name.dvi
+c:\programs\emtex\bin\v #path#name
+4. Find existing working file
+#find
+5. Type new working file name
+#new
+6. Printer menu
+#menu 1
+7. Other TeX programs
+#menu 2
+8. Execute DOS command
+#dos
+9. Exit the menu
+#end
+
+%
+% Menu 1: Printing
+
++ % The '+' sign signals a new menu
+0. Create #name.ps
+dvips #path#name
+1. View #name.ps
+c:\gs\gs386.exe #path#name.ps
+2. Create #name.lj (hplaserjet, 300dpi)
+prthplj #path#name
+3. Create #name.ljh (hplaserjet, 600dpi)
+prthpljh #path#name
+4. Other TeX programs
+#menu 2
+5. Return to main menu
+#menu 0
+
+
+%
+% Menu 2: Other TeX programs
+
++
+0. Huge LaTeX 2e #name.tex
+htex386 &latex2e #/path#name.tex
+1. Huge LaTeX 2.09 #name.tex
+htex386 &latex209 #/path#name.tex
+2. Plain TeX #name.tex
+tex386 &plain #/path#name.tex
+3. DC Plain TeX #name.tex
+tex386 &dc-plain #/path#name.tex
+4. Huge Plain TeX #name.tex
+htex386 &plain #/path#name.tex
+5. Jed #name.tex
+jed #/path#name#ext
+6. Vi #name.tex
+vi #path#name#ext
+7. Printer menu
+#menu 1
+8. Return to main menu
+#menu 0
diff --git a/systems/msdos/tx/tx.doc b/systems/msdos/tx/tx.doc
new file mode 100644
index 0000000000..a1da185b07
--- /dev/null
+++ b/systems/msdos/tx/tx.doc
@@ -0,0 +1,324 @@
+ ************************************************
+ TX: A flexible menu system for TeX users in a pc
+ ************************************************
+
+Tx provides a system of interrelated menus intended primarily to be used
+with TeX. However, since the menus are completely definable by the user,
+tx could, in principle, be used as a front end for any other application.
+
+The program occupies about 80Kb of RAM. It uses Ralf Brown's "spawno"
+library to swap out of dos memory when executing other programs.
+
+ ********************
+ COMMAND LINE OPTIONS
+ ********************
+
+The syntax of the command line is:
+
+ tx [-h] [-e num] [-m] [@cnfname] [wfname]
+
+where square brackets indicate that an item is optional.
+"-h" prints a usage message and exits.
+"-e num" sets the environment size for child processes. This may be
+ necessary, for instance, if you want to execute a program that
+ tries to define some environmental variable. If you receive
+ messages like "out of environment space", set "num" to a high
+ enough value. The program will exit if "num" is smaller than
+ 256. (Note: when spawning a new process or command processor,
+ dos ignores the environment size you currently have; modifying
+ the config.sys to set up a higher value in the shell statement
+ does not help---you still have to use the -e option here.)
+"-m" sets a monochrome display.
+"cnfname" denotes the configuration file name (see explanation below).
+"wfname" indicates the working file name.
+
+For instance, the following are all valid calls:
+
+ tx
+ tx -e 4096 @c:\dos\myconf.cnf mypaper.tex
+ tx -m -e 1024
+
+If you hit "tx -h" a brief message will appear and the program will exit.
+
+
+ ******************
+ CONFIGURATION FILE
+ ******************
+
+Tx requires a configuration file to start working. The configuration file
+contains the menu entries and the commands associated with each entry.
+
+There are three ways of specifying the configuration file to the program.
+In order of descending precedence, they are:
+
+ (1) Type the configuration file name in the command line, preceded by an
+ `at' sign @. For instance, if `$' is your prompt, either
+
+ $ tx @c:\thing\config.ego mytex.tex
+ or
+ $ tx mytex.tex @c:\thing\config.ego
+ or
+ $ tx @c:\thing\config.ego
+
+ are valid commands. The two first commands are equivalent, and
+ tell tx that the configuration file is "c:\thing\config.ego", and
+ the working file name is "mytex.tex". The third call sets the
+ configuration file to c:\thing\config.ego, and lets tx use the
+ default working file name, which is "work.tex". By preceding the
+ configuration files with an @ sign, we follow emTeX standards.
+
+ (2) If the configuration file has not been entered in the command
+ line, the program looks for the default configuration file
+ "tx.cnf" in the same directory where "tx.exe" resides. For instance,
+ if both programs are in c:\emtex\bin, you don't need to type
+ the name each time you run tx. (NOTE: If you rename "tx.exe" to,
+ say, "menu.exe", then the default configuration file name becomes
+ "menu.cnf".) This should be the usual procedure, as it does not
+ require any specific user input.
+
+ (3) If neither of the two previous methods worked, then tx checks whether
+ the environmental variable "TX" has been defined. For instance,
+ if you type
+
+ $ set TX=c:\thing\config.ego
+ $ tx mytex
+
+ the effect is the same as you would get in the first and second
+ examples above, provided you do not have a file named "tx.cnf" in
+ the directory where the executable resides. If you want to use
+ this option permanently, you can write the "set
+ TX=c:\thing\config.ego" command in your autoexec.bat file.
+ (NOTE: Renaming "tx.exe" does NOT change the name of this
+ environmental variable. You can change it by editing "txdefs.h"
+ and recompiling the program.)
+
+If everything else failed, a brief help message is shown and the program
+exits. This structure allows the user to have multiple configuration files;
+the usual configuration file can be the default (tx.cnf), and alternative
+configuration files can be entered in the command line.
+
+From now on, we will refer to the text of the menu entries as `text', and
+to the corresponding commands to be executed as `actions'.
+
+The limits imposed by the program are the following:
+
+ (1) There is a maximum of 10 menus, numbered from 0 (main menu) to 9.
+
+ (2) There is a maximum of 10 entries per menu, numbered from 0 to 9.
+
+ (3) Each menu entry can have a maximum width of 60 characters. Commands
+ in the configuration file have a DOS limit of 128 characters. Typed
+ commands have a limit of 80 characters.
+
+(NOTE: You can change the above, as well as many other, things in the
+program by editing the header file "txdefs.h" and recompiling.)
+
+The format of the configuration file is as follows:
+
+--> The lines must appear in pairs. The first line is a `text' entry, and
+ the next line contains the command (`action') that corresponds to it.
+
+--> Each `text' line must be numbered, starting at 0. These entries will
+ appear literally in the menus the program shows, provided they do not
+ exceed the 60 character limit. `Action' lines should NOT be numbered.
+
+--> A `text' or `action' entry terminates with the linefeed (ASCII 10)
+ character that marks the end-of-line. If an action extends more than
+ the 80th position, you must configure your text editor so it allows
+ you to continue typing beyond that limit.
+
+--> Comments may be inserted anywhere with a percent (%) sign, following
+ the TeX conventions: whatever appears from the % (including it) till
+ the end-of-line is ignored. Empty lines and extra spaces are also
+ ignored.
+
+--> Inside `text' and `action' entries, the following conventions are
+ used:
+
+ #name Will be replaced by the working file name, without
+ path or extension.
+
+ #ext Will be replaced by the extension of the working file.
+
+ #path Will be replaced by the working drive and directory.
+
+ #/path This works exactly as in the previous case, with the
+ only difference that the backslashes used by DOS to
+ separate directories will be replaced by forward
+ slashes.
+
+ #menu <n> In an `action', the choice of that option will cause the
+ appearance of the nth menu. If n is not given (or is
+ invalid), the main menu (number 0) will appear. Inside of
+ `text', the string is interpreted literally (that is, it
+ has no effect).
+
+ #find In an `action', the choice of that option will be
+ followed by the appearance of a window displaying the
+ files in the current directory. You can navigate
+ through your file system and choose a new working
+ file. Inside of `text', the string is
+ interpreted literally.
+
+ #new In an `action', the choice of that option will be
+ followed by a prompt asking the user to enter a
+ new working file name. This new name can be entered
+ with a full path.
+
+ #dos In an `action', the choice of that option will be
+ followed by a message prompting the user to type in a
+ DOS command, which will be executed immediately in a
+ subshell. Inside of `text', the string is interpreted
+ literally.
+
+ #end In an `action', the choice of that option will end the
+ program. Inside of `text', the string is interpreted
+ literally.
+
+ + A plus sign at the beginning of a line, indicates that
+ a new menu is going to start. You cannot have any other
+ entries in the same line. Inside a text or action entry,
+ a plus sign is interpreted literally.
+
+
+Sample configuration file:
+
+% Beginning of sample configuration file
+%
+% Menu 0: main menu
+%
+0. Edit #name#ext
+jed #name#ext
+1. LaTeX #name.tex
+tex386 &latex2e #name
+2. View #name.dvi
+dvidrv dviscr @c:\emtex\data\lj.cnf /ocr=1 /o3 /fl=-1 #name
+3. Create #name.lj
+dvidrv dvihplj @d:\emtex\data\lj.cnf /po=#name.lj #name
+4. Find new working file name
+#find
+5. Type new working file name
+#new
+6. DOS command
+#dos
+7. Auxiliary programs
+#menu 1
+8. Exit
+#end
+%
+% Menu 1: auxiliary programs
+%
++
+0. Send #name.lj to printer
+copy /b #name.lj lpt1
+1. Create #name.ps
+dvips -o #name.ps #name
+2. View #name.ps
+gs386 #name.ps
+3. Send #name.ps to postscript printer
+copy /b #name.ps lpt2
+4. TeXEdit #name.tex
+te /l#name #name
+5. Plain TeX #name.tex
+tex386 &plain #name
+6. LaTeX-2.09 #name.tex
+tex386 &latex209 #name
+7. DOS command
+#dos
+8. Go back to main menu
+#menu 0
+
+% A new menu could follow now, preceded by a + sign.
+% Tx allows up to a maximum of 10 menus (0 to 9) to be defined.
+% Each menu can have a maximum of 10 options (numbered 0 to 9).
+%
+% End of sample configuration file.
+
+ ***********
+ TX COMMANDS
+ ***********
+
+The program is very simple: each time a command is not being executed, a
+menu appears and prompts you to choose the number that corresponds to
+one of the options listed. If you press the space bar, the menu will
+disappear and the screen will be restored, so you will be able to see,
+for instance, any error messages or warnings issued by the last program
+you ran; any keypress will restore the menu.
+
+If you press a key that does not correspond to any of the listed options,
+the default action will follow: "go back to main menu" (menu 0) if you are
+at menu n > 0, of "exit the program" if you are at the main menu.
+In the previous sample configuration file there was no need to have in
+each menu an option to return to the main menu: this is the default, and
+will therefore happen whenever you press any key that does not
+correspond to one of the options listed; you could, for instance, press
+the escape key to go back to menu 0 from any other menu. If you press
+the escape key in menu 0, this will end the program.
+
+If you like the program, use it or modify it to suit your needs.
+
+ Ricard Torres
+ torres@upf.es
+
+ 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; version 2.
+
+ 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.
+
+ You will find a copy of the GNU General Public License in the file
+ COPYING, that comes along with the tx source and executable files.
+
+As mentioned above, this program has now been compiled using
+Ralf Brown's "spawno" library, so that the program swaps out
+of dos memory when running other processes. Here is the relevant
+part of the documentation file that came along with the spawno
+library:
+
+----------------- Excerpt from Ralf Brown's documentation -------------
+
+SPAWNO v4.13 12/12/91 disk/EMS/XMS/INT15 swapping replacement for spawn()
+(c) Copyright 1990,1991,1992 Ralf Brown. All Rights Reserved.
+
+
+-----------------
+LICENSE
+
+The source and/or object code comprising the public SPAWNO distribution
+may be incorporated at no charge into programs which are distributed or
+sold to others provided that:
+ 1) credit is given in the documentation. A mention such as
+ "This product uses the SPAWNO routines by Ralf Brown
+ to minimize memory use while shelling to DOS and
+ running other programs."
+ is sufficient.
+ 2) you drop me a line telling me that you are using SPAWNO and
+ in which product(s) you are using it (see addresses at the
+ end of this file). I'm interested in finding out how wide-
+ spread the use of SPAWNO becomes.
+
+
+-----------------
+DISCLAIMER
+
+Although both I and others have tested the code which comprises SPAWNO,
+it is entirely possible that SPAWNO may malfunction in environments or
+under circumstances in which it has not been tested. This code is
+provided AS IS, and the author disclaims any and all responsibility for
+damages (both consequential and incidental) resulting from the use or
+misuse of SPAWNO. Sole responsibility for determining the suitability
+of the code rests with the user.
+
+------------- End of excerpt from Ralf Brown's documentation -------------
+
+In this case the direct user, the author of this program, disclaims
+in his turn all responsibility and passes it along to the final user,
+as specified in the GNU General Public License.
+
diff --git a/systems/msdos/tx1/!tx1read.doc b/systems/msdos/tx1/!tx1read.doc
new file mode 100755
index 0000000000..64d1eb93d6
--- /dev/null
+++ b/systems/msdos/tx1/!tx1read.doc
@@ -0,0 +1,848 @@
+===============================================================================
+ !TX1READ.DOC vom 01.03.1991, V1.23
+
+ Deutsche Kurzanleitung zur Bedienoberfl„che
+ fr TeX und LaTeX des emTeX-Systems mit dem Namen TX1 in der Version 3.20
+
+ (C)opyright 1990,1991 Thomas Esken Software, Im Hagenfeld 84, D-4400 Mnster
+===============================================================================
+
+
+ ===> Bitte beachten Sie die Dokumentation zu emTeX ;
+ alle in diesem Dokument genannten Verfahren beziehen sich darauf !!
+ Lesen Sie bitte auch
+ TX1.HLP, TX1PARAM.DOC, TX1DRV.DOC und DVICHK.DOC !!
+
+ !!!! ACHTUNG !!!!
+ Alle Parameterdateien (TX1PARAM.TOM) alter Programmfassungen
+ werden hiermit ungltig und MšSSEN neu erstellt werden !!
+
+ * Alle von mir hergestellten Programme in dieser Fassung drfen *
+ * von Privatpersonen und ”ffentlichen-wissenschaftlichen Einrichtungen *
+ * zeitlich unbegrenzt und kostenlos auf einem Einplatzrechner oder *
+ * in einem Rechnernetzwerk genutzt werden !! *
+ * Diesem Personenkreis ist es hiermit ausdrcklich gestattet, anderen *
+ * Interessenten vorgenannten Benutzerkreises meine Software zug„nglich *
+ * zu machen. *
+ * Das gilt aber nur dann, wenn die Software in vollst„ndiger und *
+ * unver„nderter Fassung gem„á der in diesem Dokument aufgefhrten *
+ * Dateiliste kostenlos weitergegeben wird !! *
+ * Kommerziellen Softwarevertreibern gestatte ich nur bei schriftlicher *
+ * Anfrage, meine Software ber deren Vertriebsnetz in Umlauf zu bringen.*
+ * Eine gewerbliche Nutzung ist natrlich ohne die Zahlung einer *
+ * Lizenzgebhr verboten und wird von mir strafrechtlich verfolgt. *
+ * Falls Sie an einer Vollversion meiner Software interessiert sind, *
+ * eine gewerbliche Nutzung beabsichtigen oder nicht zu dem weiter oben *
+ * beschriebenen Personenkreis geh”ren, so schreiben Sie bitte bezglich *
+ * der Registrierung an die weiter unten angegebene Adresse !! *
+ * Sie erhalten dann die Vollversion meiner Programme gegen eine *
+ * Kopierkosten- und Aufwandspauschale von derzeit DM 30,-- je Lizenz, *
+ * wobei ich fr Mehrplatzversionen Staffelpreise vorgesehen babe. *
+ * *
+ * Diese Software erhebt keinen Anspruch auf Vollst„ndigkeit oder *
+ * Richtigkeit. Fr Sch„den, die aus Nutzung oder falscher Handhabung *
+ * dieser Software hervorgehen, wird grunds„tzlich von mir keine Haftung *
+ * bernommen. Bei Nutzung dieser Software erkl„rt sich der Benutzer *
+ * rechtsverbindlich und ausnahmslos mit dieser Vereinbarung *
+ * einverstanden !! *
+
+
+ -----------------------------------------------------------------------------
+ Einleitung
+ -----------------------------------------------------------------------------
+ Als ich mir Anfang Oktober 1990 das emTeX-Paket von Eberhard Mattes
+ dank eines Hinweises der Programmierberatung am Rechenzentrum der
+ Westf„lischen Wilhelms-Universit„t mittels des dortigen Dateiverteilungs-
+ programmes VAMP zur Benutzung auf meinem pers”nlichen AT-386 Rechner kopiert
+ habe, war ich nach nach der Installation berw„ltigt von den erweiterten
+ M”glichkeiten dieser verbesserten TeX-Version [3.x] und ihrer Treiber.
+ Da mir jedoch die Ansteuerung der einzelnen Programme ber die DOS-Shell
+ fr die zuknftige Verwendung zu mhsam war und ich meinte, ein so groá-
+ artiges Programmpaket verdiene eine ordentliche Bedienoberfl„che zur
+ Ansteuerung, reifte in mir der Gedanke, die vorher von mir fr eine „ltere
+ TeX-Version verwendete Bedienoberfl„che zu erweitern und umzugestalten.
+ Diese Bedienoberfl„che schrieb mein Freund Fred Sumbeck in Turbo-Pascal fr
+ einen XT mit Monochromkarte, bei dem ich mich herzlich an dieser Stelle fr
+ sein Produkt bedanken m”chte. Also machte ich mich an die Arbeit und er-
+ stellte die Programme TX1.EXE und TX1PARAM.EXE (Bedienoberfl„che und deren
+ Konfigurierprogramm) und DVICHK.EXE (Seitenstatistik aus einem Dokument
+ erstellen). Ich beabsichtigte die Programme fr den Bediener so komfortabel
+ wie nur m”glich zu gestalten und so zieht sich die Steuerung der Eingabe
+ per Rollbalken und die Ausgabe weiterer Information in einem Hilfebalken
+ wie ein roter Faden durch diese Programme.
+
+ Ich hoffe, daá mir meine Arbeit geglckt ist und positiv von Ihnen als
+ Benutzer aufgenommen wird. Falls Sie Fehler in den Programmen finden (was
+ sicherlich der Fall sein wird), die Bedienungsanleitungen fr verbesserungs-
+ wrdig erachten oder Verbesserungs/- und/oder Erweiterungsvorschl„ge zu
+ meiner Software haben, so befolgen Sie bitte genau die Anweisungen zu
+ diesem Punkt wie im Dokument README.GER bzw. README.ENG (emTeX-Paket)
+ beschrieben und schreiben an
+
+ Thomas Esken Software
+ Im Hagenfeld 84
+
+ D-4400 Mnster.
+
+ Bitte legen Sie auch einen frankierten Rckumschlag bei, da meine Einknfte
+ derzeit sehr bescheiden sind.
+
+ -----------------------------------------------------------------------------
+ Installation der Bedienoberfl„che
+ -----------------------------------------------------------------------------
+ Die Bedienoberfl„che wird in komprimierter Form ausgeliefert. Der Paketname
+ lautet TX1PACK.EXE und packt sich bei Aufruf selbst aus. Zum Auspacken von
+ TX1PACK.EXE sollte das Parameter /x angegeben werden, damit auch die in
+ der Archivdatei abgespeicherten Pfadnamen ausgepackt werden. Weiterhin
+ k”nnen Sie ein Verzeichnis anw„hlen, in das die entpackten Dateien abgelegt
+ werden sollen. Dafr geben Sie das Parameter /e[laufwerk:\pfadname...] an,
+ also z.B. TX1PACK /x /eC:\ .
+ So wird dann automatisch in ein Verzeichnis \EMTEX auf dem Laufwerk C:
+ ausgepackt. Nach erfolgreichem Dekomprimieren kann dann TX1PACK.EXE
+ gel”scht werden.
+
+ Bitte modifieren Sie auch die Datei, welche die Environmentvariablen
+ fr emTeX setzt (Default _SET-TEX.BAT) noch dahingehend, daá Sie eine
+ weitere Umgebungsvariable hinzufgen. Diese Umgebungsvariable muá
+ --> emtex_main_dir <-- lauten und dieser muá der Pfadname des
+ Hauptverzeichnisses von emTeX (TeX-Programme und Bedienoberfl„che)
+ zugewiesen werden, also z.B. SET emtex_main_dir=C:\EMTEX !!
+ Dieses kann dann entfallen, wenn Sie in den Steuerdateien TX.BAT, TX3.BAT
+ und ggfls. noch in der Initialdatei EMTEX.BAT alle -> %emtex_main_dir% <-
+ Eintr„ge gegen den (Ihnen ja bekannten) tats„chlichen Pfadnamen des
+ emTeX-Verzeichnisses ersetzten (mit Laufwerksangabe, damit Sie auch von
+ einem anderen Laufwerk aus die Bedienoberfl„che verwenden k”nnen !!).
+ Sollten Sie mit einer DOS-Version 3.2 oder „lter arbeiten, so mssen Sie
+ noch in allen mitgelieferten Stapeldateien den Befehl @echo off gegen
+ den Befehl echo off austauschen sowie den Befehl call gegen den
+ Befehl command/e:?????/c austauschen.
+
+ Bitte lesen Sie sodann die im Titel dieses Dokumentes erw„hnten
+ Beschreibungen und starten danach das Programm TX1PARAM , mit dem
+ Sie dann die Bedienoberfl„che gem„á Ihren Wnschen konfigurieren k”nnen.
+
+ -----------------------------------------------------------------------------
+ Was ist das Besondere an der Bedienoberfl„che
+ -----------------------------------------------------------------------------
+ Die Bedienoberfl„che TX1 verwendet in aller Regel Auswahlmens, in
+ denen der Bediener mit Hilfe der Cursorsteuertasten (Pfeiltasten) einen
+ Roll- bzw. Auswahlbalken auf diejenige Menoption stellen kann, die er
+ anzuw„hlen wnscht. Weiterhin kann der Bediener aber auch die Anwahl eines
+ Menpunktes durch die direkte Eingabe der in dieser Menzeile integrierten
+ Kennziffer erzielen. Aus dem Hinweistextfeld, welches sich unten im
+ Fensterrahmen befindet, kann der Benutzer zudem ersehen, welche weiteren
+ Tastenfunktionen erlaubt sind. Dieses sind im allgemeinen die Hilfetaste
+ <?> und die <Esc>-Taste, welche meist zur Rckkehr in ein vorhergehendes
+ Men oder zum Programmbeenden dient. Die Bedienerfhrung ist durch ein
+ Fenstertitelfeld gew„hrleistet, in dem der jeweilige Programmstatus aus-
+ geben wird. Wird ein Fenster ber einem anderen Fenster aufgeblendet, so
+ wird das berlagerte, passive Fenster v”llig schattiert. Zudem kann ein
+ Hilfebalken in der untersten Bildschirmzeile, der weitere Informationen zu
+ den Menpunkten ausweist, mit von Ihnen definierten Attributen zu- bzw.
+ abgeschaltet werden.
+
+ -----------------------------------------------------------------------------
+ Allgemeines und Kurzbersicht der Funktionen der Bedienoberfl„che
+ -----------------------------------------------------------------------------
+ Die Bedienoberfl„che TX1 arbeitet nur dann ordnungsgem„á, wenn sie
+ vom Stapelprogramm TX.BAT aufgerufen wird, da die Bedienoberfl„che logisch
+ Teil in einem Verarbeitungszyklus von Stapeldateien (batchfiles) ist !
+ Von der Bedienoberf„che werden die nur wenige Byte umfassenden
+ Stapeldateien TX2.BAT, TX2.TMP und TX2TMP.BAT im "aktuellen" Verzeichnis
+ erzeugt, die zur Steuerung unerl„álich sind und vom Benutzer NICHT
+ modifiziert werden drfen !!! Diese Dateinamen sollten nicht in eigenen
+ Applikationen verwendet werden, da die Bedienoberfl„che Dateien mit
+ diesen Namen modifiziert bzw. l”scht !!
+ Die Bedienoberfl„che startet nach der Anwahl eines Menpunktes die
+ Steuerdatei TX2.BAT. Nachdem die Steuerdatei TX2.BAT abgearbeitet ist,
+ wird die Stapeldatei TX3.BAT aufgerufen, welche die Bedienoberfl„che
+ erneut ansteuert. Wenn im "aktuellen"-Verzeichnis eine Parameterdatei
+ mit dem Namen TX1PARAM.TOM gefunden wird, so l„dt die Bedienoberfl„che
+ die darin gespeicherten Voreinstellungen ein und verwendet diese.
+ Wird keine Parameterdatei gefunden, so arbeitet die Oberfl„che mit den
+ fest im Programm voreingestellten Parametern. Sollten Sie beim Init-
+ ialisieren Ihres Rechners (booten) einen Datensuchpfad mit dem residenten
+ DOS-Systemprogramm APPEND anlegen, so verwendet die Oberfl„che bei
+ Nichtauffinden der Parameterdatei im "aktuellen"-Verzeichnis die
+ Parameterdatei, welche zuerst im Datensuchpfad vorgefunden wurde.
+ Von dieser M”glichkeit sollte aber von Ihnen nur in Ausnahmef„llen Gebrauch
+ gemacht werden, da es ansonsten u. U. zu einem Systemzusammenbruch kommen
+ kann.
+
+ Wichtig : Der Dateiname Ihres per Bedienoberfl„che zu bearbeitenden
+ ********* Dokumentes sollte nur maximal 6 Zeichen lang sein und sich
+ signifikant von anderen Dateinamen unterscheiden.
+ Ein von Ihnen verwendeter Dokumentdateiname mit einem voran-
+ gestellten Unterstrich (z.B. _BRIEF.TEX) ist hier unzul„ssig.
+ Just dieser Unterstrich wird als Kennung fr komprimierte
+ Dateien verwendet, die das Archivierungsprogramm LHARC.EXE
+ erzeugt.
+ Dieses alles ist aber nur dann zu beachten, wenn Sie mittels
+ TX1PARAM voreingestellt haben, daá Archivdateien noch besonders
+ gekennzeichnet werden sollen !!
+
+ Fehlerfrei arbeitet die Bedienoberfl„che nur dann, wenn sie mit
+ Monochrom- oder Farbgrafikkarten im Textmodus mit einer Textaufl”sung
+ von 80 Bildschirmspalten und 25 Bildschirmzeilen betrieben wird.
+
+ Beachten Sie bitte, daá der MS/PC-DOS Kommandointerpretierer COMMAND.COM
+ mit einer ausreichenden GrӇe fr Umgebungsvariablen initialisiert wird
+ (mindestens 2048 Byte) und resident zur Verfgung steht (/P), sowie im
+ Suchpfad fr ausfhrbare Programme (PATH) gelegen ist.
+
+ Sie sollten darauf achten, daá die von Ihnen verwendeten Verzeichnisnamen,
+ unter denen Sie Ihr TeX-System angelegt haben nicht zu lang sind, da
+ die Bedienoberfl„che teilweise den Namen des "aktuellen"-Arbeitsver-
+ zeichnisses in einen kompletten Baumnamen umwandelt und diesen in die
+ Steuerdatei TX2.BAT schreibt. Unter MS/PC-DOS besteht jedoch die
+ Einschr„nkung, daá eine Kommandozeile nicht mehr als 127 Zeichen lang sein
+ darf, so daá es eventuell vorkommen kann, daá bei zu langen Verzeichnis-
+ namen die Eintr„ge von TX2.BAT nicht korrekt vom DOS abgearbeitet werden,
+ da die Bedienoberfl„che die Eintr„ge in die Steuerdatei ab dem 127-igsten
+ Zeichen abschneidet und COMMAND.COM nicht mehr zur Verfgung stellt.
+
+ Die Bedienoberfl„che kann nur mit einem Dokumentnamen aus dem "aktuellen"
+ Arbeitsverzeichnis aufgerufen werden !! Das liegt darin begrndet, daá
+ der TeX-Compiler alle von ihm erzeugten Dateien in das "aktuelle" Arbeits-
+ verzeichnis ablegt; die Bedienoberfl„che aber den bergebenen Dokumentnamen
+ mit einem eventuell von Ihnen beim Aufruf bergebenen Pfadnamen in die
+ Steuerdatei TX2.BAT eintr„gt. Das verursacht dann bei dem Abarbeiten der
+ Steuerdatei einen Fehler, da z.B. der Screen-Previewers die von TeX im
+ "aktuellen" Verzeichnis erzeugte Datei in dem von Ihnen bergebenen
+ Verzeichnis nicht finden kann.
+
+ Die Bedienoberfl„che kann mittels des Programms TX1PARAM frei vom
+ Benutzer konfiguriert werden. Dieses Programm erzeugt eine Parameterdatei
+ mit dem Namen TX1PARAM.TOM, in der die Voreinstellungen der Bedienober-
+ fl„che gespeichert sind. Ein gesonderte Beschreibung fr TX1PARAM
+ ist nach meinem Erachten nicht erforderlich, da daá Programm weitest-
+ gehend selbsterkl„rend ist und ber eine eingebaute Hilfestellung verfgt.
+ TX1PARAM ist zudem das ideale Programm, um interaktiv mit Farbein-
+ stellungen zu experimentieren.
+
+ Ich erachte es fr unn”tig, die Bedienoberfl„che und deren Konfigurier-
+ programm mit einer SAA-Oberfl„che auszustatten, da die Eingabe mit der
+ sogenannten Computer-Maus dem Bedienkomfort eher abtr„glich w„re. TeX ist
+ tastaturorientiert und ein allzuh„ufiger Wechsel des Eingabemediums ist in
+ der Regel nicht zweckm„áig. Weiterhin bin ich der Meinung, daá die aus SAA-
+ Oberfl„chen bekannten "Pop-Up Mens" fr den Zweck, den ich mit dieser
+ Bedienoberfl„che verfolgt habe und fr ein ergonomisches Arbeiten zu
+ unbersichtlich sind. Meines Erachtens behindern die SAA-Oberfl„chen die
+ Softwareentwicklung, da die Phantasie und Kreativit„t des Programmieres bei
+ der Erstellung von neuen Bedienoberfl„chenkonzepten durch das SAA-Layout
+ vorgepr„gt ist. Aber leider verlangt die Masse der Anwender fr jede
+ noch so zweifelhafte Anwendung eben diese SAA-Oberfl„che. Deshalb habe
+ ich mich dazu entschlossen dem Begehren der Anwender nachzukommen und das
+ Bonusprogramm MASTERMIND(tm), welches aus dem Individuellen Men der
+ Bedienoberfl„che heraus gestartet werden kann, mit einer SAA-„hnlichen
+ Oberfl„che zu versehen.
+
+ Ein vor einen Menpunkt gestelltes "NOT"-Zeichen (Winkel) bedeutet, daá
+ dieser Menpunkt derzeit fr Sie gesperrt ist.
+ Ein vor einen Menpunkt gestelltes "Abgehakt"-Zeichen bedeutet, daá die
+ hinter diesem Menpunkt verborgene Funktion aktiviert ist.
+
+ Am zweckm„áigsten ist es, aus dem emTeX-Hauptverzeichnis das Startprogramm
+ EMTEX.BAT aufzurufen, welches zuerst bestimmte Environment-Variablen setzt
+ (Aufruf der Stapeldatei _SET-TEX.BAT) und danach diesen Text mittels des
+ DOS-Kommandos TYPE anzeigt. Danach wird automatisch das Konfigurations-
+ programm TX1PARAM gestartet. Dieser Verlauf l„át sich natrlich sp„ter
+ von Ihnen in der Datei EMTEX.BAT beliebig um„ndern, ist aber ersteinmal
+ fr die Erstinstallation der Oberfl„che so von mir definiert worden.
+ Wenn Sie die Bedienoberfl„che starten m”chten, so geben Sie einfach
+ von der Kommandozeile aus den Befehl TX [dokumentname] ein, wobei der
+ [dokumentname] sich auf eine Datei im aktuellen Dateiverzeichnis beziehen
+ muá ! Falls Sie beim Aufruf der Oberfl„che einen [dokumentnamen.dvi]
+ bergeben, so sind alle Funktionen, die diese Datei modifizieren k”nnten,
+ in den Mens gesperrt (damit nicht unbeabsichtigt diese Datei berschrieben
+ werden kann). Falls Sie nur den Dokumentnamen ohne den identifizierenden
+ Dateisuffix in der Kommandozeile bergeben, so sucht die Oberfl„che im
+ "aktuellen" Verzeichnis zuerst nach einer einer .TEX-Datei und zuletzt
+ nach einer .DVI-Datei.
+ Wird dabei eine dieser Dateien vorgefunden, so arbeitet die Bedienober-
+ fl„che genau so, als h„tten Sie genau diesen Dateinamen in der Kommando-
+ zeile bergeben. Anderenfalls wird die Musterdatei MUSTER.TEX mit dem
+ in der Kommandozeile bergebenen Dokumentnamen voreingestellt.
+
+ Starten Sie die Bedienoberfl„che mit einem im "aktuellen" Verzeichnis
+ nicht vorhandenen Dokumentnamen, so behandelt die Bedienoberfl„che
+ diesen "Fehler" wie folgt :
+
+ Situation -> Dokumentname physikalisch nicht vorhanden
+
+ - Wird die Musterdatei gefunden, so steht der Text aus der Musterdatei
+ unter dem als Aufrufparameter bergebenen Dokumentnamen zur weiteren
+ Bearbeitung zur Verfgung.
+ - Wird die Musterdatei nicht gefunden, so steht ein fest in die
+ Bedienoberfl„che eingebundener Mustertext unter dem bergebenen
+ Dokumentnamen zur Verfgung.
+
+ Situation -> nicht bergebener Dokumentname (kein šbergabeparameter)
+
+ - Wird die Musterdatei gefunden, so steht der Text aus der Musterdatei
+ unter dem Dokumentnamen TMP.TEX zur weiteren Bearbeitung zur
+ Verfgung.
+ - Wird die Musterdatei nicht gefunden so erhalten Sie die Gelegenheit,
+ eine Dokumentdatei aus dem "aktuellen" Verzeichnis mittels der
+ Directoryfunktion anzuw„hlen und somit voreinzustellen.
+
+ Die Musterdatei k”nnen Sie entsprechend Ihrem Geschmack auf Ihre
+ pers”nlichen Belange abwandeln, z.B. wenn Sie viele Briefe schreiben
+ sollten Sie einen Musterbrief zu erstellen, diesen in MUSTER.TEX
+ umbenennen und wenn Sie einen neuen Brief schreiben wollen die
+ Bedienoberfl„che direkt mit dem Namen dieses "neuen" Briefes aufzurufen.
+ Es wird dann unter dem Namen Ihres "neuen" Briefes die Musterdatei
+ vorgeladen, die Sie dann unter dem Briefnamen weiterbearbeiten k”nnen.
+ Allerdings darf der Musterdateiname MUSTER.TEX nicht abgewandelt werden.
+ Dasselbe gilt auch fr die Hilfestellungsdatei TX1.HLP.
+
+ Die Bedienoberfl„che erlaubt die direkte Ansteuerung von TeX, LaTeX,
+ eines Editors, eines Listers, LHarc, TeXCAD, TeXCHK und der DOS-Shell.
+ Zudem ist es m”glich, in drei verschiedenen Vergr”áerungsstufen den von
+ TeX kompilierten Text auf dem Bildschirmger„t auszugeben sowie den Text
+ in Probe- bzw. Korrespondezqualit„t auf einem Epson-FX80 kompatiblen
+ 9-Nadeldrucker sowie Laser- und 24-Nadeldruckern oder einer Textsatzanlage
+ (falls entsprechende Treiber mal implementiert werden (z.B. Linotype)).
+ auszugeben. Auáerdem kann eine DVI-Treiber-Ausgabedatei fr verschiedene
+ Drucker in komprimierter wie auch unkomprimierter Form erzeugt werden und
+ das gesamte Text-Projekt mittels LHarc archiviert (komprimiert) werden.
+
+ Ich habe mich deswegen fr das Komprimierprogramm LHarc entschieden,
+ weil der Nutzer des emTeX-Paketes zum einen ein weiteres, sehr gutes
+ kostenloses Komprimierprogramm erh„lt und weil zum anderen das einzelne
+ Programm LHarc Dateien verpackt und entpackt. Normalerweise sind bei den
+ meisten Komprimierungsprogrammpaketen genau 2 Programme dafr zust„ndig,
+ n„mlich ein Programm was verpackt und ein Programm was entpackt.
+ Zudem ist in LHarc auch noch der EXE-Datei-Header fr selbstextrahierende
+ Dateien enthalten und muá nicht separat mitgeliefert werden.
+ LHarc ist zwar in Puncto der Verpack- und Entpackzeiten nicht das
+ schnellste auf dem Markt erh„ltliche Programm, aber fr nicht zeitkritische
+ Anwendungen, wie sie die Bedienoberfl„che darstellt, allemal ausreichend.
+ šbrigens, falls Sie eine neuere Version von LHarc besitzen, so wrde ich
+ mich sehr darber freuen, wenn Sie mir diese gegen Kostenerstattung
+ zusenden.
+
+ Die Eingabe der Taste <?> erm”glicht es Ihnen, bei der Benutzung der
+ Bedienoberfl„che einen von mir erstellten Hilfetext mittels eines
+ List-Programmes (z.B. LIST von Vernon D. Buerg oder README von Borland)
+ oder Ihres Editors anzusehen. Als Default ist der DOS-Befehl TYPE
+ vorgesehen, welcher aber auf h”chst unkomfortable Weise den Hilfetext
+ listet. Der Name diese Hilfetext-Datei lautet TX1.HLP und diese muá
+ sich im emTeX-Hauptverzeichnis befinden. Bitte l”schen Sie diese Textdatei
+ nicht, da Sie sich sonst der M”glichkeit einer Hilfestellung berauben !
+ Ich habe mich deswegen fr die Taste <?> als Hilfetaste entschieden
+ (anstelle von <F10> oder <F1>), da diese Taste symbolisch gesehen genau
+ fr das steht, was mit der Eingabe dieser Taste verbunden ist, n„mlich
+ bei Fragen des Bedieners eine Hilfestellung auszugeben.
+
+ METAFONT, MFJOB, WEAVE, TANGLE, PKEdit und die Zeichensatzkonverter sowie
+ MAKEDOT und weitere Programme zum Erstellen von Ger„tetreibern sind nicht
+ direkt in die Bedienoberfl„che mit eingebunden. Diese Programme lassen sich
+ aber bequem starten, wenn die Bedienoberfl„che ber den OS-Shell Befehl
+ verlassen wird und direkt von der DOS-Kommandozeile aus diese Programme
+ gestartet werden.
+
+ Den Nutzern der registrierten Programmversion ist es weiterhin m”glich,
+ bis zu 13 individuelle Menpunkte mit in die Bedienoberfl„che einzubauen.
+ Das bedeutet, daá diesen Nutzern die M”glichkeit gegeben ist, eine indi-
+ viduelle Kommandozeile direkt in die Parameterdatei zu berstellen, welche
+ dann aus der Bedienoberfl„che heraus abgearbeitet werden kann. Diese
+ Kommandozeile kann aus einem Programm- oder Stapeldateiaufruf beschaffen
+ sein. So k”nnen direkt weitere, ntzliche Programme oder Stapeldateien
+ fr die Ansteuerung von TeX aus der Bedienoberfl„che heraus aufgerufen
+ werden (z.B. amsTeX oder die weiter oben vorgenannten Programme).
+ Falls Sie eine Stapeldatei ansteuern, so muá vor den Stapeldateinamen
+ der interne DOS-Befehl CALL (ab DOS-Version 3.3) bzw. COMMAND/E:?????/C
+ (DOS-Version 3.2 oder „lter) gestellt werden ($c), anderenfalls wird nicht
+ mehr zur Bedienoberfl„che zurckverzweigt !!
+
+ ( Falls Sie eine Stapeldatei zur Ansteuerung Ihres Editors, Listers,
+ TeXCAD oder LHarc verwenden, so mssen Sie den Befehl CALL bzw.
+ COMMAND... bei der Konfiguration der Bedienoberfl„che mittels TX1PARAM
+ vor den Baumnamen dieser Stapeldatei stellen !! Bei der Zuweisung der
+ Baumnamen der Stapeldateien, welche die Treiberprogramme des TeX-
+ Systems ansteuern, kann dieses entfallen, da von der Oberfl„che
+ automatisch CALL bzw. COMMAND... beim Aufruf dieser Stapeldateien
+ eingesetzt wird ! )
+
+ Dabei k”nnen die folgenden Makros verwendet werden :
+
+ 1. $i - Tritt in einer Kommandozeile dieser Platzhalter auf,
+ so bedeutet das, daá die Bedienoberfl„che mittels einer
+ Eingabeaufforderung, bei welcher Sie einen Ausdruck,
+ der fr den Wert dieses Platzhalters steht, eingeben
+ k”nnen. Die Bedienoberfl„che fgt dann genau den von
+ Ihnen eingegebenen Wert anstelle des Platzahalters in
+ die Kommandozeile ein.
+ 2. $c - Setzt das Kommando COMMAND/E:2048/C (DOS-Vers. 3.2 oder
+ „lter) bzw. CALL (DOS-Version 3.3 oder neuer) in die
+ Kommandozeile ein. Diesen Kommandos wird automatisch ein
+ nachfolgendes Leerzeichen (blank,space) angefgt.
+ 3. $l - Dieser Platzhalter wird in den zweistelligen Namen
+ des "aktuellen" Laufwerks (z.B. C:) umgewandelt.
+ 4. $p - Tritt in einer Kommandozeile diese Zeichenfolge auf,
+ so wird anstelle dieses Maktros der gesamte Baumname
+ der in der Bedienoberfl„che vorgeladenen Dokumentdatei
+ gesetzt (ohne abschliessendes Seperatorzeichen \ !!).
+ 5. $d - Tritt in einer Kommandozeile diese Zeichenfolge auf,
+ so wird anstelle dieses Platzhalters der gesamte
+ Name der in der Bedienoberfl„che vorgeladenen
+ Dokumentdatei gesetzt (Pr„fix + Suffix).
+ 6. $n - Tritt in einer Kommandozeile diese Zeichenfolge auf,
+ so wird an die Stelle dieses Platzhalters nur der Name
+ der in der Bedienoberfl„che vorgeladenen Dokumentdatei
+ gesetzt (Pr„fix).
+ 7. $t - Tritt in einer Kommandozeile diese Zeichenfolge auf,
+ so wird anstelle dieses Platzhalters der gesamte Baum-
+ name der Datei gesetzt, die Sie mittels der eingebauten
+ Dateiauswahlfunktion (Directoryfunkt.) angew„hlt haben.
+ 8. $f - Tritt in einer Kommandozeile diese Zeichenfolge auf,
+ so wird anstelle dieses Makros nur der Dateiname
+ (Pr„fix + Suffix) der Datei gesetzt, die Sie mittels
+ der eingebauten Dateiauswahlfunktion angew„hlt haben.
+ 9. $$ - Erzeugt das Zeichen $ in der Kommandozeile.
+
+ Die Kommandozeile wird in der hier aufgestellten Reihenfolge von links
+ nach rechts abgearbeitet (also zuerst die angegebenen Platzhalter $c
+ und zuletzt die Platzhalter $$).
+ Wenn in der Kommandozeile einer der Platzhalter 1,7 oder 8 angegeben ist,
+ so erfragt die Bedienoberfl„che vor dem Abarbeiten der Kommandozeile,
+ ob Sie auch tats„chlich die von Ihnen erfasste Funktion ausfhren wollen
+ (Sicherheitsabfrage).
+ Die Groá-/ Kleinschreibung wird bei den Platzhaltern beachtet, so daá
+ diese Platzhalter NUR kleingeschrieben von der Bedienoberfl„che bearbeitet
+ werden.
+ Sie k”nnen generell mehrere von allen diesen Platzhaltern gleichzeitig
+ in der Kommandozeile verwenden. Beachten Sie aber bitte die zur L„nge
+ einer Kommandozeile vorgenannte Beschr„nkung auf insgesamt 127 Zeichen.
+
+ Beachten Sie bitte, daá Sie NICHT aus einer Kommandozeile des Individuellen
+ Mens heraus erneut die Bedienoberfl„che TX1.EXE oder deren Startprogramm
+ TX.BAT aufrufen oder ansteuern, da bei jedem Neustart der Oberfl„che die
+ Steuerdatei TX2.BAT gel”scht wird. Das hat in dem geschilderten Fall zur
+ Folge, daá zwar erneut die Bedienoberfl„che gestartet wird, aber nach deren
+ Beendigung nicht wieder zur zuvor gestarteten Bedienoberfl„che zurck-
+ verzweigt wird, was eventuell noch einen Systemhalt zur Folge haben kann !!
+ Allerdings kann dieses Programm problemlos ber die DOS-Shell aus einem
+ ANDEREN Verzeichnis heraus NEU gestartet werden.
+
+ Ferner k”nnen die Nutzer der registrierten Programmversion fr jede von
+ ihnen erzeugte, individuelle Kommandozeile einen Text erfassen, der dann
+ in dem Auswahlmen als Menpunkt der Bedienoberfl„che erscheint. Dabei ist
+ es dem Benutzer m”glich, ein farblich hervorgehobenes "Hotkey"-Zeichen
+ in diese Menzeile einzubinden. Es wird generell das erste Zeichen einer
+ erfassten Mentextzeile von der Oberfl„che als "Hotkey"-Zeichen aufgefasst.
+ Das kann jedoch dadurch abge„ndert werden, daá mittels des Zeichens
+ ø == ASCII 248 (dezimal) genau das Zeichen eingefasst wird, welches den
+ fr diese Menzeile zul„ssigen "Hotkey" repr„sentiert.
+
+ Z.B. wird in dem Mentext
+
+ Metaøføont starten der Buchstabe f , in dem Mentext
+ Metafont starten der Buchstabe M als "Hotkey" aufgefasst.
+
+ Wenn Sie das Zeichen ASCII 248 (dezimal) aber in einem Mentext verwenden
+ wollen, so kann das erst erfolgen, wenn zuvor auf einer kleineren Zeilen-
+ position die hier beschriebene "Einklammerung" eines "Hotkeys"
+ stattgefunden hat.
+
+ Beachten Sie bitte, daá die Zeichen H == ASCII 72 (dezimal),
+ N == ASCII 78 (dezimal) und
+ ? == ASCII 63 (dezimal)
+ nicht von Ihnen verwendet werden k”nnen, da diese Zeichen bereits ander-
+ weitig von der Bedienoberfl„che reserviert sind.
+ Auáerdem ist es nicht m”glich, mehrere Menzeilen mit ein und demselben
+ "Hotkey" zu versehen.
+ Da Kleinbuchstaben bei dieser Funktion generell zu Groábuchstaben
+ umgewandelt werden (allerdings nicht in der sichtbaren Menzeile),
+ ist die Verwendung von z.B. dem "Hotkey" > s < und dem "Hotkey" > S <
+ in verschiedenen Menzeilen unzul„ssig !!
+
+
+ Zudem ist es Nutzern der registrierten Programmversion erlaubt, eine
+ selbsterstellte Hilfedatei fr die Menpunkte des Individuellen Mens
+ anzulegen und diese aus der Bedienoberfl„che heraus anzusehen. Wird ein
+ individueller Hilfetext ben”tigt, so ist der Rollbalken im Individuellen
+ Men auf den Menpunkt zu setzten, fr welchen die Hilfestellung ausge-
+ geben werden soll und anschlieáend die Hilfetaste (?) zu bet„tigen. Wird
+ dann in der individuellen Hilfedatei ein Eintrag zu diesem Menpunkt vor-
+ gefunden, so wird dieser ausgegeben, anderenfalls eine entsprechende
+ Fehlermeldung. So ist es nun m”glich geworden, auch seitens des Benutzers
+ die individuellen Menpunkte zu kommentieren.
+
+ Die individuelle Hilfedatei muá aber gewissen Anforderungen gerecht werden :
+ 1. Der Name dieser Datei MUSS --> TX1INDI.HLP <-- lauten !!
+ 2. Eintr„ge in dieser Datei drfen nicht l„nger 60 Zeichen
+ pro Textzeile sein; l„ngere Eintr„ge werden auf 60 Zeichen gekrzt.
+ 3. Zur Kennzeichnung der Kommentierung eines individuellen
+ Menpunktes muá dessen Auswahltaste (Hotkey, s.o.) wie folgt
+ angegeben werden : ø[Hotkey]ø ,(z.B. øHø).
+ 4. Die Kommentierung ist wie folgt zu strukturieren (Blockstruktur) :
+
+ ø[Hotkey]ø (Einleitung)
+ bla (Kommentierung)
+ bla bla bla "
+ .
+ .
+ . "
+ ø[Hotkey]ø (Ausleitung)
+
+ .
+ .
+ .
+
+ Fr den Ausdruck [Hotkey] ist die entsprechende Auswahltaste
+ des individuellen Menpunktes einzusetzen !
+ Die Groá/- Kleinschreibung des Ausdrucks [Hotkey] wird NICHT
+ unterschieden !
+
+
+ Leiten Sie die Kommentierung der individuellen Menpunkte nicht gem„á
+ dem obigen Schema ein bzw. aus, so arbeitet diese Funktion nicht ordnungs-
+ gem„á. Auáerdem k”nnen Sie nur genau EINE Auskommentierung pro Menpunkt
+ vornehmen, wobei die Reihenfolge der Auskommentierungen der Menpunkte
+ nicht der tats„chlichen Reihenfolge Ihrer Menpunkte im Individuellen Men
+ entsprechen muá.
+ Eine Kommentierung k”nnen Sie beliebig lang gestalten. Fr jede von der
+ Bedienoberfl„che angezeigte Hilfeseite werden Ihnen 17 Zeilen Ihrer
+ Kommentierung ausgegeben. Allerdings k”nnen Sie derzeit in dem Text der
+ individuellen Hilfestellung nur vorw„rts bl„ttern oder die Textausgabe
+ abbrechen. Die von Ihnen erstellten individuellen Hilfedateien sollten
+ nur reinen ASCII-Text ohne Steuerzeichen (Zeichen 0..31 dezimal) enthalten
+ und mit "hartem" Zeilenumbruch (Carriage Return + Linefeed) geschrieben
+ sein.
+
+ Die Bedienoberfl„che erwartet die individuelle Hilfedatei TX1INDI.HLP
+ normalerweise im "aktuellen" Verzeichnis, so daá Sie fr jede Parameter-
+ datei der Bedienoberfl„che (TX1PARAM.TOM), welche ja die individuellen
+ Menpunkte speichert, auch die dazugeh”rige individuelle Hilfedatei zur
+ Verfgung haben. Natrlich ist es auch m”glich, die individuelle Hilfedatei
+ bei Nichtauffinden im "aktuellen" Verzeichnis aus dem Datensuchpfad des
+ Programmes APPEND der Bedienoberfl„che zug„nglich zu machen, was aber
+ nicht immer unbedingt sinnvoll ist (zu APPEND s.o). Das ist genau dann der
+ Fall, wenn eine individuellen Hilfedatei im Datensuchpfad vorgefunden wird,
+ aber nicht im "aktuellen" Verzeichnis.
+ Wird sowohl im "aktuellen" Verzeichnis als auch im Datensuchpfad keine
+ individuelle Hilfedatei vorgefunden, so wird bei Anwahl der Hilfetaste
+ im Individuellen Men die "globale" Hilfedatei TX1.HLP durch das
+ (der Bedienoberfl„che bekanntgemachte) LIST-Programm zur Ansicht gebracht.
+
+
+ Weiterhin kann der Benutzer der registrierten Software eine Hilfestellung
+ bei der Kommandoeingabe ($i) abrufen, den er wie nachfolgend erk„rt in die
+ individuelle Hilfedatei einbaut. Die Ausgabe dieses Hilfetextes kann mit
+ der Funktionstaste <F1> aus dem Kommandoeingabefenster veranlaát werden
+ (hier muáte ich leider mit der ansonsten generell geltenden Hilfetaste <?>
+ brechen, da diese auch als zul„ssige Eingabe mit bercksichtigt werden muá).
+ Die Bedienoberfl„che erkennt die Eingabe der Funktionstaste <F1> allerdings
+ nur dann, wenn noch keine Eingabe in der Kommandozeile vorgenommen wurde.
+ Ich weiá, daá das sehr mangelhaft ist, liegt aber darin begrndet, daá in
+ die Programme noch keine vernnftige Eingaberoutine (Line-Editor) eingebaut
+ wurde und wird in neueren Versionen meiner Software wohl behoben sein.
+
+ ø[Hotkey][Hotkey]ø (Einleitung der Hilfestellung zur Kommandoeingabe)
+ bla (Kommentierung der Optionen zur Kommandoeingabe)
+ bla bla "
+ .
+ .
+ . "
+ ø[Hotkey][Hotkey]ø (Ausleitung der Hilfestellung zur Kommandoeingabe)
+
+ .
+ .
+ .
+
+ Der Textblock der Hilfestellung bei der Kommandoeingabe darf NICHT
+ verschachtelt werden oder in einem Textblock der Hilfestellung zu den
+ Menpunkten MIT EINGEBAUT werden !!
+ Alle bereits vorgenannten Bedingungen bei der Erstellung der individuellen
+ Hilfedatei gelten analog mit der Ausnahme, daá wenn keine individuelle
+ Hilfedatei (TX1INDI.HLP) vorgefunden wird, NICHT die "globale" Hilfedatei
+ TX1.HLP zur Ansicht gebracht, sondern eine Fehlermeldung ausgegeben wird.
+
+
+ In frheren Versionen der Bedienoberfl„che wurden die Programme DEUTEX.EXE,
+ TEXDEU.EXE und DEUTINST.EXE (zur Konvertierung von Texten im 8-Bit ASCII-
+ Format in das entsprechende 7-Bit ASCII-LaTeX-Žquivalent und zurck)
+ mitgeliefert. Diese Konvertierung ist aber in der TeX-Version 3.0 oder
+ neuer nicht mehr erforderlich, da nunmehr 8-Bit Zeichen verarbeitet werden
+ k”nnen. Fr „ltere TeX-Versionen kann diese Konvertierung entweder direkt
+ durch ein entsprechendes Parameter beim Aufruf des TeX-Compilers oder
+ ber das Profile eines Editors (z.B. KEdit) gel”st werden.
+ Wer aber diese Programme haben m”chte, der wende sich direkt an deren
+ Verfasser Fred Sumbeck, Jeilerstraáe 14, D-4400 Mnster.
+
+ -----------------------------------------------------------------------------
+ Besondere Tastenfunktionen
+ -----------------------------------------------------------------------------
+ Im folgenden sind besondere Tastenfunktionen beschrieben, die mangels
+ ausreichendem Platz nicht in dem jeweiligen Fensterhinweistext angezeigt
+ werden k”nnen.
+
+ Dabei bedeuten die Abkrzungen
+ Return == Eingabetaste oder Enter oder Carriage Return (CR)
+ Esc == Escape oder Abbruch
+ Space == Leertaste oder Blank
+ Ctrl == Control bzw. Steuertaste (Strg);
+ Home == Position 1 (Pos1);
+ End == Ende;
+ PgUp == Page Up bzw. Bild hoch;
+ PgDn == Page Down bzw. Bild tief,
+ Cursor == Cursorsteuertaste im numerischen Tastenblock
+ bzw. separater Tastenblock bei MF2-Tastaturen.
+
+ In den Auswahlmens...
+ ======================
+ Return = Funktion anw„hlen (== Eingabe der Kennziffer)
+ Esc = Men bzw. Programm verlassen
+ Cursor oben = Rollbalken eine Position nach oben
+ Cursor unten = " " eine Position nach unten
+ Cursor links = in den Hauptmens weiter nach links bl„ttern,
+ ansonsten wie Cursor oben
+ Cursor rechts = in den Hauptmens weiter nach rechts bl„ttern,
+ ansonsten wie Cursor unten
+ Home = Rollbalken auf erste Position des Mens
+ End = " " auf letzte Position des Mens
+ PgUp = wie Home
+ PgDn = wie End
+
+ Directory-Funktion...
+ =====================
+ Return = Dateiname anw„hlen
+ Esc = Directoryfenster verlassen
+ Cursor links = Rollbalken eine Spalte nach links
+ Cursor rechts = Rollbalken eine Spalte nach rechts
+ Cursor oben = " " eine Zeile nach oben
+ Cursor unten = " " eine Zeile nach unten
+ Ctrl-Cursor links = " " auf erste Spaltenposition,
+ die aktuelle Zeilenposition wird beibehalten
+ Ctrl-Cursor rechts = " " auf letzte Spaltenposition,
+ die aktuelle Zeilenposition wird beibehalten
+ Home = " " auf ersten Eintrag in der Dateiliste
+ End = " " auf letzen Eintrag in der Dateiliste
+ PgUp = wie Home (derzeit, wird noch ge„ndert)
+ PgDn = wie End (derzeit, wird noch ge„ndert)
+ Ctrl-Home = " " auf ersten Eintrag im Fenster
+ Ctrl-End = " " auf letzten Eintrag im Fenster
+ Ctrl-PgUp = " " auf erste Zeile im Fenster,
+ die aktuelle Spaltenposition wird beibehalten
+ Ctrl-PgDn = " " auf letzte Zeile im Fenster,
+ die aktuelle Spaltenposition wird beibehalten
+
+ Farbanwahl-Funktion...
+ ======================
+ Return = Farbe anw„hlen
+ Esc = Farbanwahl ohne Žnderungen verlassen
+ Space = Zeichenauswahlfenster anw„hlen
+ Cursor links = Auswahlrahmen eine Spalte nach links
+ Cursor rechts = Auswahlrahmen eine Spalte nach rechts
+ Cursor oben = " " eine Zeile nach oben
+ Cursor unten = " " eine Zeile nach unten
+ Ctrl-Cursor links = " " auf erste Spaltenposition,
+ die aktuelle Zeilenposition wird beibehalten
+ Ctrl-Cursor rechts = " " auf letzte Spaltenposition,
+ die aktuelle Zeilenposition wird beibehalten
+ Home = " " eine Spalte nach links
+ sowie eine Zeile nach oben
+ End = " " eine Spalte nach links
+ sowie eine Zeile nach unten
+ PgUp = " " eine Spalte nach rechts
+ sowie eine Zeile nach oben
+ PgDn = " " eine Spalte nach rechts
+ sowie eine Zeile nach unten
+ Ctrl-Home = " " auf erste Spalte sowie erste Zeile
+ Ctrl-End = " " auf letzte Spalte sowie letzte Zeile
+ Ctrl-PgUp = " " auf erste Zeile im Fenster,
+ die aktuelle Spaltenposition wird beibehalten
+ Ctrl-PgDn = " " auf letzte Zeile im Fenster,
+ die aktuelle Spaltenposition wird beibehalten
+
+ -----------------------------------------------------------------------------
+ Neu hinzugekommene Dateikennungen im emTeX-System durch die Bedienoberfl„che
+ -----------------------------------------------------------------------------
+ .sum Statistikdatei, welche den Seitenumfang eines ge"TeX"ten
+ Textes enth„lt
+ .tom Parameterdatei der Bedienoberfl„che
+ .tmp Tempor„rdatei, welche nur zur Laufzeit der Bedienoberfl„che
+ existiert (Kopie von TX2.BAT im "aktuellen" Verzeichnis)
+ .hlp Hilfedatei(en) der Bedienoberfl„che
+ .dvp DVI-Treiber-Ausgabedatei fr Probedruck auf 9-Nadeldrucker
+ .dvq DVI-Treiber-Ausgabedatei fr Qualit„tsdruck auf 9-Nadeldrucker
+ .dvd DVI-Treiber-Ausgabedatei fr den 24-Nadeldrucker
+ .dvl DVI-Treiber-Ausgabedatei fr den Laser/- Tintenstrahldrucker
+ .dvs DVI-Treiber-Ausgabedatei fr die Textsatzanlage (z.B. Linotype)
+
+ -----------------------------------------------------------------------------
+ Dateiliste zur Bedienoberfl„che
+ -----------------------------------------------------------------------------
+ Kurzanleitungen :
+ -----------------
+ \emtex\tx1doc\!tx1read.doc Diese Dokumentation
+ \emtex\tx1doc\tx1param.doc Dokumentation zum Aufbau der Parameterdatei
+ \emtex\tx1doc\dvichk.doc Dokumentation zu dvichk.exe
+ \emtex\tx1doc\tx1drv.doc Dokumentation ber den grunds„tzlichen
+ Aufbau der Stapeldateien, welche die
+ DVI-Treiber ansteuern
+
+ Kernprogramme :
+ ---------------
+ \emtex\emtex.bat Umgebungsvariablen initialisieren
+ \emtex\_set-tex.bat Beispiel-Stapeldatei
+ fr das Einrichten der Umgebungsvariablen
+ \emtex\tx.bat Startprogramm der Bedienoberfl„che
+ \emtex\tx1.exe Die Bedienoberfl„che
+ \emtex\tx1.hlp Online-Hilfetext der Bedienoberfl„che
+ \emtex\tx1indi.hlp Hilfedatei zum Individuellen Men (Demo)
+ \emtex\tx1param.exe Installationsprogramm der Bedienoberfl„che
+ \emtex\tx3.bat Ansteuerungsdatei der Bedienoberfl„che
+ \emtex\dvichk.exe Seitenstatistik aus .DVI/.LOG-Datei ermitteln
+ \emtex\tx1param.tom Parameterdatei der Bedienoberfl„che tx1.exe
+ \emtex\muster.tex Mustertext (bitte nicht l”schen !!)
+
+ Stapeldateibeispiele :
+ ----------------------
+ \emtex\tx1doc\_v.bat Beispiel-Stapeldatei
+ fr den Screen-Previewer
+ \emtex\tx1doc\_v.cnf Konfigurationdatei
+ fr vorherige Stapeldatei
+ \emtex\tx1doc\_prtfxd.bat Beispiel-Stapeldatei
+ fr Probedruck Epson-FX80
+ \emtex\tx1doc\_prtfxd.cnf Konfigurationdatei
+ fr vorherige Stapeldatei
+ \emtex\tx1doc\_mspfx.bat Beispiel-Stapeldatei
+ fr Konvert nach MS-WINDOWSs MSP-Format
+ \emtex\tx1doc\_mspfx.cnf Konfigurationdatei
+ fr vorherige Stapeldatei
+ \emtex\tx1doc\_gtex.bat Beispiel-Stapeldatei
+ fr den Aufruf von "German"-TeX
+ \emtex\tx1doc\_glatex.bat Beispiel-Stapeldatei
+ fr den Aufruf von "German"-LaTeX
+
+ Hilfsprogramme-/ dateien :
+ --------------------------
+ \emtex\remove\tx1pack.rem Remove-Datei (fr die Deinstallation
+ dieses Programmpaketes)
+ \emtex\tx1util\lharc.exe Komprimierungsprogramm von Yoshi
+ \emtex\tx1util\lharc.doc Dokumentation zum Komprimierungsprogramm
+ \literatu.lzh Konkurrenzprodukt zu BibTeX von
+ Fred Sumbeck, wird als Bonus mit ausgeliefert.
+
+ Die Bedienoberfl„che in dieser Versionsnummer stellt eine Vorabversion dar.
+ Eine verbesserte sowie eine internationale Programmversion (englisch) sind
+ in Vorbereitung (mit vernnftiger Tastatureingaberoutine (Zeileneditor),
+ fehlerfreier und erweiterter Directoryfunktion und eventuellen Features,
+ die noch noch Benutzerseite an mich herangetragen werden.
+
+ Ich werde die Bedienoberfl„che und deren Konfigurierprogramm nicht mit einer
+ Echtzeituhr ausstatten, da ich es vermeiden m”chte, die Interrupt-Vektoren
+ zu modifizieren (verbiegen). Durch eben diesen Eingriff w„re die Gefahr eines
+ Systemabsturzes bedingt durch schon im Rechnerhauptspeicher befindliche
+ residente Programme, die den Timerinterrupt "unsauber" benutzen, erh”ht
+ und das muá umbedingt vermieden werden.
+
+ Bitte modifizieren Sie NICHT meinen Copyright-Vermerk in meiner Software
+ oder der Parameterdatei, da dieser abgepft wird und bei Ver„nderung
+ entsprechende Reaktionen seitens der Programme ausl”st.
+ Auáerdem geh”rt sich soetwas nicht !
+ Allen, die meine Programme Dekompilieren oder Disassemblieren und den
+ Copyright-Vermerk entfernen, sei an dieser Stelle gesagt, daá ihr Tun
+ kriminell ist. Dieser Personenkreis sollte gef„lligst seine Kreativit„t
+ in eigene Programmprojekte einflieáen lassen (dazu qualifiziert sind diese
+ Leute ja allemal), anstelle sich mit fremden Federn zu schmcken und mir,
+ dem Programmurheber die Publizit„t zu nehmen.
+ Ich habe die Drucktaste fr die Bildschirmhardcopy (PrtScr) w„hrend des
+ Programmlaufs gesperrt, da der Ausdruck des Bildschirminhalts bei den
+ meisten Druckern Probleme bereitet, wenn die Bildschirmmasken mit
+ "sichtbaren" Steuerzeichen versehen sind, welche je nach Druckertyp als
+ Steuerzeichen aufgefasst werden k”nnen.
+ Bei dieser Programmversion ist es noch unerl„álich, daá Sie sich als Bediener
+ ein wenig kooperativ zeigen und keine bewuáten Fehleingaben und somit
+ Programmabstrze provozieren. Die Programme wurden in Turbo-Pascal v5.5
+ geschrieben und verwenden derzeit READLN und ReadKey zum Lesen der Tastatur-
+ eingabe. Es wird nicht in allen F„llen auf unzul„ssige Eingaben geprft, so
+ daá es somit ohne weiteres m”glich ist, undefinierte Programmzust„nde zu
+ erzielen.
+ Weiterhin sollten Sie nur die Seitennummern drucken lassen, die in der
+ Seitenstatistik erw„hnt sind. Bei "L”chern" im Dokument, d.h. Seitennummern,
+ die nicht existieren, aber zwischen vorhandenen Seitennummern liegen,
+ wird derzeit keine Plausibilit„tskontrolle Ihrer Eingabe vorgenommen.
+ Also, wenn Ihr Dokument aus den Seiten 1..4 und 7..12 besteht, sollten Sie
+ auch nur diese Seitennummern drucken lassen. Geben Sie allerdings die
+ Seitennummern 5..6 ein, so erfolgt keine Druckausgabe bzw. Ihr Drucker
+ wird fr diese Seiten in Leerlauf versetzt.
+ Die Bedienoberfl„che prft NICHT den Fehlerstatus Ihres angew„hlten Druckers
+ ab. Das hat den Vorteil, daá Sie w„hrend des Druckvorganges auch den Drucker
+ abschalten k”nnen, ohne daá irgendeine Fehlerroutine der Bedienoberfl„che
+ dafr sorgt, daá der Druckprozeá auch bis zum Ende des Dokumentes fortgesetzt
+ wird. Denn gesetzt dem Fall, Sie stellen w„hrend des Druckvorganges fest, daá
+ Sie das im Ausdruck befindliche Dokument doch nicht zu Ende drucken wollen,
+ so k”nnen Sie ganz einfach den Drucker abschalten und somit ersteinmal den
+ Druckvorgang einstellen.
+ Das Druckprogramm (emTeX-Treiber) allerdings sendet noch ber die Drucker-
+ schnittstelle den Rest der .DVI-Datei an den abgestellten Drucker, so daá
+ evtl. das Betriebssystem einen Fehler erkennt und Sie auffordert zu
+ intervenieren. Es wird aber auf jeden Fall wird wieder korrekt in die
+ Bedienoberfl„che zurckverzweigt.
+
+ Das bedeuted allerdings, daá SIE dafr sorgen mssen, Ihre(n) Drucker
+ zuersteinmal der/den von Ihnen verwendeten Druckerschnittstelle(n) richtig
+ zuzuweisen (mittels TX1PARAM), anzuschlieáen, sowie vor dem Druckbeginn auch
+ den angew„hlten Drucker anschalten und fr die richtige Ausrichtung des
+ Papiers im Drucker verantwortlich sind.
+
+ Die Bedienoberfl„che ist auf IBM-kompatiblen Rechnern, die mit einem der
+ Intel-Mikroprozessoren 8088, 8086 oder 80x86 sowie einer Hauptspeicher-
+ kapazit„t von mindestens 256 kByte ausgerstet sind, lauff„hig.
+ Weiterhin ben”tigt die Bedienoberfl„che zum Ablauf das Betriebssystem
+ MS/PC-DOS mit einer Versionsnummer 3.0 oder neuer.
+ Ein sinnvoller Einsatz von TeX oder LaTeX ist allerdings nur mit einer aus-
+ reichend groáen Festplatte gegeben. Alle in der Dateiliste aufgefhrten
+ Programme ben”tigen allerdings nicht zwingend zum Ablauf eine Festplatte,
+ wobei aber ein reiner Betrieb ber Diskettenlaufwerke sehr uneffektiv
+ im Hinblick auf die Arbeitsgeschwindigkeit ist (lange Ladezeiten !).
+ Eine Aussage darber, ob die Bedienoberfl„che mit der Kompatibilit„tsbox
+ (DOS-Emulation) von OS/2 verwendet werden kann, vermag ich an dieser Stelle
+ und zu diesem Zeitpunkt nicht zu sagen, da mir dieses Betriebssystem nicht
+ zur Verfgung steht. Gleiches gilt fr das Betriebssystem DR-DOS und den
+ DOS-Emulatoren anderer Rechnerfamilien. Ich wrde mich sehr darber freuen,
+ wenn Sie mir Ihre Erfahrungen zu diesem Punkt mitteilen.
+
+ Die Bedienoberfl„che (s. Dateiliste) ist meines Erachtens nicht nur speziell
+ fr das "emTeX"-TeX-System geeignet, sondern fr jedes beliebige TeX-System
+ (z.B. PCTeX) der Version 3.x (und evtl. auch „lter) funktional geeignet und
+ verwendbar.
+
+ Also nochmal; wenn Ihnen die Bedienoberfl„che gef„llt, so seien Sie doch
+ bitte so freundlich und bersenden mir DM 30,-- per Brief als Kopierkosten-
+ erstattung und Aufwandsentsch„digung. Sie erhalten eine Registrierungs-
+ bescheinigung und die zu diesem Zeitpunkt existierende Vollversion meiner
+ Software, und bei Problemen mit dieser meine Untersttzung.
+
+ Ich muá aus beruflichen Grnden leider ersteinmal die Arbeit an den
+ Programmen einstellen, beabsichtige aber, diese sp„testens Oktober 1991
+ wieder aufnehmen. Ich hoffe, daá es mir dann bis zum Ende 1991 gelingt,
+ die o.a. Verbesserungen einzubauen. Registrierte Programmbenutzer erhalten
+ dann automatisch diese verbesserte Programmversion zugesandt.
+
+ Anstelle einer Liste :
+ Alle in dieser Anleitung und weiteren Anleitungen verwendeten
+ Warenzeichen sind Warenzeichen der jeweiligen Warenzeicheninhaber
+ und hiermit genannt. Beachten Sie bitte deren Lizenzbedingungen.
+
+ Ich gráe alle Nutzer von TeX und LaTeX und wnsche diesen viel Freude und
+ Erfolg im Umgang mit dieser Bedienoberfl„che.
+ Nehmt mir die kleinen Schw„chen der Oberfl„che in dieser Fassung und die
+ Tippfehler in den Programmbeschreibungen nicht so bel. Ebenso, falls ich
+ es vergessen haben sollte, wichtige Eigenschaften der Software in den
+ Programmbeschreibungen nicht zu erw„hnen.
+
+ Allen Autoren des Gesamtsoftwarepaketes emTeX sowie der TeX/LaTeX-
+ Fachliteratur, allen voran dem maágeblichen Sch”pfer von TeX,
+ Donald E. Knuth meinen herzlichen Dank und
+
+ weiter so, M„dels und Jungs.
+
+
+ Ende der Dokumentation
+ 01.03.1991, Thomas Esken Software
+ \ No newline at end of file
diff --git a/systems/msdos/tx1/READ.ME b/systems/msdos/tx1/READ.ME
new file mode 120000
index 0000000000..33e0b6397a
--- /dev/null
+++ b/systems/msdos/tx1/READ.ME
@@ -0,0 +1 @@
+!tx1read.doc \ No newline at end of file
diff --git a/systems/msdos/utilities/beta/beta30sw.doc b/systems/msdos/utilities/beta/beta30sw.doc
new file mode 100644
index 0000000000..94a04a9f2d
--- /dev/null
+++ b/systems/msdos/utilities/beta/beta30sw.doc
@@ -0,0 +1,43 @@
+ ----------------------------------
+ BETA - Converter Version 3.0 (DOS)
+ ----------------------------------
+
+About this program:
+ TeX is often used as the typesetting system at universities and other
+ scientific organisations. The present boom of the world wide web (WWW)
+ makes people convert existing dokuments into HTML, the language of the
+ WWW. This coexistence of two layout formats increases the efford of
+ keeping the contents correct and up to date in both formats. The new
+ set of commands (which is very close to HTML indeed) is a source that
+ can be converted into TeX and HTML.
+
+ The introduced format is no simplification but an integration of
+ essential features of the two programming languages LaTeX and HTML.
+
+Installation:
+ Change to the directory where the converter shall be installed:
+ C:\UTIL
+
+ Call PKUNZIP as follows:
+ PKUNZIP -d A:\BETA30SW
+
+ Further instructions can be found in:
+ C:\UTIL\BETA\MANUAL\TEX\MAIN.DVI
+
+ or at the following web page:
+ http://www.iam.rwth-aachen.de/Beta/start.html
+
+license:
+ This program may only be distributed unchanged and complete. After a
+ trial period you are expected to register by sending 10 Deutschmark to
+
+ Horst Wassenberg
+ Institut fuer Allgemeine Mechanik
+ RWTH Aachen
+ 52056 Aachen
+ GERMANY
+
+ E-Mail: wassen@iam.rwth-aachen.de
+
+ You will get a copy with the pascal source and without a delay of
+ 5 seconds and without shareware signs at the bottom of HTML pages.
diff --git a/systems/msdos/utilities/vfcomb/vfc-eng.pdf b/systems/msdos/utilities/vfcomb/vfc-eng.pdf
new file mode 100644
index 0000000000..574b04508a
--- /dev/null
+++ b/systems/msdos/utilities/vfcomb/vfc-eng.pdf
Binary files differ
diff --git a/systems/msdos/utilities/vfcomb/vfc-eng.tex b/systems/msdos/utilities/vfcomb/vfc-eng.tex
new file mode 100644
index 0000000000..348e560f9e
--- /dev/null
+++ b/systems/msdos/utilities/vfcomb/vfc-eng.tex
@@ -0,0 +1,2421 @@
+\documentstyle{article}
+\title{\VFC{} 1.3 \\[1.5ex]
+the program for the designers of the virtual fonts}
+
+\author{A.S.Berdnikov\\
+Institute of Analytical Instrumentation\\
+Rizsky pr. 26, 198103 St.Petersburg, Russia\\
+email: {\tt berd{\sl @}ianin.spb.su}}
+
+\date{June 22, 1996}
+
+\newcommand{\VFC}{{\sl VFComb\/}}
+\newcommand{\bs}{\char '134 } % char \
+\renewcommand{\contentsname}{}
+
+\begin{document}
+\maketitle
+\tableofcontents
+\clearpage
+
+\section*{Introduction\label{Sect-Intr}}%
+\addcontentsline{toc}{section}{Introduction}
+
+The MS DOS program \VFC\ enables to design the virtual
+fonts for \TeX, \LaTeX, etc., using already
+existing real or virtual fonts \cite{VF}\footnote{It is assumed
+that you are familiar with the concept of the virtual fonts and with the
+article \cite{VF}. If it is not so, it is highly recommended
+to read \cite{VF} before you proceed further.} in a more flexible
+manner than the direct manipulations with {\tt .vpl} files.
+It simplifies the process of combining real fonts into the virtual font
+and makes the debugging of the virtual fonts more simple
+and less time consuming. The main purpose of this program was to
+facilitate the integration of CM-fonts with cyrillic LL-fonts
+created by O.Lapko and A.Khodulev \cite{LL,LH} but it can be used for
+other applications too\footnote{Since this MS DOS program is written
+on {\sl Borland Pascal} and uses some specific features
+of this language, it is hardly portable ``as it is'' to any other platform,
+but to my mind it is not too difficult to transfer it to portable ANSI C
+(volunteers are welcome).}.
+
+The characteristic feature of the program is that it can assemble
+the ligature tables and metric information from various fonts
+and combine it with the user-defined metric information
+and ligature/kerning data.
+The program uses the information from {\tt .tfm} files
+(converted to ASCII format by the utility {\sl TFtoPL}) and the ASCII
+data files created by the User, and produces
+the ASCII {\tt .vpl} file on its output.
+The {\tt .vpl} file can be converted later to the
+virtual font using the utility {\sl VPtoVF}.
+
+\VFC{} supports the full syntaxis of {\tt .pl} and {\tt .vpl}
+files as it was defined by D.E.Knuth \cite{VF} and adds
+new commands like numerical variables, pseudo-arithmetics
+operations and conditional operators,
+which simplifies the design of the virtual fonts.
+The typical virtual font operations are performed automatically
+and require a compact \VFC{} script file.
+The \VFC{} script files have flexible structure
+so that just the same script files can be used
+to create the full generic font family.
+
+The commands from the \VFC{} script file enables:
+\begin{itemize}
+\item
+ specify the information about the mapping table
+ between the characters of the virtual font and the
+ real fonts;
+\item
+ specify the explicit sequences of {\sl DVI}-commands
+ substituted instead of some characters of the virtual
+ font;
+\item
+ extract metric information and ligature tables
+ from the {\tt .pl} files (converted from {\tt .tfm} files)
+ which describe the properties of the real fonts;
+\item
+ add user-defined metric information and ligature tables
+ (for example, the ligature and kerning data for the pairs
+ of characters corresponding to different real fonts);
+\item
+ include automatically new characters
+ if these characters are connected by the attributes {\tt VARCHAR},
+ {\tt NEXTLARGER} or ligature table data with the characters
+ already included into the virtual font;
+\item
+ insert automatically the {\tt DVI}-commands which
+ correct the {\tt DVI}-cursor position if the metric
+ information from the virtual font is different from that
+ for the real font;
+\item
+ create the output {\tt .vpl} file which combines all these data.
+\end{itemize}
+
+All input and output files are the ordinary ASCII files.
+The command line of the program specifies
+the name of the script file (the script file contains
+the commands which control the work of the program),
+and, may be, defines some variables which are analyzed and used later
+inside the script file.
+The output of the program is the {\tt .vpl} file which contains
+all information necessary to create the virtual font using
+the utility {\sl VPtoVF} and the {\tt .log} file which summarizes
+all printed messages and all operations
+performed by {\sl VFComb}.
+
+\section{Command-line parameters\label{Sect-CL}}
+
+The command line contains the list of parameters
+which are separated by spaces (the body of the parameter
+should contain {\em no} spaces).
+The following parameters can be specified:
+\begin{itemize}
+\item
+the name of the script file (the obligatory parameter);
+\item
+the definition of some variables which are used later in the script file
+(variable specifications always contain the character `{\tt =}'
+in its body);
+\item
+the name of the log-file, the names of the
+directories which used as a source for the input files,
+the directory for the output files, etc.
+(these parameters start with the character
+`{\tt /}'\footnote{The characters `{\tt !}', `{\tt -}', `{\tt +}'
+can be used as well.}).
+\end{itemize}
+The order of the parameters is of no sence\footnote{%
+The {\em only} exception: if the {\tt .log} file name specified
+by the command line parameter {\tt /o} does not contain the explicit
+directory specification, the directory specified by the parameter
+{\tt /o} is used only if this parameter is specified {\em before}
+the parameter {\tt /l} (the command line parameters {\tt /l} and {\tt /o}
+are described in section~\ref{Sect-CL-Other}).}.
+The {\em responce files} (see section~\ref{Sect-CL-RFiles})
+specified in a form `{\tt @{\em filename}}'
+and DOS environment variable {\tt VFCOMB}
+(see section \ref{Sect-CL-VFCOMB})
+can be used to define the parameters
+which are too long or which are specified too often
+to be typed manually at the command line.
+
+\subsection{Script file name\label{Sect-CL-Script}}
+
+The parameters which specify
+the name of the log-file, the names of the
+directories which are used as a source for the input files,
+the directory for the output files, etc.,
+start with the character `{\tt /}'
+(the characters `{\tt !}', `{\tt -}', `{\tt +}' can be used as well).
+The values of variables specified at the command line
+contain the character `{\tt =}' in its body.
+The {\em responce file} name starts with the character `{\tt @}'.
+All other constructions are recognized as the {\em script file} name.
+
+The {\em script file} is the main source of the commands
+which are processed by \VFC{} and which control the creation
+of the output {\tt .vpl} file.
+If the script file name has no extension, the extension {\tt .tbf}
+is added automatically. If the script file name has no explicit
+directory specification and it is not found in the current directory,
+\VFC{} looks for it in the directories specified by the parameter
+{\tt /u}.
+
+The User should specify only {\em one} script file at the command line
+(previous versions of \VFC{} enabled to specify {\em several} script files
+in the command line).
+If several script files are specified (or if there are the command line
+parameters which are not recognized by \VFC{} properly as the variable
+specifications, responce file names, etc.), the new name redefines
+the previous one after the warning message.
+If one needs to combine several {\tt .tbf} files into one stream
+of commands, the command {\tt LOADFILE} (section~\ref{Sect-VFC-OTHER})
+specified inside the script file can be used to do it.
+
+\subsection{Variables\label{Sect-CL-Var}}
+
+The script file commands can use the variables to specify
+the numerical and text data.
+Usually the variables and their values are specified by the
+script file commands described in section~\ref{Sect-VFC-VAR}.
+This section considers how it is possible
+to specify the variables and their values {\em at the command line} so
+that they can be analyzed by the script file commands when the script file
+is processed by \VFC.
+
+The definition of the {\em string} variable
+and its initial value is performed by the construction
+``{\tt {\em name}={\em value}}''
+--- when such parameter is encountered in the command line,
+a new string variable {\em name} is allocated, and the text string
+{\em value} is assigned to it.
+
+The {\em numerical} variables can be specified if the special suffix
+is added at the end of the field {\em value}\footnote{Usually it is
+not necessary since the User can allocate the
+numerical variables and assign the numerical values to them
+just by analyzing the contents of the string variables
+specified at the command line.}:
+\begin{itemize}
+\item {\tt /r} or {\tt /R}
+corresponds to {\em real variable};
+\item
+{\tt /F}, {\tt /D}, {\tt /H}, {\tt /O}, {\tt /B}, {\tt /C}
+correspond to {\em 32-bit integer} variable where
+{\tt /F} means {\em face code} value,
+{\tt /D} means {\em decimal} value,
+{\tt /H} means {\em hexadecimal} value,
+{\tt /O} means {\em octal} value,
+{\tt /B} means {\em binary} value,
+{\tt /C} means {\em character code} (integer value);
+\item
+{\tt /f}, {\tt /d}, {\tt /h}, {\tt /o}, {\tt /b}, {\tt /c}
+correspond to the {\em byte} (8-bit integer) variable which are usually
+used to define the character codes --- similarly to integers,
+{\tt /f} means {\em face code},
+{\tt /d} means {\em decimal} value,
+{\tt /h} means {\em hexadecimal} value,
+{\tt /o} means {\em octal} value,
+{\tt /b} means {\em binary} value,
+and {\tt /c} means {\em character code};
+\item
+{\tt /@F}, {\tt /@D}, {\tt /@H}, {\tt /@O}, {\tt /@B}, {\tt /@C}
+and their lowercase forms
+define the string variable with the contents equal to decimal representation
+of corresponding integer value --- for example, the parameter
+`{\tt tmp=377/@O}' is equivalent to `{\tt tmp=255}'
+(octal number 377 has the decimal representation 255).
+The suffix `{\tt @}' is equivalent to `{\tt @D}' and `{\tt @d}',
+and all three specifications are of no use since `{\tt S=12345/@D}'
+is just the same as `{\tt S=12345}'.
+\end{itemize}
+The contents of the field {\em value} is to be
+in agreement with the suffix specification
+(see section~\ref{Sect-VFC-NUM} for more details).
+Examples:
+\begin{description}
+\item[\quad{\tt vfcomb fntnam=CMR10 ...}] --- string variable;
+\item[\quad{\tt vfcomb rval=3.14159/r ...}] --- real variable;
+\item[\quad{\tt vfcomb ival=CDEF/H ...}] --- integer variable with hexadecimal value;
+\item[\quad{\tt vfcomb cval=X/c ...}] --- byte variable which is
+the character code for {\tt "X"}.
+\end{description}
+
+\subsection{Other parameters\label{Sect-CL-Other}}
+
+The parameters which specify the log-file name, etc., start
+with one of the characters `{\tt /}', `{\tt !}', `{\tt -}', `{\tt +}'
+followed by the {\em parameter identifier} (a single character) and the
+parameter value. The parameter identifier and the parameter
+value can be separated by `{\tt :}' or `{\tt =}' to achieve better
+readability. Example:
+\begin{itemize}
+\item[]
+{\tt vfcomb ... /l:vfcomb.log -u=c:\bs{}myinput;c:\bs{} !oOUTPUT\bs{} ...}
+\end{itemize}
+The previous version of \VFC{} used a lot of such parameters
+but now most of them are moved inside the script file.
+The following parameters can be specified at the command line:
+\begin{itemize}
+
+\item {\tt /u={\em list-of-dirs}} --- specifies the list of directories
+ separated by `{\tt ;}' which are used to search for the
+ input files if the input file is absent in the currect directory.
+ Several parameters {\tt /u} can be specified --- in this case
+ they are joined together. The maximum number of the search
+ directories is 20, and the new {\sf em\TeX}
+ directory search algorithm (see {\sf em\TeX} documentation)
+ is not implemented.
+
+\item {\tt /l={\em log-file-name}} --- specifies the name for the
+ {\tt .log} file which summarizes the operations performed
+ by {\sl VFComb}.
+ By default the name {\tt {\em scriptfile}.LOG} is used, but
+ if the script file is unknown when the first \VFC{} message is printed,
+ the {\tt .log} file has the name {\tt VFCOMB.LOG}.
+
+\item {\tt /o={\em output-dir}} --- specifies the directory
+ where the output files ({\tt .vpl} and {\tt .log} files)
+ are to be placed if their directories are not specified explicitly.
+
+\end{itemize}
+
+\subsection{Responce files\label{Sect-CL-RFiles}}
+
+The User can specify the construction
+`{\tt @{\em filename}}' among the list of the command line
+parameters which means that the contents of the file {\em filename}
+is added to the contents the command line.
+
+Each line of the responce file is interpreted as
+a separate parameter. The initial spaces
+of the line are omitted, and the characters after
+the first space which terminates the parameter are omitted too.
+The lines which start from the characters
+{\tt '\%'}, {\tt ';'}, {\tt '*'} and the empty lines are ignored.
+
+The responce files can be nested in each other
+(that is, the responce file can have the line {\tt @}{\em filename$1$}
+again) but the depth of their nesting cannot be greater than 5.
+
+\subsection{Environment variable {\tt VFCOMB}\label{Sect-CL-VFCOMB}}
+
+The User can define the DOS environment variable {\tt VFCOMB}
+using the command
+\begin{itemize}
+\item[] {\tt SET VFCOMB=......}
+\end{itemize}
+The contents of this variable is added
+{\em at the beginning} of the command line.
+As a result, the contents of the command line redefines
+the default specifications established by
+the environment variable {\tt VFCOMB}
+if some parameters are specified twice.
+
+\section{Script file commands\label{Sect-VFC}}
+
+The \VFC{} syntaxis is very close to the syntaxis of {\tt .vpl}
+files (it enables to economize the program code
+since \VFC{} is to read and to analyze the {\tt .vpl} files
+in any case).
+That is, the {\tt .tbf}, {\tt .pl} and {\tt .vpl} files are composed
+from the entries specified in a form
+\begin{itemize}
+\item[] {\tt (PROPERTYNAME VALUE)}
+\end{itemize}
+where the {\tt VALUE} can contain nested list structures as well.
+
+\bigskip
+
+The following extensions of {\tt .pl} and {\tt .vpl} syntaxis
+\cite{VF} are used by \VFC:
+\begin{itemize}
+\item new types of numerical constants;
+\item numerical variables;
+\item pseudo-arithmetical expressions;
+\item string variables and string expressions;
+\item conditional operators.
+\end{itemize}
+These commands are described in details in section~\ref{Sect-VFC-VPL}.
+
+\bigskip
+
+The commands specific to \VFC{} {\tt .tbf} files enable to
+specify the following data:
+\begin{itemize}
+\item the name of the virtual font (actually the name
+ of the output {\tt .vpl} file);
+\item the header data which is specified at the
+ beginning of the virtual font;
+\item the assignment (if necessary) the numerical values to
+ symbolic variables used in specification of other
+ user defined data;
+\item the table(s) for mapping
+ the characters of the real fonts into
+ the characters of the virtual font;
+\item the additional ligature table(s) (if present) which
+ contain the ligature and kerning information
+ for the pairs of characters corresponding
+ to different real fonts;
+\item the metric information,
+ ligature and kerning tables, etc.,
+ for the characters of the real fonts;
+\item the options which control the process
+ of creation of the virtual font.
+\end{itemize}
+
+\subsection{Extensions of {\tt .vpl} files\label{Sect-VFC-VPL}}
+
+The following commands and extensions of numerical data specifications
+are valid for \VFC{} script files ({\tt .tbf} files) and for {\tt .pl}
+and {\tt .vpl} files as well. These commands are processed inside
+\VFC{} ``mouth'' subroutines, and as a result they are invisible
+for the subroutines which analyze the syntaxis of {\tt .tbf}, {\tt .pl}
+and {\tt .vpl} files.
+
+The structure of the algorithm which analyzes the
+syntaxis of the input commands implies some restrictions on the way
+these {\em preprocessor} commands can be used in the source files.
+The {\em preprocessor} commands can be inserted at any point
+where the argument {\tt (......)} is suitable.
+So, they can be specified on the upper level of braces,
+they can be specified as the argument of the command
+{\tt (CHARACTER ...)} since it {\em has} the sub-list arguments,
+but they cannot be specified inside the command
+{\tt (CHECKSUM ...)} since there are {\em no} sub-list
+agruments for this command.
+
+\subsubsection{Numerical values\label{Sect-VFC-NUM}}
+
+The syntaxis of {\tt .vpl} files enables to use
+the numerical data of different forms.
+The numerical data can be specified as real (floating point) values,
+32-bit integer values and 8-bit integer values.
+Depending of the context, real or integer values
+should be used, and the range if the accepted
+integer values depends on context also (say, character code
+cannot be greater than 255 while the {\tt checksum} parameter
+is a full 32-bit integer).
+
+Each value starts with the prefix letter preceeded by a space
+and separated from the following actual value by a space
+(as usually, there may be as many spaces as you need
+at any place where at least one space is allowed).
+The prefix character defines the type of the numerical
+value, and the following types can be used:
+\begin{description}
+\item[\quad{\tt R} {\em value}] --- real values ({\tt R 0.27182});
+\item[\quad{\tt D} {\em value}] --- decimal integer values ({\tt D 123456});
+\item[\quad{\tt O} {\em value}] --- octal integer values ({\tt O 377});
+\item[\quad{\tt H} {\em value}] --- hexadecimal integer value ({\tt H 07FA});
+\item[\quad{\tt C} {\em character}] --- character numerical code ({\tt C x}
+ is the code value for character `{\tt x}');
+\item[\quad{\tt F} {\em ident}] --- Xerox {\em face code}, i.e.,
+ an integer value which is substituted by
+ a 3-letter identifier ({\tt F LIE} = {\tt D 17})
+ where the full list of the face codes assigned
+ to the integers from 0 to 17
+ is: MRR, MIR, BRR, BIR, LRR, LIR,
+ MRC, MIC, BRC, BIC, LRC, LIC,
+ MRE, MIE, BRE, BIE, LRE, LIE.
+\end{description}
+
+For \VFC{} input files in all places where the real values can be used,
+the integer values can be used also,
+and in all places where 32-bit integers are accepted, 8-bit
+integers are accepted too.
+\VFC{} also extends the set of prefix letters so that
+more general and more flexible expressions can be constructed:
+\begin{description}
+\item[\quad{\tt B} {\em value}] --- binary integer value ({\tt B 011111111010});
+\item[\quad{\tt V} {\em var-name}] --- the value of some numerical
+ (real or integer) variable ({\tt V FntSize});
+\item[\quad{\tt V-} {\em var-name}] --- the {\em negated} value
+ of some numerical
+ (real or integer) variable ({\tt V- FntSize});
+\item[\quad{\tt V+} {\em var-name}] (unary `$+$') --- just the same as
+ {\tt V} {\em var-name} ({\tt V+ FntSize});
+\item[\quad{\tt V\~{}} {\em var-name}] --- bit-by-bit {\em negated}
+ value of an integer variable ({\tt V\~{} FntSize});
+\item[\quad{\tt A+} {\em value1} {\em value2}]
+ --- addition of two (real or integer) values (`{\tt A+ D 2 D 2}' = 4);
+\item[\quad{\tt A-} {\em value1} {\em value2}]
+ --- subtraction of two (real or integer) values (`{\tt A- D 5 D 3}' = 2);
+\item[\quad{\tt A*} {\em value1} {\em value2}]
+ --- multiplication of two (real or integer) values
+ (`{\tt A* D 5 D 3}' = 8);
+\item[\quad{\tt A/} {\em value1} {\em value2}]
+ --- division (real or integer) of two (real or integer) values
+ (`{\tt A/ D 5 D 2}' = 2 for integers,
+ `{\tt A/ R 5.0 R 2.0}' = 2.5 for real values);
+\item[\quad{\tt A\%} {\em value1} {\em value2}]
+ --- the residue of integer division (mod) of two integer or real values
+ (`{\tt A\% R 5.0 R 2.0}' = 1.0);
+\item[\quad{\tt A!} {\em value1} {\em value2}]
+ --- bit-by-bit {\bf or} operation between two integer values
+ (`{\tt A! B 1010 B 0011}' = {\tt B 1011} = 11);
+\item[\quad{\tt A\&} {\em value1} {\em value2}]
+ --- bit-by-bit {\bf and} operation between two integer values
+ (`{\tt A\& B 1010 B 0011}' = {\tt B 0010} = 2);
+\item[\quad{\tt A\^{}} {\em value1} {\em value2}]
+ --- bit-by-bit {\bf xor} operation between two integer values
+ (`{\tt A\^{} B 1010 B 0011}' = {\tt B 1001} = 9);
+\item[\quad{\tt A>} {\em value1} {\em value2}]
+ --- right shift of integer {\em value1} by {\em value2} bits
+ (`{\tt A> B 1010 D 2}' = {\tt B 10} = 2);
+\item[\quad{\tt A<} {\em value1} {\em value2}]
+ --- left shift of integer {\em value1} by {\em value2} bits
+ (`{\tt A< B 1010 D 2}' = {\tt B 101000} = 40);
+\item[\quad{\tt -A} {\em value}]
+ --- unary `$-$'
+ (`{\tt -A D 5}' = -5, `{\tt -A D -5}' = 5);
+\item[\quad{\tt +A} {\em value}] --- unary `$+$'
+ (`{\tt +A {\em value}}' = {\em value});
+\item[\quad{\tt \~{}A} {\em value}]
+ --- bit-to-bit negated integer {\em value}
+ (`{\tt \~{}A B 1010}' = {\tt B 0101} = 5).
+\end{description}
+The arguments of the arithmetic expressions can be the arithmetic
+expressions again which enables to build complex arithmetic forms
+(similar to {\em polish notation}) --- unfortunately these forms
+are not suitable for fast human recognition.
+The arithmetic operations {\tt A!}, {\tt A\&},
+{\tt A\^{}}, {\tt A>}, {\tt A<}, {\tt \~{}A}, {\tt V\~{}}
+can be used for integer arguments and only at the places
+where the integer expression is required.
+
+\bigskip
+
+Although \VFC{} syntaxis enables to use complex string
+constructions (see section~\ref{Sect-VFC-STRING}),
+the values specified as the arguments
+of the prefix commands {\tt R}, {\tt D}, {\tt O}, {\tt F}, {\tt C},
+{\tt H}, {\tt B}, {\tt V} are always the primitive text strings
+(i.e., the sequences of characters terminated by a space
+or the closing braces `{\tt)}').
+It means that the expression `{\tt D @V ABC}' where
+{\tt ABC} is the string variable with the value {\tt "99"} is illegal
+although one can assume that it is to be equivalent
+to `{\tt D 99}'.
+
+There are some serious reasons not to allow the string expressions
+to be the arguments of the arithmetic constants.
+The simplest one is, for example, that in this case
+it is impossible to convert the {\em legal} expression {\tt C @} into
+numerical value {\tt D 64} as it is required by the rules
+of {\tt .vpl} files.
+Nevertheless, to enable to use such possibilities if necessary,
+the following prefix commands are added
+which enable to perform the conversion of
+the string expressions into numerical values:
+\begin{description}
+\item[\quad{\tt D@} {\em string}]
+ --- interprete string expression as a decimal integer value;
+\item[\quad{\tt O@} {\em string}]
+ --- interprete string expression as an octal integer value;
+\item[\quad{\tt H@} {\em string}]
+ --- interprete string expression as a hexadecimal integer value;
+\item[\quad{\tt B@} {\em string}]
+ --- interprete string expression as a binary integer value;
+\item[\quad{\tt F@} {\em string}]
+ --- interprete string expression as an integer {\em face code};
+\item[\quad{\tt C@} {\em string}]
+ --- interprete string expression as a {\em character code}
+ (string is to be a single character);
+\item[\quad{\tt R@} {\em string}]
+ --- interprete string expression as a real value;
+\item[\quad{\tt V@} {\em string}]
+ --- interprete string expression as a name of a variable
+ (real or integer).
+\end{description}
+
+
+\subsubsection{String values\label{Sect-VFC-STRING}}
+
+Some {\tt .pl} and {\tt .vpl} commands require text strings as their
+arguments (commands {\tt CODINGSCHEME}, {\tt FAMILY},
+{\tt VTITLE}, for example).
+\VFC{} extends the set of numerical values
+so that the string values, string variables and string
+expressions can be used together with the numerical ones.
+The specification of the {\em string variables}
+and {\em string expressions} makes the specification of
+some commands more flexible and
+enables to prepare efficient and compact \VFC{} scripts.
+
+The string constants (contrary to the numerical constants)
+have no special prefix --- they are just the sequences
+of characters which can be surrounded by spaces.
+ Contrary to that
+the string expressions start with the prefix `{\tt @}' ---
+which means that a string constant {\em cannot} starts
+from this letter but it does not restrict the flexibility
+in specification of the string constants too much.
+
+The following string operations can be used:
+\begin{description}
+\item[\quad{\tt @V} {\em var-name}]
+ --- the value of some string variable defined previously
+ ({\tt @V HlpString})
+ (essential note: the argument of the prefix command {\tt @V}
+ {\em can be} the string expression itself like that of the
+ prefix command {\tt V@} described at the previous section);
+\item[\quad{\tt @R} {\em real-value}]
+ --- the real numerical value converted to a text string
+ (`{\tt @R A/ R 1 R 7}' = {\tt "0.14285714286"}
+ since `{\tt A/ R 1 R 7}' = $1/7$);
+\item[\quad{\tt @D} {\em integer-value}]
+ --- the integer numerical value converted to decimal text
+ representation
+ (`{\tt @D O 377}' = {\tt "255"});
+\item[\quad{\tt @O} {\em integer-value}]
+ --- the integer numerical value converted to octal text
+ representation
+ (`{\tt @O D 255}' = {\tt "377"});
+\item[\quad{\tt @H} {\em integer-value}]
+ --- the integer numerical value converted to hexadecimal text
+ representation
+ (`{\tt @H D 255}' = {\tt "FF"});
+\item[\quad{\tt @B} {\em integer-value}]
+ --- the integer numerical value converted to binary text
+ representation
+ (`{\tt @H D 255}' = {\tt "11111111"});
+\item[\quad{\tt @F} {\em string-value}]
+ --- extract font name from the string
+ (`{\tt @F cmr10}' = {\tt "cmr"});
+\item[\quad{\tt @P} {\em string-value}]
+ --- extract the string part after the font name from the string
+ which for legal font names is the font design size in {\tt pt}
+ (`{\tt @P cmr10}' = {\tt "10"});
+\item[\quad{\tt @U} {\em string-value}]
+ --- convert the string value to uppercase form
+ (`{\tt @U cMr10}' = {\tt "CMR10"});
+\item[\quad{\tt @L} {\em string-value}]
+ --- convert the string value to lowercase form
+ (`{\tt @L cMr10}' = {\tt "cmr10"});
+\item[\quad{\tt @+} {\em string1} {\em string2}]
+ --- combines two strings into one string
+ (`{\tt @+ CMR 10}' = {\tt "CMR10"});
+\item[\quad{\tt @} {\em integer-value}] --- string which consists
+ from a single character with a specified code
+ ({\em integer-value} is in a range 0--255);
+\item[\quad{\tt @@} {\em integer-value}] --- string
+ of the specified length composed from spaces;
+\item[\quad{\tt @.}] --- empty string
+ (just the same as {\tt @@ D 0}).
+\end{description}
+As usually the numerical and string values can be the complex
+expressions, not only the elementary constants.
+
+The sequences of string constants and string expressions
+separated by spaces can be specified as the argument of
+the commands like {\tt FAMILY}, {\tt CODINGSCHEME}, {\tt VTITLE}.
+In this case the \VFC{} inserts a space
+between individual string element and expands string expressions
+to a form of a string constants. As a result the string composed
+from a sequence of words separated by spaces (where multiple subsequent
+spaces are compressed into one space) can be constructed
+and written into the output {\tt .vpl} file.
+
+
+\subsubsection{Variables\label{Sect-VFC-VAR}}
+
+As it was mentioned in sections \ref{Sect-VFC-NUM} and \ref{Sect-VFC-STRING},
+it is possible to allocate {\em variables} and to assign
+the {\em values} for them so that these values can be analysed and used
+later. The variables have different types: real, integer, character (byte)
+and string. The usage of the variables and the values assigned
+to the variables are to be in agreement with their type.
+
+The operator which allocates a new variable has a form:
+\begin{itemize}
+\item[] {\tt (VARIABLE ({\em var-type} {\em var-name} {\em var-value}))}
+\end{itemize}
+where
+\begin{itemize}
+\item {\em var-type} is one of the identifiers
+ {\tt REAL}, {\tt INTEGER}, {\tt CHARACTER}
+ ({\tt CHAR}, {\tt BYTE}) or {\tt STRING},
+ which define the type of the variable;
+\item {\em var-name} is the name of the variable
+ which is to be different from the names of the other
+ variables;
+\item {\em var-value} is the real, 32-bit integer,
+ 8-bit integer or string expression which defines
+ the initial value of the variable.
+\end{itemize}
+Example:
+\begin{itemize}
+\item[] {\tt (VARIABLE (CHARACTER Del D 127))}\\
+ {\tt (VARIABLE (REAL Kern\#KKK R -0.3333))}
+\end{itemize}
+
+It is possible to allocate more than one variable
+inside one operator {\tt VARIABLE} by specifying
+several sublists inside it:
+\begin{itemize}
+\item[] {\tt (VARIABLE}\\
+ \phantom{.}\qquad{\tt (CHARACTER Del D 127)}\\
+ \phantom{.}\qquad{\tt (REAL Kern\#KKK R -0.3333)}\\
+ \phantom{.}\qquad{\tt ......}\\
+ {\tt )}
+\end{itemize}
+
+The variable names are case-sensitive: the variables
+with the names {\tt Var} and {\tt vAr} are different.
+The variable names can be composed using {\em arbitrary} characters,
+not only latin letters and digits.
+Nevertheless, it is better not to use the names started from `{\tt @}' ---
+otherwise it is possible to get a strange behaviour
+for the prefix commands {\tt V@} and {\tt @V} (the arguments
+of these commands are analyzed as string expressions, and in this case
+the first letter `{\tt @}' is recognized as the prefix of string
+operastion).
+
+If the operator {\tt VARIABLE} uses the name which was already
+used, the warning message is printed and the old variable
+is deleted.
+The variable value can be changed without the warning message
+by the operator {\tt ASSIGN} which has the form
+\begin{itemize}
+\item[] {\tt (ASSIGN {\em var-name} {\em var-value})}
+\end{itemize}
+The type of the value {\em var-value} is to be in agreement
+with the trype of the variable defined earlier.
+Only one variable can be changed in one operator {\tt ASSIGN}.
+Example:
+\begin{itemize}
+\item[] {\tt (ASSIGN Del D 255)}\\
+ {\tt (ASSIGN Kern\#KKK R +1.51134)}
+\end{itemize}
+
+It is possible also to allocate new vartiables and to assign
+their initial values directly from the command line ---
+see section~\ref{Sect-CL-Var} for more details.
+
+\subsubsection{Conditional operators\label{Sect-VFC-IFF}}
+
+\VFC{} script files can contain the conditional
+{\tt IF-THEN-ELSE} operators. The following groups
+of conditional operators can be used:
+\begin{itemize}
+\item comparison of integer values;
+\item comparison of real values;
+\item comparison of string values;
+\item operators which check the existance of the variables;
+\item integer {\tt IF-CASE} operators;
+\item string {\tt IF-CASE} operators.
+\end{itemize}
+The depth of {\tt IF-THEN-ELSE}-operators cannot exceed 50.
+
+\bigskip
+
+The general form of {\tt IF}-operators is the following:
+\begin{itemize}
+\item[]{\tt (IF-{\em condition} {\em if-data})}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\em commands}\\
+ \phantom{WWW}{\tt .........}\\
+ {\tt (ELSE)}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\em commands}\\
+ \phantom{WWW}{\tt .........}\\
+ {\tt (ENDIF)}
+\end{itemize}
+The general form of {\tt IF-CASE}-operators is the following:
+\begin{itemize}
+\item[]{\tt (IF-CASE-{\em condition} {\em if-case-data})}\\
+ \phantom{WWW}{\tt (CASE {\em case-value1})}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\em commands}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\tt (BREAK)}\\
+ \phantom{WWW}{\tt (CASE {\em case-value2})}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\em commands}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\tt (BREAK)}\\
+ \phantom{WWW}{\tt .........}\\
+ {\tt (ELSE)}\\
+ \phantom{WWW}{\tt .........}\\
+ \phantom{WWW}{\em commands}\\
+ \phantom{WWW}{\tt .........}\\
+ {\tt (ENDIF)}
+\end{itemize}
+As usually, the {\tt ELSE}-block can be skipped together
+with the command {\tt (ELSE)}.
+
+\bigskip
+
+Actually {\tt IF-}commands and {\tt IF-CASE}-commands are the preprocessor
+operators which are used by \VFC{} read-data subroutines
+to skip some blocks of input data.
+{\tt IF}-commands transfer the block after {\tt IF-}command if some
+condition is fulfilled, and transfer {\tt ELSE}-block if it is not
+fulfilled.
+{\tt IF-CASE}-operators check that {\em if-case-data} is equal to
+{\em case-value} and transfer the corresponding block of commands
+further. The {\tt CASE}-block is to be
+terminated by {\tt (BREAK)} --- like {\sl C} conditional
+operators the {\tt CASE}-block is not terminated automatically
+when the next {\tt (CASE ...)} is encountered.
+
+\bigskip
+The following {\tt IF}-conditions and {\tt IF-CASE}-conditions can be used:
+\begin{description}
+\item[\quad\tt(IF {\em integer-value})]
+ --- checks that some integer expression is not equal to zero;
+\item[\quad\tt(IF-NOT {\em integer-value})]
+ --- checks that some integer expression is equal to zero;
+\item[\quad{\tt(IF-ONE {\em integer-value})},
+ {\tt(IF-TRUE {\em integer-value})}]
+ --- just the same as the command {\tt(IF {\em integer-value})};
+\item[\quad{\tt(IF-ZERO {\em integer-value})},
+ {\tt(IF-FALSE {\em integer-value})}]
+ --- just the same as the command {\tt(IF-NOT {\em integer-value})};
+\item[\quad\tt(IF-DEF {\em var-name})]
+ --- checks that some variable is defined already;
+\item[\quad\tt(IF-NDEF {\em var-name})]
+ --- checks that some variable is not defined still;
+\item[\quad{\tt(IF-EQ {\em integer$_1$} {\em integer$_2$})}]
+ --- checks that $\hbox{\em integer}_1=\hbox{\em integer}_2$;
+\item[\quad{\tt(IF-NE {\em integer$_1$} {\em integer$_2$})}]
+ --- checks that $\hbox{\em integer}_1\ne\hbox{\em integer}_2$;
+\item[\quad{\tt(IF-GT {\em integer$_1$} {\em integer$_2$})}]
+ --- checks that $\hbox{\em integer}_1>\hbox{\em integer}_2$;
+\item[\quad{\tt(IF-LT {\em integer$_1$} {\em integer$_2$})}]
+ --- checks that $\hbox{\em integer}_1<\hbox{\em integer}_2$;
+\item[\quad{\tt(IF-GE {\em integer$_1$} {\em integer$_2$})}]
+ --- checks that $\hbox{\em integer}_1\ge\hbox{\em integer}_2$;
+\item[\quad{\tt(IF-LE {\em integer$_1$} {\em integer$_2$})}]
+ --- checks that $\hbox{\em integer}_1\le\hbox{\em integer}_2$;
+\item[\quad{\tt(IFR-EQ {\em real$_1$} {\em real$_2$})}]
+ --- compare two real values: $\hbox{\em real}_1=\hbox{\em real}_2$;
+\item[\quad{\tt(IFR-NE {\em real$_1$} {\em real$_2$})}]
+ --- compare two real values: $\hbox{\em real}_1\ne\hbox{\em real}_2$;
+\item[\quad{\tt(IFR-GT {\em real$_1$} {\em real$_2$})}]
+ --- compare two real values: $\hbox{\em real}_1>\hbox{\em real}_2$;
+\item[\quad{\tt(IFR-LT {\em real$_1$} {\em real$_2$})}]
+ --- compare two real values: $\hbox{\em real}_1<\hbox{\em real}_2$;
+\item[\quad{\tt(IFR-GE {\em real$_1$} {\em real$_2$})}]
+ --- compare two real values: $\hbox{\em real}_1\ge\hbox{\em real}_2$;
+\item[\quad{\tt(IFR-LE {\em real$_1$} {\em real$_2$})}]
+ --- compare two real values: $\hbox{\em real}_1\le\hbox{\em real}_2$;
+\item[\quad{\tt(IFS-EQ {\em string$_1$} {\em string$_2$})}]
+ --- compare two text strings: $\hbox{\em string}_1=\hbox{\em string}_2$;
+\item[\quad{\tt(IFS-NE {\em string$_1$} {\em string$_2$})}]
+ --- compare two text strings: $\hbox{\em string}_1\ne\hbox{\em string}_2$;
+\item[\quad{\tt(IFS-GT {\em string$_1$} {\em string$_2$})}]
+ --- compare two text strings: $\hbox{\em string}_1>\hbox{\em string}_2$;
+\item[\quad{\tt(IFS-LT {\em string$_1$} {\em string$_2$})}]
+ --- compare two text strings: $\hbox{\em string}_1<\hbox{\em string}_2$;
+\item[\quad{\tt(IFS-GE {\em string$_1$} {\em string$_2$})}]
+ --- compare two text strings: $\hbox{\em string}_1\ge\hbox{\em string}_2$;
+\item[\quad{\tt(IFS-LE {\em string$_1$} {\em string$_2$})}]
+ --- compare two text strings: $\hbox{\em string}_1\le\hbox{\em string}_2$;
+\item[\quad{\tt(IF-CASE {\em integer-value})}]
+ --- integer {\tt IF-CASE}-operator that checks that
+ the {\em integer-value} is equal to the argument of some
+ {\tt (CASE {\em integer})} command in its body;
+\item[\quad{\tt(IF-CASE {\em integer-value})}]
+ --- integer {\tt IF-CASE}-operator that checks that
+ the {\em integer-value} is equal to the argument of some
+ {\tt (CASE {\em int-value})} command specified
+ after it and before closing {\tt (ENDIF)} operator;
+\item[\quad{\tt(IFS-CASE {\em string-value})}]
+ --- string {\tt IF-CASE}-operator that checks that
+ the {\em string-value} is equal to the argument of some
+ {\tt (CASE {\em string})} command specified
+ after it and before closing {\tt (ENDIF)} operator.
+\end{description}
+Similarly to prefix commands {\tt V@} and {\tt @V}
+(see sections \ref{Sect-VFC-NUM} and \ref{Sect-VFC-STRING}),
+the arguments of the conditions {\tt IF-DEF} and {\tt IF-NDEF} are
+analyzed as the string expressions, not as the string constants
+(see section~\ref{Sect-VFC-STRING}).
+The arguments of the string {\tt IFS}-commands
+and {\tt IFS-CASE}-command are also processed as the string expressions
+and the strings are converted to uppercase form before comparison.
+
+\bigskip
+Examples:
+\begin{itemize}
+\item[]
+ {\tt (IF-DEF FONTNAME)}\\
+ \phantom{WWW}{\tt (MESSAGE The variable FONTNAME = @V FONT)}\\
+ {\tt (ELSE)}\\
+ \phantom{WWW}{\tt (VARIABLE (STRING FONTNAME CMR10))}\\
+ {\tt (ENDIF)}
+\item[]
+ {\tt (IF-TRUE V monospace)}\\
+ \phantom{WWW}{\tt (MESSAGE `MONOSPACE' mode is active)}\\
+ {\tt (ELSE)}
+ \phantom{WWW}{\tt (LOADFILE kerndata.tbf)}\\
+ {\tt (ENDIF)}
+\item[]{\tt (IF-CASE V FONTPITCH)}\\
+ \phantom{}{\tt (CASE D 5)}\\
+ \phantom{WWW}{\tt (ASSIGN u\# R 12.5}\\
+ \phantom{WWW}{\tt (BREAK)}\\
+ \phantom{}{\tt (CASE D 6)}\\
+ \phantom{WWW}{\tt (ASSIGN u\# R 14.0}\\
+ \phantom{WWW}{\tt (BREAK)}\\
+ \phantom{}{\tt .........}\\
+ {\tt (ELSE)}\\
+ \phantom{WWW}{\tt (MESSAGE Unknown FONTPITCH value)}\\
+ \phantom{WWW}{\tt (HALTPGM)}\\
+ {\tt (ENDIF)}
+\end{itemize}
+
+
+\subsubsection{Other operators\label{Sect-VFC-OTHER}}
+
+There are other commands
+which can be useful for the logical structuring
+of the input stream of \VFC{} commands:
+\begin{description}
+\item[\quad\tt(COMMENT {\em text})] --- skip the {\em text}
+ which can include arbitrary \VFC{} commands
+ provided that the opening and closing braces
+ `{\tt (}' and `{\tt )}' are balanced correctly.
+\item[\quad\tt(MESSAGE {\em text})] --- print the {\em text}
+ which may be the combination of string elements and
+ string expressions (see section~\ref{Sect-VFC-STRING})
+ separated by spaces, and can include opening and closing
+ braces `{\tt (}' and `{\tt )}' if they are balanced
+ correctly, but it cannot exceed 255 characters.
+\item[\quad\tt(TYPEOUT {\em text})] --- just the same as
+ {\tt (MESSAGE {\em text})}.
+\item[\quad{\tt(LOADFILE {\em filename})} or {\tt(LOAD {\em filename})}]
+ --- insert at this place the contents of the file {\em filemane}
+ ({\em filename} can be a string expression)
+ from the beginning and up to the end or up to the first command
+ {\tt (ENDLOAD)} encountered in it.
+ If the extension of the {\em filename} is not specified
+ explicitly,
+ the extension {\tt .tbf} is added if the command {\tt LOADFILE}
+ is encountered during the processing of script file {\tt .tbf},
+ and the extension {\tt .pl} is added if the command {\tt LOADFILE}
+ is encountered during the processing of the {\tt .pl}
+ corresponding to a real font metric data.
+\item[\quad\tt(ENDLOAD)] --- stop to read the contents
+ of the current input file and return the the previous file.
+\item[\quad\tt(ENDINPUT)] --- stop to read the input data stream;
+\item[\quad\tt(HALTPGM)] --- stop the program.
+\end{description}
+
+
+\subsection{{\tt MAPFONT} or {\tt FONT}\label{Sect-VFC-MAPFONT}}
+
+The command {\tt MAPFONT} describes the real fonts which are
+used in the virtual font. One {\tt MAPFONT} command should be
+specified for each real font used in the virtual font.
+
+The command {\tt MAPFONT} assignes the integer {\em index}
+to the real font, and all the commands which use the references to
+the real fonts refer to this {\em index} value. It can also
+specify the processing modes for this font
+(some of them overwrites the modes specified at the command
+{\tt OPTION} described at the section~\ref{Sect-VFC-OPTION})
+and the standard mapping table for the characters
+extracted from this font --- so that the commands
+{\tt CHARACTER} deascribed at section~\ref{Sect-VFC-CHAR}
+becomes unnecessary to great extend.
+
+The command {\tt MAPFONT} has the format:
+\begin{itemize}
+\item[]
+{\tt (MAPFONT {\em index}
+({\em option}$_1$) ({\em option}$_2$)... )}
+\end{itemize}
+where the {\em index} is the integer value.
+The valid {\em options} are:
+\begin{description}
+
+\item[\quad{\tt(FONTNAME {\em filename})} or {\tt(NAME {\em filename})}]
+ --- specifies the name of the real font (obligatory parameter).
+
+\item[\quad{\tt(TFMINPUT {\em filename})}]
+ --- specifies the name of the {\tt .pl} file which is used
+ to load data about this font. The {\tt .pl} file {\tt $<$fontname$>$.tbf}
+ is used if this parameter is not specified where {\tt $<$fontname$>$}
+ is value of the parameter {\tt FONTNAME} defined above.
+
+ The command {\tt (TFMINPUT EMPTY)} means that this is the font
+ which contains no characters at all.
+ The command {\tt (TFMINPUT DUMMY)} means that this is the font
+ which contains all the characters but with zero metric information
+ and without {\tt VARCHAR} and {\tt NEXTLARGER} attributes.
+ In both cases no {\tt .pl} file is read by \VFC{} --- the
+ necessary font information is generated automatically.
+
+\item[\quad{\tt(FONTAT {\em real-value})}] --- specifies the parameter
+ {\tt FONTAT} transferred to {\tt .vpl} file
+ (the default value {\tt (FONTAT R 1.0)}).
+ This parameter is also used to re-calculate {\em dimensional}
+ parameters from the {\tt .pl} file according to
+ {\tt DESIGNUNITS} and {\tt DESIGNSIZE} from the
+ header of the {\tt .vpl} file.
+
+\item[\quad{\tt(FONTAREA {\em text-string})}] --- specifies the parameter
+ {\tt FONTAREA} transferred to {\tt .vpl} file.
+ This parameter specifies the explicit directory
+ for corresponding real font, and as a rule is not used
+ since it restricts the flexibility of font
+ specification \cite{VF}.
+
+\item[\quad{\tt(CHECKSUM {\em 32-bit-integer})}] --- specifies
+ explicitly the value {\tt FONTCHECKSUM} --- the {\em checksum}
+ of the {\tt .tfm} file of this real font stored in the {\tt .vpl} file.
+ Usually it is not necessary to specify this parameter
+ explicitly since its correct value is copied from the {\tt .pl} file
+ with the font metric data.
+ When the {\sl DVI}-driver loads the virtual and the real fonts,
+ the {\tt FONTCHECKSUM} from the {\tt .vpl} file is compared
+ with the {\em checksum} calculated for the {\tt .tfm} files,
+ and the warning message is printed if these values are different
+ (this message shows that the versions of {\tt .vf} and {\tt .tfm}
+ files may be different or that the {\tt .tfm} file may be damaged).
+
+\item[\quad{\tt(FULL)}], {\tt(7TO8)}, {\tt(8TO7)}, {\tt(7TO7)}, {\tt(8TO8)},
+ {\tt(JWNCYR)}, {\tt(CYRTUG)} --- these parameters specify
+ the default mapping table for this real font:
+ according to some rule the characters of the virtual font
+ are mapped into the characters of this real font if
+ these characters of the real font are defined and if the
+ corresponding positions of the virtual font are not
+ occupied still.
+\begin{description}
+\item[\quad{\tt(FULL)}] --- include in the virtual font
+ all the characters from this font so that the character codes
+ are mapped to themselves;
+\item[\quad{\tt(7TO8)}] --- include in the virtual font
+ the characters 0--127 from the real font so that
+ the character {\tt D 0} of the real font corresponds to
+ the character {\tt D 128} of the virtual font,
+ the character {\tt D 1} of the real font corresponds to
+ the character {\tt D 129} of the virtual font, etc.;
+\item[\quad{\tt(8TO7)}] --- include in the virtual font
+ the characters 128--255 from the real font so that
+ the character {\tt D 128} of the real font corresponds to
+ the character {\tt D 0} of the virtual font,
+ the character {\tt D 129} of the real font corresponds to
+ the character {\tt D 1} of the virtual font, etc.;
+\item[\quad{\tt(7TO7)}] --- include in the virtual font
+ the characters 0--127 from this font so that the character codes
+ are mapped to themselves;
+\item[\quad{\tt(8TO8)}] --- include in the virtual font
+ the characters 128--255 from this font so that the character codes
+ are mapped to themselves;
+\item[\quad{\tt(CYRTUG)}] --- include in the virtual font
+ the characters 128--175, 224--244 from this font
+ so that the character codes
+ are mapped to themselves ({\sl CYRTUG} coding scheme
+ for cyrillic characters);
+\item[\quad{\tt(JWNCYR)}] --- include in the virtual font
+ the characters 128--175, 224--244 from this font
+ so that the cyrillic characters for {\sl WNCYR} coding
+ scheme are mapped to cyrillic characters
+ for {\sl CYRTUG} coding scheme.
+\end{description}
+
+\item[\quad{\tt (TRACE)}, {\tt (NOTRACE)}, {\tt (TRACE D {\em integer})}] ---
+specifies the level for printing of the debugging information
+when the ligature tables of this font are processed by \VFC.
+
+\item[\quad{\tt(LIGTABLE)} and {\tt(NOLIGTABLE)}] --- include
+ or do not include in the virtual font
+ the ligature tables of this font.
+
+\item[\quad\tt(PHANTOM)] --- assign attribute {\tt PHANTOM}
+ to all characters which are mapped to this font,
+ for which the attributes {\tt PHANTOM} or {\tt NOPHANTOM}
+ are not specified explicitly.
+
+\item[\quad\tt(NOPHANTOM)] --- switches off for this font the option
+ {\tt PHANTOM} specified by the command {\tt OPTION}
+ (see section~\ref{Sect-VFC-OPTION}).
+
+\item[\quad{\tt(AUTOTFMWIDTH)} and {\tt(NOAUTOTFMWIDTH)}]
+ --- for the characters which are mapped to this font
+ and for which the attributes {\tt SIZECHAR} and {\tt SIZEFONT}
+ are specified, \VFC{} adds automatically the attribute {\tt AUTOTFMWIDTH}
+ or the attribute {\tt NOAUTOTFMWIDTH}, respectively,
+ if such attribute is not specified explicitly
+ (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
+ for more details).
+
+\item[\quad\tt(AUTOTFMCHAR {\em font-index})]
+ --- for the characters which are mapped to this font
+ without explicit attributes
+ {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
+ (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
+ for more details), the attributes
+ \begin{itemize}
+ \item[]
+ {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em char-code})}
+ \end{itemize}
+ are added automatically.
+
+\item[\quad\tt(AUTOTFMMAPCHAR {\em font-index})]
+ --- for the characters which are mapped to this font
+ without explicit attributes
+ {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
+ (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
+ for more details), the attributes
+ \begin{itemize}
+ \item[]
+ {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em mapchar-code})}
+ \end{itemize}
+ are added automatically.
+
+\item[\quad\tt(INCLUDECHAR ({\em ident$_1$})({\em ident$_2$}) ...)]
+ --- specifies for this font the mode of automatical including
+ new charascters.
+ The following {\em ident} values can be used:
+ \begin{description}
+ \item[\quad\tt ALLCHAR] --- include automatically
+ all the characters from the real fonts even it is not
+ specified explicitly in {\tt CHARACTER} or {\tt MAPFONT}
+ commands;
+ \item[\quad\tt LIGTABLE] --- include in the virtual font
+ the characters which are listed in
+ the ligature tables specified for already included characters;
+ \item[\quad\tt KRNDATA] --- include in the virtual font
+ the characters which are listed in a kerning data
+ of the ligature tables specified for already included characters;
+ \item[\quad\tt LIGDATA] --- include in the virtual font
+ the characters which are listed in a ligature data
+ of the ligature tables specified for already included characters;
+ \item[\quad\tt NOLIGTABLE] --- do not include in the virtual font
+ automatically the characters from the ligature table;
+ \item[\quad\tt NEXTCHAR] --- include automatically
+ new characters which are are connected
+ by the attribute {\tt NEXTLARGER} with the
+ already included characters;
+ \item[\quad\tt NONEXTCHAR] --- do not include
+ new characters from the real fonts which are connected
+ by the attribute {\tt NEXTLARGER} with the
+ already included characters.
+ \end{description}
+
+\item[\quad\tt(NEWDISCARD)] --- the underfined characters of this font
+ are marked automatically by the attribute {\tt DISCRAD}
+ in the global mapping table (see commands {\tt CHARACTER}
+ (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
+ (section~\ref{Sect-VFC-DISCARD})).
+
+\item[\quad\tt(NONEWDISCARD)] --- the underfined characters of this font
+ are {\em not} marked automatically by the attribute {\tt DISCRAD}
+ in the global mapping table (see commands {\tt CHARACTER}
+ (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
+ (section~\ref{Sect-VFC-DISCARD})).
+
+\end{description}
+Examples:
+\begin{itemize}
+\item[]{\tt (MAPFONT D 0 (NAME CMR10) (7TO7) (NOLIGTABLE) ... )}\\
+ {\tt (MAPFONT D 1 (NAME LHR10) (JWRCYR) (INCLUDELIG) ... )}\\
+ {\tt ......}
+\end{itemize}
+
+
+\subsection{{\tt CHARACTER} or {\tt CHAR}\label{Sect-VFC-CHAR}}
+
+The command {\tt CHARACTER} specifies the mapping table between
+the characters of the real fonts and the characters of the
+virtual fonts. It can also specify
+\begin{itemize}
+\item
+the sequence of {\sl DVI}-commands substituted
+instead of the character from the virtual font;
+\item
+the ``phantom'' output for some characters of the virtual font;
+\item
+the dimensional parameters (width, height, depth, italic correction)
+of the character if they are not copied from the real font metric data
+and are not calculated automatically for the sequences of {\sl DVI}-commands;
+\item
+the correction of the {\sl DVI}-pen position if the width of
+the character from the real font is not equal to the
+width specified in {\tt .tfm} file of the virtual font;
+\item
+special attributes which are treated by \VFC{} then
+the default mapping tables
+(see command {\tt MAPFONT} from the section~\ref{Sect-VFC-MAPFONT})
+and the automatical including of new characters
+joined with already included characters
+(see the commands {\tt MAPFONT/INCLUDECHAR} (section~\ref{Sect-VFC-MAPFONT})
+and {\tt OPTION/INCLUDECHAR} (section~\ref{Sect-VFC-OPTION})
+are used.
+\end{itemize}
+
+The command {\tt CHARACTER} has the following format:
+\begin{itemize}
+\item[]{\tt (CHARACTER {\em char-code} ({\em parm$_1$}) ({\em parm$_2$})
+ ({\em parm$_3$}) ...)}
+\end{itemize}
+The 8-bit integer value {\em char-code}
+(see section~\ref{Sect-VFC-NUM}) defines
+the character of the virtual font which properties
+are defined by the sub-list {\em parameters}.
+The {\em parameters} can be distributed among
+several {\tt CHARACTER} commands with the same
+8-bit code --- in this case they are joined together
+in one list.
+
+The following {\em parameters} can be used:
+\begin{description}
+
+\item[\quad{\tt (FONT {\em index})} or {\tt (SELECTFONT {\em index})}]
+ --- specifies the real font into which this character is mapped.
+ The real font is identified by the integer value
+ {\em index}, and the relation between the {\em index} and
+ the name of the real font is defined by the command {\tt MAPFONT}
+ (see section~\ref{Sect-VFC-MAPFONT}).
+ The default value for {\tt FONT} is set by the command {\tt SETMAPFONT}
+ (see section~\ref{Sect-VFC-SETTFMFONT}).
+
+\item[\quad{\tt (CHAR {\em char-code})} or {\tt (SETCHAR {\em char-code})}]
+ --- specifies the character of the real font into which this character
+ is mapped (the real font is defined by the command {\tt FONT}
+ described above). If the metric data for this character
+ are not specified explicitly in {\tt .tbf} file
+ (see the commands below), it is copied from the {\tt .pl}
+ file corresponding to the real font --- or from the
+ character from the real font which is specified by the
+ commands {\tt TFMFONT} and {\tt TFMCHAR} if these
+ attributes are defined.
+
+\item[\quad{\tt (CHARWD {\em real-value})}] ---
+ specifies the {\em width} of the virtual character.
+
+\item[\quad{\tt (CHARHT {\em real-value})}] ---
+ specifies the {\em height} of the virtual character.
+
+\item[\quad{\tt (CHARDP {\em real-value})}] ---
+ specifies the {\em depth} of the virtual character.
+
+\item[\quad{\tt (CHARIC {\em real-value})}] ---
+ specifies the {\em italic correction} of the virtual character.
+
+\item[\quad{\tt (TFMFONT {\em index})} and {\tt (TFMCHAR {\em char-code})}]
+ --- these two commands specify the real font and the
+ character from which the metric information is copied.
+ Their syntaxis is similar to the commands {\tt FONT}/{\tt CHAR}
+ described above. The default value for {\tt TFMFONT} is
+ set by the command {\tt SETTFMFONT}
+ (see section~\ref{Sect-VFC-SETTFMFONT}).
+
+ The attributes {\tt TFMFONT}/{\tt TFMCHAR} are useful
+ if it is necessary to make the virtual fonts which are used
+ for visualization of the {\tt .dvi} file with PostScript fonts
+ which are substituted by some {\tt .pk} fonts with a different
+ metric properties (see section~\ref{Sect-PostScript} for more details).
+ The commands {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT})
+ and {\tt OPTION} (section~\ref{Sect-VFC-OPTION}) can specify
+ these atributes by default for the character if there are no
+ explicit commands {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}.
+
+\item[\quad{\tt (NOTFMDATA)}]
+ --- specifies that the attributes {\tt TFMFONT} and
+ {\tt TFMCHAR} cannot be added automatically to this character
+ (see corresponding arguments of the commands
+ {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT})
+ and {\tt OPTION} (section~\ref{Sect-VFC-OPTION})).
+
+\item[\quad{\tt (AUTOTFMWIDTH)} and {\tt (NOUTOTFMWIDTH)}] ---
+ these commands switch on/off the automatic correction
+ of the width of the virtual character if the metric information
+ from {\tt .vpl} and {\tt .tfm} files for the virtual font
+ is different from that specified for the real font characters
+ (see the commands {\tt TFMFONT}/{\tt TFMCHAR} described above
+ and the section~\ref{Sect-PostScript} for more information).
+
+ The default value of this attribute can be specified using
+ the commands {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT})
+ and {\tt OPTION} (section~\ref{Sect-VFC-OPTION}).
+ If no {\tt (AUTOTFMWIDTH)} and {\tt (NOAUTOTFMWIDTH)}
+ attributes are specified using these commands,
+ the attribute {\tt (AUTOTFMWIDTH)} is assumed.
+
+\item[\quad{\tt (PKWIDTH {\em width})}] ---
+ specifies the width of the character
+ ({\em width} is the positive real value)
+ which is used to correct the {\sl DVI}-pen position
+ when the attribute {\tt AUTOTFMWIDTH} is active
+ and the commands {\tt TFMFONT}/{\tt TFMCHAR} are specified.
+ The value specified by {\tt PKWIDTH} substitutes the data taken from
+ the character referenced by the commands
+ {\tt FONT}/{\tt CHAR} or the data calculated by \VFC{}
+ for the sequence of {\sl DVI}-commands
+ (see the command {\tt SETDVI} described below).
+
+\item[\quad{\tt (DVI {\em list-of-arguments})} or
+ {\tt (SETDVI {\em list-of-arguments})}]
+ --- specifies the sequence of {\sl DVI}-commands substituted
+ instead of the character of the virtual font.
+ The arguments of this command are described in
+ section~\ref{Sect-VFC-CHAR1}.
+
+ The metric data for this virtual character can be
+ specified explicitly by the commands {\tt CHARWD},
+ {\tt CHARHT}, {\tt CHARDP}, {\tt CHARIC} described above.
+ if these data are absent,
+ \begin{itemize}
+ \item
+ if the commands {\tt FONT} and {\tt CHAR}
+ or if the commands {\tt TFMFONT} and {\tt TFMCHAR} are defined,
+ the metric data for the virtual character
+ is copied from corresponding character of the
+ corresponding {\tt .pl} file.
+ \item
+ if commands {\tt FONT}/{\tt CHAR} and {\tt TFMFONT}/{\tt TFMCHAR}
+ are absent, the values {\tt CHARWD},
+ {\tt CHARHT} and {\tt CHARDP} are calculated
+ automatically according to the sequence of {\sl DVI}-commands,
+ and {\tt CHARIC} is set to zero.
+ \end{itemize}
+ If the commands {\tt TFMFONT}/{\tt TFMCHAR} are specified
+ and if {\tt AUTOTFMWIDTH} mode is active
+ (by default or explicitly specified), the correction of
+ the width of the virtual character is is performed using
+ \begin{itemize}
+ \item the value of the parameter {\tt PKWIDTH}
+ if it is specified explicitly;
+ \item the width of the character specified by the
+ commands {\tt FONT}/{\tt CHAR} if these commands are
+ defined for the virtual character;
+ \item the width of the the sequence of {\sl DVI}-commands
+ which is calculated automatically by \VFC.
+ \end{itemize}
+
+\item[\quad{\tt (VARCHAR {\em list-of-arguments})}]
+ --- specifies the extensible character
+ (usually the mathematical delimiter).
+ The arguments of this command are described in
+ section~\ref{Sect-VFC-CHAR2}.
+ The command {\tt VARCHAR} cannot be used together with the
+ command {\tt NEXTLARGER}.
+
+\item[\quad{\tt (NEXTLARGER {\em char-code})}] ---
+ specifies the character (usually the mathematical delimiter)
+ which is ``larger'' than the current character.
+ The references {\tt NEXTLARGER} cannot form the infinite cycles.
+ The command {\tt NEXTLARGER} cannot be used together with the
+ command {\tt VARCHAR}.
+
+\item[\quad{\tt (DISCARD)}] ---
+ specify the attribute {\tt DISCARD} for the virtual font character
+ which means that this character cannot be used by default
+ mapping tables (see command {\tt MAPFONT})
+ and by automatic including of new virtual font characters
+ (see commands {\tt MAPFONT/INCLUDECHAR}
+ (section~\ref{Sect-VFC-MAPFONT})
+ and {\tt OPTION/INCLUDECHAR}
+ (section~\ref{Sect-VFC-OPTION}).
+
+\item[\quad{\tt (UNKNOWN)}] ---
+ default attribute which means that the character is not used
+ by the virtual font, but it can be added automatically
+ when the default mapping table is used (see command {\tt MAPFONT}
+ described at the section~\ref{Sect-VFC-OPTION})
+ or during the automatic including of new characters to the
+ virtual font.
+
+\item[\quad{\tt (PHANTOM)}] --- specifies that the virtual
+ character is displayed as a blank space.
+ It means that instead of the output of the real font character
+ or of the sequence of {\sl DVI}-commands, the shift of
+ the {\sl DVI}-pen position at a distance equal to
+ the width of the virtual character is performed.
+ Corresponding {\sl DVI}-commands are generated and inserted
+ in {\tt .vpl} file automatically by \VFC.
+ The attribute {\tt PHANTOM} can be specified by
+ defaul using the commands {\tt MAPFONT}
+ (see section~\ref{Sect-VFC-MAPFONT})
+ and {\tt OPTION} (see section~\ref{Sect-VFC-OPTION}).
+
+\item[\quad{\tt (NOPHANTOM)}] --- swithches off the
+ attribute {\tt PHANTOM} specified by default
+ with the help of the commands {\tt MAPFONT/PHANTOM} and
+ {\tt OPTION/PHANTOM}.
+
+\end{description}
+Similar to dimensional data specified
+for the {\tt .tbf} commands {\tt LIGTABLE}, {\tt HEADER}, etc.,
+the dimensional parameters of the commands
+{\tt CHARWD}, {\tt CHARHT}, {\tt CHARDP}, {\tt CHARIC},
+{\tt PKWIDTH} and of the sub-commands of the command {\tt SETDVI}
+are specified using the values {\tt TBFUNITS} and {\tt TBFSIZE}
+from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}).
+
+\subsubsection{{\tt CHARACTER/SETDVI}\label{Sect-VFC-CHAR1}}
+
+The parameter {\tt DVI} of the command {\tt CHARACTER} specifies
+the the sequence of {\sl DVI}-commands substituted
+instead of the character from the virtual font.
+It has the format
+\begin{itemize}
+\item[]{\tt (SETDVI}\\
+\phantom{WWW}{\tt({\em command$_1$})}\\
+\phantom{WWW}{\tt({\em command$_2$})}\\
+\phantom{WWW}{\tt ......}\\
+ {\tt )}
+\end{itemize}
+where the following {\em commands} can be used:
+\begin{description}
+\item[\quad{\tt (FONT {\em index})} or {\tt (SELECTFONT {\em index})}]
+ --- makes this font active for the subsequent
+ {\tt CHAR} commands. The font is identified by the
+ integer value {\em index}, and the name of the
+ font with this index is defined using the command
+ {\tt MAPFONT} (see section~\ref{Sect-VFC-MAPFONT}).
+ if there are commands {\tt CHAR} in the sequence
+ of {\sl DVI}-commands, the command {\tt FONT}
+ is to be used before the first {\tt CHAR}.
+\item[\quad{\tt (CHAR {\em char-code})} or {\tt (SETCHAR {\em char-code})}]
+ --- output the character {\em char-co\-de} from the real
+ font specified by the last command {\tt FONT} starting
+ from the current {\sl DVI}-pen position and to move
+ the {\sl DVI}-pen position to the right at the distance equal
+ to the width of the character.
+\item[\quad{\tt (RULE {\em height} {\em width})}
+ or {\tt (SETRULE {\em height} {\em width})}]
+ --- output the {\em rule} (i.e., a black rectangle)
+ with the specified height and width ({\em height} and {\em width}
+ are positive real values) starting
+ from the current {\sl DVI}-pen position and to move
+ the {\sl DVI}-pen position to the right at the distance equal
+ to the rule width.
+\item[\quad{\tt (RIGHT {\em dist})} or {\tt (MOVERIGHT {\em dist})}]
+ --- move current {\sl DVI}-pen position to the {\em right} at the
+ specified distance {\em dist} which is to be a real
+ (positive or negative) value.
+\item[\quad{\tt (LEFT {\em dist})} or {\tt (MOVELEFT {\em dist})}]
+ --- move current {\sl DVI}-pen position to the {\em left} at the
+ specified distance {\em dist} which is to be a real
+ (positive or negative) value.
+\item[\quad{\tt (UP {\em dist})} or {\tt (MOVEUP {\em dist})}]
+ --- move current {\sl DVI}-pen position {\em up} at the
+ specified distance {\em dist} which is to be a real
+ (positive or negative) value.
+\item[\quad{\tt (DOWN {\em dist})} or {\tt (MOVEDOWN {\em dist})}]
+ --- move current {\sl DVI}-pen position {\em down} at the
+ specified distance {\em dist} which is to be a real
+ (positive or negative) value.
+\item[\quad{\tt (PUSH)}] --- remember the current
+ {\sl DVI}-pen position (to be restored by the subsequent
+ command {\tt (POP)}.
+\item[\quad{\tt (POP)}] --- restore the
+ {\sl DVI}-pen position saved earlier by the
+ command {\tt (PUSH)}. The commands {\tt (PUSH)} and
+ {\tt (POP)} should be properly nested and balanced like
+ the parentheses.
+\item[\quad{\tt (SPECIAL {\em text-string})}]
+ --- the {\em text-string} is interpreted similar to
+ the command {\tt\bs{}special\{...\}} from {\tt .dvi} file.
+\item[\quad{\tt (HEX {\em hex-text-string})}
+ or {\tt (SPECIALHEX {\em hex-text-string})}]
+ --- the sequence of bytes identified by hexadecimal codes
+ is treated as the argument of the command
+ {\tt\bs{}special\{...\}} from {\tt .dvi} file.
+ The {\em hex-text-string} cannot contain spaces,
+ it should contain only hexadecimal digits
+ `{\tt 0}'--`{\tt 9}' and `{\tt A}'--`{\tt F}' or `{\tt a}'--`{\tt f}'
+ and it should contain the even number of such digits.
+\end{description}
+Similar to dimensional data specified
+for the commands {\tt CHARACTER}, {\tt LIGTABLE}, {\tt HEADER},
+the dimensional parameters of the commands
+{\tt RULE}, {\tt RIGHT}, {\tt LEFT}, {\tt UP}, {\tt DOWN}
+are specified using the values {\tt TBFUNITS} and {\tt TBFSIZE}
+from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}).
+
+
+\subsubsection{{\tt CHARACTER/VARCHAR}\label{Sect-VFC-CHAR2}}
+
+The parameter {\tt VARCHAR} of the command {\tt CHARACTER} specifies
+the extensible character (usually the mathematical delimiter).
+Its parameters define the character codes which are used as the
+top of the delimiter, middle of the delimiter, bottom of the delimiter
+and the replicated part of the delimiter. The zero value of
+corresponding character codes (except replicated part)
+means that this part of the extensible character is absent.
+
+
+The command has the format
+\begin{itemize}
+\item[]{\tt (VARCHAR ({\em parm$_1$}) ({\em parm$_2$}) ...)}
+\end{itemize}
+where the following parameters can be used:
+\begin{description}
+\item[\quad{\tt (TOP {\em char-code})}] --- specifies
+ the character which is used as the top element of the
+ extensible character;
+\item[\quad{\tt (MID {\em char-code})}] --- specifies
+ the character which is used as the middle element of the
+ extensible character;
+\item[\quad{\tt (BOT {\em char-code})}] --- specifies
+ the character which is used as the bottom element of the
+ extensible character;
+\item[\quad{\tt (REP {\em char-code})}] --- specifies
+ the character which is used as the replicated part of the
+ extensible character.
+\end{description}
+
+\subsection{{\tt LIGTABLE}\label{Sect-VFC-LIGTABLE}}
+
+The command {\tt LIGTABLE} specifies the additional
+ligature and kerning data for the virtual font characters
+--- mainly the ligature and kerning data
+for the pairs of characters selected from different
+real fonts. Notot too much {\tt LIGTABLE}
+commands are necessary in the {\tt .tbf} file since the ligature data
+for the pairs of characters selected from the same
+real font are usually copied from corresponding {\tt .pl} files.
+
+The command {\tt LIGTABLE} has the format:
+\begin{itemize}
+\item[] {\tt (LIGTABLE}\\
+ \phantom{WWW}{\tt ({\em ligature-command$_1$})}\\
+ \phantom{WWW}{\tt ({\em ligature-command$_2$})}\\
+ \phantom{WWW}{\tt ......}\\
+ {\tt )}
+\end{itemize}
+It several {\tt LIGTABLE} commands are specified, they are
+joined together after reading the {\tt .tbf} file.
+
+The {\em ligature-commands} are similar to that specified at
+{\tt .pl} files except the fact that the {\em dimensional}
+parameter of the command {\tt KRN} is specified using the
+values {\tt TBFUNITS} and {\tt TBFSIZE}
+(see section~\ref{Sect-VFC-LUNIT}).
+The following commands are valid here:
+\begin{description}
+\item[\quad{\tt (LABEL {\em char-code})}]
+ --- start the list of ligature commands for
+ the character {\em char-code} of the virtual font;
+\item[\quad{\tt (LABEL BOUNDARYCHAR)} or {\tt (LABEL BCHAR)}]
+ --- start the list of ligature commands for
+ the special character ``{\em end-of-word}'';
+\item[\quad{\tt (SKIP {\em integer})}]
+ --- jump over specified {\tt LIGTABLE} commands
+ {\tt LIG} and {\tt KRN};
+\item[\quad{\tt (STOP)}]
+ --- stop the {\em LIGTABLE} commands started
+ by the command {\em (LABEL {\em char-code})};
+\item[\quad{\tt (KRN {\em char-code$'$} {\em shift})}]
+ --- the kerning data {\em shift} (real value)
+ specified for the pair of characters
+ {\em char-code} and {\em char-code$'$}
+ (the value {\em char-code} is specified at the command {\tt LABEL}
+ which starts the sequence of ligature and kerning commands
+ for this character);
+\item[\quad{\tt (LIG {\em char-code$'$} {\em char-code$''$})}]
+ --- the ligature data for the pair of characters
+ {\em char-code} and {\em char-code$'$}
+ (the value {\em char-code} is specified at the command {\tt LABEL}
+ which starts the sequence of ligature and kerning commands
+ for this character) --- these two characters are
+ substituted by the character {\em char-code$''$}.
+ The identifiers
+ \begin{itemize}
+ \item[]
+ \begin{flushleft}
+ {\tt /LIG}, {\tt /LIG>}, {\tt LIG/}, {\tt LIG/>},
+ {\tt /LIG/}, {\tt /LIG/>}, {\tt /LIG/>>}
+ \end{flushleft}
+ \end{itemize}
+ can be used instead of {\tt LIG} which defines
+ various ways of the substitution of the character
+ {\em char-code$''$}
+ instead of the pair of characters
+ {\em char-code} and {\em char-code$'$}
+ (see \cite{VF} for more details).
+\end{description}
+Example:
+\begin{itemize}
+\item[] {\tt (LIGTABLE}\\
+ \phantom{}{\tt (LABEL C <)}\\
+ \phantom{WWW}{\tt (LIG C < V CYR\_open\_quote)}\\
+ \phantom{WWW}{\tt (STOP)}\\
+ \phantom{}{\tt (LABEL C >)}\\
+ \phantom{WWW}{\tt (LIG C > V CYR\_close\_quote)}\\
+ \phantom{WWW}{\tt (STOP)}\\
+ \phantom{}{\tt (LABEL V CYR\_GHE)}\\
+ \phantom{WWW}{\tt (KRN C . V kk\#)}\\
+ \phantom{WWW}{\tt (KRN C , V kk\#)}\\
+ \phantom{WWW}{\tt (KRN C : V kk\#)}\\
+ \phantom{WWW}{\tt (KRN C ; V kk\#)}\\
+ \phantom{WWW}{\tt (STOP)}\\
+ {\tt )}
+\end{itemize}
+
+\subsection{{\tt OUTPUT}\label{Sect-VFC-OUTPUT}}
+
+The command {\tt OUTPUT} defines the name of the output
+{\tt .vpl} file and, may be, the way how the character codes
+for the {\tt .vpl} commands are to be printed.
+It has the form
+\begin{itemize}
+\item[] {\tt (OUTPUT {\em filename}
+ ({\em option$_1$}) ({\em option$_2$}) ... )}
+\end{itemize}
+where {\em filename} is the name of the output
+{\em virtual font}, and the optional {\em options}
+can be the following:
+\begin{description}
+\item[\quad{\tt(ALLCHAR)}] --- print all printable characters
+ in a form {\tt C {\em letter}};
+\item[\quad{\tt(ALPHA)}] --- print in a form {\tt C {\em letter}}
+ only the letters of the latin alphabet;
+\item[\quad{\tt(ALPHANUM)}] --- print in a form {\tt C {\em letter}}
+ the digits and the letters of the latin alphabet;
+\item[\quad{\tt(ALLCODE)}] --- print all characters
+ as the character codes;
+\item[\quad{\tt(DEC)} or {\tt(DECIMAL)}] --- print character codes
+ as decimal integers;
+\item[\quad{\tt(OCT)} or {\tt(OCTAL)}] --- print character codes
+ as octal integers;
+\item[\quad{\tt(HEX)} or {\tt(HEXADECIMAL)}] --- print character codes
+ as hexadecimal integers.
+\end{description}
+Example (default value):
+\begin{itemize}
+\item[] {\tt (OUTPUT noname.tbf (ALPHANUM) (OCTAL))}
+\end{itemize}
+
+\subsection{{\tt HEADER}\label{Sect-VFC-HEADER}}
+
+The virtual font has the header with the header parameters:
+\begin{itemize}
+\item {\tt DESIGNSIZE}
+\item {\tt DESIGNUNITS}
+\item {\tt CODINGSCHEME}
+\item {\tt FAMILY}
+\item {\tt FACE}
+\item {\tt FONTDIMEN} and its sub-parameters
+ ({\tt SLANT}, {\tt SPACE}, {\tt QUAD}, ¨ â.¤.)
+\end{itemize}
+The header parameters can be get from:
+\begin{itemize}
+\item
+the header of one of the real fonts used in virtual font;
+\item
+the header of some separate {\tt .pl} file;
+\item
+\VFC{} the explicit commands from the {\tt .tbf} file.
+\end{itemize}
+
+The following parameters of the command {\tt HEADER}
+are valid:
+\begin{description}
+\item[\quad{\tt(FONT {\em integer})}]
+ --- defines index of the font which is used as a source
+ for the header parameters. The real name of the font is
+ taken from the {\tt MAPFONT} command with the corresponding
+ index value. Default value for this parameter is {\tt (FONT D 0)}
+ which means that if nor {\tt FONT} nor {\tt FILE} dat are specified
+ by the User, the font {\tt MAPFONT D 0} is used as a source
+ for the header parameters.
+ If {\tt FONT} argument is $<$0 or if the parameter {\tt FILE}
+ is specified, the {\tt MAPFONT} fonts are not used as a source
+ for the header.
+\item[\quad{\tt(FILE {\em filename})}]
+ --- defines the name of the {\tt .pl} file
+ which is used as a source for the header
+ parameters. Only one of the parameters --- {\tt FONT} or {\tt FILE} ---
+ can be specified among the parameters of the command {\tt HEADER}.
+ If both parameters are specified, the last one is used and
+ the warning message is generated.
+\item[\quad{\tt(CHECKSUM {\em 32-bit integer})}]
+ --- specifies the {\tt CHECKSUM} of the {\tt .tfm} file
+ which will be generated after the processing of
+ {\tt .vpl} file by the utility {\sl VPtpVF}.
+ Usually this parameter is not necessary --- if it is not
+ specified, the correct {\tt CHECKSUM} value is substituted
+ by {\sl VPtoVF} automatically, and it is a rare chance
+ that the User can guess the proper value (see comments below).
+\item[\quad{\tt(DESIGNSIZE {\em real-value})}]
+ --- specifies the value of the {\tt DESIGNSIZE} which
+ is used as a unit of measure for nearly all
+ dimensional {\tt .vpl} data (see comments below).
+\item[\quad{\tt(DESIGNUNITS {\em real-value})}]
+ --- specifies the value of the {\tt DESIGNUNITS} which
+ is used as a unit of measure for nearly all
+ dimensional {\tt .vpl} data (see comments below).
+\item[\quad{\tt(CODINGSCHEME {\em text-string})}]
+ --- specifies the text which identifies uniquely
+ the arrangement of the characters in the coding table
+ of this font.
+ For example, for Computer Modern Roman except {\tt cmr5}
+ it is equal to
+ \begin{itemize}
+ \item[] {\tt (CODINGSCHEME TeX text)}
+ \end{itemize}
+ while for {\tt cmr5} it is equal to
+ \begin{itemize}
+ \item[] {\tt (CODINGSCHEME TeX text without f-ligatures)}
+ \end{itemize}
+ (the {\em f-ligatures} are absent in this font since
+ the characters are too small).
+ This parameter cannot contain
+ internal braces `{\tt (}' and `{\tt )}'
+ and but can be the string expression
+ (see section~\ref{Sect-VFC-STRING} for more details).
+\item[\quad{\tt(FAMILY {\em text-string})}]
+ --- specifies the {\tt FAMILY} identifying
+ string. This parameter cannot contain
+ internal braces `{\tt (}' and `{\tt )}'
+ but can be the string expression
+ (see section~\ref{Sect-VFC-STRING} for more details).
+\item[\quad{\tt(FACE {\em 8-bit-integer})}]
+ --- specifies the Xerox face code for the virtual font.
+\item[\quad{\tt(SEVENBITSAFEFLAG)}]
+ --- this command is of no use and its is skipped after printing the
+ warning message. The attribute
+ {\tt SEVENBITSAFEFLAG} was used in earlier versions of \TeX{}
+ to specify that the font contains only the characters in a range 0--127,
+ and now this flag is obsolete. Although the corresponding field is
+ conserved in {\tt .tfm} file, the utility {\sl VPtoVF} inserts the
+ proper value automatically (after the check that the virtual font
+ contains no characters outside the range 0--127) irregardless of
+ the command {\tt SEVENBITSAFEFLAG} encountered in {\tt .vpl} file.
+\item[\quad{\tt(FONTDIMEN {\em parm-list})}]
+ --- defines the following header parameters:
+ \begin{itemize}
+ \item[]
+ {\tt(SLANT {\em real-value})}\\
+ {\tt(SPACE {\em real-value})}\\
+ {\tt(STRETCH {\em real-value})}\\
+ {\tt(SHRINK {\em real-value})}\\
+ {\tt(XHEIGHT {\em real-value})}\\
+ {\tt(QUAD {\em real-value})}\\
+ {\tt(EXTRASPACE {\em real-value})}\\
+ {\tt(NUM1 {\em real-value})}
+ or {\tt(DEFAULTRULETHICKNESS {\em real-value})}\\
+ {\tt(NUM2 {\em real-value})}
+ or {\tt(BIGOPSPACING1 {\em real-value})}\\
+ {\tt(NUM3 {\em real-value})}
+ or {\tt(BIGOPSPACING2 {\em real-value})}\\
+ {\tt(DENOM1 {\em real-value})}
+ or {\tt(BIGOPSPACING3 {\em real-value})}\\
+ {\tt(DENOM2 {\em real-value})}
+ or {\tt(BIGOPSPACING4 {\em real-value})}\\
+ {\tt(SUP1 {\em real-value})}
+ or {\tt(BIGOPSPACING5 {\em real-value})}\\
+ {\tt(SUP2 {\em real-value})}\\
+ {\tt(SUP3 {\em real-value})}\\
+ {\tt(SUB1 {\em real-value})}\\
+ {\tt(SUB2 {\em real-value})}\\
+ {\tt(SUPDROP {\em real-value})}\\
+ {\tt(SUBDROP {\em real-value})}\\
+ {\tt(DELIM1 {\em real-value})}\\
+ {\tt(DELIM2 {\em real-value})}\\
+ {\tt(AXISHEIGHT {\em real-value})}\\
+ {\tt(AXISHEIGHT {\em real-value})}
+ \end{itemize}
+ (the parameters specified in a form
+ {\tt (PARAMETER {\em index} {\em value})} are skipped
+ and the warning message is printed).
+
+ All these parameters are {\em dimensional} parameter
+ except the parameter {\tt SLANT} and they are defined using
+ {\tt TBFUNITS} and {\tt TBFSIZE} data
+ from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}).
+ They are re-calculated properly so that they fit to
+ the header parameters {\tt DESIGNUNITS} and {\tt DESIGNSIZE}
+ when the header data of the output {\tt .vpl} file are known.
+\end{description}
+The parameters are specified as the sub-lists of the list
+defined by the identifier {\tt HEADER}.
+Example:
+\begin{itemize}
+\item[] {\tt (HEADER}\\
+ \phantom{WWW}{\tt (FONT D 1)}\\
+ \phantom{WWW}{\tt (FAMILY LHTT)}\\
+ \phantom{WWW}{\tt (CODINGSCHEME LH Cyrillic TeX text)}\\
+ \phantom{WWW}{\tt ......}\\
+ {\tt )}
+\end{itemize}
+
+\bigskip
+
+\VFC{} generates the header parameters in a following way.
+The commands from the {\tt .tbf} file are read,
+and the dimensional parameters from the command {\tt HEADER}
+are treated using the units defined by
+{\tt TBFSIZE} and {\tt TBFUNITS}
+(see section~\ref{Sect-VFC-LUNIT}) --- as well as the other dimensional
+parameters like that from the commands {\tt LIGTABLE}
+and {\tt CHARACTER}.
+After it the {\tt .pl} file specified by the {\tt HEADER}
+commands {\tt FONT} or {\tt FILE} is read, and the parameters
+which were not defined explicitly at the command {\tt HEADER}
+are added from it.
+Finally, all the dimensional parameters
+which vere read from the {\tt .tbf} file
+(namely, specified at the commands {\tt LIGTABLE},
+{\tt CHARACTER}, {\tt HEADER/FONTDIMEN})
+are converted to
+{\tt DESIGNSIZE} and {\tt DESIGNUNITS} values from the
+resulting header of the {\tt .vpl} file.
+
+The {\tt .pl} file header parameters
+\begin{itemize}
+\item[] {\tt DESIGNSIZE}\\
+ {\tt DESIGNUNITS}\\
+ {\tt CODINGSCHEME}\\
+ {\tt FAMILY}\\
+ {\tt FACE}\\
+ {\tt FONTDIMEN} sub-parameters except {\tt PARAMETER}
+\end{itemize}
+are processed by \VFC.
+The {\tt .pl} file header parameters
+\begin{itemize}
+\item[] {\tt SEVENBITSAFEFLAG}\\
+ {\tt HEADER}\\
+ sub-parameter {\tt PARAMETER} of the parameter {\tt FONTDIMEN}
+\end{itemize}
+are ignored after printing the warning messages.
+All other {\em legal} {\tt .pl} commands are
+skipped without processing when \VFC{} reads the header parameters.
+
+\bigskip
+
+The header parameters which are read from {\tt .pl} file
+are added to {\tt .vpl} header data if
+corresponding parameters are not specified explicitly
+in {\tt .tbf} file.
+Usually {\em all} header parameters
+(including {\tt DESIGNUNITS} and {\tt DESIGNSIZE})
+are copied from some {\tt .pl} file, and only the parameters
+{\tt FAMILY}, {\tt FACE}, {\tt CODINGSCHEME} are substituted
+by their explicit specifications from {\tt .tbf} file.
+
+The exception is the header parameter {\tt CHECKSUM} which is ignored
+when it is read from {\tt .pl} file and which value can be
+set by the User only if it is specified explicitly in {\tt .tbf} file.
+Usually this parameter is not necessary --- if it is not
+specified by the User, it is not inserted into the output
+{\tt .vpl} file, and as a result the correct {\tt CHECKSUM} value
+is calculated by {\sl VPtoVF} automatically.
+It is a rare chance that the User can guess the proper value,
+and if the {\tt CHECKSUM} from the {\tt .vf} file and
+the {\em checksum} calculated for the {\tt .tfm} file
+of the virtual font do not coincide, the {\sl DVI}-driver
+prints the warning message --- this message shows that the versions of
+{\tt .vf} and {\tt .tfm} files may be different or that
+the {\tt .tfm} file may be damaged.
+The exception from this rule (and the only case
+when the explicit parameter {\tt CHECKSUM} can be useful)
+is the {\em zero} value specified for the parameter {\tt CHECKSUM}
+of the virtual font. In this case the comparison
+of {\tt CHECKSUM} from {\tt .vf} file with the
+the {\em checksum} of the {\tt .tfm} file
+of the virtual font is not performed at all
+when this font is loaded by the {\sl DVI}-driver.
+
+\subsection{Additional commands\label{Sect-VFC-Other}}
+
+The following \VFC{} commands are considered
+in this section:
+\begin{itemize}
+\item {\tt VTITLE} --- the title of the virtual font;
+\item {\tt TBFUNITS} and {\tt TBFSIZE} --- the scale factors
+ for the lengths specified in {\tt .tbf} file;
+\item {\tt BOUNDARYCHAR} --- character code which is used
+ in the {\tt .vpl} ligature table to specify the ``end-of-word''
+ character;
+\item {\tt SETTFMFONT} --- default value for the attribute {\tt TFMFONT}
+ if for some commands {\tt CHARACTER} only the attribute {\tt TFMCHAR}
+ is specified;
+\item {\tt SETMAPFONT} --- default value for the attribute {\tt FONT}
+ if for some commands {\tt CHARACTER} only the attribute {\tt CHAR}
+ is specified;
+\item {\tt DISCARDCHAR} --- the list of characters which are not
+ included in the virtual font;
+\item {\tt NOTAUTOADDCHAR} --- the list of characters which cannot be used
+ for automatically characters;
+\item {\tt OPTION} --- modes of \VFC;
+\item {\tt SAVETABLE} --- printing of the mapping table
+ into ASCII file;
+\end{itemize}
+
+\subsubsection{{\tt VTITLE}\label{Sect-VFC-TITLE}}
+
+The command {\tt VTITLE} of the {\tt .vpl} file defines the
+title of the file which is actually the comment inserted in
+the binary {\tt .vf} file after processing by the utility
+{\sl VPtoVF}. The command {\tt VTITLE} has the form
+\begin{itemize}
+\item[] {\tt (VTITLE {\em text-string})}
+\end{itemize}
+where the {\em text string}
+is the combination of string elements and
+string expressions (see section~\ref{Sect-VFC-STRING})
+separated by spaces, and can include opening and closing
+braces `{\tt (}' and `{\tt )}' if they are balanced
+correctly. The result of the expansion of
+string expressions cannot exceed 255 characters.
+
+Example:
+\begin{itemize}
+\item[] {\tt (VTITLE Created by VFComb (Version 1.3))}
+\end{itemize}
+
+\subsubsection{{\tt TBFUNITS}
+ and {\tt TBFSIZE}\label{Sect-VFC-LUNIT}}
+
+All the length data in {\tt .vpl} file are defined in
+units specified by the parameters {\tt DESIGNUNITS}
+and {\tt DESIGNSIZE} from the {\tt HEADER} command
+(see section~\ref{Sect-VFC-HEADER}). Nethertheless,
+when the User prepares the {\tt .tbf} file, these
+parameters are not known yet since they can be read
+later from the {\tt HEADER} file. For this reason
+all the length and size data in {\tt .tbf} file
+are specified using internal scaling factors
+specified bu the commands {\tt TBFUNITS}
+and {\tt TBFSIZE} with the default values
+\begin{itemize}
+\item[] {\tt (TBFSIZE R 1.0) (TBFUNITS R 1.0)}
+\end{itemize}
+which are the analogs of the commands {\tt DESIGNUNITS}
+and {\tt DESIGNSIZE} from {\tt .pl} and {\tt .vpl} files.
+The length and size data specified into {\tt .tbf} file
+are recalculated to the proper values
+{\tt DESIGNUNITS} and {\tt DESIGNSIZE}
+from the command {\tt HEADER} when the output {\tt .vpl}
+file is generated.
+
+\subsubsection{{\tt BOUNDARYCHAR}
+ or {\tt BCHAR}\label{Sect-VFC-BCHAR}}
+
+The LIGTABLE entries can contain ligature
+and kerning data with a special character ``end-of-word''
+which defines the beginning of the word when encountered
+in the command {\tt LABEL}, and the end of the word
+when encountered in the commands {\tt LIG} and {\tt KRN}.
+The command {\tt BOUNDARYCHAR} defines the code assigned
+to this special character (usually this is the code {\tt D 255}).
+As a result:
+\begin{itemize}
+\item
+inside {\tt .tbf} file the {\tt LIGTABLE} entries which contain this code
+are recognized as the entries with ``end-of-word'' character;
+\item
+inside {\tt .pl} files the {\tt LIGTABLE} entries with their own
+{\tt BOUNDARYCHAR} codes are mapped to the code specified
+in {\tt .tbf} file.
+\end{itemize}
+Example:
+\begin{itemize}
+\item[] {\tt (BOUNDARYCHAR D 255)}\\
+ {\tt (BCHAR D 255)}
+\end{itemize}
+
+\subsubsection{{\tt SETMAPFONT} and
+ {\tt SETTFMFONT}\label{Sect-VFC-SETTFMFONT}}
+
+The command {\tt SETMAPFOMT} specifies the default value
+for the attribute {\tt FONT} if only the attribute
+{\tt CHAR} is defined (see description of the \VFC{}
+command {\tt CHARACTER} in section~\ref{Sect-VFC-CHAR}).
+It has the form
+\begin{itemize}
+\item[] {\tt (SETMAPFONT {\em ineger})}
+\end{itemize}
+where {\em integer} is the index of the font listed in
+{\tt MAPFONT} command which is used for {\tt FONT}
+attribute.
+
+Similarly, if the command {\tt SETTFMFOMT} specifies the default value
+for the attribute {\tt TFMFONT} if only the attribute
+{\tt TFMCHAR} is defined (see description of the \VFC{}
+command {\tt CHARACTER} in section~\ref{Sect-VFC-CHAR}).
+It has the form
+\begin{itemize}
+\item[] {\tt (SETTFMFONT {\em ineger})}
+\end{itemize}
+where {\em integer} is the index of the font listed in
+{\tt MAPFONT} command which is used for {\tt TFMFONT}
+attribute.
+
+The important difference of \VFC{} {\tt CHARACTER} command is
+that if the parameter {\tt FONT} is not specified although
+the parameter {\tt CHAR} {\em is} specified, the value
+specified by the command {\tt SETMAPFONT} is used
+(see section~\ref{Sect-VFC-SETTFMFONT}). The syntaxis of
+{\tt .vpl} files assumes that the parameter {\tt FONT}
+specified for the previous command {\tt CHARACTER} is used
+while for \VFC{} commands it is not so.
+
+Similarly, if the parameter {\tt TFMFONT} is not specified although
+the parameter {\tt TFMCHAR} {\em is} specified, the value
+specified by the command {\tt SETTFMFONT} is used
+(see section~\ref{Sect-VFC-SETTFMFONT}).
+
+Example (default values):
+\begin{itemize}
+\item[] {\tt (SETMAPFONT D 0)}\\
+ {\tt (SETTFMFONT D 0)}
+\end{itemize}
+
+\subsubsection{{\tt DISCARDCHAR}
+ and {\tt NOTAUTOADDCHAR}\label{Sect-VFC-DISCARD}}
+
+The command {\tt DISCARDCHAR} defines the characters from the
+real fonts which are not included in the virtual font.
+This command is useful if the mapping to some font is defined
+by one of the options
+{\tt FULL}, {\tt 7TO8}, {\tt 8TO7}, {\tt 8BIT}, {\tt 7BIT},
+{\tt JWNCYR}, {\tt CYRTUG} (see command {\tt MAPFONT} in
+section~\ref{Sect-VFC-MAPFONT}) but there are some characters
+which are to be excluded from the mapping list.
+
+The command has the form:
+\begin{itemize}
+\item[] {\tt (DISCARDCHAR}\\
+ \phantom{WWW} {\tt (FONT {\em font$_1$}) (CHAR {\em char$_1$})}\\
+ \phantom{WWW} {\tt (FONT {\em font$_2$}) (CHAR {\em char$_2$})}\\
+ \phantom{WWW} {\tt ......}\\
+ {\tt )}
+\end{itemize}
+Actually one command {\tt (FONT ...)} can be followed by several
+commands {\tt (CHAR ...)} if these characters belong to the same
+real font. Instead of several commands {\tt (CHAR {\em charcode})}
+it is possible to use one command
+{\tt (RANGE {\em charcode$_1$} {\em charcode$_2$})} --- in this case
+all the characters from the range {\em charcode$_1$}--{\em charcode$_2$}
+get the attribute {\tt DISCARD}.
+
+Example:
+\begin{itemize}
+\item[] {\tt (DISCARDCHAR}\\
+ \phantom{WWW} {\tt (FONT D 0) (CHAR D 250) (CHAR D 251) ...}\\
+ \phantom{WWW} {\tt (FONT D 1) (RANGE D 128 D 255) ...}\\
+ \phantom{WWW} {\tt ......}\\
+ {\tt )}
+\end{itemize}
+
+The command {\tt NOAUTOADDCHAR} defines the characters from the
+virtual font which cannot be used for character mapping
+when \VFC{} adds automatically characters since they are connected
+with other characters by the attribute {\tt NEXTLARGER}
+or through {\tt LIGTABLE} data
+(see sections \ref{Sect-VFC-MAPFONT} and \ref{Sect-VFC-OPTION}
+for more details) --- these characters get the attribute
+{\tt DISCARD} if this character is not used explicitly
+in mapping table.
+
+The command has the form:
+\begin{itemize}
+\item[] {\tt (NOAUTOADDCHAR (CHAR {\em char$_1$})
+ (CHAR {\em char$_2$}) (CHAR {\em char$_3$}) ...)}
+\end{itemize}
+Similarly to {\tt DISCARDCHAR},
+instead of several commands {\tt (CHAR {\em charcode})}
+it is possible to use one command
+{\tt (RANGE {\em charcode$_1$} {\em charcode$_2$})} --- in this case
+all the characters of the virtual font
+from the range {\em charcode$_1$}--{\em charcode$_2$}
+get the attribute {\tt DISCARD}
+if these characters are not used explicitly
+in mapping table.
+
+\subsubsection{{\tt OPTION}\label{Sect-VFC-OPTION}}
+
+The command {\tt OPTION} defines some modes of \VFC{} operations.
+It consists of identifiers where only {\tt TRACE} and {\tt INCLUDECHAR}
+can have a non-empty argument:
+\begin{description}
+\item[\quad\tt(TRACE {\em integer})] --- specifies the level
+ of tracing messages printed during the processing
+ of the ligature tables ({\em integer} should be in a range 0--3);
+\item[\quad\tt(TRACE)] --- just the same as
+ {\tt (TRACE D 2)};
+\item[\quad\tt(NOTRACE)] --- just the same as
+ {\tt (TRACE D 0)};
+\item[\quad\tt(SCREEN)] --- print the \VFC{} messages
+ on the display screen;
+\item[\quad\tt(NOSCREEN)] --- print the \VFC{} messages
+ only into {\tt .log} file;
+\item[\quad\tt(PHANTOM)] --- assign attribute {\tt PHANTOM}
+ to all characters, for which the attributes
+ {\tt PHANTOM} or {\tt NOPHANTOM}
+ are not specified explicitly;
+\item[\quad\tt(INCLUDECHAR ({\em ident$_1$})({\em ident$_2$}) ...)]
+ --- specifies how \VFC{} should automatically add characters to the
+ virtual font. The following {\em ident} values can
+ be used:
+ \begin{description}
+ \item[\quad\tt ALLCHAR] --- include automatically
+ all the characters from the real fonts even it is not
+ specified explicitly in {\tt CHARACTER} or {\tt MAPFONT}
+ commands;
+ \item[\quad\tt LIGTABLE] --- include in the virtual font
+ the characters which are listed in
+ the ligature tables specified for already included characters;
+ \item[\quad\tt KRNDATA] --- include in the virtual font
+ the characters which are listed in a kerning data
+ of the ligature tables specified for already included characters;
+ \item[\quad\tt LIGDATA] --- include in the virtual font
+ the characters which are listed in a ligature data
+ of the ligature tables specified for already included characters;
+ \item[\quad\tt NOLIGTABLE] --- do not include in the virtual font
+ automatically the characters from the ligature table;
+ \item[\quad\tt NEXTCHAR] --- include automatically
+ new characters which are are connected
+ by the attribute {\tt NEXTLARGER} with the
+ already included characters;
+ \item[\quad\tt NONEXTCHAR] --- do not include
+ new characters from the real fonts which are connected
+ by the attribute {\tt NEXTLARGER} with the
+ already included characters.
+ \end{description}
+\item[\quad\tt(LIGTABLE)] --- include in the virtual font
+ the ligature tables of the real fonts;
+\item[\quad\tt(NOLIGTABLE)] --- do not include in the virtual font
+ the ligature tables of the real fonts;
+\item[\quad\tt(NEWDISCARD)] --- the underfined characters of the real font
+ are marked automatically by the attribute {\tt DISCRAD}
+ in the global mapping table (see commands {\tt CHARACTER}
+ (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
+ (section~\ref{Sect-VFC-DISCARD}));
+\item[\quad\tt(NONEWDISCARD)] --- the underfined characters of the real font
+ are {\em not} marked automatically by the attribute {\tt DISCRAD}
+ in the global mapping table (see commands {\tt CHARACTER}
+ (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
+ (section~\ref{Sect-VFC-DISCARD}));
+\item[\quad\tt(AUTOTFMWIDTH)] --- add automatically for the
+ characters with the attributes {\tt SIZECHAR} and {\tt SIZEFONT}
+ the attribute {\tt AUTOTFMWIDTH} if it is
+ not specified explicitly (see command {\tt CHARACTER});
+\item[\quad\tt(NOAUTOTFMWIDTH)] --- add automatically for the
+ characters with the attributes {\tt SIZECHAR} and {\tt SIZEFONT}
+ the attribute {\tt NOAUTOTFMWIDTH} if it is
+ not specified explicitly (see command {\tt CHARACTER});
+\item[\quad\tt(AUTOTFMCHAR {\em font-index})]
+ --- for the characters without explicitly specified attributes
+ {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
+ (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
+ for more details) the attributes
+ \begin{itemize}
+ \item[]
+ {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em char-code})}
+ \end{itemize}
+ are added automatically;
+\item[\quad\tt(AUTOTFMMAPCHAR {\em font-index})]
+ --- for the characters without explicitly specified attributes
+ {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
+ (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
+ for more details) the attributes
+ \begin{itemize}
+ \item[]
+ {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em mapchar-code})}
+ \end{itemize}
+ are added automatically.
+\end{description}
+Example (default values):
+\begin{itemize}
+\item[]
+ {\tt (OPTION}\\
+ \phantom{WWW}{\tt (TRACE D 0)}\\
+ \phantom{WWW}{\tt (SCREEN)}\\
+ \phantom{WWW}{\tt (INCLUDECHAR (NOLIGTABLE))}\\
+ \phantom{WWW}{\tt (INCLUDECHAR (NEXTCHAR))}\\
+ \phantom{WWW}{\tt (LIGTABLE)}\\
+ \phantom{WWW}{\tt (NONEWDISCARD)}\\
+ \phantom{WWW}{\tt (AUTOTFMWIDTH)}\\
+ {\tt )}
+\end{itemize}
+
+\subsubsection{{\tt SAVETABLE}\label{Sect-VFC-SAVE}}
+
+The command {\tt SAVETABLE} is used when it is desirable
+to have \VFC{} commands which are equivalent to the
+mapping table equivalent to that used to generate {\tt .vpl} file.
+It can have the following forms:
+\begin{itemize}
+\item[] {\tt (SAVETABLE {\em filename})}\\
+ {\tt (SAVETABLE {\em filename} (SHORT))}\\
+ {\tt (SAVETABLE {\em filename} (FULL))}
+\end{itemize}
+where the options {\tt FULL} and {\tt SAVE}
+defines the format of the output.
+
+\section{\VFC{} applications}
+
+\subsection{Virtual fonts for \TeX{} formats with national
+ alphabets\label{Sect-CyrTeX}}
+
+Although everything which can be done by \VFC{}
+could be realized also by explicit usage of {\tt .pl} and {\tt .vpl}
+file syntaxis (as well as everything which can be
+done manually by {\tt .pl} and {\tt .vpl} files can be done with \VFC),
+some typical operations with the virtual fonts
+are performed with its help {\em easier}
+than by manual editing of {\tt .pl} and {\tt .vpl} files.
+The typical problem of this type is the adaptation of
+standard \TeX{} formats to national alphabets
+--- this problem is especially important for cyrillic alphabets
+since most cyrillic letters {\em cannot} be created as the combination
+of the latin (english) letters with some accents.
+
+The standard solution of this problem is to combine the english part
+taken from Computer Modern family with the
+national fonts which extend the Computer Modern family
+and which contain in the upper part of ASCII table
+(codes 128--255) the national symbols. The best way
+how to do it is to create
+the {\em virtual font} whose lower part refers to original
+CM fonts, and upper part refers to the national fonts ---
+it is just the way which was recommended by D.Knuth in \cite{VF}.
+The advantage of this approach is that it is possible
+to keep the changes in CM fonts and in national fonts separately,
+and in addition it is possible to economize
+disk space since it is not necessary to
+keep {\em two} copies of each Computer Modern character --- one as the
+original CM font which is necessary for original \TeX{}
+formats, and the second one as the lower part in
+the combined national font.
+
+The combination of the lower part of one font and the upper
+part of another font, or even the joining all the characters
+from one font and all the characters from another font
+(provided that {\em no} character code is encountered twice)
+can be done by \VFC{} using few commands.
+If some characters are to be discarded from the
+font or moved to the different positions of the ASCII table,
+it does not makes the command script more complicated. The output
+virtual font contains proper metric information for
+each character borrowed from the source metric information
+and the correct mapping of the characters into individual
+real fonts.
+
+The similar operation can be performed also
+by the program {\sl TFMerge} (IHEP \TeX{}ware, Protvino),
+but \VFC{} enables to perform additional
+operation.
+That is, except joining metric and ligature/kerning
+information from each font into one virtual font,
+it is necessary to add {\em cross}-ligature
+and {\em cross}-kerning information for the pairs
+of characters taken from different fonts.
+\VFC{} enables to add
+metric, ligature and kerning data taken from its script file
+(which makes the original script a little bit
+more complicated). The important feature is that
+this additional data can contain {\em variables}
+and {\em logical structures},
+which enables to generate the whole CM family of
+the virtual typefaces with national characters
+using just the same pseudo-program
+written on \VFC{} command language.
+
+Except the operations described above, \VFC{}
+is capable to perform the following operations
+if it is specified by the User in its script:
+\begin{itemize}
+\item discard the ligature tables of some real fonts;
+\item include in the virtual font the full ligature
+ table of the real font;
+\item include in the virtual font only those characters
+ which are declared explicitly in user defined data,
+ and discard the elements of the ligature tables
+ which correspond to non-included characters of
+ the real font;
+\item automatically add to the virtual fonts the characters
+ which are not included explicitly by the User
+ but which are joined with the already included characters
+ through ligature table data, or
+ by specifications inside the command {\tt CHARACTER}
+ the attributes {\tt NEXTLARGER} and/or {\tt VARCHAR}.
+\end{itemize}
+These features enable to create the desired virtual fonts
+for national alphabets with less efforts and with more realibility
+than by manual manipulations with {\tt .pl} and {\tt .vpl} files.
+
+\subsection{Virtual fonts for colored printing\label{Sect-Color}}
+
+The other problem is the application of the
+virtual fonts to multi-colored printing.
+Suppose that it is necessary to print the text
+where different characters have different colors.
+From \TeX-compiler's point of view it means
+that the characters with different colors are
+assigned to different fonts, and it is a task for
+DVI driver to decide how to print these fonts
+in desired colors.
+
+The colored printing is collected from the overlapped
+sheets where each sheet of text or graphics is printed
+by individual monocolor pass. To make the templates for
+monocolor printing it is necessary to organize the output of
+the DVI file so that in one pass only yellow characters are printed,
+in another pass only blue characters are printed, etc.,
+while the characters which have the green color are to be printed twice ---
+in blue as well as in yellow. The easiest way to teach
+{\sl DVI}-driver how to do it is to create different subdirectories
+with virtual fonts --- one subdirectory for each elementary
+color. The virtual font files placed in the
+subdirectory for yellow printing which correspond to the yellow fonts
+will refer to the actual {\tt *.pk}-files if and only if the yellow color
+is assigned to this character --- otherwise it will
+refer to {\em emty} character. The subdirectories for other
+colors are organized analogously. As soon as the yellow printing
+is performed, the {\sl DVI}-driver is configured so that it takes
+the virtual fonts from the ``yellow'' subdirectory, and for
+the output in other colors the corresponding reconfiguration
+of the {\sl DVI}-driver is performed.
+
+If the mapping of the empty characters into the {\tt dummy}
+font is performed, it results to a wrong behaviour
+of the {\sl DVI}-driver: the characters in {\tt dummy}
+font have zero size, and it means that the next character after
+the empty character is shifted to the left
+(as compared with the desired behaviour)
+on the distance equal to the width of the skipped character.
+To prefent this effect it is necessary to insert in the virtual font
+the explicit {\sl DVI}-commands which
+move the current output position to the right
+by the distance which is the width of the
+skipped character. This operation is performed
+by \VFC{} by a single command: the User can
+\begin{itemize}
+\item
+assign the attribute {\tt PHANTOM} to each {\em phantom} character;
+\item
+assign the attribute {\t PHANTOM} to the font
+which is used to mark colored letters;
+\item
+specify the global option {\tt PHANTOM};
+\end{itemize}
+and as a result for the necessary characters
+the {\em empty mapping} will be performed instead of mapping into
+the real font characters.
+
+\subsection{Substitution of {\tt .pk} fonts
+ instead of {\sl Postscript} fonts\label{Sect-PostScript}}
+
+The next problem where the usage of the virtual fonts
+is advantageous is the visualization of the document
+which was compiled using PostScript fonts.
+Generally the scren viewer {\em cannot}
+process the Postscript characters, and it is necessary
+to remap the PostScript font characters into some {\tt pk}-font
+which {\em can} be displayed by the viewer --- say, some typefaces
+from the Computer Modern family.
+
+Such remapping can be performed
+using virtual font mechanism, but if it is done without
+special precautions the screen view can be far from the
+printed output. The reason is that CM characters have
+the width different from the PostScript font (the fact that they have
+different graphical image is not so essential).
+Like the previous case the screen output will be shifted
+to the left on the distance which is the difference
+between the width of the PostScript character and the
+CM character if no special precautions are taken.
+To make the correct output, it is necessary to add
+to the virtual font the explicit {\sl DVI}-commands
+which correct the current output position.
+
+To make corresponding virtual font automatically,
+\VFC{} enables to specify for the real fonts
+{\em two} PL-files with the metric information: the first one
+for the nominal characters which is used by \TeX{}
+to compile the {\sl DVI}-file (in our case it is the PostScript
+{\tt afm}-file converted to {\tt tfm} format), and the second one
+for the real characters which are used when the {\sl DVI}-file
+is displayed (or printed). If such information is
+specified by the User, the commands which correct
+properly the current output position are inserted in the
+virtual font.
+
+This operation works if both fonts have the same coding
+scheme --- namely, the characters used by \TeX{}
+and the characters used by {\sl DVI}-viewer
+have the same code value.
+If it is not so, the operation of re-mapping inside
+already mapped font ir required which could be very complicated
+and result to a very complicated scheme of virtual vont generation.
+To solve this difficulty it is assumed that the correct
+metric information for the ``true'' font (i.e., for the font
+used in compilation of the {\sl DVI}-file) is already available.
+The special operators in \VFC{} enable to load
+this information and to correct the proper character width.
+
+\section*{Acknowledgements}%
+\addcontentsline{toc}{section}{Acknowledgements}
+
+\subsection*{Acknowledgement I}%
+\addcontentsline{toc}{subsection}{Acknowledgement I}
+
+All new improvements of \VFC{} (except English manual)
+are the results of the contacts and discussions which were held during
+the {\sl Euro\TeX-95} meeting. So I would like to thank Dr.\ Kees
+van der Laan for his giant efforts to organise the
+visit to the {\sl Euro\TeX-95} the delegation from Russia
+and for his patient attention to russian colleagues before,
+during and after the {\sl Euro\TeX-95}.
+
+It is not so easy to recall {\em all} participants of this
+conference whose opinion makes an impact in preparing the
+new version of \VFC{}.
+Among other persons I would like to thank Dr.\ Ph.Taylor and
+Dr.\ S.Znamensky for their valuable suggestions which enable to improve
+the program.
+I would like also to thank O.A.Lapko, S.A.Strelkov and I.A.Mahovaya
+for their efforts spent on the Cyrillic \TeX{} project
+which actually inspired our work.
+
+\subsection*{Acknowledgement II}%
+\addcontentsline{toc}{subsection}{Acknowledgement II}
+
+I would like to express
+my warmest thanks to Dr. A.Compagner (Delft University of
+Technology), who {\em did not} contributed something to this work
+but spent a lot of his time and efforts explaining the Phylosophy
+of Randomness and his approach to RNG.
+
+\subsection*{Acknowledgement III}%
+\addcontentsline{toc}{subsection}{Acknowledgement III}
+
+
+??????
+
+\subsection*{Acknowledgement IV}%
+\addcontentsline{toc}{subsection}{Acknowledgement IV}
+
+This research was partially supported by a grant
+from the Dutch Organization for Scientific Research
+(NWO grant No 07-30-007).
+
+
+
+\def\refname{}
+\def\bibname{}
+\section*{References}%
+\addcontentsline{toc}{section}{References}
+
+\begin{thebibliography}{00}
+\bibitem{VF} D.Knuth, {\em Virtual Fonts: More Fun for Grand Wizards},
+ TUGBoat {\bf 11} (1990), No. 1, pp.13--23.
+\bibitem{LL} A.Khodulev, I.Mahovaya.
+{\em On \TeX{} experience in MIR Publishers}.
+ Proceedings of the 7th Euro\TeX{} Conference, Prague, 1992.
+\bibitem{LH} O.Lapko.
+ {\em MAKEFONT as a part of CurTUG--Em\TeX{} package}.
+ Proceedings of the 8th Euro\TeX{} Conference, Gda\'nsk, 1994.
+\bibitem{VFC} A.S.Berdnikov, S.B.Turtia. {\em
+{\sl VFComb} --- a program for design of virtual fonts}.
+ Proceedings of the 9th Euro\TeX{} Conference, Arnhem, 1995.
+\end{thebibliography}
+
+
+\end{document}
+
diff --git a/systems/msdos/vga2mf/00readme.txt b/systems/msdos/vga2mf/00readme.txt
new file mode 100644
index 0000000000..fbfcabcab0
--- /dev/null
+++ b/systems/msdos/vga2mf/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/systems/msdos/vga2mf/cp437.ega b/systems/msdos/vga2mf/cp437.ega
new file mode 100644
index 0000000000..1ef2e7d5cb
--- /dev/null
+++ b/systems/msdos/vga2mf/cp437.ega
Binary files differ
diff --git a/systems/msdos/vga2mf/cp437.vga b/systems/msdos/vga2mf/cp437.vga
new file mode 100644
index 0000000000..0f3cbdf6e1
--- /dev/null
+++ b/systems/msdos/vga2mf/cp437.vga
Binary files differ
diff --git a/systems/msdos/vga2mf/cp850.ega b/systems/msdos/vga2mf/cp850.ega
new file mode 100644
index 0000000000..cc9d30e743
--- /dev/null
+++ b/systems/msdos/vga2mf/cp850.ega
Binary files differ
diff --git a/systems/msdos/vga2mf/cp850.vga b/systems/msdos/vga2mf/cp850.vga
new file mode 100644
index 0000000000..a671c011bd
--- /dev/null
+++ b/systems/msdos/vga2mf/cp850.vga
Binary files differ
diff --git a/systems/msdos/vga2mf/cp860.ega b/systems/msdos/vga2mf/cp860.ega
new file mode 100644
index 0000000000..f34860c8fb
--- /dev/null
+++ b/systems/msdos/vga2mf/cp860.ega
Binary files differ
diff --git a/systems/msdos/vga2mf/cp860.vga b/systems/msdos/vga2mf/cp860.vga
new file mode 100644
index 0000000000..62dc3c4918
--- /dev/null
+++ b/systems/msdos/vga2mf/cp860.vga
Binary files differ
diff --git a/systems/msdos/vga2mf/cp863.ega b/systems/msdos/vga2mf/cp863.ega
new file mode 100644
index 0000000000..b7af7087b9
--- /dev/null
+++ b/systems/msdos/vga2mf/cp863.ega
Binary files differ
diff --git a/systems/msdos/vga2mf/cp863.vga b/systems/msdos/vga2mf/cp863.vga
new file mode 100644
index 0000000000..3df505acea
--- /dev/null
+++ b/systems/msdos/vga2mf/cp863.vga
Binary files differ
diff --git a/systems/msdos/vga2mf/cp865.ega b/systems/msdos/vga2mf/cp865.ega
new file mode 100644
index 0000000000..cd8fd74f0e
--- /dev/null
+++ b/systems/msdos/vga2mf/cp865.ega
Binary files differ
diff --git a/systems/msdos/vga2mf/cp865.vga b/systems/msdos/vga2mf/cp865.vga
new file mode 100644
index 0000000000..53e16afbff
--- /dev/null
+++ b/systems/msdos/vga2mf/cp865.vga
Binary files differ
diff --git a/systems/msdos/vga2mf/cp880dv.ega b/systems/msdos/vga2mf/cp880dv.ega
new file mode 100644
index 0000000000..de81013caf
--- /dev/null
+++ b/systems/msdos/vga2mf/cp880dv.ega
Binary files differ
diff --git a/systems/msdos/vga2mf/cp880dv.vga b/systems/msdos/vga2mf/cp880dv.vga
new file mode 100644
index 0000000000..262f6ad283
--- /dev/null
+++ b/systems/msdos/vga2mf/cp880dv.vga
Binary files differ
diff --git a/systems/msdos/vga2mf/ega2mf.c b/systems/msdos/vga2mf/ega2mf.c
new file mode 100644
index 0000000000..908b8c66a7
--- /dev/null
+++ b/systems/msdos/vga2mf/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/systems/msdos/vga2mf/foo.bar b/systems/msdos/vga2mf/foo.bar
new file mode 100644
index 0000000000..7735b1d281
--- /dev/null
+++ b/systems/msdos/vga2mf/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/systems/msdos/vga2mf/vga2mf.c b/systems/msdos/vga2mf/vga2mf.c
new file mode 100644
index 0000000000..f728f38851
--- /dev/null
+++ b/systems/msdos/vga2mf/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/systems/msdos/vga2mf/wnpc10.mf b/systems/msdos/vga2mf/wnpc10.mf
new file mode 100644
index 0000000000..6ed06adc4b
--- /dev/null
+++ b/systems/msdos/vga2mf/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/systems/msdos/vga2mf/wnpc10.tex b/systems/msdos/vga2mf/wnpc10.tex
new file mode 100644
index 0000000000..5ce68ace25
--- /dev/null
+++ b/systems/msdos/vga2mf/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/systems/msdos/web b/systems/msdos/web
new file mode 120000
index 0000000000..ebc7ed21c0
--- /dev/null
+++ b/systems/msdos/web
@@ -0,0 +1 @@
+dos-tp \ No newline at end of file