From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- systems/msdos/GNU-texindex/texindex.README | 47 + systems/msdos/asc2tex/asc2tex.txt | 18 + systems/msdos/bbibtex.zoomsdos | Bin 0 -> 103593 bytes systems/msdos/djgpp/00_index.txt | 48 + systems/msdos/djgpp/TeX.README | 641 +++ systems/msdos/dos-tp | 1 + systems/msdos/dostp22/README | 183 + systems/msdos/dpmigcc/nt09c.txt | 25 + systems/msdos/dpmigcc/nt09cemx.txt | 19 + systems/msdos/dpmigcc/rsxn141r.txt | 20 + systems/msdos/dpmigcc/rsxnt141.txt | 22 + systems/msdos/dpmigcc/rsxwdk2.txt | 40 + systems/msdos/dpmigcc/rsxwdk2p.txt | 29 + systems/msdos/dpmigcc/rsxwin31.txt | 31 + systems/msdos/dviware/dvilj4/commands.h | 65 + systems/msdos/dviware/dvilj4/config.h | 131 + systems/msdos/dviware/dvilj4/dvi2xx.c | 4427 ++++++++++++++++++++ systems/msdos/dviware/dvilj4/emu387 | Bin 0 -> 42766 bytes systems/msdos/dviware/dvilj4/findfile.c | 121 + systems/msdos/dviware/dvilj4/lj4.bat | 15 + systems/msdos/dviware/dvilj4/makefile | 73 + systems/msdos/dviware/dvips/maketexp.bat | 52 + systems/msdos/dviware/dvips/readme.pc | 113 + systems/msdos/dviware/dviwin | 1 + systems/msdos/dviware/pccrude.zoo | Bin 0 -> 91057 bytes systems/msdos/dviware/xdvi-dos/copying | 249 ++ systems/msdos/dviware/xdvi-dos/copying.dj | 63 + systems/msdos/dviware/xdvi-dos/read_dvx.tex | 79 + systems/msdos/dviware/xdvi-dos/read_dvx.txt | 76 + systems/msdos/dviware/xdvi-dos/readme | 268 ++ systems/msdos/dviware/xdvi-dos/src/dvi.h | 62 + systems/msdos/dviware/xdvi-dos/src/dvi_draw.c | 1049 +++++ systems/msdos/dviware/xdvi-dos/src/dvi_init.c | 639 +++ systems/msdos/dviware/xdvi-dos/src/font_ope.c | 887 ++++ systems/msdos/dviware/xdvi-dos/src/fontfmts.c | 21 + systems/msdos/dviware/xdvi-dos/src/fontsub.c | 62 + systems/msdos/dviware/xdvi-dos/src/gf.c | 294 ++ systems/msdos/dviware/xdvi-dos/src/makefile | 36 + systems/msdos/dviware/xdvi-dos/src/makefile.bak | 36 + systems/msdos/dviware/xdvi-dos/src/maketexp | 141 + systems/msdos/dviware/xdvi-dos/src/patchlev.h | 1 + systems/msdos/dviware/xdvi-dos/src/pk.c | 324 ++ systems/msdos/dviware/xdvi-dos/src/pxl.c | 166 + systems/msdos/dviware/xdvi-dos/src/tpic.c | 434 ++ systems/msdos/dviware/xdvi-dos/src/util.c | 216 + systems/msdos/dviware/xdvi-dos/src/vf.c | 123 + systems/msdos/dviware/xdvi-dos/src/xdvi.c | 3175 ++++++++++++++ systems/msdos/dviware/xdvi-dos/src/xdvi.h | 509 +++ systems/msdos/dviware/xdvi-dos/src/xdvi.ico | 27 + systems/msdos/dviware/xdvi-dos/src/xdvi_cur.h | 9 + systems/msdos/dviware/xdvi-dos/src/xdvi_mas.h | 7 + systems/msdos/dviware/xdvi-dos/texfonts.sub | 74 + systems/msdos/dviware/xdvi-dos/xdvi.man | 396 ++ systems/msdos/e4t/e4t-deu.html | 118 + systems/msdos/e4t/e4t-eng.html | 109 + systems/msdos/e4t/e4tinfod.txt | 11 + systems/msdos/e4t/e4tinfoe.txt | 11 + systems/msdos/e4t/e4tmihlp.txt | 11 + systems/msdos/e4t/liesmich.e4t | 71 + systems/msdos/e4t/readme.e4t | 64 + systems/msdos/easytex/readme.txt | 322 ++ .../msdos/emtex-contrib/TeXtelmExtel/95_09_26.ver | 2 + .../msdos/emtex-contrib/TeXtelmExtel/read1st.txt | 106 + .../msdos/emtex-contrib/TeXtelmExtel/whatsnew.txt | 53 + systems/msdos/emtex-contrib/bonus/emtex.tex | 1476 +++++++ systems/msdos/emtex-contrib/contrib/bj10e.dvidot | 65 + systems/msdos/emtex-contrib/contrib/diskette.bat | 526 +++ systems/msdos/emtex-contrib/cyrtug/README | 9 + systems/msdos/emtex-contrib/dpinnn/README | 96 + systems/msdos/emtex-contrib/dvimfj/doc/dvimfj.doc | 24 + systems/msdos/emtex-contrib/dvimfj/dvimfj.cfg | 36 + .../msdos/emtex-contrib/dvimfj/dvimfj.src/c.bat | 13 + .../emtex-contrib/dvimfj/dvimfj.src/commands.h | 67 + .../msdos/emtex-contrib/dvimfj/dvimfj.src/disdvi.c | 454 ++ .../msdos/emtex-contrib/dvimfj/dvimfj.src/dvimfj.c | 631 +++ systems/msdos/emtex-contrib/edit-4.33/README | 35 + systems/msdos/emtex-contrib/emt2tex/e2t_read.me | 49 + systems/msdos/emtex-contrib/emtexgi/readme.txt | 14 + systems/msdos/emtex-contrib/hp2tex/what_it.is | 111 + systems/msdos/emtex-contrib/makeinst/readme.1st | 7 + systems/msdos/emtex-contrib/zemtex/lj1990.cnf | 16 + systems/msdos/emtex-contrib/zemtex/lj1992.cnf | 18 + systems/msdos/emtex-contrib/zemtex/lj_amsz.fli | Bin 0 -> 251222 bytes systems/msdos/emtex-contrib/zemtex/oz.tex | 1483 +++++++ systems/msdos/emtex-contrib/zemtex/zemtex11.doc | 203 + systems/msdos/emtex-fonts/contrib/00readme | 23 + systems/msdos/emtex-fonts/contrib/ams101.fli | Bin 0 -> 287487 bytes systems/msdos/emtex-fonts/contrib/cmcyrfnt/INSTALL | 108 + systems/msdos/emtex-fonts/contrib/cmcyrfnt/README | 49 + .../emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.fli | Bin 0 -> 1965043 bytes systems/msdos/emtex-fonts/contrib/dc_all.mfj | 81 + systems/msdos/emtex-fonts/contrib/fdori101.fli | Bin 0 -> 608706 bytes systems/msdos/emtex-fonts/contrib/lj_dc_a.fli | Bin 0 -> 1541563 bytes systems/msdos/emtex-fonts/contrib/lj_dc_b.fli | Bin 0 -> 1674351 bytes systems/msdos/emtex-fonts/contrib/p6h_dc.readme | 16 + systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgz | Bin 0 -> 1290497 bytes systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgz | Bin 0 -> 1449000 bytes systems/msdos/emtex-fonts/contrib/testdc.tex | 58 + .../emtex-fonts/fx_med_fonts/README.fx_med_fonts | 21 + .../msdos/emtex-fonts/fx_med_fonts/fx_med_0.fli | Bin 0 -> 332733 bytes .../msdos/emtex-fonts/fx_med_fonts/fx_med_1.fli | Bin 0 -> 378921 bytes .../msdos/emtex-fonts/fx_med_fonts/fx_med_2.fli | Bin 0 -> 436317 bytes .../msdos/emtex-fonts/fx_med_fonts/fx_med_3.fli | Bin 0 -> 508265 bytes .../msdos/emtex-fonts/fx_med_fonts/fx_med_4.fli | Bin 0 -> 597645 bytes .../msdos/emtex-fonts/fx_med_fonts/fx_med_5.fli | Bin 0 -> 716081 bytes .../msdos/emtex-fonts/fx_med_fonts/fx_med_h.fli | Bin 0 -> 353621 bytes systems/msdos/emtex-fonts/psfonts/README.PS | 189 + systems/msdos/emtex-fonts/psfonts/fonttst1.tex | 68 + systems/msdos/emtex-fonts/psfonts/fonttst2.tex | 30 + systems/msdos/emtex-fonts/psfonts/lj.cnf | 12 + systems/msdos/emtex-fonts/psfonts/newfonts.sub | 47 + systems/msdos/emtex-fonts/psfonts/ps_0.fli | Bin 0 -> 1260136 bytes systems/msdos/emtex-fonts/psfonts/ps_1.fli | Bin 0 -> 318265 bytes systems/msdos/emtex-fonts/psfonts/ps_2.fli | Bin 0 -> 485093 bytes systems/msdos/emtex-fonts/psfonts/ps_3.fli | Bin 0 -> 515917 bytes systems/msdos/emtex-fonts/psfonts/ps_4.fli | Bin 0 -> 631781 bytes systems/msdos/emtex-fonts/psfonts/ps_5.fli | Bin 0 -> 726233 bytes systems/msdos/emtex-fonts/psfonts/ps_h.fli | Bin 0 -> 290905 bytes systems/msdos/emtex/CHANGES.ENG | 460 ++ systems/msdos/emtex/CHANGES.GER | 478 +++ systems/msdos/emtex/DISKETTE.DOC | 82 + systems/msdos/emtex/HELP.ENG | 1131 +++++ systems/msdos/emtex/HELP.GER | 1223 ++++++ systems/msdos/emtex/INSTALL.ENG | 786 ++++ systems/msdos/emtex/INSTALL.GER | 846 ++++ systems/msdos/emtex/QUICK.ENG | 329 ++ systems/msdos/emtex/QUICK.GER | 342 ++ systems/msdos/emtex/README.BET | 235 ++ systems/msdos/emtex/README.ENG | 579 +++ systems/msdos/emtex/README.GER | 598 +++ systems/msdos/emtex/bj_base.fli | Bin 0 -> 683063 bytes systems/msdos/emtex/dj_base.fli | Bin 0 -> 578547 bytes systems/msdos/emtex/dvips | 1 + systems/msdos/emtex/fax_base.fli | Bin 0 -> 395515 bytes systems/msdos/emtex/fx_base.fli | Bin 0 -> 441499 bytes systems/msdos/emtex/install.dat | Bin 0 -> 128481 bytes systems/msdos/emtex/install.ovl | Bin 0 -> 71680 bytes systems/msdos/emtex/ito_base.fli | Bin 0 -> 316803 bytes systems/msdos/emtex/lj_base.fli | Bin 0 -> 572499 bytes systems/msdos/emtex/ljh_base.fli | Bin 0 -> 1226903 bytes systems/msdos/emtex/p6h_base.fli | Bin 0 -> 683851 bytes systems/msdos/emtex/p6l_base.fli | Bin 0 -> 363627 bytes systems/msdos/emtex/p6m_base.fli | Bin 0 -> 450303 bytes systems/msdos/emtex/qj_base.fli | Bin 0 -> 385079 bytes systems/msdos/emtex/sty_base.fli | Bin 0 -> 690327 bytes systems/msdos/ergotex/read_me | 40 + systems/msdos/ftetx | 1 + systems/msdos/gtexedit/readme.asc | 23 + systems/msdos/jemtex2/fontable.c | 178 + systems/msdos/jemtex2/fontable.pas | 152 + systems/msdos/jemtex2/jem2tex.c | 1317 ++++++ systems/msdos/jemtex2/jem2tex.pas | 1209 ++++++ systems/msdos/jemtex2/jguide.tex | 3660 ++++++++++++++++ systems/msdos/jemtex2/jis24 | Bin 0 -> 562032 bytes systems/msdos/jemtex2/jis2mf.c | 996 +++++ systems/msdos/jemtex2/jis2mf.pas | 939 +++++ systems/msdos/lalaunch/lalaunch.cfg | 148 + systems/msdos/lalaunch/readme.txt | 459 ++ systems/msdos/lalaunch/vbrun300.dll | Bin 0 -> 398416 bytes systems/msdos/lated/readme.txt | 99 + systems/msdos/lxmail | 1 + systems/msdos/mma2ltx | 1 + systems/msdos/musfilt/README | 55 + systems/msdos/nb4latex/README | 31 + systems/msdos/picins/picins.LIESMICH | 32 + systems/msdos/public-mf | 1 + systems/msdos/public-tex | 1 + systems/msdos/pxlgen/mvcloi.if3 | Bin 0 -> 63452 bytes systems/msdos/pxlgen/mvssbx10.if3 | Bin 0 -> 44950 bytes systems/msdos/pxlgen/mvtt10.if3 | Bin 0 -> 46436 bytes systems/msdos/pxlgen/readme | 131 + systems/msdos/pxlgen/tfm.lib | Bin 0 -> 5224 bytes systems/msdos/sbtex/dvf04.boo | 2719 ++++++++++++ systems/msdos/sbtex/dvf04.doc | 35 + systems/msdos/sbtex/te.doc | 38 + systems/msdos/ted/readme.ted | 481 +++ systems/msdos/texshell/readme.ts | 153 + systems/msdos/texshell/temesy18.lzh | Bin 0 -> 735891 bytes systems/msdos/text2dvi/text2dvi.doc | 665 +++ systems/msdos/text2dvi/text2dvi.tbl | Bin 0 -> 2809 bytes systems/msdos/tx/copying | 339 ++ systems/msdos/tx/news | 6 + systems/msdos/tx/readme | 58 + systems/msdos/tx/src/frame.c | 30 + systems/msdos/tx/src/makefile | 36 + systems/msdos/tx/src/makefile.gcc | 37 + systems/msdos/tx/src/spawno.doc | 486 +++ systems/msdos/tx/src/spawns.lib | Bin 0 -> 14846 bytes systems/msdos/tx/src/tx.c | 269 ++ systems/msdos/tx/src/tx.h | 19 + systems/msdos/tx/src/tx.rsp | 13 + systems/msdos/tx/src/txcomm.c | 45 + systems/msdos/tx/src/txdefs.h | 93 + systems/msdos/tx/src/txdir.c | 352 ++ systems/msdos/tx/src/txexpand.c | 64 + systems/msdos/tx/src/txmain.c | 72 + systems/msdos/tx/src/txmenu.c | 130 + systems/msdos/tx/src/txprompt.c | 27 + systems/msdos/tx/tx.cnf | 68 + systems/msdos/tx/tx.doc | 324 ++ systems/msdos/tx1/!tx1read.doc | 848 ++++ systems/msdos/tx1/READ.ME | 1 + systems/msdos/utilities/beta/beta30sw.doc | 43 + systems/msdos/utilities/vfcomb/vfc-eng.pdf | Bin 0 -> 258690 bytes systems/msdos/utilities/vfcomb/vfc-eng.tex | 2421 +++++++++++ systems/msdos/vga2mf/00readme.txt | 83 + systems/msdos/vga2mf/cp437.ega | Bin 0 -> 3584 bytes systems/msdos/vga2mf/cp437.vga | Bin 0 -> 4096 bytes systems/msdos/vga2mf/cp850.ega | Bin 0 -> 3584 bytes systems/msdos/vga2mf/cp850.vga | Bin 0 -> 4096 bytes systems/msdos/vga2mf/cp860.ega | Bin 0 -> 3584 bytes systems/msdos/vga2mf/cp860.vga | Bin 0 -> 4096 bytes systems/msdos/vga2mf/cp863.ega | Bin 0 -> 3584 bytes systems/msdos/vga2mf/cp863.vga | Bin 0 -> 4096 bytes systems/msdos/vga2mf/cp865.ega | Bin 0 -> 3584 bytes systems/msdos/vga2mf/cp865.vga | Bin 0 -> 4096 bytes systems/msdos/vga2mf/cp880dv.ega | Bin 0 -> 3584 bytes systems/msdos/vga2mf/cp880dv.vga | Bin 0 -> 4096 bytes systems/msdos/vga2mf/ega2mf.c | 187 + systems/msdos/vga2mf/foo.bar | 10 + systems/msdos/vga2mf/vga2mf.c | 193 + systems/msdos/vga2mf/wnpc10.mf | 3420 +++++++++++++++ systems/msdos/vga2mf/wnpc10.tex | 35 + systems/msdos/web | 1 + 224 files changed, 52823 insertions(+) create mode 100644 systems/msdos/GNU-texindex/texindex.README create mode 100644 systems/msdos/asc2tex/asc2tex.txt create mode 100644 systems/msdos/bbibtex.zoomsdos create mode 100644 systems/msdos/djgpp/00_index.txt create mode 100644 systems/msdos/djgpp/TeX.README create mode 120000 systems/msdos/dos-tp create mode 100644 systems/msdos/dostp22/README create mode 100644 systems/msdos/dpmigcc/nt09c.txt create mode 100644 systems/msdos/dpmigcc/nt09cemx.txt create mode 100644 systems/msdos/dpmigcc/rsxn141r.txt create mode 100644 systems/msdos/dpmigcc/rsxnt141.txt create mode 100644 systems/msdos/dpmigcc/rsxwdk2.txt create mode 100644 systems/msdos/dpmigcc/rsxwdk2p.txt create mode 100644 systems/msdos/dpmigcc/rsxwin31.txt create mode 100644 systems/msdos/dviware/dvilj4/commands.h create mode 100644 systems/msdos/dviware/dvilj4/config.h create mode 100644 systems/msdos/dviware/dvilj4/dvi2xx.c create mode 100644 systems/msdos/dviware/dvilj4/emu387 create mode 100644 systems/msdos/dviware/dvilj4/findfile.c create mode 100644 systems/msdos/dviware/dvilj4/lj4.bat create mode 100644 systems/msdos/dviware/dvilj4/makefile create mode 100644 systems/msdos/dviware/dvips/maketexp.bat create mode 100644 systems/msdos/dviware/dvips/readme.pc create mode 120000 systems/msdos/dviware/dviwin create mode 100644 systems/msdos/dviware/pccrude.zoo create mode 100644 systems/msdos/dviware/xdvi-dos/copying create mode 100644 systems/msdos/dviware/xdvi-dos/copying.dj create mode 100644 systems/msdos/dviware/xdvi-dos/read_dvx.tex create mode 100644 systems/msdos/dviware/xdvi-dos/read_dvx.txt create mode 100644 systems/msdos/dviware/xdvi-dos/readme create mode 100644 systems/msdos/dviware/xdvi-dos/src/dvi.h create mode 100644 systems/msdos/dviware/xdvi-dos/src/dvi_draw.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/dvi_init.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/font_ope.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/fontfmts.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/fontsub.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/gf.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/makefile create mode 100644 systems/msdos/dviware/xdvi-dos/src/makefile.bak create mode 100644 systems/msdos/dviware/xdvi-dos/src/maketexp create mode 100644 systems/msdos/dviware/xdvi-dos/src/patchlev.h create mode 100644 systems/msdos/dviware/xdvi-dos/src/pk.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/pxl.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/tpic.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/util.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/vf.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/xdvi.c create mode 100644 systems/msdos/dviware/xdvi-dos/src/xdvi.h create mode 100644 systems/msdos/dviware/xdvi-dos/src/xdvi.ico create mode 100644 systems/msdos/dviware/xdvi-dos/src/xdvi_cur.h create mode 100644 systems/msdos/dviware/xdvi-dos/src/xdvi_mas.h create mode 100644 systems/msdos/dviware/xdvi-dos/texfonts.sub create mode 100644 systems/msdos/dviware/xdvi-dos/xdvi.man create mode 100644 systems/msdos/e4t/e4t-deu.html create mode 100644 systems/msdos/e4t/e4t-eng.html create mode 100644 systems/msdos/e4t/e4tinfod.txt create mode 100644 systems/msdos/e4t/e4tinfoe.txt create mode 100644 systems/msdos/e4t/e4tmihlp.txt create mode 100644 systems/msdos/e4t/liesmich.e4t create mode 100644 systems/msdos/e4t/readme.e4t create mode 100644 systems/msdos/easytex/readme.txt create mode 100644 systems/msdos/emtex-contrib/TeXtelmExtel/95_09_26.ver create mode 100644 systems/msdos/emtex-contrib/TeXtelmExtel/read1st.txt create mode 100644 systems/msdos/emtex-contrib/TeXtelmExtel/whatsnew.txt create mode 100644 systems/msdos/emtex-contrib/bonus/emtex.tex create mode 100644 systems/msdos/emtex-contrib/contrib/bj10e.dvidot create mode 100644 systems/msdos/emtex-contrib/contrib/diskette.bat create mode 100644 systems/msdos/emtex-contrib/cyrtug/README create mode 100644 systems/msdos/emtex-contrib/dpinnn/README create mode 100644 systems/msdos/emtex-contrib/dvimfj/doc/dvimfj.doc create mode 100644 systems/msdos/emtex-contrib/dvimfj/dvimfj.cfg create mode 100644 systems/msdos/emtex-contrib/dvimfj/dvimfj.src/c.bat create mode 100644 systems/msdos/emtex-contrib/dvimfj/dvimfj.src/commands.h create mode 100644 systems/msdos/emtex-contrib/dvimfj/dvimfj.src/disdvi.c create mode 100644 systems/msdos/emtex-contrib/dvimfj/dvimfj.src/dvimfj.c create mode 100644 systems/msdos/emtex-contrib/edit-4.33/README create mode 100644 systems/msdos/emtex-contrib/emt2tex/e2t_read.me create mode 100644 systems/msdos/emtex-contrib/emtexgi/readme.txt create mode 100644 systems/msdos/emtex-contrib/hp2tex/what_it.is create mode 100644 systems/msdos/emtex-contrib/makeinst/readme.1st create mode 100644 systems/msdos/emtex-contrib/zemtex/lj1990.cnf create mode 100644 systems/msdos/emtex-contrib/zemtex/lj1992.cnf create mode 100644 systems/msdos/emtex-contrib/zemtex/lj_amsz.fli create mode 100644 systems/msdos/emtex-contrib/zemtex/oz.tex create mode 100644 systems/msdos/emtex-contrib/zemtex/zemtex11.doc create mode 100644 systems/msdos/emtex-fonts/contrib/00readme create mode 100644 systems/msdos/emtex-fonts/contrib/ams101.fli create mode 100644 systems/msdos/emtex-fonts/contrib/cmcyrfnt/INSTALL create mode 100644 systems/msdos/emtex-fonts/contrib/cmcyrfnt/README create mode 100644 systems/msdos/emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.fli create mode 100644 systems/msdos/emtex-fonts/contrib/dc_all.mfj create mode 100644 systems/msdos/emtex-fonts/contrib/fdori101.fli create mode 100644 systems/msdos/emtex-fonts/contrib/lj_dc_a.fli create mode 100644 systems/msdos/emtex-fonts/contrib/lj_dc_b.fli create mode 100644 systems/msdos/emtex-fonts/contrib/p6h_dc.readme create mode 100644 systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgz create mode 100644 systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgz create mode 100644 systems/msdos/emtex-fonts/contrib/testdc.tex create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/README.fx_med_fonts create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_0.fli create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_1.fli create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_2.fli create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_3.fli create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_4.fli create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_5.fli create mode 100644 systems/msdos/emtex-fonts/fx_med_fonts/fx_med_h.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/README.PS create mode 100644 systems/msdos/emtex-fonts/psfonts/fonttst1.tex create mode 100644 systems/msdos/emtex-fonts/psfonts/fonttst2.tex create mode 100644 systems/msdos/emtex-fonts/psfonts/lj.cnf create mode 100644 systems/msdos/emtex-fonts/psfonts/newfonts.sub create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_0.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_1.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_2.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_3.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_4.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_5.fli create mode 100644 systems/msdos/emtex-fonts/psfonts/ps_h.fli create mode 100644 systems/msdos/emtex/CHANGES.ENG create mode 100644 systems/msdos/emtex/CHANGES.GER create mode 100644 systems/msdos/emtex/DISKETTE.DOC create mode 100644 systems/msdos/emtex/HELP.ENG create mode 100644 systems/msdos/emtex/HELP.GER create mode 100644 systems/msdos/emtex/INSTALL.ENG create mode 100644 systems/msdos/emtex/INSTALL.GER create mode 100644 systems/msdos/emtex/QUICK.ENG create mode 100644 systems/msdos/emtex/QUICK.GER create mode 100644 systems/msdos/emtex/README.BET create mode 100644 systems/msdos/emtex/README.ENG create mode 100644 systems/msdos/emtex/README.GER create mode 100644 systems/msdos/emtex/bj_base.fli create mode 100644 systems/msdos/emtex/dj_base.fli create mode 120000 systems/msdos/emtex/dvips create mode 100644 systems/msdos/emtex/fax_base.fli create mode 100644 systems/msdos/emtex/fx_base.fli create mode 100644 systems/msdos/emtex/install.dat create mode 100644 systems/msdos/emtex/install.ovl create mode 100644 systems/msdos/emtex/ito_base.fli create mode 100644 systems/msdos/emtex/lj_base.fli create mode 100644 systems/msdos/emtex/ljh_base.fli create mode 100644 systems/msdos/emtex/p6h_base.fli create mode 100644 systems/msdos/emtex/p6l_base.fli create mode 100644 systems/msdos/emtex/p6m_base.fli create mode 100644 systems/msdos/emtex/qj_base.fli create mode 100644 systems/msdos/emtex/sty_base.fli create mode 100644 systems/msdos/ergotex/read_me create mode 120000 systems/msdos/ftetx create mode 100644 systems/msdos/gtexedit/readme.asc create mode 100644 systems/msdos/jemtex2/fontable.c create mode 100644 systems/msdos/jemtex2/fontable.pas create mode 100644 systems/msdos/jemtex2/jem2tex.c create mode 100644 systems/msdos/jemtex2/jem2tex.pas create mode 100644 systems/msdos/jemtex2/jguide.tex create mode 100644 systems/msdos/jemtex2/jis24 create mode 100644 systems/msdos/jemtex2/jis2mf.c create mode 100644 systems/msdos/jemtex2/jis2mf.pas create mode 100644 systems/msdos/lalaunch/lalaunch.cfg create mode 100644 systems/msdos/lalaunch/readme.txt create mode 100644 systems/msdos/lalaunch/vbrun300.dll create mode 100644 systems/msdos/lated/readme.txt create mode 120000 systems/msdos/lxmail create mode 120000 systems/msdos/mma2ltx create mode 100644 systems/msdos/musfilt/README create mode 100644 systems/msdos/nb4latex/README create mode 100644 systems/msdos/picins/picins.LIESMICH create mode 120000 systems/msdos/public-mf create mode 120000 systems/msdos/public-tex create mode 100644 systems/msdos/pxlgen/mvcloi.if3 create mode 100644 systems/msdos/pxlgen/mvssbx10.if3 create mode 100644 systems/msdos/pxlgen/mvtt10.if3 create mode 100644 systems/msdos/pxlgen/readme create mode 100644 systems/msdos/pxlgen/tfm.lib create mode 100644 systems/msdos/sbtex/dvf04.boo create mode 100644 systems/msdos/sbtex/dvf04.doc create mode 100644 systems/msdos/sbtex/te.doc create mode 100644 systems/msdos/ted/readme.ted create mode 100644 systems/msdos/texshell/readme.ts create mode 100644 systems/msdos/texshell/temesy18.lzh create mode 100644 systems/msdos/text2dvi/text2dvi.doc create mode 100644 systems/msdos/text2dvi/text2dvi.tbl create mode 100644 systems/msdos/tx/copying create mode 100644 systems/msdos/tx/news create mode 100644 systems/msdos/tx/readme create mode 100644 systems/msdos/tx/src/frame.c create mode 100644 systems/msdos/tx/src/makefile create mode 100644 systems/msdos/tx/src/makefile.gcc create mode 100644 systems/msdos/tx/src/spawno.doc create mode 100644 systems/msdos/tx/src/spawns.lib create mode 100644 systems/msdos/tx/src/tx.c create mode 100644 systems/msdos/tx/src/tx.h create mode 100644 systems/msdos/tx/src/tx.rsp create mode 100644 systems/msdos/tx/src/txcomm.c create mode 100644 systems/msdos/tx/src/txdefs.h create mode 100644 systems/msdos/tx/src/txdir.c create mode 100644 systems/msdos/tx/src/txexpand.c create mode 100644 systems/msdos/tx/src/txmain.c create mode 100644 systems/msdos/tx/src/txmenu.c create mode 100644 systems/msdos/tx/src/txprompt.c create mode 100644 systems/msdos/tx/tx.cnf create mode 100644 systems/msdos/tx/tx.doc create mode 100755 systems/msdos/tx1/!tx1read.doc create mode 120000 systems/msdos/tx1/READ.ME create mode 100644 systems/msdos/utilities/beta/beta30sw.doc create mode 100644 systems/msdos/utilities/vfcomb/vfc-eng.pdf create mode 100644 systems/msdos/utilities/vfcomb/vfc-eng.tex create mode 100644 systems/msdos/vga2mf/00readme.txt create mode 100644 systems/msdos/vga2mf/cp437.ega create mode 100644 systems/msdos/vga2mf/cp437.vga create mode 100644 systems/msdos/vga2mf/cp850.ega create mode 100644 systems/msdos/vga2mf/cp850.vga create mode 100644 systems/msdos/vga2mf/cp860.ega create mode 100644 systems/msdos/vga2mf/cp860.vga create mode 100644 systems/msdos/vga2mf/cp863.ega create mode 100644 systems/msdos/vga2mf/cp863.vga create mode 100644 systems/msdos/vga2mf/cp865.ega create mode 100644 systems/msdos/vga2mf/cp865.vga create mode 100644 systems/msdos/vga2mf/cp880dv.ega create mode 100644 systems/msdos/vga2mf/cp880dv.vga create mode 100644 systems/msdos/vga2mf/ega2mf.c create mode 100644 systems/msdos/vga2mf/foo.bar create mode 100644 systems/msdos/vga2mf/vga2mf.c create mode 100644 systems/msdos/vga2mf/wnpc10.mf create mode 100644 systems/msdos/vga2mf/wnpc10.tex create mode 120000 systems/msdos/web (limited to 'systems/msdos') 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 + + + +====================================================================== + +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 + 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 Binary files /dev/null and b/systems/msdos/bbibtex.zoomsdos 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 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 denote the root of the TDS as described in the draft `A +Directory Structure for TeX Files' --- typically 'c:\texmf' or similar. +And let be the directory where the .zip files are located. +Make 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 + for %i in (\*.zip) do unzip -o %i + +3. Generating the Programs from their Sources + +All SRCxxx file are installed in the directory \dostp\ +(where 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 \dostp\ +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 \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 \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 +\dostp\tmp and then in the \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 +\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 \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 \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 \dostp\bin directory, therefore you +should add it to your Dos path. You SHOULD NOT, however, move all the +executables from the \dostp\bin directory to another directory +already in the Dos path; this will most probably fail. + +All programs accept command line parameters, the \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 \dostp\ini directory, +e.g.: + cd \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 \fonts\pk\ibmtont\public\mflogo\dpi100\ + cmmf \mode=cx; mag=1.2; scrollmode; input cmss8 + gftopk cmss8 \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 +#include +#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 +#include +#include +#include +#ifdef vms +#include +#else +#include +#endif +#ifdef MSDOS +#include /* only for binaryopen on device */ +#endif +#ifdef unix +#include +#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 +#else +#include +#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; i00) +#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 (num0x60)); 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: Jpxl font area */ + 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)= 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; jwhere.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,"\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(®s, ®s); /* 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(®s, ®s); /* 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 /* */ +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("\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("@\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(" @ \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 () +{ /*@= */ + 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 Binary files /dev/null and b/systems/msdos/dviware/dvilj4/emu387 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 +#include +#include +#include +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.", + 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 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 Binary files /dev/null and b/systems/msdos/dviware/pccrude.zoo 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. + + + Copyright (C) 19yy + + 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. + + , 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 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 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 '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 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 +#include "xdvi.h" +#include "dvi.h" + +#ifndef X_NOT_STDC_ENV +#include +#endif + +#if NeedVarargsPrototypes /* this is for tell_oops */ +#include +#else +#include +#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 is not provided (or for 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 + +#ifdef sun +extern char *sprintf(); +#endif + +#ifndef X_NOT_STDC_ENV +#include +#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 +extern FILE *fontsubfile; +extern char *subfont (FILE *,char *); +#endif + +#endif +/*--------------------------- Msdos ---------------------------------------*/ + +#include "xdvi.h" +#include + +#ifndef X_NOT_STDC_ENV +#include /* has getenv() */ +#include /* 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 +#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. */ +/* was included by xdvi.h. */ + +#include + +static int is_dir (); + +#if defined(SYSV) || defined(_POSIX_SOURCE) +#include +typedef struct dirent *directory_entry_type; +#else +#include +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 /* 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 +#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 +#include + +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 +#include + +#include "xdvi.h" + +#ifndef X_NOT_STDC_ENV +#include +#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 +int errno; + +#ifdef VMS +#include +#endif /* VMS */ + +#ifndef X_NOT_STDC_ENV +#include +#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 +#else +#include +#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 +#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 + +#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 +#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 +#include +#include "xdvi.icon" +#endif /* X10 */ + +#ifdef TOOLKIT +#undef Boolean +#include +#ifdef OLD_X11_TOOLKIT +#include +#else /* not OLD_X11_TOOLKIT */ +#include +#include +#endif /* not OLD_X11_TOOLKIT */ +#include /* needed for def. of XtNiconX */ +#ifndef XtSpecificationRelease +#define XtSpecificationRelease 0 +#endif +#if XtSpecificationRelease >= 4 +#include +#ifdef BUTTONS +#include +#endif +#else /* XtSpecificationRelease < 4 */ +#define XtPointer caddr_t +#include +#ifdef BUTTONS +#include +#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 +#include +#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 /* 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 +#include + + /* 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 [+[]] [-s ] [-S ] [-p ] [-l] [-rv]\n\ + [-expert] [-paper ] [-mgs[n] ] [-altfont ]\n\ + [-margins ] [-sidemargin ] [-topmargin ]\n\ + [-offsets ] [-xoffset ] [-yoffset ] [-keep]\n\ + [-hushspecials] [-hushchars] [-hush] [-nogrey] [-gamma ] \ +[-version]\n\ + [-fg ] [-bg ] [-hl ] [-bd ] \ +[-cr ]\n\ + [-bw ] [-geometry ] [-icongeometry ]\n\ + [-iconic] [-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 [+[]] [-s ] [-S ] [-p ] [-l] [-rv]\n\ + [-paper ] [-mgs[n] ] [-altfont ]\n\ + [-margins ] [-sidemargin ] [-topmargin ]\n\ + [-offsets ] [-xoffset ] [-yoffset ] [-keep]\n\ + [-hushspecials] [-hushchars] [-hush] [-nogrey] [-gamma ] [-version]\n\ + [-fg ] [-bg ] [-hl ] [-bd ] [-cr ]\n\ + [-bw ] [-geometry ] [-icongeometry ]\n\ + [-iconic] [-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 [+[]] [-s ] [-density <%>] [-p ] [-l] [-rv]\n\ + [-paper ] [-mgs[n] ] [-altfont ]\n\ + [-margins ] [-sidemargin ] [-topmargin ]\ +\n", stderr); + Fputs("\ + [-offsets ] [-xoffset ] [-yoffset ] [-keep]\n\ + [-hushspecials] [-hushchars] [-hush] [-nogrey] [-gamma ] \ +[-version]\n\ + [-fg ] [-bg ] [-hl ] [-bd ] \ +[-cr ]\n\ + [-bw ] [-geometry ] [-icongeometry ]\n\ + [-iconic] [-display ] [-copy] [-thorough] dvi_file\n", + stderr); +#endif /* VMS */ +#else /* X10 */ + Fputs("\ +Usage: xdvi [+[]] [-s ] [-S ] [-p ] [-l]\n\ + [-paper ] [-mgs[n] ] [-altfont ]\n\ + [-margins ] [-sidemargin ] [-topmargin ]\n\ + [-offsets ] [-xoffset ] [-yoffset ] [-keep]\n\ + [-hushspecials] [-hushchars] [-hush] [-version]\n\ + [-fg ] [-bg ] [-hl ] [-bd ] \ +[-cr ]\n\ + [-bw ] [-geometry | =]\n\ + [-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", FalseArg, BooleanArg, 1,(caddr_t) ©}, +{"-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 /* include Xfuncs.h, if available */ +#include /* needed for XDestroyImage */ +#include /* same as below */ +#else /* X10 */ +#include /* get type of Window */ +#include /* for sites without X11 */ +#ifdef SYSV +#include +#define index strchr +#define rindex strrchr +#include +#else /* SYSV */ +#include +#endif /* SYSV */ +#include +#endif /* X10 */ + +#ifndef XlibSpecificationRelease +#define XlibSpecificationRelease 0 +#endif + +#if XlibSpecificationRelease >= 5 +#include +#endif + +#ifdef VMS +#include +#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 +#include + +#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 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 @@ + +<B>Informationen zu Eddi4TeX</B> +

Eddi4TeX 2.01

+
+Diesen Text gibt es auch auf Englisch.

+ +

+ +Eddi4TeX ist gleichzeitig Editor und Oberfläche für die Arbeit mit +TeX. Die folgende Zusammenfassung gibt einen groben Überblick über +das Paket, sie kann jedoch nicht den Test durch Sie ersetzen. Weiter unten +gibt es Informationen zu dem Paket und wie Sie eine Kopie erhalten können. Außerdem eine Auflistung +der Änderungen in der neuen Version, falls Sie +Eddi4TeX schon kennen sollten. Am Ende dieses Textes sind dann noch einige Informationen zur rechtlichen Seite, etwas zu meiner Person und eine Kontaktadresse.

+ +

+ +Informationen zum Paket +(zum Anfang)

+

    +
  • Systemvoraussetungen: DOS oder OS/2, komplette TeX-Installation +
  • mehrere Textfenster, jeweils >64kB, volle Mausunterstützung +
  • Fließtext durch selbständigen Umbruch, mehrfaches +Zurücknehmen und Wiederherstellen von Textänderungen +
  • Bearbeiten von Blöcken, Spalten und Falten +
  • farbliche Syntaxhervorhebung, blinkende Klammern, Klammernkontrolle +
  • Analyse von log-Dateien auf Fehler und Warnungen, Sprung zu fehlerhaften +Stellen im Text +
  • Online Hilfe zum Programm und zu TeX (Einbindung von texinfo-hlp-Dateien +möglich) +
  • Makrosystem mit 40 Befehlen und 30 vordefinierten Variablen +
  • Suchen, Ersetzen, GREP-Syntax +
  • Manipulation des kompletten Menübaumes und der Statuszeile +
  • Aufruf beliebiger externer Programme +
  • unter OS/2: Start von Programmen in eigenen Sitzungen, Makros warten auf +das jeweilige Programmende +
  • Erstellung eigener hlp-Dateien +
  • Handbuch als 70 seitige dvi-Datei +
+ +

+ +Bestandteile des Paketes +(zum Anfang)

+Das Paket besteht aus drei einzelnen Teilen, Sie benötigen nicht alle +Teile. Aktivieren Sie die "Speicherfunktion" in Ihrem Web-Browser und +wählen Sie die gewünschten Teile:

+ +

    +
  • E4T201P.EXE enthält das +Programm für DOS und OS/2 +
  • E4T201D.EXE das deutsche Handbuch, +die Makrosammlung und hlp-Dateien +
  • E4T201E.EXE das englische Handbuch, +die Makrosammlung und hlp-Dateien

    +Auch das alte Archiv E4T200D.EXE kann mit den 2.01-Programmen +benutzt werden. Die Datei DIFF201D.TXT aus dem Archiv +E4T201P.EXE gibt alle hierfür notwendigen Informationen.

    +

  • E4TINFOD.TXT sollten in Zukunft +Fehler bekannt werden, so gibt dieser deutsche Text darüber +Informationen (üble Fehler werden sofort zu einer neuen Version +führen) +
+ +

+ +Neuigkeiten in Version 2.00/2.01? +(zum Anfang)

+

    +
  • mehrfaches Zurücknehmen und Wiederherstellen von +Textänderungen +
  • Falten +
  • Menübaum und Statuszeile frei konfigurierbar +
  • verbessertes Makrosystem ("zeigende" Makrovariablen) +
  • Verarbeitungsgeschwindigkeit der Makros erhöht +
  • GREP Suchen und Ersetzen +
  • Kosmetik an hunderten von Stellen +
+ +

+ +Rechtliche Hinweise +(zum Anfang)

+Eddi4TeX ist Shareware und muß nach einer Testzeit von 30 Tagen +registriert werden. Die nicht registrierte Version unterliegt keinen +Einschränkungen, Eddi4TeX ist keine "Crippleware".

+ +

+ +Der Mensch hinter "Ulrich Jahnz" +(zum Anfang)

+Ich bin 1969 geboren und beende zur Zeit mein Studium der Biotechnologie an +der Technischen Universitä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.

+ +

+ +Kontaktadresse +(zum Anfang)

+Sollten Sie Fragen oder Vorschläge zu Eddi4TeX haben, setzen Sie sich +mit mir in Verbindung.

+

+
Ulrich Jahnz +
Mittelweg 37 +
38106 Braunschweig +
Deutschland +
100667.1252@compuserve.com +
+ +

+ +(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 @@ + +<B>Information on Eddi4TeX</B> +

Eddi4TeX 2.01

+
+This text is available in German, also.

+ +

+ +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 information on +the package, how to obtain it and for a list of new features, if you know Eddi4TeX already. At the +end of this document you find some legal information, some +data on my person and a contact +address.

+ +

+ +Information on the package +(back to top)

+

    +
  • system requirements: DOS or OS/2, working TeX-Installation +
  • multiple text windows, each >64kB in size, full mouse support +
  • floattext by auto wrapping, multi-level undo and redo +
  • working on blocks, columns and folds +
  • syntax highlighting, blinking brackets, check of brackets +
  • analyzing log-files for errors and warnings, jump to faulty parts +
  • online help on program and TeX (works with texinfo-hlp-files) +
  • macro-system with 40 commands and 30 predefined variables +
  • searching, replacing, GREP-syntax +
  • customizing of whole menu tree and status line +
  • runs any external programs +
  • under OS/2: runs programs in their own sessions, macros may wait on + the end a program +
  • writing new help files +
  • handbook supplied as dvi-file +
+ +

+ +How to obtain the package? +(back to top)

+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:

+ +

    +
  • E4T201P.EXE contains the programs +for DOS and OS/2 +
  • E4T201D.EXE for German handbook, +demo macro collection, resource and help files +
  • E4T201E.EXE for English handbook, +demo macro collection, resource and help files

    +You can also use the old archive E4T200E.EXE with the +2.01-programs. The file DIFF201E.TXT from the archive +E4T201P.EXE provides all necessary information.

    +

  • E4TINFOE.TXT 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) +
+ +

+ +What's new in version 2.00/2.01? +(back to top)

+

    +
  • multi-level undo and redo for all actions +
  • folding +
  • menu tree and status line free configurable +
  • enhanced macro system (commands, "pointing" variables) +
  • speed of macro system increased +
  • GREP searching and replacing +
  • fine tuning on some hundred features not worth mentioning +
+ +

+ +Legal information +(back to top)

+Eddi4TeX is shareware and must be registered after a test period of 30 days. +All functions are provided in non registered versions, Eddi4TeX does +not come as crippleware.

+ +

+ +The person behind "Ulrich Jahnz" +(back to top)

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

+ +

+ +How to contact me? +(back to top)

+If you have any questions or suggestions on Eddi4TeX feel free to contact +me.

+

+
Ulrich Jahnz +
Mittelweg 37 +
38106 Braunschweig +
Germany +
100667.1252@compuserve.com +
+ +

+ +(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 + + + 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 + + + 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 + + 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. + ------------------------------------------------------------------------ + 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 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 +#include +#include "commands.h" +#if defined(MSDOS) +#include +#include +#include +#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) + + + +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 +#include +#include "commands.h" +#if defined(MSDOS) + #include + #include + #include + #include +#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) + + + +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 Binary files /dev/null and b/systems/msdos/emtex-contrib/zemtex/lj_amsz.fli 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 '. + +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 +% + +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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/ams101.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/cmcyrfnt/cmcyr_lj.fli 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 +% +% 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/fdori101.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/lj_dc_a.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/lj_dc_b.fli 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 + 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/p6h_dc_a.fgz 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/contrib/p6h_dc_b.fgz 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 +% +% 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_0.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_1.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_2.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_3.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_4.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_5.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/fx_med_fonts/fx_med_h.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_0.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_1.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_2.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_3.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_4.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_5.fli 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 Binary files /dev/null and b/systems/msdos/emtex-fonts/psfonts/ps_h.fli 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 Binary files /dev/null and b/systems/msdos/emtex/bj_base.fli differ diff --git a/systems/msdos/emtex/dj_base.fli b/systems/msdos/emtex/dj_base.fli new file mode 100644 index 0000000000..0b168268f2 Binary files /dev/null and b/systems/msdos/emtex/dj_base.fli 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 Binary files /dev/null and b/systems/msdos/emtex/fax_base.fli differ diff --git a/systems/msdos/emtex/fx_base.fli b/systems/msdos/emtex/fx_base.fli new file mode 100644 index 0000000000..f1f27d5fb0 Binary files /dev/null and b/systems/msdos/emtex/fx_base.fli differ diff --git a/systems/msdos/emtex/install.dat b/systems/msdos/emtex/install.dat new file mode 100644 index 0000000000..6d23cff868 Binary files /dev/null and b/systems/msdos/emtex/install.dat differ diff --git a/systems/msdos/emtex/install.ovl b/systems/msdos/emtex/install.ovl new file mode 100644 index 0000000000..4e4c12b719 Binary files /dev/null and b/systems/msdos/emtex/install.ovl differ diff --git a/systems/msdos/emtex/ito_base.fli b/systems/msdos/emtex/ito_base.fli new file mode 100644 index 0000000000..28ea23212a Binary files /dev/null and b/systems/msdos/emtex/ito_base.fli differ diff --git a/systems/msdos/emtex/lj_base.fli b/systems/msdos/emtex/lj_base.fli new file mode 100644 index 0000000000..32844afe05 Binary files /dev/null and b/systems/msdos/emtex/lj_base.fli differ diff --git a/systems/msdos/emtex/ljh_base.fli b/systems/msdos/emtex/ljh_base.fli new file mode 100644 index 0000000000..c6eb46bb8a Binary files /dev/null and b/systems/msdos/emtex/ljh_base.fli differ diff --git a/systems/msdos/emtex/p6h_base.fli b/systems/msdos/emtex/p6h_base.fli new file mode 100644 index 0000000000..5a2bf2672b Binary files /dev/null and b/systems/msdos/emtex/p6h_base.fli differ diff --git a/systems/msdos/emtex/p6l_base.fli b/systems/msdos/emtex/p6l_base.fli new file mode 100644 index 0000000000..06f956cc50 Binary files /dev/null and b/systems/msdos/emtex/p6l_base.fli differ diff --git a/systems/msdos/emtex/p6m_base.fli b/systems/msdos/emtex/p6m_base.fli new file mode 100644 index 0000000000..4c971257bb Binary files /dev/null and b/systems/msdos/emtex/p6m_base.fli differ diff --git a/systems/msdos/emtex/qj_base.fli b/systems/msdos/emtex/qj_base.fli new file mode 100644 index 0000000000..e48525ea25 Binary files /dev/null and b/systems/msdos/emtex/qj_base.fli differ diff --git a/systems/msdos/emtex/sty_base.fli b/systems/msdos/emtex/sty_base.fli new file mode 100644 index 0000000000..7c839138d5 Binary files /dev/null and b/systems/msdos/emtex/sty_base.fli 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 +#ifdef __TURBOC__ +#include +#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 +#include +#include +#ifdef __TURBOC__ +#include +#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 ; ParamIndexParamMax) { + /* 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 ; IndexExtraSpace=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 ; IndexExtraSpace=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'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'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=$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 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 Binary files /dev/null and b/systems/msdos/jemtex2/jis24 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 +#include +#include +#ifdef __TURBOC__ +#include +#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 ; ParamIndexParamMax) { + /* 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 ; IndexFixedX=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 Binary files /dev/null and b/systems/msdos/lalaunch/vbrun300.dll 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 Binary files /dev/null and b/systems/msdos/pxlgen/mvcloi.if3 differ diff --git a/systems/msdos/pxlgen/mvssbx10.if3 b/systems/msdos/pxlgen/mvssbx10.if3 new file mode 100644 index 0000000000..cbc0f2590e Binary files /dev/null and b/systems/msdos/pxlgen/mvssbx10.if3 differ diff --git a/systems/msdos/pxlgen/mvtt10.if3 b/systems/msdos/pxlgen/mvtt10.if3 new file mode 100644 index 0000000000..b7b5fab1b1 Binary files /dev/null and b/systems/msdos/pxlgen/mvtt10.if3 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 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 Binary files /dev/null and b/systems/msdos/pxlgen/tfm.lib 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 +0A7ofI@?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: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=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=]9oE_^n0oBW^oPkhcaQo>AA\F__6?nMOC35S +EX2J;j?7RG8hF>R`9h;^RY4Vjh]X2^N6j`mZCaad^?o07\?6A>_mYl[m2iTOY6UcYf;hF:mjAkog +>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?FGKhJneM_lmMMEVajZg_]3VjkM6MOZ?274\G^>>?RagW_<\O5oWfXIKibec;=c9YQ?=lLo_G +Rj9nW77jhoamQ?h_lgU2;ooeG]QOi33GPfFWn_Dnn;oUa>_WRcm@b_WjZ@WDLQ>h92 +9V\@ +U98d3cYSA>M_<58aONe233??2W4TNL\2R<_VZcTXFNPiUHef +I1UfM<37BUVgoHlF: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`[KTfbkgKGj4Gfme1]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\RSKdc>N[5j?E?mC3Tn3T=DC8Ln`N]2_ +3M3UiMm`ZUg1mG[[9?okdoK]lXQQWNiXf;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@YRTPhA5;\gbb1?6317G8g]7\bdNF@d?_oG83U6TD4R?k7@Hc[TN +6NR@`bo5mlS>5Gen5hnCdbb19[WVkWo\RRl9dll +BNWMA;U9gZmVV1VS[iW=\A>EbCgoDd7j\ah +1i7ok9?mgWnd?6Z7Z3dh6WZjAaoUE +[cm61WCF@Q]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_2M`kAmHZPlneOKhaLoSH +1j?GNmciGkKZeEGNC7Ai[]gUZa_9[mkZ]k_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;lXUeNPnA +kEC6N`ZAP@hc^;m3MZ8h?LXL>7Y51TH>m85A?Q``Y4C6RcV:1HjHX>]7jh\DK?XB1PJd1S91MYk@ +kf0nkDRMDG0_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[PGZBO]K4\`=6jkX32Sk= +nYjVPiF_W=mBl>h_TWYCf[NhMQ7CcgKlK8_3P3XO`WnUCGTjj_8H2?aEIbI?n[:VU +3MTYn9gM0MOEgD\U_C?X[^C_RVIoA`@<9n1mS^gg3YBO^oe1NEEWm?\=d\?0 +mS\0QMbNac]`jN`KogYonY4^bN4J@A5<^m1WC^@if7@o8DbCO]:<=Qh`Pm@k3F3lf@36dBHeS;]gjDhPf1?C5Zd[N5nW02Yd +Q95g[adjTR3mKLT7k7UkYE2Pgi]j54WG_efeBR5b5Kmga45j:Db>\[TNiXfCS:YOX8EOL]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<e5l@J6eFV_J3nc^Qe?jeHodY7ke4aMd4N\:=G_DL7VK;a`` +@imJB=k@6CVT:G3D=2F7]1NHW4?jE_[2 +]O^=2M8hhN==aKRD@fZOLK>7Gg]=[1ffkKNQ7TYk;T?\DDGJ3me1I<`JHmCBa`5oM;D13JBV_B>=j53c7RT_^L9h5KiNB0^1N>7:2MoJXEXDFhHY`7OCJKD +o:lA;8ol^;7:U>NC3UCI5F?\dM81;`fYWfI_VR0W3km[>^1VYbcATYMZNfQ1[bNj[L6VYk:d>m=XJoNajTc:F +WMZ[c[:h9iFdMLM6I=Z_N;ZF0W1XYiCk1N3@g`9`g7O5alo9 +kIe3nYh5UT>j7h0ZD_jKDN3BfCOm\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:_FSIC29LVj7NNYVcMDVe<_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;NX@@YWgZ8YNC3mlXDY57281N>bACG_c_S +@;Gh]MLdb1ffkKL2f8 +]<^1_VJ8;`L5=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[BMJMf`6WEmf`;]>IeEnM[9m0SD]iVM6OlKkj9 +Ae9fJkcK@_[VNgn5?>NbQ`YiioSGSR?4YajlI95f7mcclG>3f0PigH7Fdm_G7K0MC=R>5Tl\ng]3 +A13iN5_e70;EM>AOA@R;jJ3l7G49dS6>NHWGmIc0dK@jjJDDe;1R3kh=GU7?OJYCefjO^G>_5e2RoF +:LZTDnRQ?34n]L_n_fml<1T0nWk0_9k_PomME[anGRlI_P2VN7:VoW^S`A@b0JK`ZDa\B82oXRVT +lk8K9i[TNQeVIh44RoKW2c1IdhM3aQPAH4D4Ab@0cML=CK4Ui33LRd_L:13[\SS +^_P\7W=1bck102big3H>C9kSoAJ0>9?Y3 +l`KJl>\^7o:=e^giT>MT_<i53WBe;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;nZ8NXDPdJnZQ5^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_ngoUTo3k24Xdi4i6=IOlRdNKjO]M +U_:I9SHmcN^>Y]N\m`V]g;cfZYbdaN3MGnEJmfLgb7Jn`COX=lNm2mLfgofKkEN[`aeX?>?7?1ii +^@dUeU@QT>Ljn6WCi`fAWXC7T]6P^bFoXL8J1D36VJaAd>TS;W3\HZdITQD0=aaj5oZ; +RNckABoAE1\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>RPTm`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;G6T1lmo;7e7B]dZg3LHQl7oV8Bne73YQD9Uf]TbH8d=91RcLg@N1[9E`jHUNk>iH1K;SC_NI_jRl_N +DKoX[@LaPTII>Ie=nG56:9_bLXHhVSoC?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;MO;`>b[UYQg5E^m>4oCT +^7LFlTV]nm^E:H?^H2RSG>kQ8dnml>[:Bb[e4SA@=AVdn^7mfmATJ;:n8PP_4D7XLP\A19Xg]nAH +IGomHaIkH:C4dMMl3aS?NDR_[gV:9Di]`C7`CQ8ZnWZ`G?eA=1X=WSk`hHkd?I[A5mi;g=D9ln +9`XofLdVn`BK[1O5F`GAA\F__6?mnOO[1SE]3gKd_\N;0\1UKM[T3J +2dcenP;K3k^en`?MhD2?Y<[m9k_fFMdR=kcGo\Ngo\4 +kb?UINgcefA4jfDRTWRjWXMV@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:UD6oSJOZDbPG0Gbk7NHoCFi +R]=`5DOP:Ua8Z`3lTeHQ5CM>>5Fod>LZ0`[Fk=LWH;8g4d8DO;_VC^22an::W86Yd66`9NZ``eIU +BG`QFHaGLiG:0bljYieSE0mJF?GF2AE>23^_^31DY`^J=1[X?h:DHX7L@[ +6N8J8OJoL<3[Sd>4N\2=fkkQP1eY]WLhd0bI7R[Qn];e8XH84U3G8JP9hhD0Y3 +GG705B[Da@5KD1Um_iQQBh^o1_371gDl=hJ5635TWnP8dSGi]]Lhd2gFkCL=TXOYW\<>=eg\Ml\D +Y3e4OE7eNdDSabRoh\A5KlmBNHk1jcC\Mg>0Nm\S9;WHB3K872NL<_g=LP?oIl3 +1BJf2c[PH?KI1egDMD=TkLHWOiQjmTM9WHMgcYP9Tjo9j9[OF3OGRc8GZbg0SU=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=]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?^]KL:URobnE=7:I7giUb6EiTVlOLZ5Oc3Em +8YDn>3ooa?[GNjA6mN0L\7diH?l^Wdo]M=;ONWVf^HFWiLokh3oW[il_o_PUWUm16_PEianaK7i3 +_n8hG19J:=JH=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?J0TShBL5Vfb7GP;n?oBAdQk@@4gf +^HN6?5C3bfl_h?E9>oOaT8m^L5V]>=fP5egDb^R5X[YI6nBY7SKIO@5h_Wd`S:B@kBO3Bk8GJJ@^oa4;Q=T]cgY`F:VZ7a@aSHbVDO8LSG3[^m\=B1CS^g^c[PJjDXoJ\5bX;UGA?<[?3eP^W9R\^oo>6OSmf86B\mZE7G2iB=YILO7:XbdF;D?MR;[;0?]DJck46O=HWGH=?meif\Y628 +fOR:dhFn0e3h9eWQdJ4nQbmbh_bTl^BhdYdm1i\\k3Ndo]<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;0T2;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`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_VM8mIC5XcOLK92^C?M>9]V1[RZR7nONPZU5Kjg@fVG7EagH]O +4\YUk2jQU8Fc3UCK5_o5d=H1KffX]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\NWVIkZPMkoPf4T4]_nD=iQ:_; +9m[X?K;]e[_\U>0WV\3igda_T0Ic0bh03=JVO5Ti0OOc`bl\0S +nfn75U[h7QTlSTL6\8^WVXl;^WU00C`hbh5kI=S2`L\m\T9Hh@iFZQVdC=0b_1[[mWj\6fo_LB7hih3DXhYdZgm3Qg:B3G9VafF0KD4hROP?;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_\\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@7m0LjPbkh3eBIKG>m1mC^ggG<`kHliBS8? +@[ad9eQn\YdggDnBWmH@EJnJA]Hn3M533oKFb3?=W]0iMZQ3aF[ +O[PGaP06V;na\QW0X7WJ1jWKNnci;@o^eRok0046c_1nkQIffkBGWAodnoc?g[E5ZLLO[So7fJIOkCO3jV +cgnm9oIG0mR^5h=fOKhWo[NILO]ljILo?T>6A2SE>V]BQP`nQb43fP44?Vea4Da9lbA4:0WM8PZdNnhT0]SocRP2me<]EVS9a`n2B63:ST]GX`I:32ChW>T06`S\c;R6lGIlS04TGh?ILQ +Pj2`DHnBb_^^5EYJH:`ZY`On:[B<[BKnFTlMHE;eKj5AiC +X\hjh:a164=LjdFSgUnYa2goiW<@MkVE[^^0^cX]GmV[K_IN1o[=J\lR7R`1BR4NMZ9dnQP`<109 +MhF5P@4jXHRjZ``joRWVn1mTbJ:oVmS^gg3YP?9_g@djo\LkVgm3n;_KlAGTclOeV4;9]kacocKfBA8aLBgNiEm7S@ +30MmfThVZD5f[j3k3?:\?j8m4BW_?jRGL77@NOnSI_lBiTOXf=VS53jfJmkAkhON9XhN;lZQI2fo +QDlMjam41\b]GfDPO7o?PBM^>lP0dO3E\;8CIX;NSSokL< +WROIH;fbG^A2?lZ_3kT\Co;]@bkeVkVVKjAB2NOg7g?oNY7DSb4bl8NEY_ci?_RO7Wom_?777gn@ +b92WC_V\YA:IG938i5BVVV^]4G83fhhFOP=FakXkHl<4H?= +7P6673KkQ0=EH[EK>>15UM`Kkb7T3B^<:oP\AUPKf3LIXPNMmRk8>RjkBIZhH8kQQKCB\L6O9AfQ +Y\lDidAC9AS@XhNLFjh4bD]LkVEG0\6nVA4nDMfOi5Xnn:CXD@3@DLZD0eIU_0\4NjG^?[^baNk>IH9M>UQTD5]b +1DQg^NU7KooRYXoB]\`>Q_aHPi@F0JBln@[i4: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@3KicgF9\Qik^_dfN[\3_jDK>dm_G7JPmgDD4e9GAFF:iR83=0l5]6Ce>UT_?jPmTBe]_o07\?6A>_mY`X3K^H7JMYh:L?7N]DkC]U0Sn>SLXRIbfoTfA:jJ9RjEoJO +a3hdDEfIZ8i^EBhSZXomBSOTc620_l>ooUFXh>];Wj4Gf +]JYB_]>EjSo;i9Cg8n]2Wn;;Io;UEoTb]bKebYgO?FiDXg:HVm=[edknN4V]Gb^7 +]S60gWZ`ghdd6E\?LPWFJ38mj?Mf2b9fWWlkj_A1hNINgcSTgj]BjhMmJ0R@eiF2cfeBO?TSiHF[ +cJ?84jKNg7UibcGUoTgLUcW4mf`MEjdeA^2PA3=C8lPTIf^6>GRhGEb4jRTN6Y9VUT07GYSDIfXa\MEVO@b6BIAXJ6FYY88b]ia8HJ +fJljYm38?YCnQ4IFR:WU=;;BEWR[TGF^_TH6ZTcJ2?Td\UJnJ:JADhV7m[SA85f4lFd[?BSeHAc2 +K2@ZhLHEE30g6=Gi8aG6Rk]nX`3e^CKG^=0=i9jhh0i6Nn` +R7L:OEoLba1lFiCogB@Ko?X:B?Bg\T^0XFMTniT;9_]Ani819KK;lRLVBXJGjU@UB +nF39QDLMbZ9:`PJYaZbmjU0JREla]@ai5Pgd=37ZSS8MSni:C[C^Taa]WHj_IIhGkZkC28\ +MX^:\iX8QLF?dLa9EhZ6Cb:hU8n7RW0gIBJRUo^V7GUgalFdl9U:^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@FdUh9lbfYn[KbVf0oUgdGh3>9k`_`WlKnGbI1bfKOl\ol6fWTb0M=df@I +?BiD`l4eBc5lK>GgSDL^j;HTh^Sa +i4O>lS_h]86E;XcN=OfWTlQ@khI3kd9o\A5m_nR5VALR5ePkHEoYQI]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\A8D_n[]4cXL_5^KITcM: +l^_35`gim^5;eK2=Gen^5nKG]I_olna<3I47kK^\`=oUk`gbne\n4l56oCJogl9UUcllGM>_md4V +hLC[ih\oP=@:3:Bi<]V[1i8M>7G;90?oUTTW7WGOJ=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\;AHB5^dHRh0JSfQZ9 +U_`NTi;n?POjaboi?d>4I;<7T\EUWgfX4LY=GkGC`PHiBRgjDB=T]4=5mda\T4G;N7Mmd@4K^jBi +d3YJh: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^lRnoQh?M +G2ASU]ZdWje`\?\O^7YCGD8N\fWi?6X`[gc>TCdioc\eV364VcMW8o?_R_:kVYB8agkoaX`We1h> +43H@Sc]@NE>DFVdalWVf;lbK8c[9`<4f7PjWHFciQ]d=O]eV9d2:I8Xkbb=hfgb?K1ScOPOH> +9oM_h_Qk0@fcOnnOkdPafcPRh:GV;7PfDa?TSSfWm17 +\SCHo?mK_WX3i`M\g>cAR1kgS[jYgkL:cM\ad;mTZL;4Za5YG33]hH:=DOFP3Ce=i]23 +_TVECK:<_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^<;j?7nV5=[cno^>>]l;oo\MVPcV2cd\TE24P6\i=K[;I14GcYnL?\5 +997NjhDT`Z:621X8BGBK[1G9Hc;`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 +?AG\l89oWg3971WmLPnmRfkhGeO62b6bm5gB0kBFf3S:KKLZGQC^oKD3 +ICU0f`jhWGO`KAGbVNkM3_BMmok]P>6Bd:HLeoQA3i0bel546b\Kjf\ob=?W@;6\?`DAMW[k6TCh +91YDLJNDnk\5bW>iXhndYk;22Comk_XVN0=\; +blak0mfGTnaCM]:Zfgm87n4RW7bo7VJ_H7f2SYdm:^7S^^DKoCjNi2>Ia563QDoElTnSmh]V=<5o +j9gX:eUPO9W@6n>Z00mXN2UO=nBd<5?J:PR_Akb1AebXHOiZJACZbBO?>Abj:5bl3B8TOJoGFRR +?cNdJX;?>g^nZE\XkYTjbAIVSo>hm?3>de]>N7;aKZfj=GR_;]^J@U[^DKV?C1nOTWe[mfXF]80f]8mh69nedn3n_E +KoGm1F<\IeEj`D5ekaaVm@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@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^PaF<3Z416fA[6l^22jdI>TQh43\jBo7YG9>O1B^Q`FLYLbmXC@GDCP_Y3f +0hOT0m\C>kGojMj`SLXPI9C;dc3HUH_N;IC9i`?T: +E>6GB7E6Y3XcBQ]df_nIn7QOZHJKACAn1UFd7jY`Wa[EZLX=hMifCO:M@m;I\Y?fMo:@07IZejfK +VWhO^Ri[fcK0KcgHS`K>Wh5_H^KK7>g8VCo\PMmMiaYl^?lmiQSi`oYTO55k?Io>YEk]KeUd;bAacNjogM9 +W0nc^QoZfJ=\iXOimRBKlF7N_LP5EC0gORRIgRSh[fROaKEnUaWh^oam0oSm;InocICjKChJHMWU +;b[>n8<3cgV^Wbonm1?8T4ciBbbN:I2MA20ST`@bP=hTT3M?_33Q4X5> +eGXSQaPFKVd63[4JnH@E^NVgF3^Z8VC_J9@[?XLTW;@@QgA\l=>S?BC5VI]G83mALAmNFF5a9bJi +W?l[D4X5Od\g2NjY:m90=o`jbhNjHK5OLL4NCS^NHb`A`nmKgi73CG2b?WQ +?:AoG^UPFiaH0k5Xk5CV?M5Jj>iL3K\5S_hi=oLEUkjQOm9H0?h9MGCUMaV8O^G:;o;9=Z_Tc:EB;?>gcblTM>oXT5NB@5^CfA +Ae:dEUUih9iAMV5L7SQflTMLb`Z5 +M;lWZI_WiFRFon6L7S1Obfg\6g7JPk +hO9^=m2CgD7PW]8^kX3S6NmIi>Df=?kBADnNLdmlbmV;V1nRIF^GH_SHb^lKSec@JVU5W3?jalcU +=d0iNcn4b80i^AXR0k4jfNlCTgY?>CAm@lV<5j:Ek;<\STWI\7[@YfhB_m:3leI9=`0>WW736ZFh +cNZeJbN][YZf[`gLSUk;dC4bmlC83kVlC_;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 +hWKcoiej0HQ0UDmla:RfOWGcLkF2118[nRgROl +2Va6ZgMnaH4So]\nhT^8HZ^JnQEWRooS_enaTYcePQmFEN`2E0LJN`>X3W[k@h=40?0A3SB9eAi1 +_49XIlP_c?0boRDZ3bo\^:aJI:f``Z[5aULhFl8OBGT>B3m_ffdIhf172nZRR +eLc8@?ZTlGofOAc`AmOm4^8@_njX5EmX1CFZ5IQGfDU9JR3n0R9=TRQWKBG8?6>j?cU@=57DdVT4 +h:MDg;<\d8[SGIGP:g;QB]iRMfOZ;agl?ol]0J8lgVDcSmknaFJVT\HLL0bUcab`CE +M6>aYbaBQObe@E0QgmHP[d;niT3a:6f[V677?VLbSd]kgETUOmLP^N]i3[B?MO^Nb3`ce=iY?`Ol +0jBO0n8Qk^1233:]OM012n]TcIk:LS9R7jYjm<>ohdm0XBJ=d0^]^66eBFS5BGIoY7n>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>@KhjD5h?_Uc_@NE74U>6mRP_lmRXn_GgMPMXCJVmWaMO3m?enMl1h6[^BM1hde83O +>n5S[MB:nWUdgcM1OWJiH`:o3`U@MA?hkUkiCa7oiA2aJ^hMogaoQg6=F\AJFCGAhd5lA1ThH?]o +gOe;1XjC;[ngORZJA5NPBC_4_hoTOJ7PYKiQMi\D_c][mTCXnVk_V6C=beG]Tge`^<^9gUfnJ8A`]oWS:8neiA>O +?6Cm\14^KkVF_?lk[GI8h=hi\QXE1mbn37YUlf +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 +GAf466gN507hDBZaaB8WF54LD8dP@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=D=4;IGbb +\46>D\mne0QYnOgg4a]TZAYRoGLUn8eE<\lCQX6?IUQIl4n=49?Z`TP:>[dkS:C8hJO2B6ZKmBn< +Q:J^oAM68RNckYLlbZ0k8_2S]9SE0Tfml>5?BjjbLXalUUMIM\NXG5Ej[nAG183G15lEP>Uc; +f<`?5j[H3A6ZX?MPY=Fjk]XFN6f4RLEkZDPgYCf;YfbnXKOn=lNm0d?LO?O_QPPFl^4=[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?WEW74WeXdeZV: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=0REk`amDS:1R_Z][e6nl1^ +Of:4l2R?::06Vgf2cjhQ[G2PBj:8;H\G2?XWm]lRI?8=5ONj`3nll?iO^aSQ1hdU@Xh`3\fk>0HPCW4mQT2LocJJa[T3]_fV`c\T=Yco=KH +HK8J@PIIG6^d3: +5K_kB\1Ok?HM1G0_kUP65X=Ial30]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\ibgfTEJKglY6^;?Jf +AWRl_FSR[`edk^ba3SCcTH98ecI94OOE]L1Ki\dG:W?YbL4@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 +DLXTO>cAJWidKFQD?MRL[[H\CObQjZ5GTU@Sc_]T7KA0W?;gE2jPL0E=nMI?L=d\Q +;?naBbk^0^4?9HZ]DUkl>4nUS`e9dg@UQ=?VG +:V< +7okOW^8;jZCmndX3LN26VjekV:3:?WjQYFN97Qk6F730QSKI?XBVoL3^OQIB;OVS665dbRLIX^ZD +:o3F^>7S9ehhH4JG5;EF3P_L`<4O9^RQR@C +`=1QJW3le4Vfo[2MngD6QS5S\`ha@RN=N58<_=[T?F8eB?P6[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>oPfFA1:gXd\>>omf`73GG8;a76=mg@;=6MM^;T3W_M8ek^NiGDH_6J8G^MGD^odmSJc?ZWL +3`6aik;7mRi@?_OWCjJlQT6@gaW\d146Ek\V9^^fi3KF]eL:1OZmZHM2fKmM]DXQLXemDm8?>L5Q7]AeTBlNJ\4?njVDZEJD +CaibFOC3AK8lc3[bo^nNKfd:[53LO7^^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;Y5TDo4^PDN=32WJ?[54NW@^fRDkI9?>6GC_65U@Mbj9C1 +2eL=YUMbKlS[5IO9D;:eCP8hIJ\mfWN8V6Bo\e2TLL7[=MQJ8?e;LEi26V52LEgWTR@^>VOT8 +2Wg4T609ZKDCAcma`1B>GP1aQI6dF:0;K[QLmL:enbG?n637PLF`ORS]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:mVWV[aCl3\JR>_ZkTDZ7Nof9_S>:?LiSmMb1iJLC@Hk4[am_P?]UKG_P?dYk_h>n0n4oNE@ +\6W]6omlOm[[WDD56;k4SR73PeTPWPRjb`;Q5m5n^;CG7mBNB57g7mQSf9QX_Ol]?glQlh7Gd_U4=9h?EdC_DFhJWC?MPOiUX4SeC?CETmKjn@Tgm_lV54WGljc2DA^\JnEeTRlNLS7dT3lZR5D[c2\G^DbjZ>OV9=^H +neNNR5\4cY\GERf9ecfmB[bRlMIUWjh6g0ehki4356>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`GTm4477AVf@ +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=bmBgO2Tdmh7dX1G2=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=DjEeJ^h0=7ZLk7c30RBKo?XAAZnGa\11O +@Pjo5;J0S35Eo;g_0`M<\:;aPTjb3ekHmlH;7_A`@e95KW2PQdeoL<08[K^`F]Ubck102big3L^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?7C_J9igVX89IZid^0OHS:Y5C[MNc5IbN:W +4Y>MhEK[Gf8bmY5_obdV0iejhLjVSUOM9oFW\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[RAZQl^TN5QU]M3_\2D2C_<7aNie:[89`ne7?[QHUPHa4KMolbH_:;J +c\g[ZYK8ljINkfPE?^j9j?b@@hgCLSTo==E[LgJKAeW>8U>L@BM +@RP@P?R4Dm2;Im9dCWUj@86JoOXhf?me257`kIXkP@\NRd^a1eZ84Cj0P1UjJ:ELRBmTRgRR;dYi +h4FE1g5hi2SUZ\7\=9IGfBgiPP1bAk8BCohYARPlnID1oYP]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_JaU02j_ai1JELm:9?`ee@mNR5;FKN@=>W7LZF?SY@I=8kU?9TSO`AeT`; +]3C2^V>[JXBKMZQVeYL=TYF;gcU=\=I86i8@IAOIQ;N78]:hcS@]`WDYJigWole_7Y9ldX`eFiIeh_8 +e0nGa=2Z^akZ9E56f57nNmNLXV?>Eg7NSi@gYTM<=] +ojMG^ECKF`K=TcLjCoVLYacbBJMh_TkAKIfbD]Ka2d[fb?clDnYOkh?fGEKPkg:4h8WkFckcU56o +cNoWDDCk5bU_8eE\iGKh?ZmLXg1hXc3hW?YKSMh_Fh]=Oe +^N__6RAg?Ln1m[5^ghlR`m3N;2;UWfcK9lb;[f=8PCbnC;mm9b +6o>`WUgPD: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==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;fWHBb2Koc +lY1[b_eg4gH=MCeKee<[PllMOKkAZHS]6Sf]dc]6nN;K;SfjlaA>1ZYU83PI24en54h6P?Eji:kO +1onkW7Sm_?777l5>l75`A@2Njc83@lnGXF18TM=WPfVo:7dDPQ +3O6Pd_\;Hh8U:YQXHj<F2B[Dh>^0C:VRc@b@b;FZI1 +:Y<aAk?24PBBffLWT3bUWDoi\4[RJOfR +1BYb[nlC0LTW<_h2T9``aoDJNWXEa8o>FV;18`oii=@dgQZQ9XG^:XKXPY]SNaNRU1GY;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^;k3m\8Yb?anlDaWkCfQQZ0Aoom6bO`?W1fcL +k=687WL:HTQkSnf48GeH9U4cE1O5DLZUnhGRUb[LbdCR_i3N;7_@IdgR=MQTMToZ5Yd5DA89h4g[=]]DX4[J7JlXZ2Y`GiNAX_YA5OQcZ3h9 +eNm^6e0TGOmfeNZ5b?Fmg[78\GNUfSdlQelMWJ8LIm>Fg_:7lPQGUdl6Z4_mJ35\k[9iY@^>WCXT +L>lLFJ\>?UaoS^C\9Sd@f;EMYM2mDX>QKooMhVLI^Uk8lVcVQoZfj=\aXMimb@Ko>5\ +h`NCjXGinFOD_md7jkNLT;oUKeo?oSK?gfE5nbjo?jcUUPog;\L[^Ykch_GcaQmo@24S7ABbCe:8 +OhIEb61U53:0?]Ddf?=BjaCbAPYIgDhXI6S]kALD\SX_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>==`Tmgn03EIU5jenW9d4c +Ph5R`KHf1d;PW\P=>Z1ilV1SXecb^YL_^PcA]Nfg1ddVj=Md^8 +ggc_3nPiUcdD@n`TiSN0O1\dmOab1cZ?PZJM4B3O1ZVF==f1eW?KdnCKNjBJEK]Kh;\E;[gl2b?l +G?Jh:WdJ6e9CG`^WX`G9ga<5ki7SOE5UU4I`HXa3g4[XYA?n8 +m\B]_OnPG\;5@NOmSi[mBiPOXF=W1hC7EWkOf?M;iQi7So?8AlkZ>oQdP7ooSmh_V^6ToZ55b\XR +IGBALYU8NHa4NVK`VFReofhjM>PWFRiic:47NloPTO@O;C]jd8l=jcEl3N>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]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\Amd2]2CSkn?fWo:HB:HDa715:n7 +O0XV?SoT5doNn90HK5TUj5W73bKI4o?ccjS^^;FB>?SKo7fG5O^kO3jW2^Fo8HCIi\G^goSc_O2o +bGeO[ocaCC8Tl9M=Ih>JI1;1998X:N;Do?LHkST7\fV2j@?[ogW?_7[3WIUa2IO +i^30SSSNYDc`R4_^dl4VJKVC3UHUknEFCVYhO\\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@ooAC0mmY9dkf9BlNkj73I80iDmZQ6DCabam\D6JVR7NgS\jh6>jn`;@THX6SgBPbLcJ9c6h9M9NLJ[C3CeG +U>4]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 +7YUbNT>\ikF_Nn^m\7ENgAg`?M6l_^l>50OE_0?>Pj]NFNm3ajEI4L@mSnkS4?LMDDh;N<3m;?Mh +a?gl03Eb7W7oUd?2Y]7SO\kOhgZTCY][bHP05WWFS\4gm_f[OJCAhdb4[5J`MOL^gDVEGN13_j1e1^mS:c>\7_B9AnB_AU2n +aNYCkPbNLJ=JU +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\Sf3`QI`F;OAlQ2B_6J;_8gKjPI[TOLc:c\FNlblAKi]g8i7 +Mc\7_:?:W`GZ@;jWMO^N0oKeb=7Q=dWn0i527o98N5odFnbmEnaLa?dC;eRj5 +2g;Umhg:XlN;7cW;Ka]^`=<3AnlKeG0b4dceV61>mf1o6JIjk<6NJ?hX?S3Mcf +of:BMZ^kCJQl7GkJWOi_^SAUinjmB=CfWkbm\oGocY6i`T@hXOcaHo9dUf79;\2bBI58Xe9Xa:1^@cUHaN +JO4]DlcaKLik82N86FI:_h0fNAdTmDE:_V7H`ADa`PD]73cL +0`5]g71_`QDLL:5O83;^X``@Mfnj`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?DgHmlQUW=<56KZUW8VidX\N3JJj?e`iTgDLkFGebfF?\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>?io8UVed2:SNnXMoKk]C>;XlJ8L +B]KbFoPdPGOWSMiGCii<8F^_@QjSk\5nL\Fa1gg>59jXK?omG>W@Cab<2YWO:FCnh`McWNQ7IoDL +_ZSdPiG9^gd3b7XBmi>?H=JWnPQ3n@QG=f`H\;M5WVTf67;\D0clIZMfWFdBiX>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?g;UT0TMOnD@PHdho\[5376: +CNiSD4ilmfA6f:B79YJi1:NO6kkK[I<3?YE8?:6oBIib`NW[RDBTRlHncA2eF>iE@>fh]5lcA2ij +NeJ3K;?253_\1K\[befmUgKkW@?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;oVM5\Eh4AlU +NdFOgIVXbUD;2`imaEL_oOIF2;[ZXK>ee30CDao[@3>1UPefKI=<]G\Ii7K4HLMfR`P_]n2X0gOQ +D\:9GgJinc[P[jkIcF2hAo[ILCCb\@mJmlXFNUo@TQ +mA2>5WY??OST8MbdO:iAO^e3Wnei3O:KdIjQBKLGZWobMX=dIkYg>m1gb^gO@RlIM;P3SADekX3U +;E;<7]D]l=`5Cmoe_16b6ceO>5gX?KMmgH7JJn;d3[\kh;\E9EK?Hc:WM?JYOFLf_?4BERXUS +USfALnc@QVDb=jgKK5?YoDWG[iYA3M97@oYKk:=QWa_kT]Pkk041d?o^[=TS`N^k_O7F7ZQh]RMD>9daAKE2e2f3L?[UH:Wb?H_B=Wl[@?D[Ogf??C3]J] +NaST;C=^gFFM_4WGK_APi09BA4D3I0aLeki0D:9<:@9Uhi\N:90XJ]deH;03K[AJk:8GB<`3?na`@HJb@Cjjl\>1@SVR +k?j28ahaXLBJ6T3BA0T3;:RTjc3iT`I9MDmaX9FD\^:0;BW^;PkhhTFI7oo6^<4Nc?6lV9m`O91\ +GfLLZ4H3^jI1k[1]_`6D`g;?JI0mM[2[Me3?noAa`9mLmal7Z;InOI033K>4nTND5b6C9P\l +hU;kT@\S>\>RUVUlAXK<_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 +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 +]NPl7TGM_n@94WXE>NYcb\;Ej\^A3eV=@FmiZ7GWoL@kWXH1k +ilAJEE2HjPEW3YE`kbQKRUGRb5HX_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\]\ZR32=>=`3]P +Ciml\eLOX`=lgIokR5mg6>@Q4k`o\656ZTA5M94G6MU>P;IWlC:E4hM2UaVXYQlldk>^1Sd_\` +NJBR`B7glTSK[[Q2ln9Edn>N`N_CSOdF];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[G7bDScjU>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>KcNahS +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_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`bMaJ1SZNBM:<[f7m;[0@hjgoo:XUo1nP@MZ`2Nl74E2?jSD]OjdVC4Jie1 +T`4c[N8==a6`LGNkRFS[a6hR@4ij6le=1MQRIk0Tg6LF@b85o9I:C5TdQCF``4MC=n_P2C>ml8T_3K]GH16ca> +MmhU?e5PE@Bn7iDB9P=M>67eJEnle666 +?=ZKhD0K:fF3C;o30\QQ62:eBZA[jRh]eRP2h^kS@Vn +Z>6k;KlbA1b?PAldaX5V:^2UfSD>F0>^g3SPCMK]=`jDRo6>BgbWCXk=Lhl5nTP6N3ImS?0@nWlI +8QBom\1=[PM8aEmV>6B4;U90_]f>a;;;C9h_@jbbEn`L]VPeF5_NHC9kg:P;c2G4`ncEIAlS47O;11:g^Eb6l>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?9ieMLPeLDZFPA;AZnOF@XTk +YD@2OQ>T9kPbZXDHaAceOO1HUN\Mj3jWmW\0k`fjo3TIm>NbkgF2A>;mOWhhhKlI1BjMOM4]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?:Y7oCm^gbR64c?_KH;lEna]YCEEeG]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@XS9;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`738 +1c1j^^7a4bLjd69CR:Ah<=L<]bDG7P`BKeHk?9QjOXl7LkE28`>CI;KRTfBUZohG3hIoe6TiSbC3EPdi51X?a_W`H00Mn_\\?1PTKf0QdBgB +A5P]90:e:6KhkT8Rg_2SQi08I?Yj`IjGXb^9jgeX +VNV[QKPW4UE5g3O4l@8X6C3QWTE3b@1f52blZ^nKSSW2W2VE\N?37 +=[2UVmI][YWTgZG[El^TIX?a=na7HclGnbCHkfj[==KiMfO=WPPndhOJM^eJ_L=cU@blOUP7jiI[ +bO\OocYeB>3N>K9F6G`^h?J=4_aQ7k^nbiiodJjdQo^PRGIn<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=imaX5YlhiH\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>7gcS7M?1ocd8o]oK=DAP>ND?L]L6S +AKhUiYmHmQb2M=W\^kZhK?IN1o[=;O]_@hBV\@McLKe2AHgb74ROQn^LRK0R=MVi_:C +Jn]0^F54=jT=8iZPQQ6QJjin_gJPkh\nc8K9[ocZmIed>Vn0oFM +h[l3o^_2G`d3UljnlLok7mOSU9Qmi6Gd21?Oob0lO66bO99cCj57@?eSL=fYci=6kY_o4 +P@6mOlOc63P`8:]>2[BZmUPLV7nTg7PQlL:EOiK5DA0g[1kd:J8]Dki2]6G:[O3[A9`TKQX?4FRi@Y?mOc@WZUc1JHo;5Nh`jhRn33_G^Ab_i]]o5HbMK2noB[f[m]PoIACkJOloCBcl:MioBZWb[m^A?^kFDiMRYo<[Oa39Kc_ +EZXE98EJlI=f@O^nE2^>XeIL@JeP5QS0Ok4Ei_\0Cid7=nd +j:mH:jhHU@>6E6fg2>lS7o23AlGl\214]W2kATLL<6=0TURQ@Tjj>6hUCLHfZ2g?e2MHK=7 +T=;7JYm``0X^\emihDGf_f6275X`nPb;>:9QCKTbH8TE1E94DI4K8@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`LAnSjJLX1Zjcg: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=\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?oC +_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 +GX=BIR8YYe3=lMkiUJoLh2Gb;7EgbYE:\6ONMI\ANW7I^aWR5kg]MRHd?X`AYUlMLl2b5;MbmTC8 +P7e\UClRV[7RhdaLDT@nAbT^^62ii^j02=MkI0 +M]d@MJ8E7G2aB_KWWkCZYMT@\R_EOJDTGaYkJh>lmL>@jJl>66\?aLYIL_6e +@5]VORO8WWci[DYK^RFL1:G8_`hHc5;63SR\j9i\PLKL2nMGS>7VGH`m3aLmb7hN:[hDio`a= +L_IQKM4TClceE4;HNOXl9fVk^[_998lmCPK7:>8oC_1kUWjG:ihPEgC`mYOTHW1PNGofRAji`=?; +:j?7hJO1V>1?1=d5EFIm4Nf7CW_m@Nf9;VgoPCCNF;g2`i4=0WlO]4;JY;>AFk`J<8n2\3=?HLGk3k_fNM`PMkW?o\\k_nCIC:fBQKYJHJU +6fE47eQ@kF:MgoMZYfkEnmm\Ln0?8hH9 +UEWjh?D0NOTaokDTobPn>5kGCQblJl^_35`^Mb[aA2mOhmNGj +h7cSf_aoES[Zgnj3O8`9nUgnkYNf_mDC27_Dko;k:ea^nJag][b?jg1Keg\Q^O_O>0`S?kmM6jGgD8DO3]VS^12aj;BhHON67PC`L@JQGhDP<3C9_K8P3SM94G[L>Bo:9VRffH4U0ih^B +_SnFY=X]8nZESAKff8dUhD=SRN0h`[S^^c\>f5F7@o>=h9jPH^iPQ1Rak1hS>7A7Z`BG +E9o8QH]G9jZ;17Nag9odnWUQhf[d0diIeCYUUMjkMm8D8 +_a``36U4PAn3dCL;=6=a5ca4>nU??4@kjFU]EBR_JJ]MgNI0kbQ]WgCDO1bKF_0U;b +>`O:LnA>dW]I]noa`hkNSTWjSjNgT`HZ^R=JH2Khm5:Bmd +XNIS57MX4RaU=2:hN^Gc: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 +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;RG3RJIoiI3GVcf;Ymim?H_?S=MkB8mYY?;UFDZkY:@bYEm9:@KRcdEMKWb +]JQKUM^Xe4;U6`FmG5VUYnKW6Z@NUoJj9IGlWH7NmC`7f\NjODmUQW@P>4id9gC0@IfS3cY@0F@O +^MOb@kfc7i83GAKYEaXCn4D_>SK>GWQVF`d3a;C3AeEoM:38Y7M4L=O8W7V>1?bB@S1bPOcB +SKXYoa;1LIl45nlB`LW9[?\USc;XC^Z0XjbH>>GD31=^[?B0[EBSJAnLOfGIWMD2EiWNJdg@ULGN +^XV[9AZI1]3F9gR;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=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=?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=:PY9CQQjT904FXQG7Wg01X +JK2gLADTJLdk5^GB27l^[A8XYa`:?O=UPfCUhWM>4ncD`kVCgh2=bG;K0>LCl_kI4659]8Le`U@^ +nfQ3U7E3noD_MJ3CY8e9MlN@nCBok?e9_67]`PPa7R\0O93[ATTIHM\5T=U_D_1Uh5lSjcUT=OgVVgQ@IKO2 +iMh>n9gd_^CQ:^jPT3mPhnJ>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<[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^@XZFcd8^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[BiDa4a_9 +jD;o0D7`dBDcRZ?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 +4dALLL:5YX@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 +6n1N0LiYl5f_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[bV4j=Dk +fTnWJGGT_Ac:LC[b[nZgk<\SKGM`fjFkTDN4ii61m`[68gog?AN?[2:?KfagZH?WBCKg`kajTL_l +046d>?4a7XRnhXiM?H5S]:XG;>jZO<5R_i@O=?JHIi1?`7@h9=3@AVUhVN4AJYFXYbY>JGSCf9EZUJY]h[L`3U:>HId9RCFONX?c5o::aIcFMnE^fbWbG0gfI +OcUPF8YKVZ7lCB9U:N:LaEhbgfW\Ideo6Y];iOhkSSAY4_9TgdN=1D0YPc_d?oIXD>1oVN;aXAnMQg5S=ljVS=_2dJhNZokIEVhCO>fi<0j5hji2[IE8gGH?X]mdNUU4i`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`B\bWl@\?:] +4@LLHAh7KNHAe1i]7cX]P_XYlak]:db7j[O`0C?o0\3:OKg=N1@2Q:d:Y:PYNT@fXVd>R>\Ao]Bdj5jOd;K<3ZSmV9MNl39]MYoEXYb7D2>Q[M4hFm@d0hoic`7g<4nPo[6h>o@7Z?MR;cH=Y5 +c8=YSfRjR=ZSoB>13MDO4L=VoRB7T7T4]9WgJ6LbOc[P9^H9d5iHdGiWdGEJ;iAH=k3Gn6cejhio2mNNj7OAK_cnM>fFOdogaNX]dSdO2Hea8=GaRi +ML>^M[enLonRo[lj?H5fm<=CO]djM^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`RdJ339]@\>1]Q^Kh30g5bTlMHVP0EW[7WGOI6=[CgiZQ838dN^lJ@`>LZ52b?WU< +M5lfd@7o=m41Ek\MWTC7UM8UBWQ`c?4C==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>WWCnojZYKHZLOiiSC;OW5PmnI1=TWXkaMIEaNU[36`kU?41nN]dgE4iZog80oH`ocSP3nI]fQ2JGRHH +F_mQARRdoZ:VJoB?J1EVC7:P9O0NNHAn_[<8oF +ki3:VDO[Wc>?e[nGbYWOAjAVoXl4:\PNM<11i]7j@\bSmD?eSmS7Zeo\b4jlc_MD^Ho^JGe2Bm;83;Y>>eSN[^3]Kh3>;nkD9P]Ho^Q46[Gnj8BYJ_kY1;^J_7BS;O=\1]iU7jk\aKm>n +FMbONKCn8O=XoN<=DCCji@eb@j?Mn1nc7_4gkIg6K?66;OL\omloS^2EfS1PN;7?l1m[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>==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: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\VSVEKDCla<7C65NZUo1_5Ao`M9ER7;4_la;mLMH@9To@`O=O0djJ>Hg3YS3_5Bo +PgVYoX>VJUnRG55FmD2UnZ>Jc_`YFfFn +bX6^c:lL<8]iZGh;le;m2deWoZ:]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<<>6M;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\DLgbVHMfS[J3Y@;fIl +bka3ne_CVAoO83?cl`iDIgk_P?O^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=ihFW +FcFQ>HoaNXWDCkSJ_e14T_IG7I;fckHjG`Ko6ig>1N22@8AYc1L2\7EJP:gkjXkCAglVd3a>0b:2 +2ZI171>4]U0\9`2cQaePkdZ]PjnOb]ii6VPebQiYW80mGJm[ +@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`m5dH0IiP>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` +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?GE43M0n_@ZeJ1hWI`QeoP +7RaALONJi1i43?Ono2GLlMk^7G\1gP;[e1b_D?Q0LE0;5[`=go7QPjjZSTZW1lINFJh]?FT2P[577[EWClDnV0@@^7XTCgdG8:;nPPJ^ +mDJ`9a^BaoCG8aE@B`<42P0000H0dV^^5?U7PEQ1n000FB0100X0~2A4eOE4I=;UY9D0l04P3UZNdbMKQl91P4C=>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`1an`hLk2XO\CQodHXof6`af7 +aIjDhMk3JLES]2^B?F:59HG[M8_e:L?90L?b6HA]>Q^\h:LcQPg7J9fc@l5nhk3\jki?o +CM8bNBX^gKMhMIG\_`iTW1Mk`9M2lFYmfgLokK4KkDOL^[bna8IVMaSmAZ6KkN^L1_K9KOh]3QRR +jOIJ@cHLB7PfCN1IGD9<7]fSF?`5So\6_chVimHPPajTjS`\Lk:8bmOlR]?^`^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?6HEO6DO7?< +Q_mCcKZAHT:aN?\kaGQoH^cl`D7_=obI\N>iKd>[7DUg^e^lF0G[58j_O[e6[ijTb;D]g^3]nWf?V59d\]JmSRgXI?:B:7^e`ianc`aeL`ld_EYXh=IE;`]M_e\^H]jITGHEgOZ[Gk51 +Zf8VN[mXG>]1noN]NKRmOXN`^MIG?MXYkMk27bLeO8Ae4_[k:jWOobohkEN +9U[omW^0SnmRm<]k94WgJ54Gi9jmX7R?QcFgC6ihlfNPj<<7]Gl@jfWhGF7JW]ogZD7TAY<>=2]D +ld2V4f]_CZkk_6Z7aQQoeXTcfak;73K]cbkGRGWS\GQmfa +XG2X02_2cIdKnmnW=oUf3W]i9]\[TOOgSiRe>mj\>kaY]kQCKgB[gY0bo;>]efnhkgOHlnhne_?\ +3FoL7MjHM\[kiRhinoB36nf67NiSkAR?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[]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<>`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?DmHAmjh7j]@mG`3=_ckP +^Qo8^U7]Xoh882nAGR8@gg>=:0 +Mg?LO]o1Z1gLQ_:jNEjjnmM[?b94mfQ;a^lik?VikGVHnRN1``J\gb=gf8LFoCRJDZ2MC;MCA5n8 +6oS]Q_o=H>8Pl^c8mCkT=[ML?Vn`hSY^o?K[1YDeco_^1LZ45f@;SG:d1^gNSONUNO>aF5g +JR@L6Z1:l7;Wa_k_fBen7KC`\mPVIMboOl:\gO56[]jd>m`YEdnmPC;licMG2^`LnoU2kK=4ikML@Z2WT79>[_4_bLO^8j07>0]mff6m>WQ_\[1`bcnF`]fHOg37m04oh +b[YfggkB_3oOBKc1NR?SFQQ`oaSWMoK>]bMkP@lad +?HnN]HSN_GKWiJeS5eW4`bcRBaHAO\HRnUWl1gFKF4C`=aHAT>D\8TeX4B5YkXe8\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\On1R3YKUGcQHo:;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;nfN7;V\OX>ji6j1f?QnH<1H4io>BG`]DVk5eKL=f[F7FH^2[L3Go^WEK9mo>D_nlM +_]Ogh]ZQlo_;I>k +kilDkE9oN?PU28hbmik42@Y]bCKjK`iMDZe=mH[S>Cj=M6MTd@^l9BO>F:S1U +e>]^XD[WoY4lb[>]?GL<[KkZfIZE5F=MoYVROhFSMnGeMbmbKkm`l>inBMD]n_NV6dn\o]gg +@1j`?okhSU7S7Wgc9LC[GQLHl0MlkaATOKRTOA^nb0iBAWYE9dSnT`5VQjXNL6J1hR_;Mifn>MG^ +LjO:36dSZ39Wf1a`l:ekR?\>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>XGV7RU?d9]_MXBj4o5JbL=e?T@jNJ@Y +0cN31F;3iP?6Ik\LO\7?SS7Jb]7Ia1?N=hYY9Yl<0kcSJ==UDJ?6?ZT7__Q0jDHD[;MD:CRULXdG +DDi_]fnRm6;TiB3Enh>W?L7c5P`WGk7KXhaPFSK9V`m5dhmA];VhWPI`VjK1R\g]M6U4kG]hANGYV>?Ke<@RgOj3L +gBhnnb]aAh]d>;FL]6V6[Tm^==[eM]kANWWK[QkBm5S5bXlG]LTO]nVGF:^]>=l9dce>YGE0h1\c +o4nMHWWWLBkLSYdO1HU3m[\=X[ZWIKTg_]UkQRknfn`Gjo +b7OWh;MW4Do3\8mg]_e6][\7Ukd;ChOO]Ef4faf6cniI>V3H]cWF_\_ekdo_dKTk1=oF_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[aVmOB7kI1_`ZC_cm@bJ3EBB1X>cWPTiTk<]Bcmm`Fb@Q>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<DiOk7BlY3:BSE0fmN3E4;nVI3?[]XRG<4kP`_d +?ImRO:=mIAjE[KaSl[5k2NX4AXVk6P@eR7ONHY7;9:49IfoE?]RSnX5SKZndLoO]9c?le8Mk8n:M +6ck4ac3nOgnWlOaOonNmme1U;BEWmMXmc1X`mljj@bS]g3H@c5T@>hd[6JLQY\` +bYPM8Ub;?C;3AccX0hESG1jGjdkFH@kk605a]3_]3ckX>Jg2La;df2M:cNQi^7CghMEF];L9mWAI +BMbVl7DMY@[Mllb?LnhASC[iXnB_7l=P`g0nY3YN3bXeOQ\\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=3oMY6lKY0IJ_3DAhnVn;CQahSNHI89F3O:ef +l;YMQjENAn7_bPGdRj9eVXKk7WMcg:iaVHP7M?WN4IU[[LoZDMhN7?]VOc9[_]KUlX5V5>462U_VlL=a63D=obGJF5H3^?]M_@aXa8kWc__Pd^WbVbWOV[C1ccg^TB;d520@0?f6Q0Nl92l93kS50a8N +@4@Ph@5\6Q08Z>oaVP>1U]hN;]fK]c4>O]8T6^F7VZQfbEUfNZmg>?CFc +T4POi8k3Ui5:O=VQ1fbbdRkPbe0J420ZJO0d3@d8T[W?S;B[J420i^2QOhaj3QkhT:QFmh[4A7f8 +a[7j?aGV?=OL_;SH:R2i20MgANUjPVS^nK?Ti;9[=V^I3a6Ng\83SYdf\ +H=oN[N4W;fAMOi2XkI;ZKASc60@OWL;D2;DSRng1n]DI]6\h`E>m=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;73hIIc9SEWfDZK[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;lZNg[4Kdg[goNLBmDX87QPX6HXM:5\U<8LG2c;fjh;M^l +6nn@HAHmd6PQ6QJ86_3bi\Gm@H27Glm`=jNKgO7no@>WK\O4Pe;VO53YJe]W2No44S;a62aan>D] +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_efQjbPlceE +Tm?19B3_9_:W0oXUC:N[TD6eEYaf5D<>?90j`\`iPC:6W;3YA[[7QnH1hRbA[bBlB26Lj^9\VBG@Qm<\81idY?j?9Sf?gX01ND:112KoaoPbX9]gobLc?]Sm__3O +OWTf7klo?6[77afWg@\MZn^ZHX>C9aj@hM?`N\73=SG7n@9lOA0WA;?25@LWJ +QGn@N4cfB;=bk<BMBoeNCmYF3V@Zbh +Ao=nYhORo?O:mXNjUnhFlFBB@0O3c1VUaQnJME[L7A^ggB_g<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[<4?>mQf;F7hS\1Ofjc\T72_L^VkQd`38:m@j7`_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? +mYd[I^8SAl7IPV8[kNLLmDH9^bH0G +=P=0=fkiM[b;Qgiaf1dK2XL:\2;Lg;Vaom5iln75;o4RoojQI>ahTidf9O^WjYdPK\[`chYJ7mRQ +o>M5R6RoM:YdbmK;?n_n@E^m2HQ?l=hmcNlCHJ?67o_J_ONDEHZmO35 +6FH:`nc_\9bTR^=H0cmN_e]=1fbK=I[7Gg?<^@@4m>7S\mbINN`7lNO7KhP3lgn_o_miP6n_Z?gm7G]9l5e8jJooo_8lJW_OmJRn>n6gF]HL8DX8^KCE9?4O81gGcBCf@n8:J\CT;Vdm1A1aB`JHE@QLNNb[1YQa16hG68QJ3O5[]2MKhhK4BF`97S7[iB;j8 +=CNDhSjRUMIP;c0R?7ebCZlP +3IOLlF6^F50Xg^ffnhH4JgDhI=mdFX +DCXdC1^iKHJO^hi?7;hgalllSlGc4lA[_D22[gajDmojQV7=^`HWo5l[agQ\o6=HNETe7e^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:KJQgggf:_GiKiBk0o[j3l@d:<3kQSDHHo +aoH7G??Nc2^T7EXkA[o:?c_4JQLiO3Fjn^>kdn7W]KH;1SZD9lQ@<6_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_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`?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=fW0cGlg>g6;0kc4QVIgc71o5;[I +[P`=LESl0^MOIHP`[7KG5JG318YScg<^?c0bagHKnKM`fCOdkG5hMYDBj@8]om4hDlUH_Lhf??Hi +G?kC:BhE8D7ld8?8OCA>kldg>dBeDjnIDFcg737LoQlO4^^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[8eiSmnK`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^YlF]K_mm`9dFjdO=S]?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>DL5J=XQcND6A>KD?IOPK?;II_ZOQfOE7XQ?1_\ThheG0]`BL]4;F;e +b7o`f9=aNFnnfA6:PWV]m>6jaf;dK?XXeNEgOSUKiSa53SkiU:gRPj@kPlNKMB_EPUjAc`MmMMjNNfb7aVS`9Uio90\g?Ki8A +]fm`V2HH4J2>l:YMP_?mPW7\1CY4bgKki:64HYR7Lgb9D3`^1KGncPW]XhJiD@\O3N +UTdjS5^5SeLV`hmPKF5nT:gIg75]Y;Mem9iVH?nc[\231Wl5bEeYe +YQ]6NFD1Vg6f7cm;V]a_S`AMmBUlmPVoV\kX=md<_^VFDZT6Sbgd>971NKm@Ue0ekJKi6jRlPm>nRMVjnZ^H:E:V:^;DO\Wd?Fbb>jT[0`UNFl\ +6K_\COCb8>>iS6MGK:fgN]Cg3N]Bl?YX8NHUSO2?bZ5Tk8F3In]HO8>5N>e1]3SAn[OO0g`lIlC= +OjA8mcR?CfoJRT4LfCc7L9@aOh8j7akPmNNN9Bga8DjeOFdN7fQFX2HHhXVeK\:cbgJMo3J: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]ebaNNcG6FLHmnc>[MD5>XEk@UBnjeVTMmA?cB>eVW]TG[J?PAk4U=Je`6^TccViFiml +UXZgLPl@b1lac^jJN_KNoB@FK4Al4b\m>gc0Wa]nNMm7koH_VFf2NROMoooOHPgHF7O3YDU33\BY +CZIBNGYmiE^W`EI\kaN7N22VFTX;gPc48bKDB82@_2ZEGGZn8T;AeOf>dO908I;R>4kOVBScfBTB^o4=78jhK +:_`?;NTcPoB^@N90G=R37^B5hNMNEKa\2cnH6??=;@3inAhlk1[ho3]JfH<4NXn@o7WekA`cNchdW?F_]^mCUL]VZLgfTFHSS3i=UFlDg3Un6FO@[c +?@8<=DS^P8gKkYVO:>J2o1hU7MJ`eHWGOH[=<`8?iPC`bR@LjXQSknE]^ka\f\79EL8ah[h^]G1=Snl;?Shi +77i0`l4;;TNON_0gQaD7\gc=lUY\oIod[8OMjiMiAoFkoXJ5901m]BI>jSHVlIK6FL[TfkdXJZ:[_MJ2QNmV +Go?`KlDkSL\9QO\5o>?caSWF17SgK +4^9eZ`o98bR=cGlH`PC5?^SI0NR;W_D8eWcClomgZ[G9JC0g3AQQOYYAMfMV_MNeNZQ]P@\oW +3R65F8`6N5O7kOLNg>j?1hkFGTgclWXF4>j?2=6EBQ4>4^[g@J\J8^h24@_]MlSj;`k]\P4H^0;N +g`Yj8Oa7VTmGJB7R[cOJlPS_0]F8J@g +c=bc3`l@N_;__\QQOn3aXa1bU?8Y8GNbOkGgeXg;7n=AXe3MfKHQkXfh=WJa +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 +`kI9f6KkBY3hL69;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] +^jA<_7:9fkZWe2CJlCK9lIYR1MNiVOmo\3UehQd[TJ4c]B8M:E6i>\JdCdd8_:a:ER]4EeF8m;F9Eig +d8QhWDI4DVY4DQZEm_RV4N7C=29dBG6=BTNZmKjPcmg7;k:`mUZU9\kd;DG@`bNMM[H`4^Rh\aKZgClB>_@9EVKhO_9dn4N=n`o^nbO; +UH2IGZf_4:I`g4^iXFbmYecY7on\O`nIJLgE[R`g5XbkZDZ?o +Y1n]Y=R_XQ;4YOcFE6MWEHTb]NcLMV6K?`UE +;mk8=?EnIVZo^5SW9gYaT1^AMX@i5BQ^^IYAMfMZ_DM@0g`ZD>^j0@_lY07[Znd;D4Yho3cbL9^jGMK +alSKX2Gi9OCU[C;gjQ^5^kRU3gW:\EA1JonTCHLXlNfPSi:4dh84?Do][aK\FcL^Omaa[nN`kl[j +_ggV3ITG]bjDOM6f1Lfo1>mK8>^J0]\_PiAm\lJBolX_Bkl55k>EKC60L4gC;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`_MHR50O0213e8MCP\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]RVmE0FY6J?HGRMhiJ\jV8l7_:nQ<^G\;UMgl>1dU[m?i[hWlJX7G2Jj>JGm0k +ojnQ8XoTJKmeG?L\LV\Oi\n16GkgBW7ZJlXdNE1:M[h5C7fmL80MQEoaT4`hgn2;6VkC9 +eggIhB_?7L;WL?Z3caleoKRdoXQ5jM^?F;iUKj9ggo8EnhCCOfVbN5:JHKnnkEdOF>a=NGKEihjQ +eULmfSAMnPXmM`fY>7i5WiWg5]HOVV?efBlI>SN;6SAYi@eJHmYAAN_OOQO`lI`?4^io7Y +kKKN>`=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]4ZdMl9YScBSUcYkK:jdLH@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:`SQ6[W37CfjHm?VhAO33lm`j4G2]o4f7dJK8UfI@_Yi`>FN4l9mRHo4 +Ka>U@>PgDGm?>=j_A>g`PcCZ?c=f?>m=NZ?XKGGjU<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\n7g9Ae3C?Ra[K0O=\hP?Mec3oLf^7:;?0lW?g0_nngSIGM9ah\O]`n:L?S=Ti[Dg; +?l6J1P`PXBfKK=fkiK>3c[Wb8FYn6a94U0X3RSo9L_OJS`SAj`h_g^mcf?<MclA;5JPACU4 +_0leo>5L6n;NZ5\3ig>a_`Jh]S7@OJN`_4aV6I1W?ifnGfA1=a=eLP9aaiY4H;?j?cfHcnNo77?JA0@?[8^9m3ZTRgZn4g6WO[h]g +KZdfh4WL4fBHMcj=n9KJPYSTJ^jANMXn2W[0QYPM3146>N`iA5cUD7TQo6k;?[A;nR7Sk:jYInoM +Eg;HQ[Pob4X?^AB>;ShEBCO3b05g@RJEXOSjh[ +T6i362OBJFYK[Lf0?819MA;8Do^;@BLMb0KTOIYPHhXPE_k_;]hhPEX6WJZ_4fZDCW]l3U_`LI9I +0FnAlj69[o`8^S5JMnR1H]OA0kc<=;::X5Og;ZOlB\3iXPF[7N]cXMZ\i4_1\80We9Tl`M +8HC?W33oY<]en_FLGP5?SIlGLl:E2R7_CVnkXdRbEXM3aV`iT0F +LO8nZa3FbO>h@djN]PEl<^S9U\]>g]L:g[B=E`JMiN@m@VO?4BaAj;`3ZRKHMNNaTcO6[WR>^ +Nbmle]LSXlK\RGo1LE<:=\WP@MmoJ9@;>OFcei40hRn?Gg`NTboNdAU]hHBcilZm\D=gg<70kECl +L\MZVF^<:1aRki3\X8Z7WCGJm?YmIj3HZlffl]k\lFBW3FJgO8UXU]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;clFkn3YN>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[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:DDOomP=f:eIN8GJ5HQEY2PI@]^oaB]gNln8D:o0gPCa3D:ckOT +3^S_9dC?6jEoRm2eGdX4fG3hl1g@35kYo2]LNh666nb>9`WZhYLf_7OHDDKRJE;`=Eamgg?^]2gljXP +fAOTKQFXAYWH@Kj=7MkK5[j]dGd[UOYj`H2mZlO;LVVn7nh=NGk5D9O5KWfS6iPAmc6Y]k8o34V;Q_kGkI=PD3PdMa[ +\AD7mcVfYVYNMVb=KU\giC6glkN\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`9aKQgNKV2gjDX@Obee_l6]^3PG>A9`jY76VV[5j?Gehc4BLYm6:BdDVI?WlO_3H +Xg5j9oH:o7[aVYW5MSi85K?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@jifndM=AXM^=6TiOJeJHZ? +7;jST0K^SB`O8Vbc@H`MLRYDokWiic@I6kC91:SG:YnF2Fjm?NkSjcg[;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@kE1`[g;9=nkNnoPlAgKeSbFLoRPUg6Z;NcLl7>fJMmgfC6NOOY;lRS?0?cW=XL:o3k3lAjg +jXW`>oI?V^KOo]oOOPo8O2O`LIOkA^d35_`m=d:KFX7oMII8 +l7_a1I4KYP:iDh@;56QHc`\PR>lKa3lA=U3P8B[WT\1k942OJf>JlU30H@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:bjWe3TRNkg1GKJOhkoce2Tl[: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@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:cC0Yhef8LNgDCn=jA?>Jhi;5\VO22WF?>F07f9fko8M8=TYjYKYGPEIWcFog1HGOOfOk`CL=_hIJm2O=M8mhK9;JA\>fN^HMR;SRCNGc181g__SgjNlcJ +_;m35h\DWZoCHTS@ +HmI^>K[UE[CdeU^em^^f^BQ_8AC:=CZ76EOoa;d]Rj8M7mlXK8emQo +a]j_DclhCFI\]>_]_5oel[IM?GcW\HZE7bmZTcm^e2naEUL>ClL?dce>YGD74fg +gk7cXb1anmC[1DbOXlbELEmGh?EGU6eVmVnmT]L]?Mfgf0VJKhkK\AW4DoW +3WNl\ndg\]dm^>aMn>hQ^[J;L;_3l=TmBiC^MgWD_F]Y=gAlUkK=3AMZYgRk;jnnlF;\Wa2akPj> +eCe7d5UW3]M@gNO:PF@Tm`42O_C[Ym<^FodUGQL5N7[_ONg3K?k4K +m0PC:f2^[^NCMmf7aKn^32N4HbS?cfgGhg3g4l5R1Dh`X:2M0[i\`8_hKHOocX00m2?=Ym?XNNAO +KkBUlmom5QLakM4GXlhkS853_?:iaciDR?[RPDTiF?_HHCnHUmc:[6kMl>djHMfKBMV``;4[0 +2W5cil[nmnT=5WkHbbS9=kYooh3VO8cG89CaLd6gRo^beOIi_[?EofnOH5::@MH_Fdcn[oT6K_RV +UIkEflWRkKj>6;mk_K_SCVGM]SYl\HJIJ\<5BN9fY;X;;?]=W[mKCPM\R`KOLMoVV7<:S[T]P=eb +InJa=[kSV?F0Va]MkbMnb +hkMhoS99?P_bE^f3?JXO>>KfBS]gliWUhVJ7:HBa?gJ1:P9Cg]e557CPLO034g7;Y[_e1\AZlRBHVhWLL\FloZ3FS3eb=TmBQ +hfjLi3cSfQi<\8_2?oH>`7P?RW]W41BWl@>>=CeB:9i>NRG7Yk\jbELbC`:93gbnT3;RV^1_ +[kgIX]6blQXm2a_5;ML\W]odBXJk2HOSP@1GZjMnWDLYI6m`5XVk=LO`3HLbJ\2g +GEhfAF4NKY\<^JnQ@Ekin>kPhi=^`P67PaMLUSiEhNnc`gRPcm\d_ceE6cK5611F6DMdGS1\Peae +n;__6jKgmmXFN:M_TkGCPl9UOC?[ggB;EN=CbCKBfVL?m1Y>G]C0O +_M5[KEFSOO6M_OL79nGS2ic;hTgOeo2o4KM=kcX`G97ABKTa65Pm;n7a5f3j8kWW53dX4J_c?T\f +O6iK>?clJK^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\F;j1cS``3ldn0AXOHQk +NNbnkl5^bn`7`>9AcL_]?=i^nh41^mkT^aC@3]^7^?JlgoTc`>42CB:4<>0nQ2W7NLRYn\Vlg2[i +@]c0N^=o5?iS2QQoc7D: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:9KjROW +TUc=?C8?3S_XPLaJ39a8VnnMh\o^G[GgnGB1mQVInbM9NJSi`DFEHccl]BaPeD^5b`fh6d5[HAdeD[>n^9? +j7UJ2C99:`6lQeJR:KDBWE@PgHH`F\TihhHoi0VC=e6V +CgMB]CRLOlRfYP5fIM\NYVo[LNMnQ:PFn6618Hob:\AKcYa847eh[8GWH\\A7aCZ46G4d79E0cBl +Eg_PnIRm8jMm5Oc\iUoS]82n[@@NK6B6@dEW=JPmBjUNnJA>acEV`6OoQL]fkWN8`k +nj=_]VXPdKX6f97ScZC@XlkUWAi`i:]L9j^dgWHhdM]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;;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_SOoGWm[f>iAClmAIo\fO4XnlD2RTUDjYQ\M +O]9j9N6BUGV_aQdn^;Z1E@gk@KagG>cgf]>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@lk6NTiFO1Rc9JlL2ag0MmlZ=Uh_6;1gmGQI;\eO>Nc6]gQG3_NTH;IFf9Fl +R=6kgAGXgBQeLmR]Zef0cWOCFoUeF_M7;BS`X_8nFK7^IU^g[Yi +cgIdT8472Y6e@:6k?8ci9gl2X11B:0i@2Vj;MBS3b@73k`TnI>>aN>kSdBNicSGK`[>khl]e +^M=W`6gfRh@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^7gomPoD:BIE\?hN@BNf5L9[UXGK`l>\GWOckMK7efh]\FW7ZJagWTWcEbliiUB1 +lfDRP;jjJ4gnOoeBgZeH6ek?7TUD:N:i?bE_?\UJ`Hbmj?BCE6ob5\[H^n6?Zm7RojgOl7UGR7ef +h7FiPka77_SkO?P9C?WaHQlg?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;:KVZNj@N]hn4 +7]0FANbf5_bcjhDoY1HcAjMHNdcnB`I`PY6F1gH@glF@Cejkn\bOo??gKUOXH^ +HJ^\o]oojZgmogm][GYlH;JjEi^]_I5Fi^g8k8\Nm5oo[\_GaPg807hlX4\R3PN@gVdhk:LAi0S= +2m?2V4djf[P;MX`JL_3HL`=>O34NDo>SdP`eiCZoX_4\XIAW;i7_hk85@F[Vn +D7[hH8MhK]Xi?N_SHCo^TlgY[KfTABH0m;1=HYfmU^CM;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_CO7K?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;l^>BfoQD73T6Y8AfA4Zh3e9J12T1nQ]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@ckYPieFInlBQdgfZeSPMK=d^: +ojaC`jU_RjCmdBQbnQl]U[A?LG[cc_ek\\nimjOOi=_oWjm]?jiTV<;kGcO^GALWn0h[[_2iG8gj +1I_IPJiiOF7n`]8KQQnjDCoan_ioYTCn1H?jL=oEnjSD\nd66C1:^e6AN`o<`3bHj89JE;?Je\SD2]fnMJOB3?Q5Q10T>1@Gj8e_9i^Ie=gVdo<62G +FWdYh3fQlO?Jlc7JoH@h2cB940;^OPRESh?:IM;9AZBG7gHAfX>eRUIPDK5ih152SNgbgg^T2FMmeDXO[NH9\jQRciN<`JMo4Z?TP +lMT]QeoTZd1_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[d7EFVo^\2hmJD?c2U< +=]jOT:17UbB[lWMA^E7`oSNUGL1\BF^4>ADXIJWGZoK>k7Z_boD1?A=T2A4L1o@30o2DQPmb;hoM +megHkAoJ3WaPXLoEmLCb[_^21;gNl>YY[@B[OTo2fD>TGlcD8g6ONUk8bURV_P]B8GKh]mn:cIhG6c8^mo^b;]ReXoREhg`9I +eaCH3ZL?f3M[;?V_o;;dF`[\;1AL70j>n>ieKho9h6Jk]BI_c24Wfh75=P6o8UB:m?>gbfV2K[UB +lmR_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:650Z0CaA^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_SL6;V +n@30E`20AIaiV`<0m`00>PL0TUm0>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_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;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]6bkGKLBlnMbHaMf``;4[02W5cil[nmnV= +_Y;l\Y38gclHh3kf0h6Pk>N2S[7f1OKiM81n84@YnENgbMVW7aAERO0?Jdn>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@:81bPj20Q7>\H=?_W4cN9P +`4M4>;MHgc;l3UjiFk3N7mP`1`DN +\77K?J0gc8EVW4V:TB2UEWXm36GDm57Mc +aIdn\3DKSPk^0;U]a[KIJ7OLMGNjSjoMLWKAMWn7YHTj[=S\GYM6e8jGm`B1foUJi6?[d40ZRl2d=Md7@5hiLODE<4d8J^nL>K9h>Z>UWe6cjN5gjN50AgBoTC:^XVNcid0hIKiWL?I1c=J?`jO[VRm@do1lAjWm: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>?>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^HF7@TLMd2k1^[b= +@RM[fCgfTH9=>X@_4ZeiP2\56hV1YoA`=ahcFT +SS\\g<555dAF:TV0hkJ:m9n0OHkiWV6[30[HXfgk4;n^IYekodmP>nGiG_5O4nDQn``?5n_aQnMY +:?3W]YZhh>@A;ffNQML7WZkICo4PHmN2c>_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^^kMUSkCShod0nI65g6gY7o8QYW=`_`^KQBTkdiEYQ[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:e[ongmmm3nAY58F=]@:kkM=E +@KZ?Bm_V4H^lao?Inn@0kGmGXGhnH[mgI +mmX_:NQgMCk=jQXoCZ8L@NODC_O^FXkPnFI +gF[mVnnY=JkAHBKT`P?^QZ`oh74c9O:gTL]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@Nl0`8nF0;RT@TP7XWSh@5T4Pn?W_?` +J0HSn>GY0PKdl00VolKZ@lheR3jRm?PKSRn8=3cfTT8=>X@hTRaiP2f5VYoI5W[7QnMW\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?KLK[We3m +4Cb]lA^VADjm_Jf4Vl<3JQV7ag573nlma\Om]J8dSCo`CI_84lJnRE35lDRgDbc_7W6]4fk@EhlR +a1PL_RhUCkce^0Sg4eK_j`QSM=iU0[goAJgHohJ]2W?hCoeo@l]TgC4Pj>O`4IIW3Q=jm9WL +2ik?Z7jT=:66J9CeC5jC?UCc3Jo>7d^mZWR3n:4[SojCZKmn=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;cCInfPk5BIDnB5PjQg1cZGRbBD<0nlI:R_3SlK]_21RS?eo?LfE3kPc0855Ym>>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 +RlT?;_A^elGkmaJKL2C^2Nb +1;ocJLBge4o>9KVJNfBN]Xn2E@nbn5^bcjdBoXQhnb^ZFO_gEMbf3?N=a_3 +fA3oCdghkonXS?oGOjZElT27fBUnO9P?n\G122dlfj\5WObC=lNk:<`\_3QJP +kRD:eNSoR=CSL`c2l4=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:0hGReVjkKdPb3hn3ihO3KgWbc8mBmR=?^]^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_39OcTQCfQFkb2hE]l7IH6 +Rmk@b]kRlo0]_M0lYFjK\Fff?FN79Ji;IHjgkO88V_dCW6l4g5Q]GiOb`Nca?F7HSSkNPaCQ`==V +lgUCQiajNi\\K5elCLH6Jc9]g=c[M8?G9jVmmFd8>hK[f^5CSeVdolkaG9O +ATXKk0iF^l7l`?WZR=acLOdGV?7oE:hCi38jBj +Y`oSe\nEYgMREWb@N^NcZM>OgZPnk]?6h;=7f68dmi3m6MjdO9;bKkK]?e]bLSC4>HoW3 +TeWgOmmgjEnYVWokOgok?L37La;NggCS_D2?kZH=U3]i_:g_WXBn3h0j]\[:3lV[kUXCn4E8`f_V +]L<]oc[0dm8cNUOnnB3Rl^e`ieHSg9eK;70oIIgO8m>Y1] +ikIhbM82NI\GMT1^nkgda@cO]Ykh?@4R0mOGn[gKf6Y +0l4b7ZREI0`J80;^ala[lTglOZ1ZiSCi?gDko67RmH2QgVP55h`@^k?EO7:kmH<42JX3Jk@>Ln=9QYQCPVJmn2g[iY@Hg\XH7^Sk3Vgg3fi3NH4oPK]T +^1RgoL20G@7QPY4eJ;2dMId\@OU@bG:mel`ImZ=8GTj32^:mG40>OM_Q_c?0:7ODo3BF7lCkjddf +9_ag_lG=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>P1j@N=iMcE\oO^`:Q=W2djTaHC0l@5IIP>5aDPa?<=PG2^Ac`LG`W>e>fKN[0PK5 +l02INPZ6Yo^;L83_JP2_>=akF>a16]Z96[1S=\7QET^hHmC@QC[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@hGSI>_D=dLCOL6;K]Ue>?hPD8MTl^?i9WoNTG7omV3=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=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;I9Uee]CHB_G^J9K5k;5Z@YbhJnNWIFBnG3AXGl5H3T8CHL47BU_VVmZ^`02B1 +U`59P2`3TVQJT0A9TCeGeDh10hh>TSmB@:mZl80Wj0R@1IRm8hW`IWcd5BK0:9d0B +OLKd9P19N=SVgRDcYkdEXlOPo2\V58[Im][2=1U2CY?lH;_^8_U3ccNEI3iQa +POf7Vnkb9moT^=O`n4Pho1mQliJ;l;QOlOQW_]D9?`HBIn?bhBiTf +Fi5gSV6JkllLOZ;dmS3K5jcL=[5>h`T5Jici66Ghi;mM`nEomX2A;i`cFL4HjgR1:Lfca>Aj3nBl +6cSEeFo7WfD8Wke;ifDCboeoGW5>`fGc4hJI48n?fcE4YWRg7nCLKbAdb;DO7WOjSaak=SOhWWOX +hYYQI^@KRI>g[dakOHQ0WOI?S@SEGc;C\LMOg:3E^SM6GcWcoIL7A` +P7SKS6eKT>8HgGJgkSjn=UAKLWRk_e9Ye675I_Nj]:Z7Z]HnFlG9?:mK6gbQ]ibn=[Tc1=jm4f1a^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?G +M63YPjQP2Ob>U?C1kL07ZYc?eOE1U>:e7aBXJb9\6N0mgokcfWeOR +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;>JHKoWYfMT^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?Mn6_6BHBdbQl^MoT?7W\d>_^\M^]RVV1Wj1]XelRaK_kfdZHVbSN5WOdj8m_6oj>@9;fb5elm_c:K<;[EfkD6YG[O\GWCn001flhMK]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^=GcPoaGm4j`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?VNkk:2_Og3D5V[T`b_J[Ki1PoAigG3KUKoTUN=JE`cjGGHIVI?G]Ka2CMk^gEl`M^5JK?2ca +4aWPHhi:1[aEd:mQNRecMT]7_>3TlB:7Foik6WIii8H7aB]W;?b9\h]MNgQ?B] +S[ML\[\:]>\7;[To<0oCRIQenbBmd@7mSDc\Xco@[dgnOofIgPcOBPCfQP6__^ORoYXCo9lAl8A\ +CG=l\P:lEWKBZ84nnkk;CLnnl^8>ln9Nl^;P8oBB`fajl[Pi091;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:Wc1RUU5jC0oCVSci2MFjXf]@T9d6KcQll=k1WEnA0=L200iM +aD4i:LnOJAR\4=;AS52gFfoK[P2b5N2L?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:kY=UO[?ZUFSAia +0dJmfFi1b>8EIWn>LGOI[aQ8`M=GgZA;mkTo1c7>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\ +69kOogoonEDKDie_;_Yg:KiZeK4XV>ncEOWi[YI;BXlR5\=8b4a +<9:ScZ\I8Si60YlS`@7P:O^gSmo;8[D30MBMAQ0LjDiC;h;Pm0TSZA]6lW083WX5PR=g9T9`bW8O +k?lVO>V8TiD]hk2=6L^l\cgJ4K0o5oQlVNiFF?cNng?6Gj6k?I`fYNHfBjU7]IdRBMlj[mf +hO4oMf9L5V7f7nc0lAD7S^620KOW3L>WCg90D>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[g6ikc3=Sidg10MX61_Y73`5f5V:M]VO]XIHVg_MeK\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=J81jNd`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\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[On09>^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\neBIEVJ1GQhfMOa8@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=[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>O3hZPmjMmM8=^=U?nOIk>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:Do3U6UZYPa9N7EO_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=o5Hd6gHUcneelYcJ6Fl9j`Ci[n2WBnl=YKlBkk:DnLF[\V=\;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_V25NDDjlTK[Nn`WXPl?joGgg9 +TkMZT]dQ3jmB0kN6WbjUi02N]NG`VI_g7ikIU7?V]=JgM7Uio`g:MILPJXSPZCM6NOnfMkj6CZX` +S\\eOf6>iAWnIMml9]kkQ_eFi_mJJfGOo^mo5K]l8=Fjm@76GXg10GadjMMZbn:NNd7b5VQM^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>B0onjR@UhKRTh6OHW@b +l6kK\_aYAd1^_ENUf?^N:o<`m2M^@;WV=fM;gBO\loJiJ;l5=AH6iU>kOE^@L6MPl`l61D2NU2 +UCb]lDQch^DmT5DDNdJkN`aK2C3L;TNAJ`R`Qhg><72_^U[GW@ +WhK5TAnSVl<`D>of;9:[L81EG;273gQ9hn9Dcl`QMIo:F_54T8a@l8eOElWF_On7`9h9ER9aWPa=oAZ\RQiH47P2R7e`^FjG?9c>6RId2VDZNXF>Oa;6^6dLRg[TG:OJ0JDS_lSfIUTOa`]bI5`_dC65TCGH_ebE_ +cTI^fg_l4RIWWo==3iCh>3KKji[5MSOoIP2iM>_@on6oanRL_DS[SiN:gNkIYdjY6HOKiB<0?OcZ +jNEQJ:1ALhXA\Ojaic7NZBOg>Van +T61Qo@^I=TaKog37Vf<1_gfKL:an1KAeA;?BWeNLJf]7omU\4Dj4__]lKJ@CCGZN2AedQ<4lDPDhAka8lN`hac4JBe24j_5=IQgQ1YXWk_09 +QFo9a:>3^e1[KBYh:lo3]o5LP;QBRCheQbF60Mk=`oWUdQ73]_Lk7dS4[]6j^Kc\83jdKA>Dj_`m7iQlh`jL_SaXSKI +C_DoEGZ3S>j@l6gW4hN=IgVS3b?<3]ofAh<1B;W__0M5kNhaklC?]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[0gDi`;dVIbV_?::``n6IQi@I6FKo:O@oNKhA7l^:;3k[^40 +SGBU5Pe^oWCY_OH?=e2\[K_QY42LmcYgWL2cNhC?G>Y1YW?IacD5Tmjma?g41iU?9^HjNiec0XkA +OmaI8NN[6cgVZX@G_iWA;oN=3n7NGTPF?^V2KP4Bm2WM>_bR\A\naoPMOVFagPDBUkLcMfiDOL2I +1BceY`?=LnIZTBWU[OXW0eIKGB;jRGAkegf=>Xec<9 +OU?GiaggA0Vjn0JFoh4L5L_Oai>BQ>n=7GKSE^o6^o;L^CS\CXf4@`=D2Ek^g8Q?egIJaNOFc4QF +;L1?QT3gOJS?gcD;7:\4OX@P6SK2SHk>GJ`i2o0i8cj@gH[NY^>?S\E2k\dCMU;a0UlEm]jN:gCEbfM3AhY7iB1\bge>K5Y4ZbGc@^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<:WSbBLgWH[0C2U3g_4c_a_Xk>W]H]FnD>EQfbG?L9@9>nkYPhc;==TKQ2aIn_D9J +lfNWikNTjTeSSgN6`EoC9FBacZdWmg`JY^VPTckTZF>fmPmk^aV2Oo^GHIUn;T5D8=RAdeK=^?Lnhc`i<9ImLi?3kTP3iaj]GL<:a0_OMiFf`[W?QLPaYYRV90UYlI +l<272MnXeTIFHi>Q6mkDZCnNYkdaG8c9NKlPNAMkdPdlf4=G;8Vkn5blRe21EHQ8oZ=KU``o?:=A +e]^emoBjGFiF6CO26A^\bHC>[ddmO>?Sfd>aDnAZQf_PL[H^_MN=ROdd4CdJi=1L7]h^O>EBGdc^;mW?M>9[kfddbB^URCU +^@2UN`L:YRH]CmCO?YSk@mD\Jo:fKW3hiJ8gnGo_HkmFnnY:`>^m@C8G`MWn9V_LoSk +_@F8J@UYZ13g5nK[FFoXTCYo@mfnWn5G_\oQ\PgE8Gmk43]8faYm^WdMo^E[TM=YfmNgJ[\L_]YP +kK8NB66UMNVHbPnd\2L_jAQZMO`9^gA`nk`>nB[a24JhOj4Z_m`_4K=n`]>oEMn>`@aPd_ +d?Qm3nA1Xak8lCoJm9K91nah7RaSV:75Nkak>RMLcIeg1SIN_:G\SOk=M`iofD9Z[iI`n=MnNk6nG=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\9J\Sm;^G?^LO7cHMoo +>gEoik6WIijHWkaC\YEkASk^Wd0W?9^@DV1o\eN?]m?bb>ehd5hoL^WgBbWaff3MO +gQW9V=l1nWonXMeZm0llI4OX0YgS1?\F6\Ik2>7ooBm;cQ@[7ig;6c9g_j2cJ8Q2OK;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_h[A[V:HTofjASbk>>cnl@W3n;5cACQIQ] +>hO;DbcPQhhmVj5j^]ik]Rjj6FIdcX4==\?<0om[EBO7S=Aaa_Fdk5]bf^Ac6]oN]O6lhLKUm[N[Q6aoO7Z;=bF59 +XPk_mbo6hDRQ`cCXaRiK;F3]loMUS>RMY]JkP +U^M2jAZIHRiOUc?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^>4EBHoOOd7O[`DHdkRCL7oemeI_keook5OU_aCgL;noON;BV@3K`k_Pg;Z8KYhWko +LnK;Q`gXkOjb[O^7UF`ODGJ4QQ9gWIMbZ1C>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_G0fS3U8CRGk6YNEdeSC0]LH43o6>e3faf7_9hSE8W@Z:Pm0];]gn42OMmT73GRA88:>mj1261knl?XCBi79_1^gO3_NYNM>]7G7 +Q\:Q0Z`8=gM^a:M[>hNm?;MVQS8hcNcgBZ1i=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:8ima[MQP6YE?gMm;4IochTgM6[W:_b4]8f`kkKJni +OFWUTM^kVSV_7kSDo\2cfBeOWFgkA2[XgcoFCWdQc@GZZFH6cP`6oQb0`b7SoK0bTBWUn5W2:U4NCBGWWV7RU?9nAlXIaPWnL9Tn^_P4VIO9k?W`X;YPkc2GTUHj4KcRe]f; +GeO9e[goQ`RQPfC_nJ;oZRGML_cnl8cL`hD<\:U`l`SQE:mJhTFEgiKQFiR9?o_<:8kRcC;iAn6^6lLNg[T]O\2dZ[3lSJIUcoaHif0l +mSO2gCPUYhoKQ:[RkWoUF9lRh5YOK6A5KKn_OM\^UfSGZMOSOKGSVo\?faiESK_\O +?M:]3;O7;oh\@]l9m2oM6KAL\e_UTV50?Xlm=]NNJ66>]HhHHUR;O7\=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@?:L1LWk1HJ?ONkWCgdVCjP5Qal_K9>Wfc_nWbjLlcQUVo`a:]dJlZk?`Fbg_f@]J7Sb]=Uck\o`]KIM +^??40\VDe1Tn5ZGg[T]QPSN8L?jc6iMnh:NZ3D[B3MB?3o?99ZVLP3HamnI8AiIRNA?n7K79=S7dQL]WF0 +`B6:1kRMKDfP_>DKOTSoO43;mUK8DlmmgJXG_?F]A_2dEcj4_?gc@iC@f;S3G1S[ZOcn[^aHco8TnikbSdKoUl<8H8KE`kmjlDJZQAT_G6l`8OZ=gXF2;8UA>;i1BJ6 +[EaPa_4KODjgN14c@lYMHmH5c9JkAYQCPC:6CcR +<<>NA[gNhFkOA=c?>nj94[aPP84VGSKo2k?d\5W:iWmaXngHiM]b;dHaaVR[MLNX4;A0UcL_aV]0 +fjEcGYdLe;A1N920_b>4nce[T779POVCfgkP2Qlig6=Ik:E=hGK7:oh5VdiVZ]fbLig9W=Oi?6:h@ih8l7n?onlDGi +lnc=AfmkWBm?LSSoQgACfbn^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^^IIhHYP;OM]b^9DfGRV^ +2K??Jb24k<4Ndo5V6Caaf>?=HWFooc9RkcmM6>m6TiiW@HNLSSB4o9lPAIe:l^ko3e9NLLdRXPSillnWR +6Gf2E +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\jiTO8DKWgSN;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[B4Hk37K?HK4W\M`AOKAS=R615T^hHmB`AK5\]5L_3R\C9>?H +g8e7MKPFkNA>d;iMPFMc1aeia>k3SnBhUo3[Hbmn +]_lAjX3hoSCghK0oHo +NcBN[`ga^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]joVRAfagSFhgSWhkAVIkQbL]_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;IaSolNjmg7NgW\O^o1KOo4KR2CM]Vl_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:_KU31bUG]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]\_B76g0Q8<;cfUGaR]MTR5lh[@: +RJnmXZ9OYZ;OCc`e2AF]JE@d^NGg?eohKn>\6i7OWajchlo>8X5GQTfMAbMM]:Bfffdo8fE7Bb0T0fVT5fcAl4bgUhM4?hmb?f:Soa`QgeS@Z6GIZPO`d +RGne\j;?ZAAjTaG=@JlMFC;>I8J0_7cUXBU_<^QUWo=gBij_dbh95WkcbifBIJhaYTSVPUnW5>h`OcID +>7805gZaac^W7kRF:lRRVg=>kWWH7<\kNT7]^]dS?V:jLho_?HC1l1;^enhMSnWGZ9cmM;?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;6_f1ao_1LPhImO7L;WS7NKbkQiGTd5]PgKS^cll5b]]lgK0F7 +d`Ol`\N3lO +?>lO?5KoKO5nS4amma11><8a;>Lf9Mc_G]BMQL_^VXG6;W2j`N31=En];M_bCXg;8kN][CWT:dKd +F8b8[YG1cA=dKofZHcj7n1lG`[^YljookiloSW`PG\T7bJZEUKj?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>VbOlLE9XWN9O7kOOb8O\eQm39@ed=VP7;?@h:Nj_VIMR1PkS41\RZPE8LUX57N]?59[W;YQPGIi7XJ9m6aik2T9:d1j9 +eSc0V8;5^]E;m;Scl9S9E=8ReM=7n56djL5DO\IR1;C_1XXIId27a9=312nhSf^Gh8HKB4j7`PEN +4:=HkAgB^ndU=SAifR5H_0C_3bSMnf7KKKN1i4fIbXU`IKAWVhK5Dj=fC=6H;=32 +B;e;Yhk1I;ilLdn`g1Mn]AgcH?6KPUe[]BgLRP]nCk5I3[GLl3fb_SQmk@X6FKg@TfoH29`oN_3ef1iWc +f;=a:6fSHjdSGVPHOL:PQfUcQVSFj=;[ei_3iM]d^D3[f>WSCW3fJV;E8ZIZFTk +FXbeY\TN[Ln9L<5[3=n^YXi68TjBMWRSAf=ZeSblH_S16Xd:lYa1lTDk72Ulj8I=1fma0kfUI1m] +@YfjKLJffOGlkXS[kW@OGk_UiI:OG`i;TgAH\MV];YfX7Bm_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\F3KibmWPAL]O>\FK]hV +oI>SljookgNoPd_hb8OPVC7^J?MZPLQk_7`nA`>iOIa3IBCR6@gR6_WNo6\F[od; +BokXaX7DKfC>5dT:7fRCI@fEnRe1\1a=\4a3R>8?DMIn3]nZOIoPH=C3KbML3mR^;NFkgI`O>Yg9 +=oAZQkPABT[d?TQa[GOcdCl?Mk<7Cj?[fAi1mLOL?EQS5jggijm +^?a0gGm_l^GM^j^O5o;dkM<3e_nIOMfTMUkHVD3ZD5g2=LlhO6GFJ@=GGLg`[EWG1JFgQLTc[5OJ +I[mbjG3eD;<^fA9jCmkBKhKl2Eo1keY`2a;Xkako2U:o[kkPPCmg_3K13?\\>OW]^]QEIh8?FmEoRe19mm5BEoSQ>LH1D7` +3aJX6_ob7@4O`L73fnLSHj;nWXb9P?P0mN6XHjDOSISUL?01_3S^kH5k5>7N +k?Q]U`SA]gIlG3KU;jc`N9B0cK`Jk]Hg^R76MjmgNmbMFfMW^[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 +@\LJDVDCAo3HPg6IA72SSDlg;f69C`MWgPEiTJif1LWDi=JoTd<2=kQ_ +9Ao9Y3m^aLkj;D;;;h5:W>hJ>W3h49m>cooAI>>`gR6[X>4gJM]^aJn[FNOjh9maH@h27lhK`_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]V0okKXIoe8[O=l7?GLBkagQbolc`>?gaS +:Ak\1DFHS6m?gFWGiW6WhYLkAjoaNC_8hJifKK^]oiV`^kKLcfA +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[eodLbC;liT>kL]i7DMjMC;AcM_k5jSKe`^^i[kgXJ9?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?AlnCnl=_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`m7Qoo?_3OPg=o2[P=7O3mhhIl_m`2MMZ;o?kZ_IINk<465>1NI@;imB:7o2J^ng7aR`Sjn^_0l^P8n22jZ90ecV`mlik:EE +?Xc@X`C]n3O_\Im4NGX5o=iQKb?mKWU?]g`e6;?^\U?JQdTW:0oJM`nH>5;A45O__ao +o^;W]_cXTKQHW:BCoYNO>;c@N;YP:jZcanD>^e[[CKefmBK`kTPKaJj05U75cSKS]D3 +e]<5h77X0T0fX`]X>S@2T\=3WFEI`81f0L3Tga5lDF@dH\^4jNb2TE<=j1JWOLJ@M\7l4FK>2B`0 +VeN=84T_Q5HSm:AXX`\Q2hOm6J=m2TX:aQjimK4JGjSH;;YDnLmTZJWInL_YlQh8WK_[TG=i0O?`G2FN5;AYPNE0hcHL:U:[@NeI`kn4N1cfb<9ajHMdY\4]jBDl +do3\Po?=Y:@_3koLU_UlP`PUbZd^Fj=]>DAnjeZB2C_i^[dE4jM;_ZM@YaR_RRC;M^_HRI8`mOog5kK2?_mRPM +BOIY0Sh^:N0kZh3_]08nk_5PeYjgN`<5C]K`DHI\^BO\WO[]boS^9HJef;K^Moh=hg;OW__4T\L^ +cn6YPWDh3L;OY>ZN8AG5k\Da>;CbR +1_hY?4:ml@P0MPDNPAk6d^JIdKRe6?3LgGKnOTK@Xd>jmka=2lNaJaa^@mRK` +km@6gZcm2Ym>KJ>o\N]Hh<\S[UPh7iWk_Gk34oK=:moi2GHom5J1SjHKa^mbIEY;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>cWnP:=QV`oHW0?hM7DoWf1?eMZn651S@OY]WN;>iFBOegC8oC\ +fAefg`io^ja1^^b=6S5nnSh=?khYo`8:_L:5W56>aK\@]FgP3oL_i1SO^\3;L>D;kUPomW@Kh@`D<> +nd?S7fDnSOnCnCCnGR9QPo27n;77?YmAFj>nomM2o^KJh=Mc:bCL6o1fQDR76]a`4_[AKfeh3a7L +2a7l]R]4j5\k?RjKl[M<]^P1cV8[SOlg]^IViYEcdOWN^WKPgFca^od[ +7Z5k\\=oRG3;7>i3honZX>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>_aH9OLKXS2mhM?YeW`G?O\5E>1Cc2 +PWn21@lom2]IQ1Z;GO2KCH0BicgXP\OAG?3C1CQl9>j?>66WClh1]aL^^J?Ih8X5T[?PkNXaEhM9 +?WAId9e[6Pkgh]hO5N?ASn;I?7OX]0?ZRN7ONGbc@hbiL>iMeaj^jmWjf^=CSoXLRMi`g0ngL>RW?LY^>Oc\MKaRlKhl +O_8ICQc_j0Qc7AQikX4hie=gg?6i=`an_dbKo +5IWcM_^20Tg>i1L0?=hYnZImMb:nXlPih:oNKoh[g_7N0>`PV@^gg50hnMR4`h_=>oKYB\KeDc;m +73I>fe01>MC7:\48cJloaFFN>1]?>cjAEZYA_TMJS4?PWoH8gMRb>EZg3ZhBOY\FH +H4@]67hT4=i7K]A\l3INQfoSYOaXjZI]UjEMMWdVjfI1Xo_J[BjGn_a22cAafJd]Rj8M7emcokD< +AhK\j[VWIhISem^UMK:W1L8[Hli6Xleg2b?Q?KO`iDQa=ZJL=A5Q3[ZAjmgjJ=V_ +`oE>KEjCOc\Ii]\[VcoD:ISn@jVFJO;e[aEZEk_5hLO]g?1oJZU64KJ\jACiK>7`Cel@j?TR_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 +41CPWcoHLHQ1RT\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^gn6nZf2 +9ggX7YPMI>;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 +4_i\WMod[_Mhb8cbXUbc\<;[21SondKA;d@6I\[Hf] +]l>N4nEEc\df`goK^T7g\\?_kYlXD9iTfDem?P<=WiDnCG\G>kXfa>ACQjf_okoo_HJ7XENL538[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_3hlK: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;GNgbeeL: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?_^HS>doMigOUHk7d5jWb= +n[]0U`QQaCIm3T?^=1`]DBKalQaEmf5>^LKd3WdYlE6MRm]>0OGU1h>n?7?IAPe\JIHEPWP8OP]U]6jhnk[SWLnSNN_go[H_jc[[@]o>Z +8=TGi6hEZ4JIf46nSAgNVjYnZl:64g[15PcH^gZl;9OVniDg_\FSlON4H;JndFg_LOfFLV8_;57Z?k_d1_ia1gCQTigV4XeQ^I?bJDNYGo\Vd:m22VB[af +0mGcLfU=eK`\C[H?=ONb`no^WgPDk\V=oZIn4R@E@^gWjVfhfI\V[]Y@mRK2@H5b?mSH03CB@]GMmaK>gOZ]INbA=[f1B^h<5CCGJgCoX[AUd_?j9GPPP3X_M4`8co8Cg>DM9n1OU>3jPLJI7VL8WWkSmQhEl +h76?N>^3YU6^i@YJ>>V2_`cae7KkJS25AXngAiVL_P?N]d]oYbT]_U4[LhBDPeL6;CSPojHA_GODJ;110g_dljPHk^4K3YF8gb=g +V< +_WO4c]L=GjlZLSaQiY43mhcjLOQkflG9aHoAJmfdP1TFMMJYA^:ig3@CiM1o_P^GOYEFc=l[KLJ0WAiUSf71afnTgYmNX:TZc]6jGU03ojRRkk[Gj8L3nR3NRlo_`k`]@4=TFjN62C262bGKLMCJfLWL\L6`:04[agHW[MCZ6ToAS_U_kY=eX640d;Vg`K;`;?lHB[WnBjFo[mmiTfH5kL^S7faMXF1Ad@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:VCaPgm_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;7jK3lFhR6flmHh7Kh6CQ1m4eF_;G36b1dj46KF\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]TN9f652]EfgnDd`NSmf +MU^PYnLnA1ZLHnR\WjTiWQPVD@=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]h8WRP`W\7e4PlYe^lc]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_;fSEk3Rhk\V;iKeoR +oodO?88`O3FijU`6eb\Ig?\Oem`34Ikg8]cJ3c7]\3^>beoUI_XMN^g1X@SSlVhK`eM^8j^dl2d] +`<_BPPOL>?>[72f0cj45@?I?X32A1KA0>mFN]fKQFhimD3M``W`3>VC8=DgW3Oe^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?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@_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;m3ikQaQIXY9EacdF7h8?[=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@?S4HT8:EX0_TU`nl9gbOFiCkPOSi0?;TT6nDSVI`9;:Mm1P6Ajk`;3LQccN89o53B:ZAe;a +0oDC^PMfk8=k8_I07B30gBbAZRD6R:4@mQM`C@Eh8mR@Y4\dhI9gWF7:OB>l]UOhFUoW +dPFcCW:]bWNKinffk9gY2Wjk7L^f;YWRONImSadkI]W;;5gP>ZbLiTd7jH=HUW;[UY6>>EkM;VMI +5JnXjgZoKB=d_EgHjg[OCO?daJS_eM=cDBmUEHm`hiZ^=H_S +GA?7Ti7;VS5NbgZ<\H_=TjF^feInbe86F3G<_=?_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^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?V6M +Am53b?DTCMEXTkGZ\FYFcHQcGV5XZ4`:dHbGlW9NXlTN^mLPNi\c<\FYI:Gi^3\P[g:M:O;YU6MI +JSV]\\3G7@aGfFN6JDOddgAA2@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<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^Nnla +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`<`Uili32A]jVK3S?9B``CDCM[274SHb +6L==_dk8TdkR04oVm`Wf2GSbRE3PT]5mWSP?ABQHGLGb63L>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_=@Dd=0P4B8a@E=SMXRI[K?0D64Q=4aOJFmlVf5H\g9\b62XiW3N?j +Q_6D@eg;VNibY?]L=]haV5Lic2^j[?TMIn?WC\6^BIKebfJi=Z\VNCD2D4\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]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@a3Wi>cOMiM1nPjG[3ULjB`jN8GVB[GS=EScVldZn@jTk`fAm3KiM +hN[3HaSL=PLWnOXOUc\l^VR[oQ2naHi=CJHbi`cUPXYQLZQdTl?\Z]752j7I^5dQK[Y1`VH]mP7TVik0LWf?6\D:7IkPd +N9lWgNIPk0ZL`C>A^kXDRDGIZG>HBGNb8C;L65l?\=WQE?J;Thm65 +S_TEQ46\dA6BGnUHU[L?C]e5:1mcJYS>fJVQK1jI27NiA2l8A]iFQOB9cLgde\_eIgV2TK:iP[6f +OS0:`E3dBJfZ_7UkSN6UNAeiALONhiKF^ +Wn>kOR2SO^HA^;G5_Z7BWOeh?[i^WAUI=hda[cJEIWES]nmTd0PeX8E5=OkQF_LZnQ@ECg;BGHa8 +jeg_;H:E?^^JPo9`JVbR2_^`c4cFGeAd8HGGJ9YXEHak[cFOGH[IK3iX1E72jMgkNNka_ZoPZbIA<6WGHlMnd3hZDTm] +HHV4ammFOf8_IA8Skh_6h[icLj5njTG5=:ob^meUA>7:;oHgf4_lkQiOU8:5WV<^=f4nTZb[WC0H +XC3lH_cJNRmOa[OFFkVZ5L@3De@\lB_kMXGDX: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_A8_J]HFhnTTj:UMJ`]9W>dDLFcga3?F_9MB +A8LU62Rl9ZOXCc1@N9GZk^DJO:DB_LSHHdjl?TdhIX0j`>GIMkG?RQS +UjL5lPIi2n]ZhLJbKn4:X]T`MEiW=UZGmm9hnWV?82MFmk=9NhFl9CHQBfOlTQZjW@@lb>D:=3DCWob2oUQd`iKIXHi;d25`8P]@7QU96:_0jYGhHdhZ@:Q3f8NPaX1k7BMAoH6moeMCaK +>1e=VjBeC>[aZ:DiKlD5`Qg^eWPMkH2Di^=CNY8K;\WZ9]1S@5m=LL5:3PL?=LPJT9QRh>1Q45S75bYSQieL^QYLXLCVGeYMU0^;X +92l?E9k2`B<]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?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`XL3b182KChKdT0aD[7H=Wi92VVYNG4^XW +h8dTehL5ihAeNHm`Umg5^W`fOWn2?2oJ4\6gAiK6kf2m03?:UM3AXC?DF^YghBAj +S9RIFC4eG8fIWQhcNVkPa9mWAHnIT>E`WjC4WVMTaAoIDoBKj +PSlW9m?^`GX]OjK`BDH^ni5T[oXi?B]VB>C4c<[6faWZ5l:_?g7@SZP0\S2b +JT=fDnnSb^[>7X7:d?G>AG^WX1TBPSY`WeNCaiXUW;F:Vg`@UhgYAVQ8c[6KChh=f@o4:oBbkkeb78SdeIRR6 +3WoXlEn7DciD\jBo`DlGnBVNKdib^9nU:kmS_AmOidGGnJo5c;Oih65?_BDVgn:U:SmL]M4mD +7X=7LI:^m8aB]NmGj>MVaa@H92\b1\<41RWn6P`Y<4RmJFZ^b3e98L>H8[UfQBlG>_^Dbn8OPT14 +QN3WfhKWnb?ZJ`Qk2Wi1RVl9WGnQA:kR_1l\ASMXS?f]bG4GEYkmNSFU?QII +2o8A5WCQk20OF7aEh`GmM^4?0gA\=jXe@GJWEn>KOJIhNCjGZgB:PVPn[=T85`JS +H2\kH1lgmlK2e:45DPA6980\@ZIi?lWUR\9DUW]EOXT0jXi:kM`OA9@MW>Ck_^\9BgQQjm6MlWdT +E06hKA2Z^mRDWAWCFZ_7C\\B8]jNoGKST=hT +[M2RX_Dn9<\=Q=nEHdUgjVmD=FD5[W[N2b=Q17N0HC:VZoOQ_ll?Oa[]Pm39fN;H[dfdNG]LMHdcRO<54Z?iY;jYgSl3097D`cn +<\S2Mf?USN4dWlQi1N:No:2j7HQA3kRIc2^`eN[K7=L?S6X?:mG3\mAgN699_ +KZkBEO=7ca2jYS3H\GT5iFOZ_>:kJ75O`Eg^_Uo3Oh@gRf3MNkH +hOIiG2kI;XoTCi7h`Y6J;SSen;Vi50iRSGm:k6YGOHEh>0aD9SX[UD?`3RlQl6Z:]6PE +@OhCgAAa1S@bj36K549]^XV>UFZho2T44TfGcTBOAbNH`;:lYn@92:ji@f6OC< +KB0MMRJCM_@LRf4A<8I`Y6T8D]Q3QZPND;@B9IB?D8SUmo2<[:?VPTfOJbP3l>]_WO +cDh[2En>Pg1oO6fPYE6i6`Vdf7ZiLD:\hXlS[Xb?;WAF64oZG6>0eCN0SnhKk9GeboYTcDaiOoLbj5VD`lB7i:S;hN6bJ8M0Rb?TZ; +8OQ\i2GYX`X\SCHYA_T8=G5liKNMBLhg2]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:hBlD4QUdLX47AIm>^Pd^Y2aARSg:meK0LE[Q`9JL +8W:W5I8KdGN5NlcW@K;Xh_22V4DeV_G638U3`K@]IdiNI8aM82R\IeUN_clnf^VH0khV2Z]V_ekZaLid?j?QBgg:1=7flgJTN@cUZW[R8eEh:AhISSe>]D[244?OUHa130Yh2XAN<9R`RXC\=Jn`k1Sh5W[5_777>B4HhAL1^J5N?SE:\OWX7TU823Go09URGKE^gG62clG8]LT3OJ6j@m38 +59?K\=C:a9U=[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;KZQRQeH8A69Uk[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\aBdSnU`[i2;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<_D44YN4kbhiM3o7dMWK<1Zh[H +;;\_>5R1<`9j\jo59^b\@0R4nPi;241d@IFQF>:kCJ9]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[>5g`:WL@X8?EHoi347875JT4`d0f^eKF7EIbJFW@][\PjbiBXAdZE`OSe=I;==M@db^@2\5JC +4h:J<?J2MKf90@k61KhZl[UCn[_bIDVZRlNZ1K5oO02Z9SXHTWCae2B^Ym:69T +1b>A[XSDL]2S@]Oo^GB=USJE^PBS43c^ZX^bRC6C3P7S:R]2>5aRhf6e;Loe +\1fI6GUUC;fEO35 +ESHDWad4:VP1@f7kST2ZWe\BJok?^DhZBb>\\kGKeU5^::ad\[\iCIH2BZdQ0b832SS5Oa5NUXaGZ0mIhKdTQ2X_eN9:OJU08T]mb]=LaFU8WG=5ii0B +fl<^QP[FRf@d\T3VZVfPcXfcW5e4[>9k82ChW\;QfOM8Ccc1KLlf4bm>?U52L0PB +GDQRVGQ\hF>:W?[SaO6FQ3\H1CdZSZ50Nb7c1>gBje:\l]IE;XiSRPK:n3QTJ@PQU[4JCl=ZXQm2H>Al +T;j7eQDG?UAH>ITaH9U0LeglQN>KgKU4MBP8YbM6U]Y`J9lW6I>`@`SKAdY]U6Ii<TU:4QT>0HC04n>i0S?NMGEf2ZQ9YAlXZRTQE:DU^JePWc`IVkM?L1G[T;I2;HPCLb6X@CM^X927h3_eR]3` +Y0;d4aQQ\j@0:=UYSYF2H8BVG6fIR``UVI=90IaIa`>>5P?B2D\KikkbG=QVTM\;4D@XZ\TCGmoR +j=5>:B6P@c0DPfW@lnG]fUHl8L]BL4dGNI>@GE]=O\a +J\gi>AMf39BkX7;`1j??KF1BF4mbVLUMkldIKeFL_G32Ijc4m7cXN98=3\EMR[_n[XhHeSicNQ]i@KRnHk_1olMDM\VBh[4=\Z6c\K +RY@DAc627A>SC@9W6d?I>8e +[TB[U2Po_E2VUN0=DM1oN@ooX?Onk`niNWecbZOIX2T^[>Ukl8od4KoQhKX_?:`e6JWKDcMk5SZPemWUo80N3 +4Ah6<>[5EmAGK8L@k6_S]gjO]dAH3\RaI5j6@IBOL89NbL2:2RJ?H:>dJBLoABPPP>Y?bKP;haK==AC=CcD2QDT1i8TA;lb;mA7R^dlUnneW1j:U_8?IY +UM^=]8]@Q +m`_\D2jIPTfXe>9=P3PWZ2[20\SO6N43n=4MDSN5c7I6bd_?bg6cfNl`a27\Cnf:aAeLI4`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?6k1MifJmaY@JVeXE<6iTk4i0HS@2iKO12AkJnX;XM4F3UI +6F@neX>6bWnF;dNKfWj_2CB[n@Eg4I37iGfT]OYVaGSiPb4KMBgdC +>g6SAn`kO76c[FiB=7T@>CAQ8BaB_66182]7^2eARkbiNGVCW8aXN=6Fj=;iSEHHj`NCH?93I_7n +7j]0F?`hSMTGQR9m53NIcSeShcEQe3\?YP58;M``jXMgd5 +PO63bkUL>[E:oDZROEC>3UgC5HlAWL:mgFeI\YHX?n9_k>GbS]d]gM:L^V>[0ZMF +j;SS<29?c2?Nc4D`6>dgLd<2lG\`2DQ9<=:PRNDY6H3X7PjOL14^PXm0LP1LQN]iLDR;jb@kfg=0 +6Zj:]7Xo]2@bbIZ8LY12]jekK]RjMJj7Q3^mZQj36T5WDG2DNbP5WJaFG?QKcTI=E1:L^8DE?_0b4kOi:Ec]c[of? +HOmSA3LoP6BI7l\b?d@d8mBKIgRk@?V@GkUJ1X:39ZH=3E0E=HG817o1iGEB0Dj\>F[4VXj[0RL<=00b\6 +PlQDmn1P;IW<1D5JP^MS\82HWT>P9HaFR4bDA2g\\iN3ZoY0c7EDYb32l;>34KTXnc7[3i[hd9LH0@Q +C5Q8GhC95Qmih8V7=5RY?\];>e`b8\f>@1L2RgD4P018C63XooE45]OQ>ER18SNTLTWHfLJ=LCjj +GN]8P7BaN`Z52Z: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:nWkSDQ2 +fJDe_5mRE226;^:mJ9aUC`AB;]f\bm]`C;^Ej;B2AfV4m`ld[6Jc`:`L +cn@[Xg4`N\:WiHZd[Bi=]Y\OYXdC=UKR=8A2n^50ncoKUKX[lg=ToWoeFD?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@MeZ43RGhY4eQNZ1ngZM`5X1Ca5NjW?3D9;a0HRng[VIl448hNN:=M:O_dD\DcaEEkk[\B_D=ee +ZU_JGR7FkN[D`U_d2JY_d1RhB=h>4FZ[Yh>a^fIgd8A]]Lla\kDYYfYBfFkKjFcWA7GF:DG[3F4<4bL[72GY8kf5BBC[]7d7Ef_D9Dj +8]oS6[HFi`LkZ4mGohU6NdYl9>\=FKQ2ME65BS=3HIXel6aHU5D;KQ6@mG?o7[5kSB@351;0`@:~31P3gHJhD +9G5bl@51~2T9P000L0~2A5I6;TEHA@l04P3UZNdbMKQl91P4C=>GfU_NKJXDd?<2d03T2 +E7]@kNW[3042VIhYQ>6N6ck3\;67M6`abd`_9eQgc?\hhKM^h5cGg1^`giSf7T<^i5QGc;\G8Hmc;2g6GHi`kiXf2\=^jIQ +9cG\ZHHMe[3k6oH7L@f@`[1W6?HWMoVFHJlck7Z6oLn`AaYfBl>nJMQK3K^\HKlek^K]SO3K^mH@lHHOP6`giQf1<=>jQQibQQN6c3KVkHYdhH_\^`RaUf>\>NImSm37^XHElek;26 +gMN`3a_fK<>NK]SW3O^nHF<[h@\:B`YZaBNf9fGLECP2YZ7h`Nh:3YTj97m0o\E7ojcL^HSkjnLF5W@]Xm\E6 +2B9MSjROVd9Za^c4OBXG>12oBLD5XMR]C>aFQ0k>9_mi_ohI>XL=`Q\4_eDP`8Q9gLj] +JmI\f[5YbkZU2e9Zd:HQX::9lLmHN<47Tk]dP;Vd>^IfCFHWKm@W]VX`=>n09k_`Kl=V9[P +W2m?7J33ZnS1[JDY3G1?g:3a0?^]cflmJ@eX49Udc4GKVkU2Y67WXPEY]RiK]R4ODWgk5VCK\6kc +PW@K]VgI^B4_;7EH\VGSePe;]bc8^GCUYWEka_RdN\]4AB>L2GbVm4Hjoj?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?;Ed35En4EeVofOe\7L1IKmhc[d`9o +0oZJHm>Kn1ek7iKFJ8?Pf^;RfU9db[IfaBX7CFLMP2J_bWo@\mX5lBm4aY;FocJ\8c8C@`[9PMUg6UBodHjYL_c[3Sg\SVgX +lEFG_1cEfSD0MoG3Z[jSgNU0OaU0iSAFdKbX`;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]@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:kX74d04hbh7ihLl?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?benPf5]d6K0Od4IfH1MU`=QkaomkGkRP1dPHK]T19WYM>f]bI8l>=hl +AadLj=`9cUi`=H0Q`:oGh;_T^Ro@o;KQf7dd^5DBUN7\oOlF5KF:]1M5VZ1;XUJCX0@^<43@9;k1 +HJVnQUjaJ?T4i1e\`ji7Ac;Q=9J@C0Q^[_V7@dd4SE9?[KiQCd?`0]: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[ +LSUjaN^WU5IJOE_ahQO?\7eOdf^mSjba>C?@LZmJ\Ro>E +V3?_W5i7@XdMllkQM0T6WKCK\CD3bYUX`?DOP`IQG_;RHMQNUj3RL2CebD6dg@Rh9l;HCUGPbVOP +:NRYVDo@;]S<2]d[2RaWJkO1o1dBHN5QoagPd9d;_[;FK3l9M@XCj=TeK4YAI;fKn43FP1A^3jYP: +1SUSd[I`e8LCkfCKORTiW>dK6SbU?FA6ZVRNVBYX]9`1T>4G=\bKiE5je: +>DC3D>E`[S9d1n5Uc]495d2fJDKK +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@1:b:f_MAZH=eabP]Yg:Y=4_OZLSU:j1\b^Nc0E]>VPcZ0e]2hRgl3Z^3F]R1YW[CM_=CTkRR9=8P=VKAlFj1ZaYFMJiQ +5O2kTg_[fF:a5?NoIRL2\AaDLe2c=FU1^`_V;:[oJ62SW9>\^?VPO@NbfjgAE1>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`jdabB9d2i;GWn_I^BlCIO6`794IWBmOaI:`B>ej3ZWO;UfSOZe?7fA=:NB=_Gedho1Sh4oR0L +OP_9V>9RdZHeNV8H`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_9o8I37Sf37R;Y2cX`ZMEknPUA +7C`PCgb3L?CJZ_B]i=oGnDbDc6MRPS7iUX5eIg3B?<01:lW4e?ikOoXfBBnOS^Z]6X0NdOmHj8J_ +PBFjP6TlF9ZUC:X0SLb +92Y`m:MPm`chaVaARC5Sci;Ag=5Ij8]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?lSh7fBBh1d;d;oXlKP1m1TbkPDIoh><`O0o7^m_ +W27SGY3a?lRhGjNIha6[5f;m@n`=9D84CKmo``W5g4\aoe? +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^=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=PTc9OU`h31LBc_GS@\:YOZQ_ +fO]3OCbW8m@gH_M2[7n83OEm?4ioZ6o5jZFHobVFe=]=U^gd`@AmWNZ2SURm4>\OIihW[DKOR1]m +`2F0W32M64oC`oAkJC[AO;;@=dc7VTLgnZ[F[42P0baMT4T_b;POI?`?PTb=?_2G8=0R]E;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=oT0UJ21Z[1gd:6ON2S?m19QV^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\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>5853f +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\i_9oP]];DDQhej@ +LCo8n1mT@_Hig6W^53;^1AWoXhg>XQLUncac=]TgH_M2[7j8m@nabKjCG27kj9F6I=n8g@^aoR4f +fOO=VFjD5:^GH_jWVGabGk6[_@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<^T56On3SXQLUnobZ=mTgH_M2[7j8m@nabKj_[B?kj:FLI=n8g@^aoR4ffGNkiFAOR]E;Gj0k5?8Y1MTg0lboPNIT7ehW8iTGhEK^2:5S7]1a_lP4aWB5bj5F?l@Vn]Kg;Vn5:^GH_jWV;Wnf0Fi?S3Fi_YF[5j:nImRLGeW6lCeSCP44W2Q +QU>h?X5=o]=5Ik:8@B>2?SR1m]=U3Y6o4kXEHoa0KjO_U3RaAR]E; +\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=3F2M8N=NT74ob?POI88=jGfM^HQSd\\anNLJ +co=<75>=2gS0=QcOi`JdMl_SDN23ofP5aOJkk3QR\fHUUM5nV0A3=Of\e0^4==Wb;PGI?`?<]JhgL3k6fO8^1MTo0lbe[RMCCA^EQ\k +@lJm8>=nT?4ob4CS<[d`I=`;<_i76id5VHXeh5Y8RcDlYj=HoLHJlO>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^oLHJQW]K4cI=`;<^h76On3C8`nd`]3a[dP +hgnddEV@ZDSWLYU5^Q6k5f;e@jaoR2gBmDi<@5\]e?Y6k5j8m@na]Kk[M6@QY5Rm5?]gmU4jfNea@@:VOB2S?]1a_lP4jg?m<:@LBo8n1m]M1IT:]:1Nl@R +7HdId^PK\G\QeSo4=_X>ETRTBk5j:NIoRVGd7NfKd@N^^]4gH_M2[7nL6HChAXG@6jOeLK> +T74_b;POI?`?_aWb7SGY3a?lSHj0oN];maQXak@LKo +86>SgmW4j6Ne\C=Tg0\bkPLIoh=9R21C7Y1a_dP +hgn@2MKgIja?d^G2nT[m42dTT4T_b?POI8ce9of<5Q;8Y1MTo0lba_ZMCK1nEQ\]Y919;lRh7fCl +3c;1nT`_31WgPXcodDIW@JIH7gR@hS0VV^H`Y +a>j5F?lhlkabNHbn4COjP0\mgf3d2FCB2c;^1aWoPdb_i?N=cX9g`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=<?M=;WXg0Bh9oS +:_]l0YWdPXck@LKo81>W47AI6Ym?89=NT?4ob=SWGi?__d6WT4T_b?POI6cd>i\Ho@\V733j53;Y +1AWgPhco@BI6WnV58N=NT?4of^P\b=CX0fm@cBT4oSDP\b +mOW0ollc2P7oOgnHIMQi9RmE;?>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:\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;?>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@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=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>=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\_W^Jo09929[dPhgn@\MJo>e`10BA=_=EB53;^1AWgPhco +@BIJWfm=hThQhej@lCoJj2ajD@4T80< +]OhHkDe80YWdPXco@LIJomBI=Ydl3VkC2FCB2c;^1aWoPdbd?_o_I]<9I=8;<_i76ie5;bZ016C7 +fA81:X04o7?X7Je?89=NT74ob?POI2:018ffEN\Cb:@GI?`?<]KjTM@B0H5XQLE@0;bmG6]S`XP0GM;>J3V025id`5I1nS< +LHfk[mE7>f_fj06W1k`NL5_[nkSFaf9\mHo]eoZ6C7Y1a_dPhgn@RMKgab?m]Ci77ZoeUC`>O@XI +mh:]Od10k?ACl[P5\3=Tg0\bkPLIoh=<]3h_SnM_2QWgPXcodDIW +dH]ZOIIOja^aNb5F?lCjQmQJgcTNB@ADiUofN=aoVElame;o9aKhDZiMRoZMH2lCn0F0O +M07H?f312L?^IMQJo`3fidF6]1B;j`<^]?\oebN@BBo8^1mTo0lbhOZPla]cO@:Im8:MAb;PGI?b?=SZ;GYC[0c9F +lOeL7o2Oi`6n1gS?mLfEAaPPPhRYB_h\`>0e0mh<23@00KKDP5^JWFa0\`7C1V@Snbhg`=G_3MS7 +]5`20MA85VOB2S?]1a_lP4jk_ +d4hRlDT;L7eW74FO@\Jm8>=oT4T6[_mX0lLjhISdLTcn>JIDglHVE7o]0PL`cI1a;lRh7fCl3c:Q +n\`^31WgPXcodDIW@JID?bTLAPX9IoY98N54?m3gX7]j8EYcYUiXa>j5F?l@6nNkFCUF;dDlco5l_V>5?6og +HIm_a7dnh48Yno\=0YWdPXck@LKo81>O3glla^M[a3Ro@B2CGY3a?lS4io]5M[m17M=NS\ToamCW +fmS4ionIaVl@b:@GI=`?<_h7VOQlIQN6S7]1a_mXXk\OH_]lYncS +ljEH_ACc?lGbnKhEc^L3ka;7ia^aNb7F?lhlkoASWfo4OCkP@Z^[ng`2VOB2S?]1a_lP4il?_cC3 +ib]CbCo7e>OKf=f;d@jamRngaO:NGcYERm5?o^lKW6k5k8MHocSa_ +DFFOKlBi9<03]Pd`^Ll=J4LVnMn0P@Z6[LH@N\II=lM`2KM;1V9ak@64jb1hYZ +o]_WRg6OCb2CGY1a?lSh7fCRln5FFYl_>MHnWd8V_B3SOi2acmoaN7oS31WgPXco@LI6_k>93^Dh +UZ:@LBo8^1mT[4PkH0PBRZIJ +IO@5YjE?8N=NT?4ob=SX=e?g=lj@LBo8n1mTK?@kVaSm[3IfQXak@LKm8>=oT8WAIgYQb;PGI?b? +=SX;^S4b=ZOB=f;lCjQmQJgdN:J7dYERo5o4na];kO_M?j +`5GGnTK\GXSeSc??bg]7ja]a[@lF=l3P09D3W0j@>l3b0=g5@Ph`H8:Y3kPa8C3[fWmZgBmE0]mJ0W0=nnWd_eNbXB]eK1bSeI`NdeNbiFUl4 +^06d?XEh9I=`;<_h76E?maS5Tg0\boPLIDogHlBO\63;^1AWgPhco +@BIDWkUSb;PGI?b?=SZ;>n7XH01kP>SghO83kF\BKo71=bj9\h9[dLTgn>2CMdCShi9hi9;lNTWf?bcc65Q]:_TThLTej>bCoG +N9IdJPb0Gc@<0V@>D=PK73]0k@?80e@>43m1N\o<[1Dh`X8;; +>Z25V3[PZh=UcAf\ +2HbQ8>R4H^jUV?\YiWn:MD0F?]d82ncl8^N\V7\YiWn:6ABjI\GLBc7oDlb@D3Mod\f:^IMRkZNH +obTF?_ImUFmFc;dDlcoAM1Hi\^o3k=;oVR_VGXZiWf;nYiQO:1HRRJ5G<_ +aOa?USeU\WbH7 +cjJa_Ia[NSaGh_e4S1N@CBKH=B_VGX[iWf8fak[iTfiFc;dDLco5o4nac95m\f;^YISoRJJc +bYTSh?oV23RC22?1l;ZS9WB\WK51EWfjoF;R1BL2S4e`>W[6dPL:7fEC7Vdhh4030OWAR8Bk:Hlb +<9\<;A1PBh0@Af_bHIN8dmN0>;N4R3aoUjaYef`ND3alS`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^j03DOOe0gce214SG`9>WT;VgIcalYHLn?gPma<@>=^B9?GC8RG]8TC<6 +1^lCI`8OYObX2o1A;S:_3W3E1ZL^dh]]]H^g:>A;:UPBI4V?aB^4fIBTlD11aM1Y6cRj1Kg0SB=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_CXdY_FEMlik`=n1?<5ecO\m0oKMGVGe_?dco\?3_mQSDMG7afkN?g; +UVU`obgKfoMaQenfi8;lDH;X5:DaikP_WZk<2N=:hDh?^Mle5NJO6TSLdJWFLPLZ=i1MQSVmWFbi +l`A3Dl:]4aL\bddcD:;Vdk_0DdjLGGRO]XOZD5jeLJ27o^b@:Z +\m;e8Dd>^>?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>5Kl`okX;Y +PCIH\LPI5M[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=:bhPbcU^Skm7Gb7Da_07=NUca`EJ:Fda`1d2RVF=Dg>7_F9SAjB]jTlH;ol=hnm87iSbY6iQGB`mT2 +5:G^heIVafiPZCiEY]M]=e1NXT9QKf94W4EM]Da;lZF3>jL0E0^h5JTbMS\IH\cch` +^enj\Jn@\\F[a?dZ=7PEEi:6^]RX@B@Tcj7kRmi1MYk?Gkg3nUMNUYk\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 +P=O[13aLhEbDmhD3Q5lgiQBA[E:Q5<^`KQdhO>_4jE^nf75d>Ej9AlDgMeYWIl4 +k9PNa=>dg0G7GcSNh5aXc7jK`=8ZUk[oigG]:gQOO?Ce^W13fTCb6n_E^65O6fj6OiFb[ekM^2SM +eHbVGOH2hi59Nfh7IGbEYOmTh9SMh1O\BF[P]IcgK6_ +^OZjIA4oD?O\JbPC4iWg\9j^a1kFdfgH8jSY@S`fjFj68DiBRV@XBH1JQ=JZ0Xc6MeWnj9Ed>3f6 +Gg^;ik3D@ci0df@PB8iYag0\Cc\2YOGiP6_MKmn9CLD=J=Xe7;T:\cbCUR^NRd5D=>6d +dPH2H`gf:C=M_2X3Plj0Y^E2`::HdHc:l@L@U2CKk_QjMnm`@fobL5>49Y2VF:^1emWS;\?>b84X +`a7[eV7lDFQ +Sch:@9lRN[SoNGcaQT=i=^2TdI=IGX62N8Rm;Ng[Bj2SdJ2_47H36N[o\2Jh0Ooc9Pd@RAcLEd=L +3mPcfUi@74=@cRhXGgn>J?AhOdl^P_foW:oaIFmnOCe00j1hlgPg:ok;nHcCfGheng8W[Ho_C:IcETEcPdZ57417Lj^@R_GaTOGU4gMTinj +_TBn;b:O?b^0dLb<^[?M]KncEdcd7lA`i>W>Ab`D_94@?7mZaCaNHV>oh2dNL9S[nkc7:`1lEI=;=]]f\Emf=AF`O;5E +1NDdC7eUdOWkeoe`<>aam]]0QWETH_T2ZJcY6m\55o]m]Oonh_61CIH3Bf@IQ4ef2i\_P]fbejC^C8KZ7AbLYe;`0VV@0`aI\9Q7dFSmdF1_dSUYHdUIDA3okIjijW@ddEcd94KfYnWnL]H;>LHhNXiZlGlJ7 +7IW@4cJ@I0XF28PSd?el3TKL;aQFdPLj`fdZm5_2S +DX32M]Koh;O]l<>8GeG3_jkn3cF9BX10kkbGd2>aj_AY?iD2R`11bDPB5FQEmUJD@DhHJVUO7WdB +?QEF4MmiF5:e_MbBSPfb0T?4\`S\oce`jba@V>WVbJMHVKf;P>NfbSV>8YiCPC5hRk835h?83mfkQQXC[J^ +FcCkg:`IHcZ=70nabPY3\^2c +Hj38k7XLaQCDM5`LgSe?=Q6ajRo4gRSV>HYjSf>\\cNgBYG?L:e0]`Jh6Pb9dZE0R@oT=YCl47W7fA=eCYCY`lCOZT25BPD?Q3_AMUOUAg +D]A;;CL]o9A^E:YCJEJUN9DnE^aJSGD3[0;l3A0l`?T1mhCh`8<>05@=j37Pb8<`0cNL<^3`LD7A1e@=L1JHfkkX300`h?J3aPlX3P1[`O\7W1l`7C=kShP +A8U12fhE:58TOhPCT74_b;POI?`?=oT76oCS=W>Y];O4[jbE8D<^h56ON3S?m19P5nL;oZDcg^53;^1AWoXhg>XQL=<6=2 +RF6EOTlhPERm4:\OH_e3k0d_QRe:Z\OHVlX4B9Xn_dKCRSVGX[iWf;^ +ebef`@03B_SS4hCg8[`OhOnn1LS1oC[FiUhame;J3VP:03VPk8>Z3\ +P;S6gGM0hP6?1e@N\7U0J +T7eG6cb0?T?6_B3SOi0afOmZEGoS31WgPXco@LITonLW1k3cYccC;DDQhej@LCo8n1mT@_Iiogo^ +53;^1AWoXhg>XQLUnebh=MTgH_M2[7j8m@nabKiSm\m?m]TK;U\NkklgE89=NT?4ob9S][a=EZQ?8Y1MTo0lbI_\k]YKZI=i8ZDhPTej@LCo8n1mT`_KiiUVYCR2CGY3a +?m[X;7YA]\m3Kk=m8gH_a>Z7F?l@VndkORFYSSKm:=F=f;d@jamRTggOZ4_fYERm5?20Qg3OKYcd791e@eKS33UP[eWeg +P5PoF;mD=mbmhOj^?9iY>5_V4jeSbjdENeIPD27F3YPTaj@LKm8>=oT8WA +mfJSCh8l=_[Za_KBIlRh5fCl3c8fnU\Gk6nL8N=NT?4ob=SXMcHanUU]k0`Imh: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]ML4aj +>BKo75>OKf=nT?4obl?WDOcnc2T74_b?POKG@FI>[cPBL:io?ADbmm_Q6k5f;m@fbOkdfkO;hDZiMRoZMH +?]mKXoUlh:oBn7`SMRo4n\NIieFmk?>=^1<5n=oT8TC1OLKM6DO9hY09[dPhgn@\LmoL<]o9hY29[dPhgn@\M6o:94CADcERB:@BBo8^1mT +o0lb=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?aO7k2oLHJ`K +\G\QeSo49_^n>M>=TV;eD\co53?I?gNm=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;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 +0njJQLhP\b=OZYkV4?lUf]fYoZMTaj>BKm79=oSVT8_>mUoB7KkgOVanX_3P3o +\SlEh;=Sd\\anNNH>VZ8gogg@mH9b;PGI?`?^o4Z@6\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\WnZ2VT74_b;POI?`?\3UoTnPERm4>\OIiiG +k8;F=n8R7G2Q;K6e?X5?cUk0Je?8I=NT74ob?POI:;e^FYEOe?8^1MTo8lf>X]NE:@3Gak7j:dl505fCB2c;^1aWoPdb< +_[]ocFodNFYeXjoo]4jO8N=NT?4ob=SX9f7g=lj@LBo8n1mTK?@kVaSm[3IfQXak@LKm8>=oT8WA +IgYQb;PGI?b?=SX;QWNSJA@\Jm8>=nT?4ob4C[>o@E4H96f:;e5GNJ +V40PTej@lCo8F>]o75e<8919;lSh7fB\mC^KJ?f\]YQ08I=NT74ob?POI:;eVEhH<^h56OnSSLj2 +C4DjL8mHY:P\b=O[0ckne2ZW7_bcA_OlN +_f;^YISo:FJWol9f[e2:eD\aoe?U6k5j8m@naXKk3i@3YDZaNR_VOHU5A +PS619HLaQMRm4>\OIiiG;XoA=n967g2Qia^ldDM_ +GcCjA^aNR?D?\Hfn0fDanU:\GX[iWf8IOHM?IoB1ZfkdSMRm4>\OIihG[hkA=n967k3?0g`?l=kX +V`lk`X0A0bceb80\Z^0e0mh0\@LP\D\=^:GIb@Hd6h2TcSFVWgKj2_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>ZJm79=oSZW?]k69ccmX_D4WT4T_b;POI?`?<_7ic2h<6ON2 +S?oAAVM1YShOn?miAR7P?`HM`9CMg?g6OP<>jPeOm1]T9`]5dQZgbooGi7_aP?\[Wdc[@k_>mhg40nP`Imh:?f=Y^=oXk7;DDQhej@LCo8n1mTH_Bi@43^53;^1AWoXhg>XQLenQgQ\2jahC5RmD:\OXSe +3k6e_V=oT8WFMe6kT>A[ +YoEEX6h0nP`Imh: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=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\3;QC_gH3SLKBn89=N +T74ob?POI:;eGB6NeZLIfVYmiNEFnP`Imh:=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:\OhR]mEdaX]I7PjKEnTK\GXSe3k6e_We^ +[Bo5jZFHobVFeWN84EXO^>YJghSM2k7nLNIi>ZoF=n9J7g2QoUf\K0XImh:hMk`E21I20OcK8XOD9I=8;<^h76On3C0B@X4mWJWd2VOB2S?m1aUYoUa1JWd0V +_B3SOi2ae]lcVmHW]BM`YI=`;<_i76ie5;bZ016BP0`98`55C:B`26ON2S?]1a_lP4`4TjX5c +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:Z_GN00YQTbkPDI +mh>\OH^=l=f\V +8dZaNRWVOhZU5oYI=oT8W? +mfNOCj;=l_UjF[00OHJ1]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?>=^;chIMVn7aU:^Kc2FCB2c;n1iWhO?n\ko>YHm[;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=P3UkfodLM>A:=_a>j5F?l@6dSRoT0B +m`NB^3n@a4IO\VbS3b:i@AMRmd:\OiaigPj3[Qd67C1NH<1AM^lN<2h72LF@JBo8^1mTo0lb +68:4XZUF6Gg1JNUCb;PGI?`?9THoZhfM8N=NT74ob?POI6;dVEhH +<^h56OnSSLj2C4TX;U:LQ39Rmd:\OXSe3k6e_Q\Ud?[Xa8QJghSM2k7n8KKFmi4RFUn:eD\aoe<\ +[Nmgkk@nL=Fe_Q6k5f;mhlccl]kAnTILjh?53C0h@>D0Y`?T3[0l@7NaT0<V3TPih2OO]m;=C^ZD_OF0D[mf@5] +=G^^eQL1KP2]Cb6CGY1a?lSh7fBRmK4[?H@5UW\26ON2S?m1aUBoL@`Imh:=oT0WEInhH<^h56OnSSLkRCSPjf02>KYd_ePFacLljhBjoiB4\9mcS]ia`6;@M?QSX9WHF +]5G@AT7kQ5ob?7\HcX?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<2b3VQQS0Ke7VkCEIbRgNHl0`XiACnBR[JKIeU5HjZNNIaa_g>B;AGedAJ\nDfYj:<3YPkh +jV1IL`M[0Vk?\`^oBoiXZiUf;^YiSo:NHGRXD83?dbj:bHNbWVOhXI +5;YVaMa;0dH=B3GPeH1J0gIYM[01aFRnXn5lMm?\L@0O43@C;_01[d5KP8>H8n0filbA5J^GH^jWV?lY +IWIH=goBcHZiUf;^YiSo:IHi\VmFc;dDlcoAM=HiL`Al +\i`i\V;eD\cm5?~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 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 -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 Binary files /dev/null and b/systems/msdos/texshell/temesy18.lzh 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 Binary files /dev/null and b/systems/msdos/text2dvi/text2dvi.tbl 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. + + + Copyright (C) 19yy + + 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. + + , 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 + +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 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 Binary files /dev/null and b/systems/msdos/tx/src/spawns.lib 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 +#include +#include +#include +#include +#include +#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 +#include +#include +#include +#include +#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 + +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],"") ; + 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 + +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 +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 +#include + +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 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 -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 oder ), 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 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 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 Binary files /dev/null and b/systems/msdos/utilities/vfcomb/vfc-eng.pdf 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 Binary files /dev/null and b/systems/msdos/vga2mf/cp437.ega differ diff --git a/systems/msdos/vga2mf/cp437.vga b/systems/msdos/vga2mf/cp437.vga new file mode 100644 index 0000000000..0f3cbdf6e1 Binary files /dev/null and b/systems/msdos/vga2mf/cp437.vga differ diff --git a/systems/msdos/vga2mf/cp850.ega b/systems/msdos/vga2mf/cp850.ega new file mode 100644 index 0000000000..cc9d30e743 Binary files /dev/null and b/systems/msdos/vga2mf/cp850.ega differ diff --git a/systems/msdos/vga2mf/cp850.vga b/systems/msdos/vga2mf/cp850.vga new file mode 100644 index 0000000000..a671c011bd Binary files /dev/null and b/systems/msdos/vga2mf/cp850.vga differ diff --git a/systems/msdos/vga2mf/cp860.ega b/systems/msdos/vga2mf/cp860.ega new file mode 100644 index 0000000000..f34860c8fb Binary files /dev/null and b/systems/msdos/vga2mf/cp860.ega differ diff --git a/systems/msdos/vga2mf/cp860.vga b/systems/msdos/vga2mf/cp860.vga new file mode 100644 index 0000000000..62dc3c4918 Binary files /dev/null and b/systems/msdos/vga2mf/cp860.vga differ diff --git a/systems/msdos/vga2mf/cp863.ega b/systems/msdos/vga2mf/cp863.ega new file mode 100644 index 0000000000..b7af7087b9 Binary files /dev/null and b/systems/msdos/vga2mf/cp863.ega differ diff --git a/systems/msdos/vga2mf/cp863.vga b/systems/msdos/vga2mf/cp863.vga new file mode 100644 index 0000000000..3df505acea Binary files /dev/null and b/systems/msdos/vga2mf/cp863.vga differ diff --git a/systems/msdos/vga2mf/cp865.ega b/systems/msdos/vga2mf/cp865.ega new file mode 100644 index 0000000000..cd8fd74f0e Binary files /dev/null and b/systems/msdos/vga2mf/cp865.ega differ diff --git a/systems/msdos/vga2mf/cp865.vga b/systems/msdos/vga2mf/cp865.vga new file mode 100644 index 0000000000..53e16afbff Binary files /dev/null and b/systems/msdos/vga2mf/cp865.vga differ diff --git a/systems/msdos/vga2mf/cp880dv.ega b/systems/msdos/vga2mf/cp880dv.ega new file mode 100644 index 0000000000..de81013caf Binary files /dev/null and b/systems/msdos/vga2mf/cp880dv.ega differ diff --git a/systems/msdos/vga2mf/cp880dv.vga b/systems/msdos/vga2mf/cp880dv.vga new file mode 100644 index 0000000000..262f6ad283 Binary files /dev/null and b/systems/msdos/vga2mf/cp880dv.vga 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 +#include + + + +/* 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 +#include + + + +/* 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 -- cgit v1.2.3