From f5cf24f11bc3d1ad221b9fc4cc0fc1930a996218 Mon Sep 17 00:00:00 2001 From: Andrew Hyatt Date: Sat, 19 Nov 2016 17:11:38 -0800 Subject: [PATCH] Initial commit --- BUG-REPORT | 55 + COPYING | 340 + ChangeLog | 5253 ++++++++ ChangeLog.115 | 6147 +++++++++ ChangeLog.116 | 1388 +++ ChangeLog.117 | 2190 ++++ ChangeLog.118 | 3794 ++++++ FDL | 397 + INSTALL | 50 + INSTALL.gen | 231 + LICENSE | 21 + MANIFEST | 164 + MORE.STUFF | 198 + Makefile | 25 + Makefile.ccpg | 33 + Makefile.comm | 304 + Makefile.cpg | 27 + Makefile.dev | 4 + Makefile.in | 776 ++ Makefile.init | 25 + Makefile.lib | 20 + Makefile.man | 5 + Makefile.sub | 35 + NEWS | 2307 ++++ PROBLEMS | 916 ++ PROJECTS | 14 + README | 134 + README.MinGW | 277 + REVISION | 1 + TODO | 25 + VERSION | 1 + aclocal.m4 | 1152 ++ arch/djgpp/README | 346 + arch/djgpp/config.bat | 95 + arch/djgpp/config.sed | 16 + arch/djgpp/config.site | 33 + arch/djgpp/t-groff.bat | 64 + arch/misc/Makefile.sub | 27 + arch/misc/shdeps.sh | 118 + configure | 11663 +++++++++++++++++ configure.ac | 126 + contrib/eqn2graph/Makefile.sub | 19 + contrib/eqn2graph/eqn2graph.man | 115 + contrib/eqn2graph/eqn2graph.sh | 91 + contrib/gdiffmk/ChangeLog | 63 + contrib/gdiffmk/Makefile.sub | 47 + contrib/gdiffmk/README | 46 + contrib/gdiffmk/gdiffmk.man | 281 + contrib/gdiffmk/gdiffmk.sh | 346 + contrib/gdiffmk/tests/file1 | 11 + contrib/gdiffmk/tests/file2 | 11 + contrib/gdiffmk/tests/runtests.in | 98 + contrib/gdiffmk/tests/test_baseline | 17 + contrib/gdiffmk/tests/test_baseline10 | 26 + contrib/gdiffmk/tests/test_baseline6 | 17 + contrib/gdiffmk/tests/test_baseline7 | 2 + contrib/gdiffmk/tests/test_baseline8 | 26 + contrib/gdiffmk/tests/test_baseline9 | 26 + contrib/grap2graph/Makefile.sub | 19 + contrib/grap2graph/grap2graph.man | 105 + contrib/grap2graph/grap2graph.sh | 85 + contrib/groffer/ChangeLog | 1546 +++ contrib/groffer/Makefile.sub | 60 + contrib/groffer/README | 104 + contrib/groffer/README_SH | 268 + contrib/groffer/TODO | 58 + contrib/groffer/groffer.man | 4018 ++++++ contrib/groffer/groffer.sh | 299 + contrib/groffer/groffer2.sh | 5854 +++++++++ contrib/mm/ChangeLog | 679 + contrib/mm/Makefile.sim | 66 + contrib/mm/Makefile.sub | 62 + contrib/mm/NOTES | 105 + contrib/mm/README | 31 + contrib/mm/examples/APP | 352 + contrib/mm/examples/B1B2 | 91 + contrib/mm/examples/COVER | 235 + contrib/mm/examples/IND | 4191 +++++++ contrib/mm/examples/LT | 1058 ++ contrib/mm/examples/LT.se | 1062 ++ contrib/mm/examples/ML | 169 + contrib/mm/examples/MOVE | 175 + contrib/mm/examples/MUL | 535 + contrib/mm/examples/NCOL | 196 + contrib/mm/examples/ND | 17 + contrib/mm/examples/README | 32 + contrib/mm/examples/References | 975 ++ contrib/mm/examples/SETR | 109 + contrib/mm/groff_mm.man | 2104 ++++ contrib/mm/groff_mmse.man | 86 + contrib/mm/m.tmac | 3536 ++++++ contrib/mm/mm.tmac | 3 + contrib/mm/mm/0.MT | 146 + contrib/mm/mm/4.MT | 82 + contrib/mm/mm/5.MT | 34 + contrib/mm/mm/ms.cov | 84 + contrib/mm/mm/se_ms.cov | 3 + contrib/mm/mmroff.man | 49 + contrib/mm/mmroff.pl | 137 + contrib/mm/mmse.tmac | 3 + contrib/mm/mse.tmac | 184 + contrib/mom/BUGS | 317 + contrib/mom/ChangeLog | 812 ++ contrib/mom/Makefile.sub | 138 + contrib/mom/NEWS | 446 + contrib/mom/TODO | 25 + contrib/mom/copyright | 24 + contrib/mom/examples/README.txt | 115 + contrib/mom/examples/elvis_syntax | 90 + contrib/mom/examples/elvis_syntax.new | 106 + contrib/mom/examples/letter.mom | 34 + contrib/mom/examples/penguin.ps | 461 + contrib/mom/examples/sample_docs.mom | 574 + contrib/mom/examples/typesetting.mom | 673 + contrib/mom/groff_mom.man | 101 + contrib/mom/mom.tmac | 3 + contrib/mom/momdoc/appendices.html | 692 ++ contrib/mom/momdoc/color.html | 338 + contrib/mom/momdoc/cover.html | 512 + contrib/mom/momdoc/definitions.html | 768 ++ contrib/mom/momdoc/docelement.html | 5041 ++++++++ contrib/mom/momdoc/docprocessing.html | 2484 ++++ contrib/mom/momdoc/goodies.html | 1057 ++ contrib/mom/momdoc/headfootpage.html | 1636 +++ contrib/mom/momdoc/inlines.html | 802 ++ contrib/mom/momdoc/intro.html | 405 + contrib/mom/momdoc/letters.html | 463 + contrib/mom/momdoc/macrolist.html | 1794 +++ contrib/mom/momdoc/rectoverso.html | 253 + contrib/mom/momdoc/refer.html | 1482 +++ contrib/mom/momdoc/reserved.html | 2200 ++++ contrib/mom/momdoc/toc.html | 329 + contrib/mom/momdoc/typemacdoc.html | 235 + contrib/mom/momdoc/typesetting.html | 4189 +++++++ contrib/mom/momdoc/using.html | 230 + contrib/mom/om.tmac | 15889 ++++++++++++++++++++++++ contrib/pdfmark/ChangeLog | 137 + contrib/pdfmark/Makefile.sub | 112 + contrib/pdfmark/PROBLEMS | 25 + contrib/pdfmark/README | 50 + contrib/pdfmark/TODO | 53 + contrib/pdfmark/cover.ms | 57 + contrib/pdfmark/pdfmark.ms | 2531 ++++ contrib/pdfmark/pdfmark.tmac | 1562 +++ contrib/pdfmark/pdfroff.man | 552 + contrib/pdfmark/pdfroff.sh | 572 + contrib/pdfmark/spdf.tmac | 225 + contrib/pic2graph/Makefile.sub | 19 + contrib/pic2graph/pic2graph.man | 140 + contrib/pic2graph/pic2graph.sh | 101 + doc/Makefile.in | 150 + doc/Makefile.sub | 233 + doc/fdl.texi | 452 + doc/fixinfo.sh | 46 + doc/gnu.eps | 1018 ++ doc/gnu.png | Bin 0 -> 7260 bytes doc/gnu.xpm | 198 + doc/grnexmpl.g | 3250 +++++ doc/grnexmpl.me | 84 + doc/groff | 301 + doc/groff-1 | 8695 +++++++++++++ doc/groff-2 | 4910 ++++++++ doc/groff-3 | Bin 0 -> 145423 bytes doc/groff.css | 17 + doc/groff.texinfo | 15797 +++++++++++++++++++++++ doc/meintro.me | 2243 ++++ doc/meref.me | 2223 ++++ doc/pic.ms | 2982 +++++ doc/texinfo.tex | 7086 +++++++++++ doc/webpage.ms | 1832 +++ font/devX100-12/CB | 213 + font/devX100-12/CBI | 213 + font/devX100-12/CI | 213 + font/devX100-12/CR | 213 + font/devX100-12/DESC | 9 + font/devX100-12/HB | 213 + font/devX100-12/HBI | 213 + font/devX100-12/HI | 213 + font/devX100-12/HR | 213 + font/devX100-12/Makefile.sub | 2 + font/devX100-12/NB | 213 + font/devX100-12/NBI | 213 + font/devX100-12/NI | 213 + font/devX100-12/NR | 213 + font/devX100-12/S | 221 + font/devX100-12/TB | 213 + font/devX100-12/TBI | 213 + font/devX100-12/TI | 213 + font/devX100-12/TR | 213 + font/devX100/CB | 213 + font/devX100/CBI | 213 + font/devX100/CI | 213 + font/devX100/CR | 213 + font/devX100/DESC | 9 + font/devX100/HB | 213 + font/devX100/HBI | 213 + font/devX100/HI | 213 + font/devX100/HR | 213 + font/devX100/Makefile.sub | 2 + font/devX100/NB | 213 + font/devX100/NBI | 213 + font/devX100/NI | 213 + font/devX100/NR | 213 + font/devX100/S | 221 + font/devX100/TB | 213 + font/devX100/TBI | 213 + font/devX100/TI | 213 + font/devX100/TR | 213 + font/devX75-12/CB | 213 + font/devX75-12/CBI | 213 + font/devX75-12/CI | 213 + font/devX75-12/CR | 213 + font/devX75-12/DESC | 9 + font/devX75-12/HB | 213 + font/devX75-12/HBI | 213 + font/devX75-12/HI | 213 + font/devX75-12/HR | 213 + font/devX75-12/Makefile.sub | 2 + font/devX75-12/NB | 213 + font/devX75-12/NBI | 213 + font/devX75-12/NI | 213 + font/devX75-12/NR | 213 + font/devX75-12/S | 221 + font/devX75-12/TB | 213 + font/devX75-12/TBI | 213 + font/devX75-12/TI | 213 + font/devX75-12/TR | 213 + font/devX75/CB | 213 + font/devX75/CBI | 213 + font/devX75/CI | 213 + font/devX75/CR | 213 + font/devX75/DESC | 9 + font/devX75/HB | 213 + font/devX75/HBI | 213 + font/devX75/HI | 213 + font/devX75/HR | 213 + font/devX75/Makefile.sub | 2 + font/devX75/NB | 213 + font/devX75/NBI | 213 + font/devX75/NI | 213 + font/devX75/NR | 213 + font/devX75/S | 221 + font/devX75/TB | 213 + font/devX75/TBI | 213 + font/devX75/TI | 213 + font/devX75/TR | 213 + font/devascii/DESC.proto | 8 + font/devascii/Makefile.sub | 31 + font/devascii/R.proto | 190 + font/devcp1047/DESC.proto | 8 + font/devcp1047/Makefile.sub | 32 + font/devcp1047/R.proto | 322 + font/devdvi/CW | 152 + font/devdvi/CWEC | 280 + font/devdvi/CWI | 152 + font/devdvi/CWIEC | 281 + font/devdvi/CWITC | 138 + font/devdvi/CWTC | 137 + font/devdvi/DESC.in | 11 + font/devdvi/EX | 143 + font/devdvi/HB | 297 + font/devdvi/HBEC | 2078 ++++ font/devdvi/HBI | 298 + font/devdvi/HBIEC | 2079 ++++ font/devdvi/HBITC | 138 + font/devdvi/HBTC | 137 + font/devdvi/HI | 298 + font/devdvi/HIEC | 2079 ++++ font/devdvi/HITC | 138 + font/devdvi/HR | 297 + font/devdvi/HREC | 2078 ++++ font/devdvi/HRTC | 137 + font/devdvi/MI | 136 + font/devdvi/Makefile.sub | 23 + font/devdvi/S | 149 + font/devdvi/SA | 141 + font/devdvi/SB | 132 + font/devdvi/SC | 137 + font/devdvi/TB | 348 + font/devdvi/TBEC | 2306 ++++ font/devdvi/TBI | 354 + font/devdvi/TBIEC | 2765 +++++ font/devdvi/TBITC | 138 + font/devdvi/TBTC | 137 + font/devdvi/TI | 355 + font/devdvi/TIEC | 2765 +++++ font/devdvi/TITC | 138 + font/devdvi/TR | 431 + font/devdvi/TREC | 2306 ++++ font/devdvi/TRTC | 137 + font/devdvi/generate/CompileFonts | 15 + font/devdvi/generate/Makefile | 206 + font/devdvi/generate/ec.map | 255 + font/devdvi/generate/msam.map | 127 + font/devdvi/generate/msbm.map | 121 + font/devdvi/generate/tc.map | 80 + font/devdvi/generate/texb.map | 128 + font/devdvi/generate/texex.map | 100 + font/devdvi/generate/texi.map | 128 + font/devdvi/generate/texmi.map | 46 + font/devdvi/generate/texr.map | 128 + font/devdvi/generate/texsy.map | 127 + font/devdvi/generate/textex.map | 34 + font/devdvi/generate/textt.map | 128 + font/devhtml/DESC.proto | 12 + font/devhtml/Makefile.sub | 34 + font/devhtml/R.proto | 746 ++ font/devlatin1/DESC.proto | 8 + font/devlatin1/Makefile.sub | 32 + font/devlatin1/R.proto | 322 + font/devlbp/CB | 216 + font/devlbp/CI | 216 + font/devlbp/CR | 216 + font/devlbp/DESC.in | 9 + font/devlbp/EB | 216 + font/devlbp/EI | 216 + font/devlbp/ER | 216 + font/devlbp/HB | 400 + font/devlbp/HBI | 401 + font/devlbp/HI | 401 + font/devlbp/HNB | 400 + font/devlbp/HNBI | 400 + font/devlbp/HNI | 400 + font/devlbp/HNR | 400 + font/devlbp/HR | 400 + font/devlbp/Makefile.sub | 21 + font/devlbp/TB | 422 + font/devlbp/TBI | 402 + font/devlbp/TI | 430 + font/devlbp/TR | 426 + font/devlj4/AB | 428 + font/devlj4/ABI | 428 + font/devlj4/AI | 426 + font/devlj4/ALBB | 756 ++ font/devlj4/ALBR | 771 ++ font/devlj4/AOB | 720 ++ font/devlj4/AOI | 782 ++ font/devlj4/AOR | 708 ++ font/devlj4/AR | 430 + font/devlj4/CB | 330 + font/devlj4/CBI | 331 + font/devlj4/CI | 331 + font/devlj4/CLARENDON | 331 + font/devlj4/CORONET | 332 + font/devlj4/CR | 330 + font/devlj4/DESC.in | 9 + font/devlj4/GB | 718 ++ font/devlj4/GBI | 718 ++ font/devlj4/GI | 653 + font/devlj4/GR | 836 ++ font/devlj4/LGB | 330 + font/devlj4/LGI | 331 + font/devlj4/LGR | 330 + font/devlj4/MARIGOLD | 331 + font/devlj4/Makefile.sub | 41 + font/devlj4/OB | 784 ++ font/devlj4/OBI | 776 ++ font/devlj4/OI | 887 ++ font/devlj4/OR | 863 ++ font/devlj4/S | 319 + font/devlj4/SYMBOL | 220 + font/devlj4/TB | 953 ++ font/devlj4/TBI | 1006 ++ font/devlj4/TI | 1090 ++ font/devlj4/TNRB | 444 + font/devlj4/TNRBI | 433 + font/devlj4/TNRI | 450 + font/devlj4/TNRR | 436 + font/devlj4/TR | 843 ++ font/devlj4/UB | 797 ++ font/devlj4/UBI | 748 ++ font/devlj4/UCB | 758 ++ font/devlj4/UCBI | 666 + font/devlj4/UCI | 806 ++ font/devlj4/UCR | 727 ++ font/devlj4/UI | 950 ++ font/devlj4/UR | 848 ++ font/devlj4/WINGDINGS | 230 + font/devlj4/generate/Makefile | 266 + font/devlj4/generate/special.awk | 82 + font/devlj4/generate/special.map | 271 + font/devlj4/generate/symbol.map | 199 + font/devlj4/generate/text.map | 845 ++ font/devlj4/generate/wingdings.map | 233 + font/devps/AB | 492 + font/devps/ABI | 493 + font/devps/AI | 493 + font/devps/AR | 492 + font/devps/BMB | 346 + font/devps/BMBI | 349 + font/devps/BMI | 342 + font/devps/BMR | 338 + font/devps/CB | 281 + font/devps/CBI | 282 + font/devps/CI | 282 + font/devps/CR | 281 + font/devps/DESC.in | 11 + font/devps/EURO | 19 + font/devps/HB | 481 + font/devps/HBI | 482 + font/devps/HI | 521 + font/devps/HNB | 481 + font/devps/HNBI | 482 + font/devps/HNI | 521 + font/devps/HNR | 520 + font/devps/HR | 520 + font/devps/Makefile.sub | 38 + font/devps/NB | 392 + font/devps/NBI | 510 + font/devps/NI | 453 + font/devps/NR | 440 + font/devps/PB | 370 + font/devps/PBI | 376 + font/devps/PI | 375 + font/devps/PR | 377 + font/devps/S | 229 + font/devps/SS | 194 + font/devps/TB | 460 + font/devps/TBI | 443 + font/devps/TI | 456 + font/devps/TR | 448 + font/devps/ZCMI | 403 + font/devps/ZD | 207 + font/devps/ZDR | 207 + font/devps/download | 6 + font/devps/freeeuro.afm | 34 + font/devps/freeeuro.pfa | 316 + font/devps/generate/Makefile | 239 + font/devps/generate/afmname | 44 + font/devps/generate/dingbats.map | 5 + font/devps/generate/dingbats.rmap | 4 + font/devps/generate/freeeuro.sfd | 610 + font/devps/generate/lgreekmap | 31 + font/devps/generate/sfdtopfa.pe | 9 + font/devps/generate/symbol.sed | 33 + font/devps/generate/symbolchars | 65 + font/devps/generate/symbolsl.afm | 203 + font/devps/generate/textmap | 374 + font/devps/prologue.ps | 255 + font/devps/psstrip.sed | 7 + font/devps/symbol.afm | 212 + font/devps/symbolmap | 442 + font/devps/symbolsl.ps | 41 + font/devps/text.enc | 236 + font/devps/zapfdr.afm | 222 + font/devps/zapfdr.ps | 225 + font/devutf8/DESC.proto | 8 + font/devutf8/Makefile.sub | 32 + font/devutf8/NOTES | 53 + font/devutf8/R.proto | 819 ++ gendef.sh | 34 + install-sh | 323 + man/Makefile.sub | 10 + man/ditroff.man | 201 + man/groff.man | 3564 ++++++ man/groff_char.man | 1422 +++ man/groff_diff.man | 3848 ++++++ man/groff_font.man | 660 + man/groff_out.man | 2106 ++++ man/groff_tmac.man | 1282 ++ man/roff.man | 1278 ++ mdate.sh | 42 + mkinstalldirs | 158 + src/devices/grodvi/Makefile.sub | 6 + src/devices/grodvi/dvi.cpp | 978 ++ src/devices/grodvi/grodvi.man | 434 + src/devices/grohtml/Makefile.sub | 18 + src/devices/grohtml/grohtml.man | 293 + src/devices/grohtml/html-table.cpp | 783 ++ src/devices/grohtml/html-table.h | 132 + src/devices/grohtml/html-text.cpp | 1047 ++ src/devices/grohtml/html-text.h | 133 + src/devices/grohtml/html.h | 96 + src/devices/grohtml/output.cpp | 367 + src/devices/grohtml/post-html.cpp | 5053 ++++++++ src/devices/grolbp/Makefile.sub | 6 + src/devices/grolbp/charset.h | 69 + src/devices/grolbp/grolbp.man | 336 + src/devices/grolbp/lbp.cpp | 725 ++ src/devices/grolbp/lbp.h | 546 + src/devices/grolj4/Makefile.sub | 7 + src/devices/grolj4/grolj4.man | 152 + src/devices/grolj4/lj4.cpp | 708 ++ src/devices/grolj4/lj4_font.man | 167 + src/devices/grops/Makefile.sub | 12 + src/devices/grops/TODO | 24 + src/devices/grops/grops.man | 1170 ++ src/devices/grops/ps.cpp | 1881 +++ src/devices/grops/ps.h | 129 + src/devices/grops/psfig.diff | 106 + src/devices/grops/psrm.cpp | 1178 ++ src/devices/grotty/Makefile.sub | 6 + src/devices/grotty/TODO | 3 + src/devices/grotty/grotty.man | 423 + src/devices/grotty/tty.cpp | 907 ++ src/devices/xditview/ChangeLog | 542 + src/devices/xditview/DESC.in | 9 + src/devices/xditview/Dvi.c | 611 + src/devices/xditview/Dvi.h | 46 + src/devices/xditview/DviP.h | 233 + src/devices/xditview/FontMap | 17 + src/devices/xditview/GXditview.ad | 57 + src/devices/xditview/Makefile.sub | 47 + src/devices/xditview/Menu.h | 46 + src/devices/xditview/README | 13 + src/devices/xditview/TODO | 17 + src/devices/xditview/ad2c | 64 + src/devices/xditview/device.c | 565 + src/devices/xditview/device.h | 21 + src/devices/xditview/draw.c | 699 ++ src/devices/xditview/font.c | 442 + src/devices/xditview/gray1.bm | 4 + src/devices/xditview/gray2.bm | 4 + src/devices/xditview/gray3.bm | 4 + src/devices/xditview/gray4.bm | 4 + src/devices/xditview/gray5.bm | 4 + src/devices/xditview/gray6.bm | 4 + src/devices/xditview/gray7.bm | 4 + src/devices/xditview/gray8.bm | 4 + src/devices/xditview/gxditview.man | 410 + src/devices/xditview/lex.c | 96 + src/devices/xditview/page.c | 82 + src/devices/xditview/parse.c | 366 + src/devices/xditview/xdit.bm | 14 + src/devices/xditview/xdit_mask.bm | 14 + src/devices/xditview/xditview.c | 657 + src/include/DviChar.h | 37 + src/include/Makefile.sub | 50 + src/include/XFontName.h | 50 + src/include/assert.h | 39 + src/include/cmap.h | 56 + src/include/color.h | 96 + src/include/config.hin | 217 + src/include/cset.h | 75 + src/include/device.h | 21 + src/include/driver.h | 36 + src/include/errarg.h | 47 + src/include/error.h | 59 + src/include/font.h | 124 + src/include/geometry.h | 27 + src/include/getopt.h | 227 + src/include/getopt_int.h | 131 + src/include/gettext.h | 4 + src/include/html-strings.h | 27 + src/include/htmlhint.h | 37 + src/include/index.h | 42 + src/include/lib.h | 170 + src/include/macropath.h | 23 + src/include/nonposix.h | 231 + src/include/paper.h | 37 + src/include/posix.h | 67 + src/include/printer.h | 107 + src/include/ptable.h | 172 + src/include/refid.h | 35 + src/include/relocate.h | 27 + src/include/search.h | 96 + src/include/searchpath.h | 32 + src/include/stringclass.h | 196 + src/include/symbol.h | 83 + src/include/unicode.h | 26 + src/libs/libbib/Makefile.sub | 14 + src/libs/libbib/common.cpp | 38 + src/libs/libbib/index.cpp | 640 + src/libs/libbib/linear.cpp | 503 + src/libs/libbib/map.c | 86 + src/libs/libbib/search.cpp | 133 + src/libs/libdriver/Makefile.sub | 7 + src/libs/libdriver/input.cpp | 1835 +++ src/libs/libdriver/printer.cpp | 267 + src/libs/libgroff/Makefile.sub | 126 + src/libs/libgroff/assert.cpp | 34 + src/libs/libgroff/change_lf.cpp | 37 + src/libs/libgroff/cmap.cpp | 56 + src/libs/libgroff/color.cpp | 429 + src/libs/libgroff/cset.cpp | 104 + src/libs/libgroff/device.cpp | 36 + src/libs/libgroff/errarg.cpp | 128 + src/libs/libgroff/error.cpp | 142 + src/libs/libgroff/fatal.cpp | 27 + src/libs/libgroff/filename.cpp | 2 + src/libs/libgroff/fmod.c | 28 + src/libs/libgroff/font.cpp | 1054 ++ src/libs/libgroff/fontfile.cpp | 69 + src/libs/libgroff/geometry.cpp | 179 + src/libs/libgroff/getcwd.c | 54 + src/libs/libgroff/getopt.c | 1241 ++ src/libs/libgroff/getopt1.c | 174 + src/libs/libgroff/glyphuni.cpp | 504 + src/libs/libgroff/htmlhint.cpp | 59 + src/libs/libgroff/hypot.cpp | 40 + src/libs/libgroff/iftoa.c | 73 + src/libs/libgroff/invalid.cpp | 60 + src/libs/libgroff/itoa.c | 64 + src/libs/libgroff/lf.cpp | 63 + src/libs/libgroff/lineno.cpp | 1 + src/libs/libgroff/macropath.cpp | 30 + src/libs/libgroff/matherr.c | 49 + src/libs/libgroff/maxfilename.cpp | 65 + src/libs/libgroff/maxpathname.cpp | 71 + src/libs/libgroff/mksdir.cpp | 34 + src/libs/libgroff/mkstemp.cpp | 34 + src/libs/libgroff/nametoindex.cpp | 117 + src/libs/libgroff/new.cpp | 71 + src/libs/libgroff/paper.cpp | 84 + src/libs/libgroff/prime.cpp | 26 + src/libs/libgroff/progname.c | 1 + src/libs/libgroff/ptable.cpp | 52 + src/libs/libgroff/putenv.c | 99 + src/libs/libgroff/quotearg.c | 209 + src/libs/libgroff/relocate.cpp | 238 + src/libs/libgroff/searchpath.cpp | 208 + src/libs/libgroff/spawnvp.c | 122 + src/libs/libgroff/strcasecmp.c | 66 + src/libs/libgroff/strerror.c | 48 + src/libs/libgroff/string.cpp | 341 + src/libs/libgroff/strncasecmp.c | 2 + src/libs/libgroff/strsave.cpp | 31 + src/libs/libgroff/strtol.c | 133 + src/libs/libgroff/symbol.cpp | 159 + src/libs/libgroff/tmpfile.cpp | 190 + src/libs/libgroff/tmpname.cpp | 116 + src/libs/libgroff/unicode.cpp | 67 + src/libs/libgroff/uniglyph.cpp | 504 + src/libs/libgroff/uniuni.cpp | 1994 +++ src/libs/libxutil/DviChar.c | 658 + src/libs/libxutil/Makefile.sub | 10 + src/libs/libxutil/XFontName.c | 241 + src/libs/libxutil/xmalloc.c | 7 + src/libs/snprintf/README | 8 + src/libs/snprintf/snprintf.c | 1131 ++ src/preproc/eqn/Makefile.sub | 60 + src/preproc/eqn/TODO | 49 + src/preproc/eqn/box.cpp | 612 + src/preproc/eqn/box.h | 280 + src/preproc/eqn/delim.cpp | 401 + src/preproc/eqn/eqn.cpp | 1169 ++ src/preproc/eqn/eqn.h | 50 + src/preproc/eqn/eqn.man | 1160 ++ src/preproc/eqn/eqn.y | 330 + src/preproc/eqn/eqn_tab.h | 67 + src/preproc/eqn/lex.cpp | 1172 ++ src/preproc/eqn/limit.cpp | 195 + src/preproc/eqn/list.cpp | 237 + src/preproc/eqn/main.cpp | 395 + src/preproc/eqn/mark.cpp | 121 + src/preproc/eqn/neqn.man | 43 + src/preproc/eqn/neqn.sh | 10 + src/preproc/eqn/other.cpp | 601 + src/preproc/eqn/over.cpp | 197 + src/preproc/eqn/pbox.h | 141 + src/preproc/eqn/pile.cpp | 293 + src/preproc/eqn/script.cpp | 222 + src/preproc/eqn/special.cpp | 115 + src/preproc/eqn/sqrt.cpp | 180 + src/preproc/eqn/text.cpp | 528 + src/preproc/grn/Makefile.sub | 17 + src/preproc/grn/README | 68 + src/preproc/grn/gprint.h | 86 + src/preproc/grn/grn.man | 652 + src/preproc/grn/hdb.cpp | 346 + src/preproc/grn/hgraph.cpp | 1048 ++ src/preproc/grn/hpoint.cpp | 49 + src/preproc/grn/main.cpp | 907 ++ src/preproc/html/Makefile.sub | 7 + src/preproc/html/pre-html.cpp | 1779 +++ src/preproc/html/pre-html.h | 37 + src/preproc/html/pushback.cpp | 329 + src/preproc/html/pushback.h | 54 + src/preproc/pic/Makefile.sub | 31 + src/preproc/pic/TODO | 35 + src/preproc/pic/common.cpp | 647 + src/preproc/pic/common.h | 80 + src/preproc/pic/lex.cpp | 2001 +++ src/preproc/pic/main.cpp | 642 + src/preproc/pic/object.cpp | 2017 +++ src/preproc/pic/object.h | 225 + src/preproc/pic/output.h | 83 + src/preproc/pic/pic.cpp | 5687 +++++++++ src/preproc/pic/pic.h | 123 + src/preproc/pic/pic.man | 1109 ++ src/preproc/pic/pic.y | 1898 +++ src/preproc/pic/pic_tab.h | 139 + src/preproc/pic/position.h | 47 + src/preproc/pic/tex.cpp | 459 + src/preproc/pic/text.h | 28 + src/preproc/pic/troff.cpp | 567 + src/preproc/refer/Makefile.sub | 23 + src/preproc/refer/TODO | 124 + src/preproc/refer/command.cpp | 809 ++ src/preproc/refer/command.h | 36 + src/preproc/refer/label.cpp | 1620 +++ src/preproc/refer/label.y | 1193 ++ src/preproc/refer/ref.cpp | 1160 ++ src/preproc/refer/ref.h | 128 + src/preproc/refer/refer.cpp | 1242 ++ src/preproc/refer/refer.h | 78 + src/preproc/refer/refer.man | 1492 +++ src/preproc/refer/token.cpp | 378 + src/preproc/refer/token.h | 88 + src/preproc/soelim/Makefile.sub | 7 + src/preproc/soelim/TODO | 1 + src/preproc/soelim/soelim.cpp | 308 + src/preproc/soelim/soelim.man | 216 + src/preproc/tbl/Makefile.sub | 13 + src/preproc/tbl/main.cpp | 1590 +++ src/preproc/tbl/table.cpp | 2778 +++++ src/preproc/tbl/table.h | 165 + src/preproc/tbl/tbl.man | 493 + src/roff/groff/Makefile.sub | 8 + src/roff/groff/groff.cpp | 765 ++ src/roff/groff/groff.man | 1732 +++ src/roff/groff/pipeline.c | 579 + src/roff/groff/pipeline.h | 31 + src/roff/grog/Makefile.sub | 32 + src/roff/grog/grog.man | 91 + src/roff/grog/grog.pl | 222 + src/roff/grog/grog.sh | 112 + src/roff/nroff/Makefile.sub | 20 + src/roff/nroff/nroff.man | 149 + src/roff/nroff/nroff.sh | 99 + src/roff/troff/Makefile.sub | 48 + src/roff/troff/TODO | 131 + src/roff/troff/charinfo.h | 214 + src/roff/troff/column.cpp | 732 ++ src/roff/troff/dictionary.cpp | 211 + src/roff/troff/dictionary.h | 92 + src/roff/troff/div.cpp | 1198 ++ src/roff/troff/div.h | 172 + src/roff/troff/env.cpp | 3893 ++++++ src/roff/troff/env.h | 415 + src/roff/troff/hvunits.h | 340 + src/roff/troff/input.cpp | 8214 ++++++++++++ src/roff/troff/input.h | 105 + src/roff/troff/mtsm.cpp | 632 + src/roff/troff/mtsm.h | 164 + src/roff/troff/node.cpp | 6482 ++++++++++ src/roff/troff/node.h | 676 + src/roff/troff/number.cpp | 698 ++ src/roff/troff/reg.cpp | 473 + src/roff/troff/reg.h | 76 + src/roff/troff/request.h | 91 + src/roff/troff/token.h | 242 + src/roff/troff/troff.h | 92 + src/roff/troff/troff.man | 705 ++ src/utils/addftinfo/Makefile.sub | 11 + src/utils/addftinfo/addftinfo.cpp | 218 + src/utils/addftinfo/addftinfo.man | 111 + src/utils/addftinfo/guess.cpp | 490 + src/utils/addftinfo/guess.h | 44 + src/utils/afmtodit/Makefile.sub | 25 + src/utils/afmtodit/afmtodit.man | 337 + src/utils/afmtodit/afmtodit.pl | 6566 ++++++++++ src/utils/hpftodit/Makefile.sub | 8 + src/utils/hpftodit/hpftodit.cpp | 1454 +++ src/utils/hpftodit/hpftodit.man | 311 + src/utils/hpftodit/hpuni.cpp | 698 ++ src/utils/indxbib/Makefile.sub | 29 + src/utils/indxbib/eign | 133 + src/utils/indxbib/indxbib.cpp | 790 ++ src/utils/indxbib/indxbib.man | 211 + src/utils/indxbib/signal.c | 78 + src/utils/lkbib/Makefile.sub | 6 + src/utils/lkbib/lkbib.cpp | 137 + src/utils/lkbib/lkbib.man | 136 + src/utils/lookbib/Makefile.sub | 7 + src/utils/lookbib/lookbib.cpp | 143 + src/utils/lookbib/lookbib.man | 101 + src/utils/pfbtops/Makefile.sub | 7 + src/utils/pfbtops/pfbtops.c | 230 + src/utils/pfbtops/pfbtops.man | 68 + src/utils/tfmtodit/Makefile.sub | 6 + src/utils/tfmtodit/tfmtodit.cpp | 874 ++ src/utils/tfmtodit/tfmtodit.man | 197 + src/utils/xtotroff/Makefile.in | 62 + src/utils/xtotroff/Makefile.sub | 8 + src/utils/xtotroff/xtotroff.c | 299 + src/utils/xtotroff/xtotroff.man | 109 + stamp-h.in | 1 + test-groff.in | 34 + tmac/Makefile.sub | 137 + tmac/README | 9 + tmac/TODO | 36 + tmac/X.tmac | 132 + tmac/Xps.tmac | 59 + tmac/a4.tmac | 20 + tmac/an-old.tmac | 638 + tmac/an.tmac | 3 + tmac/andoc.tmac | 19 + tmac/composite.tmac | 25 + tmac/cp1047.tmac | 101 + tmac/devtag.tmac | 131 + tmac/doc-common | 1242 ++ tmac/doc-ditroff | 332 + tmac/doc-nroff | 275 + tmac/doc-old.tmac | 1856 +++ tmac/doc-syms | 842 ++ tmac/doc.tmac | 6434 ++++++++++ tmac/dvi.tmac | 788 ++ tmac/e.tmac | 1666 +++ tmac/ec.tmac | 64 + tmac/eqnrc | 63 + tmac/europs.tmac | 38 + tmac/fixmacros.sed | 7 + tmac/groff_man.man | 775 ++ tmac/groff_mdoc.man | 4136 ++++++ tmac/groff_me.man | 282 + tmac/groff_ms.man | 1556 +++ tmac/groff_trace.man | 550 + tmac/groff_www.man | 525 + tmac/html-end.tmac | 25 + tmac/html.tmac | 546 + tmac/hyphen.us | 4469 +++++++ tmac/hyphenex.pl | 78 + tmac/hyphenex.us | 896 ++ tmac/latin1.tmac | 107 + tmac/latin2.tmac | 107 + tmac/latin5.tmac | 107 + tmac/latin9.tmac | 107 + tmac/lbp.tmac | 94 + tmac/lj4.tmac | 32 + tmac/man.local | 2 + tmac/man.tmac | 3 + tmac/man.ultrix | 103 + tmac/mandoc.tmac | 3 + tmac/mdoc.local | 2 + tmac/mdoc.tmac | 3 + tmac/me.tmac | 3 + tmac/ms.tmac | 3 + tmac/papersize.tmac | 158 + tmac/pic.tmac | 12 + tmac/ps.tmac | 694 ++ tmac/psatk.tmac | 63 + tmac/psfig.tmac | 89 + tmac/psold.tmac | 61 + tmac/pspic.tmac | 106 + tmac/s.tmac | 2076 ++++ tmac/safer.tmac | 5 + tmac/strip.sed | 10 + tmac/trace.tmac | 111 + tmac/troffrc | 54 + tmac/troffrc-end | 19 + tmac/tty-char.tmac | 237 + tmac/tty.tmac | 91 + tmac/unicode.tmac | 3 + tmac/www.tmac | 1230 ++ 845 files changed, 447114 insertions(+) create mode 100644 BUG-REPORT create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 ChangeLog.115 create mode 100644 ChangeLog.116 create mode 100644 ChangeLog.117 create mode 100644 ChangeLog.118 create mode 100644 FDL create mode 100644 INSTALL create mode 100644 INSTALL.gen create mode 100644 LICENSE create mode 100644 MANIFEST create mode 100644 MORE.STUFF create mode 100644 Makefile create mode 100644 Makefile.ccpg create mode 100644 Makefile.comm create mode 100644 Makefile.cpg create mode 100644 Makefile.dev create mode 100644 Makefile.in create mode 100644 Makefile.init create mode 100644 Makefile.lib create mode 100644 Makefile.man create mode 100644 Makefile.sub create mode 100644 NEWS create mode 100644 PROBLEMS create mode 100644 PROJECTS create mode 100644 README create mode 100644 README.MinGW create mode 100644 REVISION create mode 100644 TODO create mode 100644 VERSION create mode 100644 aclocal.m4 create mode 100644 arch/djgpp/README create mode 100644 arch/djgpp/config.bat create mode 100644 arch/djgpp/config.sed create mode 100644 arch/djgpp/config.site create mode 100644 arch/djgpp/t-groff.bat create mode 100644 arch/misc/Makefile.sub create mode 100644 arch/misc/shdeps.sh create mode 100755 configure create mode 100644 configure.ac create mode 100644 contrib/eqn2graph/Makefile.sub create mode 100644 contrib/eqn2graph/eqn2graph.man create mode 100644 contrib/eqn2graph/eqn2graph.sh create mode 100644 contrib/gdiffmk/ChangeLog create mode 100644 contrib/gdiffmk/Makefile.sub create mode 100644 contrib/gdiffmk/README create mode 100644 contrib/gdiffmk/gdiffmk.man create mode 100644 contrib/gdiffmk/gdiffmk.sh create mode 100644 contrib/gdiffmk/tests/file1 create mode 100644 contrib/gdiffmk/tests/file2 create mode 100644 contrib/gdiffmk/tests/runtests.in create mode 100644 contrib/gdiffmk/tests/test_baseline create mode 100644 contrib/gdiffmk/tests/test_baseline10 create mode 100644 contrib/gdiffmk/tests/test_baseline6 create mode 100644 contrib/gdiffmk/tests/test_baseline7 create mode 100644 contrib/gdiffmk/tests/test_baseline8 create mode 100644 contrib/gdiffmk/tests/test_baseline9 create mode 100644 contrib/grap2graph/Makefile.sub create mode 100644 contrib/grap2graph/grap2graph.man create mode 100644 contrib/grap2graph/grap2graph.sh create mode 100644 contrib/groffer/ChangeLog create mode 100644 contrib/groffer/Makefile.sub create mode 100644 contrib/groffer/README create mode 100644 contrib/groffer/README_SH create mode 100644 contrib/groffer/TODO create mode 100644 contrib/groffer/groffer.man create mode 100644 contrib/groffer/groffer.sh create mode 100644 contrib/groffer/groffer2.sh create mode 100644 contrib/mm/ChangeLog create mode 100644 contrib/mm/Makefile.sim create mode 100644 contrib/mm/Makefile.sub create mode 100644 contrib/mm/NOTES create mode 100644 contrib/mm/README create mode 100644 contrib/mm/examples/APP create mode 100644 contrib/mm/examples/B1B2 create mode 100644 contrib/mm/examples/COVER create mode 100644 contrib/mm/examples/IND create mode 100644 contrib/mm/examples/LT create mode 100644 contrib/mm/examples/LT.se create mode 100644 contrib/mm/examples/ML create mode 100644 contrib/mm/examples/MOVE create mode 100644 contrib/mm/examples/MUL create mode 100644 contrib/mm/examples/NCOL create mode 100644 contrib/mm/examples/ND create mode 100644 contrib/mm/examples/README create mode 100644 contrib/mm/examples/References create mode 100644 contrib/mm/examples/SETR create mode 100644 contrib/mm/groff_mm.man create mode 100644 contrib/mm/groff_mmse.man create mode 100644 contrib/mm/m.tmac create mode 100644 contrib/mm/mm.tmac create mode 100644 contrib/mm/mm/0.MT create mode 100644 contrib/mm/mm/4.MT create mode 100644 contrib/mm/mm/5.MT create mode 100644 contrib/mm/mm/ms.cov create mode 100644 contrib/mm/mm/se_ms.cov create mode 100644 contrib/mm/mmroff.man create mode 100644 contrib/mm/mmroff.pl create mode 100644 contrib/mm/mmse.tmac create mode 100644 contrib/mm/mse.tmac create mode 100644 contrib/mom/BUGS create mode 100644 contrib/mom/ChangeLog create mode 100644 contrib/mom/Makefile.sub create mode 100644 contrib/mom/NEWS create mode 100644 contrib/mom/TODO create mode 100644 contrib/mom/copyright create mode 100644 contrib/mom/examples/README.txt create mode 100644 contrib/mom/examples/elvis_syntax create mode 100644 contrib/mom/examples/elvis_syntax.new create mode 100644 contrib/mom/examples/letter.mom create mode 100644 contrib/mom/examples/penguin.ps create mode 100644 contrib/mom/examples/sample_docs.mom create mode 100644 contrib/mom/examples/typesetting.mom create mode 100644 contrib/mom/groff_mom.man create mode 100644 contrib/mom/mom.tmac create mode 100644 contrib/mom/momdoc/appendices.html create mode 100644 contrib/mom/momdoc/color.html create mode 100644 contrib/mom/momdoc/cover.html create mode 100644 contrib/mom/momdoc/definitions.html create mode 100644 contrib/mom/momdoc/docelement.html create mode 100644 contrib/mom/momdoc/docprocessing.html create mode 100644 contrib/mom/momdoc/goodies.html create mode 100644 contrib/mom/momdoc/headfootpage.html create mode 100644 contrib/mom/momdoc/inlines.html create mode 100644 contrib/mom/momdoc/intro.html create mode 100644 contrib/mom/momdoc/letters.html create mode 100644 contrib/mom/momdoc/macrolist.html create mode 100644 contrib/mom/momdoc/rectoverso.html create mode 100644 contrib/mom/momdoc/refer.html create mode 100644 contrib/mom/momdoc/reserved.html create mode 100644 contrib/mom/momdoc/toc.html create mode 100644 contrib/mom/momdoc/typemacdoc.html create mode 100644 contrib/mom/momdoc/typesetting.html create mode 100644 contrib/mom/momdoc/using.html create mode 100644 contrib/mom/om.tmac create mode 100644 contrib/pdfmark/ChangeLog create mode 100644 contrib/pdfmark/Makefile.sub create mode 100644 contrib/pdfmark/PROBLEMS create mode 100644 contrib/pdfmark/README create mode 100644 contrib/pdfmark/TODO create mode 100644 contrib/pdfmark/cover.ms create mode 100644 contrib/pdfmark/pdfmark.ms create mode 100644 contrib/pdfmark/pdfmark.tmac create mode 100644 contrib/pdfmark/pdfroff.man create mode 100644 contrib/pdfmark/pdfroff.sh create mode 100644 contrib/pdfmark/spdf.tmac create mode 100644 contrib/pic2graph/Makefile.sub create mode 100644 contrib/pic2graph/pic2graph.man create mode 100644 contrib/pic2graph/pic2graph.sh create mode 100644 doc/Makefile.in create mode 100644 doc/Makefile.sub create mode 100644 doc/fdl.texi create mode 100644 doc/fixinfo.sh create mode 100644 doc/gnu.eps create mode 100644 doc/gnu.png create mode 100644 doc/gnu.xpm create mode 100644 doc/grnexmpl.g create mode 100644 doc/grnexmpl.me create mode 100644 doc/groff create mode 100644 doc/groff-1 create mode 100644 doc/groff-2 create mode 100644 doc/groff-3 create mode 100644 doc/groff.css create mode 100644 doc/groff.texinfo create mode 100644 doc/meintro.me create mode 100644 doc/meref.me create mode 100644 doc/pic.ms create mode 100644 doc/texinfo.tex create mode 100644 doc/webpage.ms create mode 100644 font/devX100-12/CB create mode 100644 font/devX100-12/CBI create mode 100644 font/devX100-12/CI create mode 100644 font/devX100-12/CR create mode 100644 font/devX100-12/DESC create mode 100644 font/devX100-12/HB create mode 100644 font/devX100-12/HBI create mode 100644 font/devX100-12/HI create mode 100644 font/devX100-12/HR create mode 100644 font/devX100-12/Makefile.sub create mode 100644 font/devX100-12/NB create mode 100644 font/devX100-12/NBI create mode 100644 font/devX100-12/NI create mode 100644 font/devX100-12/NR create mode 100644 font/devX100-12/S create mode 100644 font/devX100-12/TB create mode 100644 font/devX100-12/TBI create mode 100644 font/devX100-12/TI create mode 100644 font/devX100-12/TR create mode 100644 font/devX100/CB create mode 100644 font/devX100/CBI create mode 100644 font/devX100/CI create mode 100644 font/devX100/CR create mode 100644 font/devX100/DESC create mode 100644 font/devX100/HB create mode 100644 font/devX100/HBI create mode 100644 font/devX100/HI create mode 100644 font/devX100/HR create mode 100644 font/devX100/Makefile.sub create mode 100644 font/devX100/NB create mode 100644 font/devX100/NBI create mode 100644 font/devX100/NI create mode 100644 font/devX100/NR create mode 100644 font/devX100/S create mode 100644 font/devX100/TB create mode 100644 font/devX100/TBI create mode 100644 font/devX100/TI create mode 100644 font/devX100/TR create mode 100644 font/devX75-12/CB create mode 100644 font/devX75-12/CBI create mode 100644 font/devX75-12/CI create mode 100644 font/devX75-12/CR create mode 100644 font/devX75-12/DESC create mode 100644 font/devX75-12/HB create mode 100644 font/devX75-12/HBI create mode 100644 font/devX75-12/HI create mode 100644 font/devX75-12/HR create mode 100644 font/devX75-12/Makefile.sub create mode 100644 font/devX75-12/NB create mode 100644 font/devX75-12/NBI create mode 100644 font/devX75-12/NI create mode 100644 font/devX75-12/NR create mode 100644 font/devX75-12/S create mode 100644 font/devX75-12/TB create mode 100644 font/devX75-12/TBI create mode 100644 font/devX75-12/TI create mode 100644 font/devX75-12/TR create mode 100644 font/devX75/CB create mode 100644 font/devX75/CBI create mode 100644 font/devX75/CI create mode 100644 font/devX75/CR create mode 100644 font/devX75/DESC create mode 100644 font/devX75/HB create mode 100644 font/devX75/HBI create mode 100644 font/devX75/HI create mode 100644 font/devX75/HR create mode 100644 font/devX75/Makefile.sub create mode 100644 font/devX75/NB create mode 100644 font/devX75/NBI create mode 100644 font/devX75/NI create mode 100644 font/devX75/NR create mode 100644 font/devX75/S create mode 100644 font/devX75/TB create mode 100644 font/devX75/TBI create mode 100644 font/devX75/TI create mode 100644 font/devX75/TR create mode 100644 font/devascii/DESC.proto create mode 100644 font/devascii/Makefile.sub create mode 100644 font/devascii/R.proto create mode 100644 font/devcp1047/DESC.proto create mode 100644 font/devcp1047/Makefile.sub create mode 100644 font/devcp1047/R.proto create mode 100644 font/devdvi/CW create mode 100644 font/devdvi/CWEC create mode 100644 font/devdvi/CWI create mode 100644 font/devdvi/CWIEC create mode 100644 font/devdvi/CWITC create mode 100644 font/devdvi/CWTC create mode 100644 font/devdvi/DESC.in create mode 100644 font/devdvi/EX create mode 100644 font/devdvi/HB create mode 100644 font/devdvi/HBEC create mode 100644 font/devdvi/HBI create mode 100644 font/devdvi/HBIEC create mode 100644 font/devdvi/HBITC create mode 100644 font/devdvi/HBTC create mode 100644 font/devdvi/HI create mode 100644 font/devdvi/HIEC create mode 100644 font/devdvi/HITC create mode 100644 font/devdvi/HR create mode 100644 font/devdvi/HREC create mode 100644 font/devdvi/HRTC create mode 100644 font/devdvi/MI create mode 100644 font/devdvi/Makefile.sub create mode 100644 font/devdvi/S create mode 100644 font/devdvi/SA create mode 100644 font/devdvi/SB create mode 100644 font/devdvi/SC create mode 100644 font/devdvi/TB create mode 100644 font/devdvi/TBEC create mode 100644 font/devdvi/TBI create mode 100644 font/devdvi/TBIEC create mode 100644 font/devdvi/TBITC create mode 100644 font/devdvi/TBTC create mode 100644 font/devdvi/TI create mode 100644 font/devdvi/TIEC create mode 100644 font/devdvi/TITC create mode 100644 font/devdvi/TR create mode 100644 font/devdvi/TREC create mode 100644 font/devdvi/TRTC create mode 100755 font/devdvi/generate/CompileFonts create mode 100644 font/devdvi/generate/Makefile create mode 100644 font/devdvi/generate/ec.map create mode 100644 font/devdvi/generate/msam.map create mode 100644 font/devdvi/generate/msbm.map create mode 100644 font/devdvi/generate/tc.map create mode 100644 font/devdvi/generate/texb.map create mode 100644 font/devdvi/generate/texex.map create mode 100644 font/devdvi/generate/texi.map create mode 100644 font/devdvi/generate/texmi.map create mode 100644 font/devdvi/generate/texr.map create mode 100644 font/devdvi/generate/texsy.map create mode 100644 font/devdvi/generate/textex.map create mode 100644 font/devdvi/generate/textt.map create mode 100644 font/devhtml/DESC.proto create mode 100644 font/devhtml/Makefile.sub create mode 100644 font/devhtml/R.proto create mode 100644 font/devlatin1/DESC.proto create mode 100644 font/devlatin1/Makefile.sub create mode 100644 font/devlatin1/R.proto create mode 100644 font/devlbp/CB create mode 100644 font/devlbp/CI create mode 100644 font/devlbp/CR create mode 100644 font/devlbp/DESC.in create mode 100644 font/devlbp/EB create mode 100644 font/devlbp/EI create mode 100644 font/devlbp/ER create mode 100644 font/devlbp/HB create mode 100644 font/devlbp/HBI create mode 100644 font/devlbp/HI create mode 100644 font/devlbp/HNB create mode 100644 font/devlbp/HNBI create mode 100644 font/devlbp/HNI create mode 100644 font/devlbp/HNR create mode 100644 font/devlbp/HR create mode 100644 font/devlbp/Makefile.sub create mode 100644 font/devlbp/TB create mode 100644 font/devlbp/TBI create mode 100644 font/devlbp/TI create mode 100644 font/devlbp/TR create mode 100644 font/devlj4/AB create mode 100644 font/devlj4/ABI create mode 100644 font/devlj4/AI create mode 100644 font/devlj4/ALBB create mode 100644 font/devlj4/ALBR create mode 100644 font/devlj4/AOB create mode 100644 font/devlj4/AOI create mode 100644 font/devlj4/AOR create mode 100644 font/devlj4/AR create mode 100644 font/devlj4/CB create mode 100644 font/devlj4/CBI create mode 100644 font/devlj4/CI create mode 100644 font/devlj4/CLARENDON create mode 100644 font/devlj4/CORONET create mode 100644 font/devlj4/CR create mode 100644 font/devlj4/DESC.in create mode 100644 font/devlj4/GB create mode 100644 font/devlj4/GBI create mode 100644 font/devlj4/GI create mode 100644 font/devlj4/GR create mode 100644 font/devlj4/LGB create mode 100644 font/devlj4/LGI create mode 100644 font/devlj4/LGR create mode 100644 font/devlj4/MARIGOLD create mode 100644 font/devlj4/Makefile.sub create mode 100644 font/devlj4/OB create mode 100644 font/devlj4/OBI create mode 100644 font/devlj4/OI create mode 100644 font/devlj4/OR create mode 100644 font/devlj4/S create mode 100644 font/devlj4/SYMBOL create mode 100644 font/devlj4/TB create mode 100644 font/devlj4/TBI create mode 100644 font/devlj4/TI create mode 100644 font/devlj4/TNRB create mode 100644 font/devlj4/TNRBI create mode 100644 font/devlj4/TNRI create mode 100644 font/devlj4/TNRR create mode 100644 font/devlj4/TR create mode 100644 font/devlj4/UB create mode 100644 font/devlj4/UBI create mode 100644 font/devlj4/UCB create mode 100644 font/devlj4/UCBI create mode 100644 font/devlj4/UCI create mode 100644 font/devlj4/UCR create mode 100644 font/devlj4/UI create mode 100644 font/devlj4/UR create mode 100644 font/devlj4/WINGDINGS create mode 100644 font/devlj4/generate/Makefile create mode 100644 font/devlj4/generate/special.awk create mode 100644 font/devlj4/generate/special.map create mode 100644 font/devlj4/generate/symbol.map create mode 100644 font/devlj4/generate/text.map create mode 100644 font/devlj4/generate/wingdings.map create mode 100644 font/devps/AB create mode 100644 font/devps/ABI create mode 100644 font/devps/AI create mode 100644 font/devps/AR create mode 100644 font/devps/BMB create mode 100644 font/devps/BMBI create mode 100644 font/devps/BMI create mode 100644 font/devps/BMR create mode 100644 font/devps/CB create mode 100644 font/devps/CBI create mode 100644 font/devps/CI create mode 100644 font/devps/CR create mode 100644 font/devps/DESC.in create mode 100644 font/devps/EURO create mode 100644 font/devps/HB create mode 100644 font/devps/HBI create mode 100644 font/devps/HI create mode 100644 font/devps/HNB create mode 100644 font/devps/HNBI create mode 100644 font/devps/HNI create mode 100644 font/devps/HNR create mode 100644 font/devps/HR create mode 100644 font/devps/Makefile.sub create mode 100644 font/devps/NB create mode 100644 font/devps/NBI create mode 100644 font/devps/NI create mode 100644 font/devps/NR create mode 100644 font/devps/PB create mode 100644 font/devps/PBI create mode 100644 font/devps/PI create mode 100644 font/devps/PR create mode 100644 font/devps/S create mode 100644 font/devps/SS create mode 100644 font/devps/TB create mode 100644 font/devps/TBI create mode 100644 font/devps/TI create mode 100644 font/devps/TR create mode 100644 font/devps/ZCMI create mode 100644 font/devps/ZD create mode 100644 font/devps/ZDR create mode 100644 font/devps/download create mode 100644 font/devps/freeeuro.afm create mode 100644 font/devps/freeeuro.pfa create mode 100644 font/devps/generate/Makefile create mode 100755 font/devps/generate/afmname create mode 100644 font/devps/generate/dingbats.map create mode 100644 font/devps/generate/dingbats.rmap create mode 100644 font/devps/generate/freeeuro.sfd create mode 100644 font/devps/generate/lgreekmap create mode 100644 font/devps/generate/sfdtopfa.pe create mode 100644 font/devps/generate/symbol.sed create mode 100644 font/devps/generate/symbolchars create mode 100644 font/devps/generate/symbolsl.afm create mode 100644 font/devps/generate/textmap create mode 100644 font/devps/prologue.ps create mode 100644 font/devps/psstrip.sed create mode 100644 font/devps/symbol.afm create mode 100644 font/devps/symbolmap create mode 100644 font/devps/symbolsl.ps create mode 100644 font/devps/text.enc create mode 100644 font/devps/zapfdr.afm create mode 100644 font/devps/zapfdr.ps create mode 100644 font/devutf8/DESC.proto create mode 100644 font/devutf8/Makefile.sub create mode 100644 font/devutf8/NOTES create mode 100644 font/devutf8/R.proto create mode 100644 gendef.sh create mode 100755 install-sh create mode 100644 man/Makefile.sub create mode 100644 man/ditroff.man create mode 100644 man/groff.man create mode 100644 man/groff_char.man create mode 100644 man/groff_diff.man create mode 100644 man/groff_font.man create mode 100644 man/groff_out.man create mode 100644 man/groff_tmac.man create mode 100644 man/roff.man create mode 100644 mdate.sh create mode 100755 mkinstalldirs create mode 100644 src/devices/grodvi/Makefile.sub create mode 100644 src/devices/grodvi/dvi.cpp create mode 100644 src/devices/grodvi/grodvi.man create mode 100644 src/devices/grohtml/Makefile.sub create mode 100644 src/devices/grohtml/grohtml.man create mode 100644 src/devices/grohtml/html-table.cpp create mode 100644 src/devices/grohtml/html-table.h create mode 100644 src/devices/grohtml/html-text.cpp create mode 100644 src/devices/grohtml/html-text.h create mode 100644 src/devices/grohtml/html.h create mode 100644 src/devices/grohtml/output.cpp create mode 100644 src/devices/grohtml/post-html.cpp create mode 100644 src/devices/grolbp/Makefile.sub create mode 100644 src/devices/grolbp/charset.h create mode 100644 src/devices/grolbp/grolbp.man create mode 100644 src/devices/grolbp/lbp.cpp create mode 100644 src/devices/grolbp/lbp.h create mode 100644 src/devices/grolj4/Makefile.sub create mode 100644 src/devices/grolj4/grolj4.man create mode 100644 src/devices/grolj4/lj4.cpp create mode 100644 src/devices/grolj4/lj4_font.man create mode 100644 src/devices/grops/Makefile.sub create mode 100644 src/devices/grops/TODO create mode 100644 src/devices/grops/grops.man create mode 100644 src/devices/grops/ps.cpp create mode 100644 src/devices/grops/ps.h create mode 100644 src/devices/grops/psfig.diff create mode 100644 src/devices/grops/psrm.cpp create mode 100644 src/devices/grotty/Makefile.sub create mode 100644 src/devices/grotty/TODO create mode 100644 src/devices/grotty/grotty.man create mode 100644 src/devices/grotty/tty.cpp create mode 100644 src/devices/xditview/ChangeLog create mode 100644 src/devices/xditview/DESC.in create mode 100644 src/devices/xditview/Dvi.c create mode 100644 src/devices/xditview/Dvi.h create mode 100644 src/devices/xditview/DviP.h create mode 100644 src/devices/xditview/FontMap create mode 100644 src/devices/xditview/GXditview.ad create mode 100644 src/devices/xditview/Makefile.sub create mode 100644 src/devices/xditview/Menu.h create mode 100644 src/devices/xditview/README create mode 100644 src/devices/xditview/TODO create mode 100644 src/devices/xditview/ad2c create mode 100644 src/devices/xditview/device.c create mode 100644 src/devices/xditview/device.h create mode 100644 src/devices/xditview/draw.c create mode 100644 src/devices/xditview/font.c create mode 100644 src/devices/xditview/gray1.bm create mode 100644 src/devices/xditview/gray2.bm create mode 100644 src/devices/xditview/gray3.bm create mode 100644 src/devices/xditview/gray4.bm create mode 100644 src/devices/xditview/gray5.bm create mode 100644 src/devices/xditview/gray6.bm create mode 100644 src/devices/xditview/gray7.bm create mode 100644 src/devices/xditview/gray8.bm create mode 100644 src/devices/xditview/gxditview.man create mode 100644 src/devices/xditview/lex.c create mode 100644 src/devices/xditview/page.c create mode 100644 src/devices/xditview/parse.c create mode 100644 src/devices/xditview/xdit.bm create mode 100644 src/devices/xditview/xdit_mask.bm create mode 100644 src/devices/xditview/xditview.c create mode 100644 src/include/DviChar.h create mode 100644 src/include/Makefile.sub create mode 100644 src/include/XFontName.h create mode 100644 src/include/assert.h create mode 100644 src/include/cmap.h create mode 100644 src/include/color.h create mode 100644 src/include/config.hin create mode 100644 src/include/cset.h create mode 100644 src/include/device.h create mode 100644 src/include/driver.h create mode 100644 src/include/errarg.h create mode 100644 src/include/error.h create mode 100644 src/include/font.h create mode 100644 src/include/geometry.h create mode 100644 src/include/getopt.h create mode 100644 src/include/getopt_int.h create mode 100644 src/include/gettext.h create mode 100644 src/include/html-strings.h create mode 100644 src/include/htmlhint.h create mode 100644 src/include/index.h create mode 100644 src/include/lib.h create mode 100644 src/include/macropath.h create mode 100644 src/include/nonposix.h create mode 100644 src/include/paper.h create mode 100644 src/include/posix.h create mode 100644 src/include/printer.h create mode 100644 src/include/ptable.h create mode 100644 src/include/refid.h create mode 100644 src/include/relocate.h create mode 100644 src/include/search.h create mode 100644 src/include/searchpath.h create mode 100644 src/include/stringclass.h create mode 100644 src/include/symbol.h create mode 100644 src/include/unicode.h create mode 100644 src/libs/libbib/Makefile.sub create mode 100644 src/libs/libbib/common.cpp create mode 100644 src/libs/libbib/index.cpp create mode 100644 src/libs/libbib/linear.cpp create mode 100644 src/libs/libbib/map.c create mode 100644 src/libs/libbib/search.cpp create mode 100644 src/libs/libdriver/Makefile.sub create mode 100644 src/libs/libdriver/input.cpp create mode 100644 src/libs/libdriver/printer.cpp create mode 100644 src/libs/libgroff/Makefile.sub create mode 100644 src/libs/libgroff/assert.cpp create mode 100644 src/libs/libgroff/change_lf.cpp create mode 100644 src/libs/libgroff/cmap.cpp create mode 100644 src/libs/libgroff/color.cpp create mode 100644 src/libs/libgroff/cset.cpp create mode 100644 src/libs/libgroff/device.cpp create mode 100644 src/libs/libgroff/errarg.cpp create mode 100644 src/libs/libgroff/error.cpp create mode 100644 src/libs/libgroff/fatal.cpp create mode 100644 src/libs/libgroff/filename.cpp create mode 100644 src/libs/libgroff/fmod.c create mode 100644 src/libs/libgroff/font.cpp create mode 100644 src/libs/libgroff/fontfile.cpp create mode 100644 src/libs/libgroff/geometry.cpp create mode 100644 src/libs/libgroff/getcwd.c create mode 100644 src/libs/libgroff/getopt.c create mode 100644 src/libs/libgroff/getopt1.c create mode 100644 src/libs/libgroff/glyphuni.cpp create mode 100644 src/libs/libgroff/htmlhint.cpp create mode 100644 src/libs/libgroff/hypot.cpp create mode 100644 src/libs/libgroff/iftoa.c create mode 100644 src/libs/libgroff/invalid.cpp create mode 100644 src/libs/libgroff/itoa.c create mode 100644 src/libs/libgroff/lf.cpp create mode 100644 src/libs/libgroff/lineno.cpp create mode 100644 src/libs/libgroff/macropath.cpp create mode 100644 src/libs/libgroff/matherr.c create mode 100644 src/libs/libgroff/maxfilename.cpp create mode 100644 src/libs/libgroff/maxpathname.cpp create mode 100644 src/libs/libgroff/mksdir.cpp create mode 100644 src/libs/libgroff/mkstemp.cpp create mode 100644 src/libs/libgroff/nametoindex.cpp create mode 100644 src/libs/libgroff/new.cpp create mode 100644 src/libs/libgroff/paper.cpp create mode 100644 src/libs/libgroff/prime.cpp create mode 100644 src/libs/libgroff/progname.c create mode 100644 src/libs/libgroff/ptable.cpp create mode 100644 src/libs/libgroff/putenv.c create mode 100644 src/libs/libgroff/quotearg.c create mode 100644 src/libs/libgroff/relocate.cpp create mode 100644 src/libs/libgroff/searchpath.cpp create mode 100644 src/libs/libgroff/spawnvp.c create mode 100644 src/libs/libgroff/strcasecmp.c create mode 100644 src/libs/libgroff/strerror.c create mode 100644 src/libs/libgroff/string.cpp create mode 100644 src/libs/libgroff/strncasecmp.c create mode 100644 src/libs/libgroff/strsave.cpp create mode 100644 src/libs/libgroff/strtol.c create mode 100644 src/libs/libgroff/symbol.cpp create mode 100644 src/libs/libgroff/tmpfile.cpp create mode 100644 src/libs/libgroff/tmpname.cpp create mode 100644 src/libs/libgroff/unicode.cpp create mode 100644 src/libs/libgroff/uniglyph.cpp create mode 100644 src/libs/libgroff/uniuni.cpp create mode 100644 src/libs/libxutil/DviChar.c create mode 100644 src/libs/libxutil/Makefile.sub create mode 100644 src/libs/libxutil/XFontName.c create mode 100644 src/libs/libxutil/xmalloc.c create mode 100644 src/libs/snprintf/README create mode 100644 src/libs/snprintf/snprintf.c create mode 100644 src/preproc/eqn/Makefile.sub create mode 100644 src/preproc/eqn/TODO create mode 100644 src/preproc/eqn/box.cpp create mode 100644 src/preproc/eqn/box.h create mode 100644 src/preproc/eqn/delim.cpp create mode 100644 src/preproc/eqn/eqn.cpp create mode 100644 src/preproc/eqn/eqn.h create mode 100644 src/preproc/eqn/eqn.man create mode 100644 src/preproc/eqn/eqn.y create mode 100644 src/preproc/eqn/eqn_tab.h create mode 100644 src/preproc/eqn/lex.cpp create mode 100644 src/preproc/eqn/limit.cpp create mode 100644 src/preproc/eqn/list.cpp create mode 100644 src/preproc/eqn/main.cpp create mode 100644 src/preproc/eqn/mark.cpp create mode 100644 src/preproc/eqn/neqn.man create mode 100644 src/preproc/eqn/neqn.sh create mode 100644 src/preproc/eqn/other.cpp create mode 100644 src/preproc/eqn/over.cpp create mode 100644 src/preproc/eqn/pbox.h create mode 100644 src/preproc/eqn/pile.cpp create mode 100644 src/preproc/eqn/script.cpp create mode 100644 src/preproc/eqn/special.cpp create mode 100644 src/preproc/eqn/sqrt.cpp create mode 100644 src/preproc/eqn/text.cpp create mode 100644 src/preproc/grn/Makefile.sub create mode 100644 src/preproc/grn/README create mode 100644 src/preproc/grn/gprint.h create mode 100644 src/preproc/grn/grn.man create mode 100644 src/preproc/grn/hdb.cpp create mode 100644 src/preproc/grn/hgraph.cpp create mode 100644 src/preproc/grn/hpoint.cpp create mode 100644 src/preproc/grn/main.cpp create mode 100644 src/preproc/html/Makefile.sub create mode 100644 src/preproc/html/pre-html.cpp create mode 100644 src/preproc/html/pre-html.h create mode 100644 src/preproc/html/pushback.cpp create mode 100644 src/preproc/html/pushback.h create mode 100644 src/preproc/pic/Makefile.sub create mode 100644 src/preproc/pic/TODO create mode 100644 src/preproc/pic/common.cpp create mode 100644 src/preproc/pic/common.h create mode 100644 src/preproc/pic/lex.cpp create mode 100644 src/preproc/pic/main.cpp create mode 100644 src/preproc/pic/object.cpp create mode 100644 src/preproc/pic/object.h create mode 100644 src/preproc/pic/output.h create mode 100644 src/preproc/pic/pic.cpp create mode 100644 src/preproc/pic/pic.h create mode 100644 src/preproc/pic/pic.man create mode 100644 src/preproc/pic/pic.y create mode 100644 src/preproc/pic/pic_tab.h create mode 100644 src/preproc/pic/position.h create mode 100644 src/preproc/pic/tex.cpp create mode 100644 src/preproc/pic/text.h create mode 100644 src/preproc/pic/troff.cpp create mode 100644 src/preproc/refer/Makefile.sub create mode 100644 src/preproc/refer/TODO create mode 100644 src/preproc/refer/command.cpp create mode 100644 src/preproc/refer/command.h create mode 100644 src/preproc/refer/label.cpp create mode 100644 src/preproc/refer/label.y create mode 100644 src/preproc/refer/ref.cpp create mode 100644 src/preproc/refer/ref.h create mode 100644 src/preproc/refer/refer.cpp create mode 100644 src/preproc/refer/refer.h create mode 100644 src/preproc/refer/refer.man create mode 100644 src/preproc/refer/token.cpp create mode 100644 src/preproc/refer/token.h create mode 100644 src/preproc/soelim/Makefile.sub create mode 100644 src/preproc/soelim/TODO create mode 100644 src/preproc/soelim/soelim.cpp create mode 100644 src/preproc/soelim/soelim.man create mode 100644 src/preproc/tbl/Makefile.sub create mode 100644 src/preproc/tbl/main.cpp create mode 100644 src/preproc/tbl/table.cpp create mode 100644 src/preproc/tbl/table.h create mode 100644 src/preproc/tbl/tbl.man create mode 100644 src/roff/groff/Makefile.sub create mode 100644 src/roff/groff/groff.cpp create mode 100644 src/roff/groff/groff.man create mode 100644 src/roff/groff/pipeline.c create mode 100644 src/roff/groff/pipeline.h create mode 100644 src/roff/grog/Makefile.sub create mode 100644 src/roff/grog/grog.man create mode 100644 src/roff/grog/grog.pl create mode 100644 src/roff/grog/grog.sh create mode 100644 src/roff/nroff/Makefile.sub create mode 100644 src/roff/nroff/nroff.man create mode 100644 src/roff/nroff/nroff.sh create mode 100644 src/roff/troff/Makefile.sub create mode 100644 src/roff/troff/TODO create mode 100644 src/roff/troff/charinfo.h create mode 100644 src/roff/troff/column.cpp create mode 100644 src/roff/troff/dictionary.cpp create mode 100644 src/roff/troff/dictionary.h create mode 100644 src/roff/troff/div.cpp create mode 100644 src/roff/troff/div.h create mode 100644 src/roff/troff/env.cpp create mode 100644 src/roff/troff/env.h create mode 100644 src/roff/troff/hvunits.h create mode 100644 src/roff/troff/input.cpp create mode 100644 src/roff/troff/input.h create mode 100644 src/roff/troff/mtsm.cpp create mode 100644 src/roff/troff/mtsm.h create mode 100644 src/roff/troff/node.cpp create mode 100644 src/roff/troff/node.h create mode 100644 src/roff/troff/number.cpp create mode 100644 src/roff/troff/reg.cpp create mode 100644 src/roff/troff/reg.h create mode 100644 src/roff/troff/request.h create mode 100644 src/roff/troff/token.h create mode 100644 src/roff/troff/troff.h create mode 100644 src/roff/troff/troff.man create mode 100644 src/utils/addftinfo/Makefile.sub create mode 100644 src/utils/addftinfo/addftinfo.cpp create mode 100644 src/utils/addftinfo/addftinfo.man create mode 100644 src/utils/addftinfo/guess.cpp create mode 100644 src/utils/addftinfo/guess.h create mode 100644 src/utils/afmtodit/Makefile.sub create mode 100644 src/utils/afmtodit/afmtodit.man create mode 100644 src/utils/afmtodit/afmtodit.pl create mode 100644 src/utils/hpftodit/Makefile.sub create mode 100644 src/utils/hpftodit/hpftodit.cpp create mode 100644 src/utils/hpftodit/hpftodit.man create mode 100644 src/utils/hpftodit/hpuni.cpp create mode 100644 src/utils/indxbib/Makefile.sub create mode 100644 src/utils/indxbib/eign create mode 100644 src/utils/indxbib/indxbib.cpp create mode 100644 src/utils/indxbib/indxbib.man create mode 100644 src/utils/indxbib/signal.c create mode 100644 src/utils/lkbib/Makefile.sub create mode 100644 src/utils/lkbib/lkbib.cpp create mode 100644 src/utils/lkbib/lkbib.man create mode 100644 src/utils/lookbib/Makefile.sub create mode 100644 src/utils/lookbib/lookbib.cpp create mode 100644 src/utils/lookbib/lookbib.man create mode 100644 src/utils/pfbtops/Makefile.sub create mode 100644 src/utils/pfbtops/pfbtops.c create mode 100644 src/utils/pfbtops/pfbtops.man create mode 100644 src/utils/tfmtodit/Makefile.sub create mode 100644 src/utils/tfmtodit/tfmtodit.cpp create mode 100644 src/utils/tfmtodit/tfmtodit.man create mode 100644 src/utils/xtotroff/Makefile.in create mode 100644 src/utils/xtotroff/Makefile.sub create mode 100644 src/utils/xtotroff/xtotroff.c create mode 100644 src/utils/xtotroff/xtotroff.man create mode 100644 stamp-h.in create mode 100644 test-groff.in create mode 100644 tmac/Makefile.sub create mode 100644 tmac/README create mode 100644 tmac/TODO create mode 100644 tmac/X.tmac create mode 100644 tmac/Xps.tmac create mode 100644 tmac/a4.tmac create mode 100644 tmac/an-old.tmac create mode 100644 tmac/an.tmac create mode 100644 tmac/andoc.tmac create mode 100644 tmac/composite.tmac create mode 100644 tmac/cp1047.tmac create mode 100644 tmac/devtag.tmac create mode 100644 tmac/doc-common create mode 100644 tmac/doc-ditroff create mode 100644 tmac/doc-nroff create mode 100644 tmac/doc-old.tmac create mode 100644 tmac/doc-syms create mode 100644 tmac/doc.tmac create mode 100644 tmac/dvi.tmac create mode 100644 tmac/e.tmac create mode 100644 tmac/ec.tmac create mode 100644 tmac/eqnrc create mode 100644 tmac/europs.tmac create mode 100644 tmac/fixmacros.sed create mode 100644 tmac/groff_man.man create mode 100644 tmac/groff_mdoc.man create mode 100644 tmac/groff_me.man create mode 100644 tmac/groff_ms.man create mode 100644 tmac/groff_trace.man create mode 100644 tmac/groff_www.man create mode 100644 tmac/html-end.tmac create mode 100644 tmac/html.tmac create mode 100644 tmac/hyphen.us create mode 100644 tmac/hyphenex.pl create mode 100644 tmac/hyphenex.us create mode 100644 tmac/latin1.tmac create mode 100644 tmac/latin2.tmac create mode 100644 tmac/latin5.tmac create mode 100644 tmac/latin9.tmac create mode 100644 tmac/lbp.tmac create mode 100644 tmac/lj4.tmac create mode 100644 tmac/man.local create mode 100644 tmac/man.tmac create mode 100644 tmac/man.ultrix create mode 100644 tmac/mandoc.tmac create mode 100644 tmac/mdoc.local create mode 100644 tmac/mdoc.tmac create mode 100644 tmac/me.tmac create mode 100644 tmac/ms.tmac create mode 100644 tmac/papersize.tmac create mode 100644 tmac/pic.tmac create mode 100644 tmac/ps.tmac create mode 100644 tmac/psatk.tmac create mode 100644 tmac/psfig.tmac create mode 100644 tmac/psold.tmac create mode 100644 tmac/pspic.tmac create mode 100644 tmac/s.tmac create mode 100644 tmac/safer.tmac create mode 100644 tmac/strip.sed create mode 100644 tmac/trace.tmac create mode 100644 tmac/troffrc create mode 100644 tmac/troffrc-end create mode 100644 tmac/tty-char.tmac create mode 100644 tmac/tty.tmac create mode 100644 tmac/unicode.tmac create mode 100644 tmac/www.tmac diff --git a/BUG-REPORT b/BUG-REPORT new file mode 100644 index 0000000..293101e --- /dev/null +++ b/BUG-REPORT @@ -0,0 +1,55 @@ + Groff Bug Report + +Please read the PROBLEMS file before sending in a bug report. + +Please fill in all fields, even if you think they are not relevant. + +Please delete the text in brackets before sending it in. + +Please report separate bugs separately. + +Send the completed form to bug-groff@gnu.org + +GROFF VERSION: +[The version of groff you are using. For example, `1.05'] + +MACHINE: +[The machine you are using. For example, `Sun SPARCstation 2'] + +OS: +[The operating system you are using. For example, `SunOS 4.1.1'] + +COMPILER: +[The compiler you are used to compile groff. For example, `g++ 1.40.3'] + +INPUT FILES: +[Include all the files necessary to reproduce the problem that are not +part of the standard groff distribution. This includes font +description files, DESC files and macro files (with the exception of +the -ms and -mm macros: we have them). Send them as a shell archive or +as a uuencoded, compressed tar file. + +It's easier for us if you can provide an example that doesn't depend on +any macro package, but obviously if you're reporting a problem with a +macro package that won't be possible. Also a short example is more +convenient than a long one, but don't worry if you can't find a short +example. Don't say something like ``any file that X'': Always send a +definite example.] + +COMMAND LINE: +[The command line that we should run in order to observe the bug. For +example, `gtroff -Tps bug.tr'. If the command line uses -ms or -mm, +say whether these refer to the groff versions or the Unix versions of +the macros.] + +DESCRIPTION OF INCORRECT BEHAVIOUR: +[What goes wrong when that command line is run? For example, `gtroff +gets a segmentation fault', or `The output looks bad because the bar +over the x is too long and is too far over to the left.' If you get an +error message, include it here without modification: Don't edit it to +make it more readable.] + +SUGGESTED FIX [optional]: +[If you can suggest a fix for the problem, include a context diff here. +But don't delay sending in a bug report in the hope of finding a fix. +Guesses about the cause of the bug are not usually helpful.] diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..b2fe7b6 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 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/ChangeLog b/ChangeLog new file mode 100644 index 0000000..04291c6 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,5253 @@ +2005-09-04 Werner LEMBERG + + * tmac/groff_ms.man, doc/groff.texinfo: Synchronize. + + * doc/webpage.ms: Updated. + + * install-sh, mkinstalldirs: New versions; taken from texinfo CVS. + +2005-09-04 Jörgen Grahn + + * tmac/groff_ms.man: Document `PO' better. + +2005-09-03 Werner LEMBERG + + * NEWS: Document grotty changes. + +2005-09-01 Keith Marshall + + Backward compatibility support for `man' program. + + * tmac/an-old.tmac (LL): Initialize it to respect prior LL register + assignment, prior `.ll' request and then package defaults, in this + specified order of decreasing priority. + + * tmac/groff_man.man, doc/groff.texinfo: Document altered `LL' + register initialization priorities. + +2005-08-29 Gary W. Swearingen + + * tmac/groff_mdoc.man: Go into more details how the `AUTHORS' + section should look like. + +2005-08-29 Werner LEMBERG + + * tmac/groff_mdoc.man: The month's name in a call to .Dd shouldn't + be abbreviated. + +2005-08-27 Bernd Warken + + * tmac/groff_man.man: Add man(7) too SEE ALSO and more minor + fixes. + +2005-08-11 Bernd Warken + + * tmac/www.tmac (URL, MTO): Handle empty \\$1 better. + +2005-08-09 Bernd Warken + + * tmac/www.tmac (URL, MTO): Use bold series if color support is + deactivated. + +2005-08-02 Bernd Warken + + * doc/Makefile.sub (uninstall_sub): Use --remove, not --delete + as argument to $(INSTALL_INFO). The latter isn't portable. + Remove $(HTMLEXAMPLEFILES) too. + + * Makefile.in (uninstall_dirs): Remove $(datadir)/doc/groff and + $(datadir)/doc too. + Suppress warning messages and return always true. + + * tmac/Makefile.sub (uninstall_sub): Remove www.tmac too. + +2005-07-02 Bernd Warken + + * src/devices/xditview/gxditview.man: Change many `.I' to `.B'. + * man/groff_out.man: More markup and minor improvements. + * src/roff/groff/groff.man: Minor improvements. + +2005-06-28 Werner LEMBERG + + * ChangeLog: Split off older entries into... + * ChangeLog.115 ChangeLog.116, ChangeLog.117, ChangeLog.118: New + files. + +2005-06-26 Bernd Warken + + * src/devices/xditview/gxditview.man: More minor fixes. + +2005-06-24 Werner LEMBERG + + * src/preproc/pic/troff.cpp (troff_output::set_fill, + troff_output::set_color, troff_output::reset_color): Use .bcolor and + .fcolor instead of \m and \M, respectively. + +2005-06-23 Bernd Warken + + * src/devices/xditview/gxditview.man: More minor fixes. + * README: Formatting issues. + Mention some problems with Debian. + +2005-06-23 Bernd Warken + + * src/devices/xditview/gxditview.man: Revised and improved. + +2005-06-22 Werner LEMBERG + + Another round in fixing getopt problems. Hopefully the last one! + This time we use the getopt stuff from gnulib and define a prefix + unconditionally so that there are no collisions with any other + getopt implementations. This is a slight waste of space in case + we already use a GNU getopt implementation, but on + the other hand it really simplifies life. + + * src/include/getopt.h: Use gnulib version. + + * src/include/getopt_int.h: Use gnulib version. + + * src/include/groff-getopt.h: Removed. Obsolete now. + + * src/include/lib.h: Regarding getopt, don't handle any platform + specially; just include getopt.h. + (__GETOPT_PREFIX): Define (before getopt.h). + + * src/include/Makefile.sub (HDRS): Updated. + + * src/libs/libgroff/getopt1.c, src/libs/libgroff/getopt.c: Use + gnulib version. + + * src/libs/libgroff/Makefile.sub (EXTRA_CFLAGS): Set + __GETOPT_PREFIX. + + * src/utils/pfbtops/pfbtops.c, src/utils/xtotroff/xtotroff.c + (__GETOPT_PREFIX): Define (before getopt.h). + +2005-06-21 Werner LEMBERG + + * src/include/lib.h: Provide a fix for Mac OS X to not include + groff-getopt.h. + +2005-06-20 Denis M. Wilson + + * font/devps/prologue.ps (EP): Dont' use `bind'. Reason: Using + `bind' to define a procedure which contains `showpage' means that an + invocation of `showpage' may execute wrongly (the exact effect + depending on the interpreter). Not usually a problem except under + transformations, such as combining pages. + (PEND): Don't call `clear'. Reason: Using `clear' in the definition + of /PEND means that stack underflow will occur if the stack is + deliberately non-empty before document inclusion. If included + files are found to be generally badly behaved, we could replace the + `clear' with `mark' in /PBEGIN and `cleartomark' in /PEND (I've + never found this necessary). + +2005-06-20 Jörgen Grahn + + * src/preproc/soelim/soelim.cpp (do_file): Append trailing zero + earlier to get correct error message. + +2005-06-16 Bernd Warken + * src/roff/nroff/nroff.sh: Add support for iso-8859-15. + +2005-06-15 Werner LEMBERG + + Another try to update getopt files. This time we add a dummy + gettext.h file to satisfy the dependency. + + * src/include/getopt.h, src/libs/libgroff/getopt.c, + src/libs/libgroff/getopt1.c: Updated from GNU libc CVS. + + * src/include/getopt_int.h: New file (from GNU libc CVS). + + * src/include/gettext.h: Dummy file which just defines a gettext() + macro. + + * src/include/groff-getopt.h: Updated. + + * src/include/Makefile.sub (HDRS): Add getopt_int.h and gettext.h. + + + * src/libs/libdriver/input.cpp (IntArray): Remove superfluous + `const' keywords in return value. + + * src/preproc/html/pushback.cpp (pushBackBuffer::~pushBackBuffer): + Remove redundant variable `old'. + (pushBackBuffer::skipToNewline): Remove redundant variable `ch'. + + * src/preproc/tbl/main.cpp (process_table): Remove redundant + variable `c'. + + + Fix more friend name injection problems since modern C++ compilers + fail otherwise. We simply provide (global) declarations for all + functions declared as friends. This is not really necessary but + doesn't harm. + + * src/preproc/eqn/lex.cpp: Provide declarations for get_char, + peek_char, and get_location. + + * src/preproc/refer/ref.h: Provide declarations for + compare_reference, same_reference, same_year, same_date, + same_author_last_name, and same_author_name. + + * src/roff/troff/div.h: Provide declarations for do_divert and + page_offset. + + * src/roff/troff/env.h: Provide declarations for title_length, + space_size, fill, no_fill, adjust, no_adjust, center, right_justify, + vertical_spacing, post_vertical_spacing, line_spacing, line_length, + indent, temporary_indent, do_underline, do_input_trap, set_tabs, + margin_character, no_number, number_lines, leader_character, + tab_character, hyphenate_request, no_hyphenate, + hyphen_line_max_request, hyphenation_space_request, + hyphenation_margin_request, line_width, tabs_save, tabs_restore, + line_tabs_request, widow_control_request, and do_divert. + + * src/roff/troff/input.cpp: Provide declaration for chop_macro. + + * src/roff/troff/node.cpp: Provide declarations for class + tfont_spec. + Provide declaration for make_tfont. + +2005-05-29 Werner LEMBERG + + * doc/fdl.texi: Updated to version 1.2. Reported by Bernd Warken. + +2005-05-28 Werner LEMBERG + + * contrib/pdfmark/Makefile.sub (.ms.pdf): Use `--stylesheet', not + `--style'. + + * src/devices/grolbp/lbp.cpp, src/devices/grolbp/lbp.h: Remove + redundant semicolons. + + * src/preproc/eqn/Makefile.sub, src/preproc/html/Makefile.sub, + src/preproc/soelim/Makefile.sub, src/preproc/tbl/Makefile.sub: + Define `MLIB'. Some compilers need this for linking with libgroff. + +2005-05-27 Werner LEMBERG + + * MANIFEST, README, doc/webpage.ms: Updated. + +2005-05-26 Werner LEMBERG + + * All affected files: Update postal address of FSF. + +2005-05-25 Keith Marshall + Bernd Warken + + * README: More fixes. + + * README.CVS: Removed. Its contents is now part of the README file. + +2005-05-21 Werner LEMBERG + + * README: Updated. Based on a patch from Bernd Warken. + +2005-05-16 Keith Marshall + + Miscellaneous script portability enhancements. + + * aclocal.m4: (GROFF_CSH_HACK): Add space in shebang prototype for + generated conftest.sh script, conforming to portability + recommendation in autoconf docs. + * configure: Likewise, for code generated by GROFF_CSH_HACK. + * contrib/eqn2graph/eqn2graph.sh: Add space in shebang, conforming + to portability recommendation in autoconf docs. + * contrib/gdiffmk/gdiffmk.sh: Likewise. + * contrib/gdiffmk/tests/runtests.in: Likewise. + * contrib/grap2graph/grap2graph.sh: Likewise. + * contrib/groffer/groffer.sh: Likewise. + * contrib/mm/mmroff.pl: Likewise. + * contrib/mom/momdoc/appendices.html: Likewise. + * contrib/pic2graph/pic2graph.sh: Likewise. + * font/devps/generate/afmname: Likewise. + * src/devices/xditview/ad2c: Likewise. + * src/preproc/eqn/neqn.sh: Likewise. + * src/roff/grog/grog.pl: Likewise. + * src/roff/grog/grog.sh: Likewise. + * src/roff/nroff/nroff.sh: Likewise. + * PROBLEMS: Likewise, in embedded script examples. + +2005-05-16 Keith Marshall + + Improve portability of `pdfroff' shell script. + + * arch/misc/shdeps.sh: Add space in shebang, conforming to + portability guidelines in `autoconf' docs. + (PATH_SEARCH_SETUP): New substitution; emits PATH_SEPARATOR + initialization code. Used by contrib/pdfmark/pdfroff.sh's + `searchpath' function. + +2005-05-14 Werner LEMBERG + + * contrib/pic2graph/pic2graph.sh, contrib/graph2graph.sh, + contrib/eqn2graph.sh: Add option `-trim' to `convert' which is + needed for newer ImageMagick versions. + +2005-05-07 Werner LEMBERG + + * src/preproc/refer/refer.man: Many small typographic fixes. + +2005-05-06 Jeff Conrad + + * src/devices/grohtml/post-html.cpp (assert_state::~assert_state): + Use `char *' cast for a_delete. + +2005-05-03 Werner LEMBERG + + * src/libs/libgroff/maxpathname.cpp: Include stdlib.h. + src/libs/libgroff/relocate.cpp: Use path_name_max everywhere. + +2005-05-03 Jeff Conrad + + * src/devices/grohtml/post-html.cpp: Use casts to `char *' if using + `a_delete' for `const char *'. + +2005-05-03 Werner LEMBERG + + * src/devices/grohtml/post-html.cpp, + src/devices/grohtml/html-table.cpp, + src/devices/grohtml/html-text.cpp, src/devices/grohtml/output.cpp: + Replace malloc/free with new/delete/a_delete. + + * src/devices/grolbp/lbp.h: Remove superfluous semicolons which + are prohibited with ANSI C++. + (lbpprintf, vdmprintf): Remove useless `inline' keyword (since the + function has a variable number of arguments). + + * src/preproc/grn/main.cpp (doinput): Change return type to `int'. + Simplify function and update all callers. + +2005-05-02 Werner LEMBERG + + Undo getopt changes from 2005-04-30. We don't want a dependency + on gettext. + + * src/include/getopt_int.h: Removed. + + * src/include/getopt.h, src/include/groff-getopt.h, + src/include/Makefile.sub, src/libs/libgroff/getopt.c, + src/libs/libgroff/getopt1.c: Revert to previous version. + + + * src/include/nonposix.h (access) [_MSC_VER]: New macro. + + * src/include/posix.h (F_OK): Define conditionally. + + * src/devices/grotty/tty.cpp (tty_printer::make_underline): Use + different variable name in second `for' loop to avoid MSVC compiler + problem. + +2005-04-30 Werner LEMBERG + + AC_TYPE_SIGNAL from current autoconf can fail if CC=g++. + + * aclocal.m4 (GROFF_TYPE_SIGNAL): New function. + * configure.ac: Use GROFF_TYPE_SIGNAL, not AC_TYPE_SIGNAL. + * configure, src/include/config.hin: Regenerated. + + * PROBLEMS: Updated. + + + Update getopt files. + + * src/include/getopt.h, src/libs/libgroff/getopt.c, + src/libs/libgroff/getopt1.c: Updated from GNU libc CVS. + + * src/include/getopt_int.h: New file (from GNU libc CVS). + + * src/include/groff-getopt.h: Updated. + + * src/include/Makefile.sub (HDRS): Add getopt_int.h. + + + * font/devutf8/NOTES: Updated. + +2005-04-28 Werner LEMBERG + + Bug fix for Win32 relocatable code. Based on a patch from Keith + Marshall. + + * src/libs/libgroff/maxpathname.cpp (PATH_MAX): Test for `_MAX_PATH' + also. + + * src/libs/libgroff/relocate.c (DEBUG): Define it conditionally. + (searchpath) [_WIN32]: Use `_fullpath', not `realpath'. + +2005-04-28 Keith Marshall + + Correct `gnu.eps' handling for build from distribution tarball, with + separate source and build directories. + + * doc/Makefile.sub: (examples.stamp): New target; forces copy of + grnexmpl.g, groff.css and gnu.eps from source to build directory; + generate gnu.eps from gnu.xpm if required; touch examples.stamp. + (prepare_examples): Make it depend on examples.stamp. + (CLEANADD): Add examples.stamp. + +2005-04-27 Werner LEMBERG + + Implement the rule + + position: '(' position ')' + + in pic. + + * src/preproc/pic/pic.y (position, position_not_place): Handle + additional parentheses. + + * doc/pic.ms: Updated. + +2005-04-23 Larry Jones + + * src/utils/xtotroff/xtotroff.c (MapFont): Fix variable declaration. + +2005-04-18 Werner LEMBERG + + * src/roff/groff/pipeline.c: Don't include ctype.h. + +2005-04-13 Werner LEMBERG + + * src/roff/nroff/nroff.man: Document option `-M'. + +2005-04-13 Bruce Lilly + + * src/roff/nroff/nroff.sh: Make the script accept option `-M'. + +2005-04-01 Kees Zeelenberg + Werner LEMBERG + + Add binary relocation support for Windows platforms. + + * src/include/Makefile.sub (defs.h): Add `INSTALLPATH'. + + * src/include/relocate.h, src/libs/libgroff/relocate.cpp: New files. + + * src/libs/libgroff/searchpath.cpp: Handle `relocate'. + (search_path::search_path, search_path::open_file_cautious): Use + `relocate'. + + * src/libs/libgroff/Makefile.sub (OBJS, CCSRCS), + src/include/Makefile.sub (HDRS): Updated. + +2005-04-01 Werner LEMBERG + + * src/devices/grohtml/post-html.cpp: Don't use strdup/free but + strsave/a_delete. + + * src/libs/libgroff/font.cpp: Replace strdup with strsave. + + * src/libs/libgroff/maxfilename.cpp: Don't include limits.h since + lib.h already does it. + + * src/libs/libgroff/maxpathname.cpp: New file, defining + path_name_max. + + * src/include/lib.h: Add prototype for path_name_max. + + * src/libs/libgroff/Makefile.sub (OBJS, CCSRCS): Updated. + + * src/include/nonposix.h (PATH_EXT): New macro. + +2005-03-28 Werner LEMBERG + + Add support for double- and zero-width characters in grotty. + + * src/devices/grotty/tty.cpp (glyph): Add width. + (tty_printer::make_underline, tty_printer::make_bold, + tty_printer::add_character): Add parameter to pass character width. + Update all callers. + (tty_printer::end_page): Increase hpos by actual character width. + + * font/devutf8/R.proto: Specify zero width for non-spacing + characters. + + * tmac/unicode.tmac: Remove definitions for non-spacing entities. + + * Makefile.comm (extraclean): Remove more junk files. + +2005-03-25 Werner LEMBERG + + * configure.ac: Undo change from 2005-03-24. + * configure: Regenerated. + +2005-03-24 Werner LEMBERG + + * Makefile.in (NOMAKEDIRS): Add contrib/gdiffmk/tests. + (dist): Search Makefile while descending into $(EXTRADIRS). + + * doc/Makefile.in (.PHONY): Add. + (clean): Don't remove *.png and *.eps. + Don't handle *.gif. + (realclean): Remove *.png and *.eps. + (extraclean): Depend on distclean. + + * configure.ac: Add copyright. + Handle contrib/pdfmark/Makefile. + + * configure: Regenerated. + +2005-03-18 Larry Kollar + + Add numbered and definition lists to www.tmac. + + * tmac/www.tmac (www-ul-level1, www-ul-level2, www-ul-level3, + www-ol-level1, www-ol-level2, www-ol-level3, www-ol-tmp): New + auxiliary string registers. + (www-ul-level, www-ol-level, www-dl-level, www-ol-ctr1, www-ol-ctr2, + www-ol-ctr3, www-dl-shift): New auxiliary number registers. + (www-level): Removed. + (www-level1, www-level2, www-level3): Initialize to empty. + (www-level0, www-level4, www-level5, www-level6, www-level7, + www-level8, www-level9): New string registers. + (www-push-li, www-pop-li): New macros. + (www-push-level, www-pop-level): Renamed to... + (www-push-ul-level, www-pop-ul-level): This. + Updated. + (www-push-ol-level, www-pop-ol-level): New macros. + (ULS, ULE): Updated. + (OLS, OLE, DLS, DLE): New user macros. + (LI): Removed. It is aliased to one of... + (www-li-ul, www-li-ol, www-li-dl): New macros. + + * tmac/groff_www.man: Document new macros. + + * NEWS: Updated. + +2005-03-18 Werner LEMBERG + + * tmac/doc-common (doc-operating-system-NetBSD-2.0.1, + doc-operating-system-NetBSD-2.0.2): New strings. + + * tmac/groff_mdoc.man: Updated. + +2005-03-17 Werner LEMBERG + + * doc/Makefile.sub (CLEANADD): Add `groff.html'. + +2005-03-17 Werner LEMBERG + + * src/libs/libgroff/hypot.c: Renamed to... + * src/libs/libgroff/hypot.cpp: This. Updated to C++. + + * src/libs/libgroff/Makefile.sub (CCSRCS, CSRCS): Updated. + + * src/include/lib.h: Updated. + +2005-03-16 Werner LEMBERG + + Add workaround for broken hypot() on Interix. + + * src/libs/libgroff/hypot.c: New wrapper file for `hypot'. + + * src/libs/libgroff/Makefile.sub (OBJS): Add `hypot.o'. + (CSRCS): Add `hypot.c'. + + * src/include/lib.h: Declare `groff_hypot'. + + * src/preproc/grn/hgraph.cpp: Don't declare `hypot'. + Use `groff_hypot'. + + * src/preproc/pic/pic.h: Don't declare `hypot'. + + * src/preproc/pic/object.cpp (hypot): Use `groff_hypot'. + +2005-03-15 Gaius Mulley + + * src/devices/grohtml/post-html.cpp + (html_printer::lookahead_for_tables): End .ce properly to avoid a + segfault. + +2005-03-15 Werner LEMBERG + + makeinfo 4.8 doesn't produce good HTML output from groff.texinfo. + + * doc/fixinfo.sh: New script to postprocess makeinfo's HTML output. + + * doc/Makefile.in (.texinfo.html): Call fixinfo.sh. + +2005-03-14 Werner LEMBERG + + Add Cyrillic support to devutf8 and devhtml. + + * font/devutf8/R.proto, font/devhtml/R.proto: Add Cyrillic blocks. + + * tmac/unicode.tmac: New file. + + * tmac/tty.tmac: Include unicode.tmac if device is utf8. + + * tmac/Makefile.sub (NORMALFILES): Add unicode.tmac. + + * NEWS: Updated. + +2005-03-02 Keith Marshall + + * src/libs/libdriver/printer.cpp (check_for_output_error): New + function. It has been introduced to catch peculiar error contexts + on MS-Windows platforms. + +2005-02-28 Werner LEMBERG + + * src/roff/troff/input.cpp (string_iterator::fill): Protect against + null pointer. + + * tmac/papersize.tmac: Convert `paper' string contents to lowercase. + + * configure: Regenerated. + + * NEWS: Updated. + +2005-02-28 Keith Marshall + + Integrate `pdfmark' into normal groff build system; + install macro `pdfmark' packages, build and install `pdfroff', + and PDF format documentation. + + * Makefile.comm: Add PDFDOCDIR. + + * Makefile.in: (MDEFINES) ALT_AWK_PROGS, ALT_GHOSTSCRIPT_PROGS, + pdfdocdir, make_pdfdoc, make_install_pdfdoc: New variables. + (unstall_dirs): Add pdfdocdir. + + * aclocal.m4: (GROFF_GHOSTSCRIPT_PREFS): New function; support + `--with-alt-gs' option, set ALT_GHOSTSCRIPT_PROGS. + (GROFF_GHOSTSCRIPT_PATH): Support `--with-gs' option, force use of + GROFF_GHOSTSCRIPT_PREFS, set GHOSTSCRIPT. + (GROFF_HTML_PROGRAMS): Force use of GROFF_GHOSTSCRIPT_PATH; tidy up. + (GROFF_AWK_PREFS): New function; support `--with-alt-awk' option, + set ALT_AWK_PROGS. + (GROFF_AWK_PATH): New function; support `--with-awk' option, force + use of GROFF_AWK_PREFS. + (GROFF_PDFDOC_PROGRAMS): New function; force use of GROFF_AWK_PATH + and GROFF_GHOSTSCRIPT_PATH, set make_pdfdoc and make_install_pdfdoc. + + * configure.ac: Add AC_PREREQ(2.59), GROFF_PDFDOC_PROGRAMS. + Remove GROFF_GHOSTSCRIPT_PATH, (forced by GROFF_PDFDOC_PROGRAMS, and + also by modified GROFF_HTML_PROGRAMS). + +2005-02-27 Gaius Mulley + + * src/devices/grohtml/html-text.cpp (html_text::do_pre): Preserve + paragraph spacing. + (html_text::done_para): Unset `start_space'. + (html_text::remove_para_align): Call `retrieve_para_space' for the + spacing. + + * src/devices/grohtml/post-html.cpp (html_printer::emit_raw): Unset + `seen_space'. + (html_printer::do_check_center): Emit vertical space if necessary. + + * src/roff/troff/env.cpp (environment_switch): Preserve + `seen_space', `seen_eol', and `suppress_next_eol' while switching + environments. + + * src/roff/troff/node.cpp (suppress_node::suppress_node): Set + `is_special'. + +2005-02-20 Werner LEMBERG + + * src/preproc/eqn/eqn.man, NEWS: Document various extensions of + eqn. + +2005-02-17 Werner LEMBERG + + * doc/pic.ms, man/groff.man: Fix typos. + + * doc/groff.texinfo: Fix typos. + (\LEmacro): Get proper mathematical spacing. + +2005-02-16 Werner LEMBERG + + * aclocal.m4 (GROFF_APPRESDIR_CHECK): Improve warning message. + * configure: Regenerated with autoconf 2.59b. + +2005-02-16 Gaius Mulley + + * src/devices/grohtml/post-html.cpp (html_printer::is_line_start, + html_printer::start_font): Fix handling of preformatted text. + +2005-02-15 Gaius Mulley + + These patches modify the indentation implementation to use `

'. Many thanks to Peter and Larry for + suggesting this solution. Grohtml only uses tables for `.IP' and + related tags when the first operand has a short width. + + Similarly, they modify all vertical space code. By default, grohtml + sets up a style sheet which uses no vertical space between `table', + `pre', and `p' tags. It forces spaces when it needs them using + `style="margin-top: 1em"'. + + * src/devices/grohtml/html-table.cpp: Include `html-text.h'. + (html_table::emit_table_header, html_table::emit_new_row): + Rewritten. + (html_table::set_space): New function. + (html_indent::html_indent): Don't set `is_used'. + (html_indent::begin): Rewritten. + (html_indent::end): Remove code in function. + + * src/devices/grohtml/html-table.h: Updated. + (html_table): Make `out' public. + + * src/devices/grohtml/html-text.cpp (html_text::html_text): + Initialize `start_space' with FALSE. + (html_text::end_tag) : Updated. + (html_text::issue_tag): Add argument to handle space style. + (html_text::start_tag) : Updated. + (html_text::flush_text): Don't set `start_space'. + (html_text::push_para): Don't set `p->really_issued'. + (html_text::do_emittext): Updated. + (html_text::do_para): Add paremeter to handle space. + Update all callers. + (html_text::retrieve_para_space): New function. + + * src/devices/grohtml/html-text.h (STYLE_VERTICAL_SPACE): New macro. + (tag_definition): Remove `really_issued'. + (html_text): Updated. + + * src/devices/grohtml/post-html.cpp (html_printer): Add variables + `current_column' and `row_space'. + Update constructor. + (html_printer::emit_raw, html_printer::write_header, + html_printer::do_indent, html_printer::do_check_center, + html_printer::do_tab_ts): Handle vertical space. + (html_printer:do_tab_te, html_printer::do_end_para): Call + `remove_para_space'. + (html_printer::do_col): Rewritten. + (html_printer::flush_globs): Remove debugging code. + (html_printer::is_line_start): New function. + (html_printer::start_font): Use `is_line_start'. + (html_printer::writeHeadMetaStyle): New function. + (html_printer::do_file_components, html_printer::~html_printer): + Call `writeHeadMetaStyle'. + + * tmac/www.tmac (www-handle-percent): New macro. + (MPIMG): Handle percent values for width and height parameters. + (DC): Updated. + + * tmac/groff_www.man: Updated. + +2005-02-14 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Remove an incorrect `my' from + $psname and $italic_angle. + Immediately restart file input loops if `split' returns an empty + array. + +2005-02-13 Michail Vidiassov + Werner LEMBERG + + Update afmtodit to better support Unicode (Michail). + Update afmtodit to use Perl 5 syntax (Werner). + + * src/utils/afmtodit/afmtodit.pl: Don't use `getopts.pl' but + `Getopts::Std'. + Decorate variables with `my' where necessary. + Use `defined' where necessary to avoid warnings. + Don't use `do' for subroutine calls. + Other minor syntax updates. + Check for both `uXXXX[X[X]]' and `uniXXXX'. + Handle glyph variants properly. + (%unicode_decomposed, %AGL_to_unicode): Don't use `u' prefix in + strings. + + * src/utils/afmtodit/afmtodit.man: Updated. + +2005-02-13 Werner LEMBERG + + Make groff.texinfo work with texinfo 4.8. + + * doc/groff.texinfo (@Var): Use @r and @slanted. + (@defdummy, @Def*): Use @c to avoid empty lines. + (\angles): Replaced with... + (\Langlemacro, \Ranglemacro): New TeX macros. + (@Langlemacro, @Ranglemacro): New variables defined with @set. + (@angles): Use @Langlemacro and @Ranglemacro. + (\LE): Replaced with... + (\LEmacro): New TeX macro. + (@LEmacro): New variable defined with @set. + (@LE): Use @LEmacro. + (@Lparenmacro, @Rparenmacro, @Lbrackmacro, @Rbrackmacro): New + variables defined with @set. + (@lparen, @rparen, @lbrack, @rbrack): Replaced with... + (@Lparen, @Rparen, @Lbrack, @Rbrack): New macros. + Update all callers. + + Other minor updates. + + * doc/texinfo.tex: Update to texinfo version 4.8. + + * README.CVS: Updated. + +2005-02-09 Alejandro López-Valencia (tiny change) + + * doc/groff.texinfo (ms Document Control Registers): Document `HY' + and `FAM' registers. + +2005-02-05 Werner LEMBERG + + * tmac/groff_mdoc.man, tmac/doc-common, tmac/doc-ditroff, + tmac/doc-nroff, tmac/doc-old.tmac, tmac/doc-syms, tmac/doc.tmac: + Update BSD license. + +2005-02-01 Werner LEMBERG + + * src/roff/groff/groff.man: Add information about paper size. + +2005-01-25 Werner LEMBERG + + * src/roff/nroff/nroff.sh: Handle `*.ISO8859-1' in locale. From + NetBSD bin/29114. + +2005-01-22 Ruslan Ermilov + + * tmac/doc.tmac (Sm): Improved. It didn't work properly in many + cases. + (Re): Emit a warning if called without `.Rs'. + (doc-finish-reference): Use parameter for decreasing + `doc-reference-count'. + (doc-print-reference): Pass specific count parameters to + `doc-finish-reference'. + +2005-01-21 Werner LEMBERG + + * src/libs/libdriver/input.cpp (delete_current_env, do_file): + Reset pointers to zero after deallocation. This fixes a crash + if a driver is called with multiple input files. Reported by + Ken Chilton . + + * src/devices/grops/grops.man: Add more info on DSC. + +2005-01-17 Ruslan Ermilov + + * tmac/doc-common (Dd), tmac/doc-ditroff (gX, doc-setup-header): + Remove dead code. + +2005-01-17 Werner LEMBERG + + * src/roff/troff/div.cpp (top_level_diversion::space): Protect + against division by zero. + +2005-01-13 Ruslan Ermilov + + * tmac/doc.tmac (Ef): Restore doc-curr-font and doc-curr-size. + +2004-12-19 Werner LEMBERG + + * install-sh: New version; taken from texinfo CVS. + +2004-12-17 Werner LEMBERG + + * tmac/devtag.tmac: Protect against loading twice. + Protect agains compatibility mode. + * tmac/www.tmac: Protect against loading twice. + Load `devtag.tmac' before switching off compatibility mode. + * tmac/an-old.tmac, tmac/s.tmac: Load `devtag.tmac'. + +2004-12-16 Mike Bianchi + + * configure.ac: Produce `contrib/gdiffmk/tests/runtests'. + * configure: Updated. + +2004-12-15 Thomas Klausner + + * tmac/doc-syms, tmac/groff_mdoc.man: Add `libpam' library. + +2004-12-15 Werner LEMBERG + + Make `test-groff' work again -- previously, wrong paths have been + used. Additionally, it can now be called from anywhere. + + * test-groff.in: Don't test for groff binary. This is no longer + necessary since the proper paths are determined by `configure'. + (EXEEXT): Removed. No longer used. + (srcdir, builddir): Use values provided by the configure script. + (XENVIRONMENT): Updated. + + * INSTALL: Updated. + +2004-12-14 Gaius Mulley + + Make .tag and .taga work for all devices (but only grohtml actually + handles them). + + * src/devices/grohtml/post-html.cpp: s/html-tag/devtag/. + (text_glob::is_br, page::add_tag, html_printer::troff_tag, + html_printer::handle_assertion): Don't use hard-coded string + lengths. + (html_printer::lookahead_for_table): Reset `tbl' properly if + necessary. + (html_printer::devtag): New function, handling `devtag'. + (html_printer::special): Don't handle `html-tag'. + + * src/include/printer.h, src/libs/libdriver/printer.cpp + (printer::devtag): New virtual function. + + * src/libs/libdriver/input.cpp (parse_x_command) <'X'>: Handle + `devtag'. + + * src/roff/troff/env.cpp, src/roff/troff/mtsm.cpp, + src/roff/troff/node.cpp: s/html-tag/devtag/. + + * src/roff/troff/input.cpp (tag, taga): Always call + curenv->add_node. + + * tmac/an-old.tmac, tmac/s.tmac, tmac/troffrc-end: Use DEVTAG* + macros instead of HTML-TAG*. + + * tmac/devtag.tmac: New file, defining the DEVTAG-* macros. + + * tmac/www.tmac: Load devtag.tmac. + Replace HTML-TAG* macros with DEVTAG* macros. + (HTML, HTML-NS): Changed definitions. + (URL): Use HTML-NS. + (HTML-TAG, HTML-TAG-NS, HTML-TAG-NEXT): Removed. + + * tmac/Makefile.sub (NORMALFILES): Add devtag.tmac. + +2004-12-10 Werner LEMBERG + + Import Mike's `gdiffmk' package. + + * contrib/gdiffmk/*: New files. + * Makefile.in (OTHERDIRS): Add contrib/gdiffmk. + * NEWS: Updated. + +2004-12-08 Werner LEMBERG + + Import Keith's `pdfmark' package. Integration is very preliminary. + + * contrib/pdfmark/*: New files. + * Makefile.in (OTHERDIRS): Add contrib/pdfmark. + * NEWS: Updated. + +2004-12-07 Gaius Mulley + + Fix a bug with title handling in HTML. + + * src/devices/grohtml/post-html.cpp (text_glob::is_nf, + text_glob::is_fi, text_glob::is_ce): Use strlen to compute string + length. + (html_printer::handle_tag_within_title): New function. + (html_printer::do_title): Use it. + + * tmac/s.tmac (TL): Don't set `need_eo_tl'. + (cov*tl-au-print): Emit `.eo.tl' tag. + +2004-12-05 Alejandro López-Valencia + + * man/groff_char.man: Minor imrovements. + +2004-12-04 Werner LEMBERG + + * src/preproc/eqn/eqn.man: Revised. + +2004-11-25 Werner LEMBERG + + * src/utils/xtotroff/xtotroff.c: Reformat to be similar to other + groff source files. + Include config.h. + Include limits.h. + Remove X_NOT_STDC_ENV conditional. + (Version_string, program_name): New global variables. + (groff_flag): Removed. + (MapFont): Updated. + (usage): Take a stream as argument. + Use `program_name'. + Update all callers. + (main): Add `long_options' array for `--help' and `--version'. + Make `-g' a dummy option. + Handle `-v' and unknown options. + Remove unused `position' variable. + + * src/utils/xtotroff/Makefile.sub (MAN1): Define. + (XLIBS): Add LIBGROFF. + + * src/utils/xtotroff/xtotroff.man, src/utils/xtotroff/Makefile.in: + New files. + + * src/devices/xditview/Dvi.c (default_font_map): Split into three + parts to avoid compiler warning. + (resources): Don't initialize with `default_font_map'. + (ClassInitialize): Initialize first element of `resources'. + + * src/devices/xditview/Makefile.sub (devdir, xtotroff, DPIS, fonts): + Removed. + + * src/utils/lkbib/lkbib.man, src/utils/lookbib/lookbib.man, + src/utils/pfbtops/pfbtops.man: Revised, updated. + + * configure.ac: Generate src/utils/xtotroff/Makefile. + * configure: Regenerated. + +2004-11-24 Werner LEMBERG + + First fixes to get produce HTML. + + * src/devices/grohtml/post-html.cpp (generate_img_src): Add `alt' + attribute. + + * tmac/www.tmac (IMG, PIMG, MPIMG): Add `alt' attribute. + (HR, LI): Use `HTML

', not `HTML'. + + * doc/webpage.ms: Minor updates. + +2004-11-23 Larry Kollar + + Add option -S grohtml to determine the file split level. + + * src/devices/grohtml/post-html.cpp (split_level): New global + variable. + (html_header::determine_header_level): Use split_level. + (main): Handle `-S' command line option. + Sort options. + + * src/preproc/html/pre-html.cpp (scanArguments): Updated. + + * src/devices/grohtml/grohtml.man: Document it. + Sort options. + + * NEWS: Document it. + +2004-11-23 Y T + + * tmac/s.tmac (ref*add-V, ref*add-N): New macros for handling + the volume and number refer entries. + +2004-11-22 Werner LEMBERG + + * src/devices/grohtml/html-table.cpp + (html_table::emit_table_header): Don't emit `cols' attribute which + doesn't exist in HTML 4.0 and is thus invalid. + + * NEWS: More minor fixes and updates. + +2004-11-18 Werner LEMBERG + + * tmac/www.tmac (HTML-NS, HTML-TAG-NS, HTML-TAG-NEXT): Simplified. + (HTML

): Minor clean-up. + + * tmac/groff_www.man: Updated. + + * src/devices/grohtml/grohtml.man: Revised and updated. + + * NEWS: Updated. + +2004-11-18 Gaius Mulley + + * src/devices/grohtml/post-html.cpp (html_printer::do_heading): + Fix space insertion. + (html_printer::do_links): Fix rules generation around automatic + heading links. + + * tmac/www.tmac (LK): Use HTML-TAG-NS. + (HR): Simplify. + No longer emit empty line for non-HTML devices. + +2004-11-17 Werner LEMBERG + + * doc/Makefile.in (prepare_examples, webpage.html): Handle + `groff.css'. + + * doc/Makefile.sub (EXAMPLEFILES, CLEANNOTSRCDIRADD, + prepare_examples, webpage.html): Handle `groff.css'. + +2004-11-15 Werner LEMBERG + + * NEWS, README, doc/webpage.ms: Updated. + + * tmac/www.tmac (HTML, HTML-TAG): Minor clean-ups. + +2004-10-30 Gaius Mulley + + * src/include/printer.h (printer): Remove virtual function + `round_width'. + Update all source files. + + * src/devices/grohtml/post-html.cpp (html_printer): New member + function `round_width'. + +2004-10-20 Tadziu Hoffmann + + * src/preproc/tbl/table.cpp (table::do_row): Fix handling of the `d' + column key letter suffix. + +2004-10-14 Werner LEMBERG + + * Makefile.in (check): Depend on `site.exp' and `docheck'. + (docheck): Run dejagnu's `runtest' if it exists. + (site.exp): Create dejagnu configuration file. + + * Makefile.sub (DISTCLEANFILES): Add files related to dejagnu. + +2004-10-13 Werner LEMBERG + + * src/devices/grohtml/html-text.cpp (html_text_get_alignment), + src/devices/grohtml/post-html.cpp (make_val, + html_printer::handle_state_assertion): Fix compiler warnings. + + * src/roff/troff/div.cpp: Include `stringclass.h' and `mtsm.h'. + (diversion::diversion): Fix order of initializers. + + * src/roff/troff/div.h: Don't include `mtsm.h'. + + * src/roff/troff/env.cpp: Include `stringclass.h' and `mtsm.h'. + (environment::environment): Fix order of initializers. + (environment::make_tag, environment::construct_format_state): Fix + compiler warnings. + + * src/roff/troff/input.cpp: Include `stringclass.h' and `mtsm.h'. + (input_iterator::input_iterator, macro::macro): Fix order of + initializers. + + * src/roff/troff/mtsm.cpp: Include only necessary header files. + (state_set::add, state_set::val): Fix compiler warnings. + + * src/roff/troff/mtsm.h: Don't include `stringclass.h'. + (bool_value_state, int_value_state, units_value_state, + string_value_state): Remove comma after last element which causes + an error with g++ 3.3.3. + + * src/roff/troff/node.cpp: Include `stringclass.h'. + (hline_node::hline_node, vline_node::vline_node, + space_char_hmotion_node, left_italic_corrected_node): Fix compiler + warnings. + (zero_width_node::zero_width_node): Fix order of initializers. + + * src/roff/troff/node.h: Don't include `mtsm.h'. + (hmotion_node): Fix compiler warnings. + + * src/roff/troff/number.cpp: Include `stringclass.h' and `mtsm.h'. + +2004-10-12 Gaius Mulley + + * doc/groff.css: New file. + + * doc/webpage.ms: Use `groff.css'. + Other small fixes. + + * tmac/an-old.tmac (need_eo_h): New number register. + (TH): Emit `.eo.tl' tag after title. + (SH): Set `need_eo_h'. + (an-trap): Handle `need_eo_h'. + (an-do-tag): s/HTML-TAG-NS/HTML-TAG-NEXT/. + + * tmac/s.tmac (need_eo_h, need_eo_tl): New number registers. + (TL): Always start diversion. + Updated. + (@AI): Always call `par@reset'. + (@AB): Update code for -Thtml. + (cov*tl-au-print): Handle -Thtml. + (par@reset): Handle `need_eo_tl', `need_eo_h'. + (@IP): Simplified. + (@IT-html): Removed. + (@SH): Set `need_eo_h' for -Thtml. + (par@TL): s/HTML-TAG/HTMl-TAG-NS/. + Set `need_eo_tl'. + (@NH): s/HTML-TAG/HTMl-TAG-NS/. + Set `need_eo_h' for -Thtml. + (@EQ, @EN): Don't handle -Thtml specially. + (par@load-init): Don't handle -Thtml specially. + + * tmac/www.tmac (www:paraspace): New macro. + (HTML-NS, HTML-TAG-NS): Use new `tag' request. + (HTML

, HTML-TAG-NEXT): New macros. + (HnE): Emit tag `.eo.h' instead of break. + (HR): s/HTML-NS/HTML/. + (www-end-nowhere): End diversion only if `www-html' not set. + Emit `.eo.tl' tag. + (ULS, ULE): s|HTML|HTML

|. + (LI): Call `www:paraspace'. + (HEAD): New macro. + +2004-10-11 Gaius Mulley + + * src/roff/troff/request.h (macro): Make `p' public. + New variable `is_a_diversion'. + New member function `is_diversion'. + + + * src/devices/grohtml/html.h (simple_output): New member function + `force_nl'. + + * src/devices/grohtml/html-table.cpp (tabs::compatible): Fix + computation of `total'. + (tabs::check_init): New function. + (html_table::emit_table_header): Emit style data. + (html_table::insert_column): Improved. + + * src/devices/grohtml/html-table.h: Updated. + + * src/devices/grohtml/html-text.cpp (html_text::html_text): + Initialize `start_space' with TRUE. + (html_text::end_tag, html_start_tag): Fix `P_TAG' and `PRE_TAG' + cases. + (html_text::flush_text): Set `start_space' flag. + (html_text::uses_indent, html_text::remove_para_space, + html_text::get_alignment): New functions. + (html_text::push_para): Updated. + (html_text::do_para): Check for empty argument. + Don't set `space_emitted'. + (html_text::do_space, html_text::emit_space): Updated. + + * src/devices/grohtml/html-text.h (tag_definition): New variable + `really_issued'. + (html_text): New member function `uses_indent', `remove_para_space', + `get_alignment'. + + * src/devices/grohtml/output.cpp (simple_output::force_nl): New + function. + (simple_output:nl): Always emit `\n'. + + * src/devices/grohtml/post-html.cpp: Include `string.h'. + (BASE_POINT_SIZE): Removed. + (base_point_size, head_info): New global variables. + (text_glob): New member functions `is_ll', `is_tl', `is_eo_tl', + `is_eo_h'. + (text_glob::is_nf, text_glob::is_fi): Handle `.fi 0' and `.fi 1' + tags, respectively. + (page::add_and_encode): Pass additional parameter for tag flag. + (assert_pos): New structure. + (assert_state): New class. + (html_printer): Remove `indentation', `prev_indent'. + Add variables `troff_indent', `device_indent', `temp_indent'. + Add variables `seen_indent', `next_indent', `seen_pageoffset', + `next_pageoffset', `seen_linelenght', `next_linelength', + `seen_center', `next_center', `seen_space', `seen_break', `as'. + Add member functions `do_check_center', `do_space', `do_head', + `get_troff_indent', `restore_troff_indent', `handle_assertion', + `handle_state_assertion', `do_end_para', `set_char_and_width'. + Change argument to `do_fill' to `char *'. + Update constructor. + (html_printer::emit_raw): Call `shutdown_table'. + Use new functions. + (html_printer::do_center): Simplified. + (html_printer::do_title): Improved. + (html_printer::write_header): Emit one more newline. + Use new functions. + (html_printer::do_heading, html_printer::do_indent, + html_printer::do_eol, html_printer::do_tab_ts, + html_printer::do_tab, html_printer::do_tab0, + html_printer::calc_po_in, html_printer::next_horiz_pos, + html_printer::remove_courier_tabs, + html_printer::insert_tab0_foreach_tab, html_printer::begin_page): + Updated. + (html_printer::do_linelength, html_printer::do_pageoffset, + html_printer::do_indentation, html_printer::do_tempindent, + html_printer::do_tab_te): Simplified. + (html_printer::do_pointsize): Check whether point size is really + associated a `.tl' tag. + (html_printer::do_break): Rewritten. + (html_printer::troff_tag): Improved. + (html_printer::flush_globs): Updated. + (html_printer::lookahead_for_tables): Handle `is_br'. + Use new functions. + (html_printer::set_char): Check `sbuf_style.f'. + (html_printer::write_navigation): Use string comparison. + (html_printer::~html_printer): Emit `head_info'. + (html_printer::special): Rewritten. + (get_str, make_val): New functions. + (main): New option `s' to set the base point size. + + * src/preproc/html/pre-html.cpp (scanArguments): Handle option `s'. + +2004-10-10 Gaius Mulley + + * src/roff/troff/node.cpp: New extern `debug_state'. + Include `stringclass.h' and `mtsm.h'. + Implement new classes and class members from `node.h'. + (real_output_file): Make `fp' public. + (troff_output_file): New variables `cur_div_level' and `tag_list'. + Update constructors. + (troff_output_file::really_print_line): Check whether we should push + the current troff state and use the state at the start of the + invocation of this diversion. + (troff_output_file::add_to_tag_list): New member function. + (node::add_char): Handle `glyph_comp_np'. + + * src/roff/troff/node.h: Include `mtsm.h'. + (node): New variables `state', `push_state', `div_nest_level', + `is_special'. Update constructors, all descendants. + Pass additional argument to `add_char' member function. + New virtual member functions `is_tag', `debug_node', + `debug_node_list'. Update all descendants. + (tag_node): New class for handling tags. + (output_file): Add variable `state'. + +2004-10-09 Gaius Mulley + + * src/roff/troff/mtsm.cpp, src/roff/troff/mtsm.h: New files, + providing a minimal troff state machine to emit meta tags for the + post-grohtml device driver. + + * src/roff/troff/Makefile.sub (OBJS, CCSRCS, HDRS): Handle new + files. + +2004-10-09 Werner LEMBERG + + * tmac/trace.tmac: Fix handling of `am' and `am1' calls. + +2004-10-06 Gaius Mulley + + * src/roff/troff/column.cpp (vjustify_node::copy): Updated. + + * src/roff/troff/div.h: Include `mtsm.h'. + (diversion): New variables `any_chars_added', `needs_push', + `saved_seen_break', `saved_seen_space', `saved_seen_eol', + `saved_suppress_next_eol', `modified_tag'. + New virtual member function `is_diversion'. Update all descendants. + + * src/roff/troff/div.cpp (diversion::diversion, + macro_diversion::macro_diversion): Updated. + (do_divert): Handle `seen_break', `seen_space', `seen_eol', + `suppress_next_eol'. + (top_level_diversion::space): Handle `curenv->seen_space'. + (page_offset): Update tag handling. + (space_request, blank_line, flush_output): Don't call `add_html_tag'. + + * src/roff/troff/env.h (environment): Make `tabs' public. + Remove `ignore_next_eol', `emitted_node'. + Update `output_line', `output'. + New variables `seen_space', `seen_eol', `suppress_next_eol', + `seen_break'. + New member functions `construct_state', `make_tag', + `construct_format_state, `construct_new_line_state, + `dump_troff_state'. + Remove `add_html_tag', `make_html_tag'. + + * src/roff/troff/env.cpp: New externs `suppress_push', + `get_diversion_state', `global_diverted_space'. + (pending_output_line): New variable `was_centered'. + Update constructor and all callers. + (pending_output_line::output): Call `curenv->construct_format_state'. + (environment::environment, environment::copy): Updated. + (environment::output): Handle `was_centered'. + (environment::add_char): Handle construct and diversion state. + (environment::add_node): Handle construct state. + (environment::newline): Handle `was_centered'. + (environment::output_line): Updated. + (environment::possibly_break_line): Updated. + Update tag handling. + (environment::add_html_tag): Replaced with... + (environment::make_tag): New function. + (environment::add_html_tag_tabs, environment::make_html_tag): Removed. + (environment::dump_troff_state): New debugging function. + (environment::construct_state, environment::construct_format_state, + environment::construct_new_line_state): New functions. + (environment::do_break): Updated. + Handle `global_diverted_space'. + (environment::handle_tag): Update tag handling. + (point_size, fill, do_break_request): Don't call `add_html_tag'. + (no_fill): Don't call `add_html_tag'. + Set `suppress_next_eol'. + (center, right_justify, line_length, indent, temporary_indent, + set_tabs): + Update tag handling. + + * src/roff/troff/input.cpp: Don't include `stringclass.h'. + (input_iterator): New variables `is_diversion', `diversion_state'. + Update constructors. + (input_stack): New member functions `get_div_level', + `get_diversion_state', `check_end_diversion'. + New variables `div_level', `diversion_state'. Initialize them. + (suppress_push, global_diverted_space): New global variables. + (input_stack::finish_get, input_stack::finish_peek, + input_stack::remove_boundary, input_stack::end_file, + input_stack::clear, input_stack::pop_macro): Call + `check_end_diversion'. + (input_stack::push): Handle `div_level' and `diversion_state'. + (get_diversion_state): New function. + (diverted_space_node::reread): Handle `global_diverted_space'. + (macro::macro): Update constructors. + (macro::is_diversion): New function. + (macro::operator=): Set `is_a_diversion'. + (string_iterator): New member function `is_diversion'. + (string_iterator::string_iterator): Update constructors. + (string_iterator::fill): Set `div_nest_level'. + (macro_iterator): New member function `is_diversion'. + (do_if_request): Handle `suppress_push'. + (tag, taga): New functions. + (init_input_requests): Add `tag' and `taga' requests. + +2004-10-05 Gaius Mulley + + * src/include/font.h (font): New member function + `get_image_generator'. + New variables `unscaled_charwidths' and `image_generator'. + + * src/libs/libgroff/font.cpp (font::get_width): Always return the + character's unscaled width if `font::unscaled_charwidths' is set. + (font::get_image_generator): New function. + (font::load_desc): Check the `unscaled_charwidths' and + `image_generator' keywords. + + * src/libs/libgroff/fontfile.cpp: Initialize + `font::unscaled_charwidths' and `font::image_generator'. + + * font/devhtml/DESC.proto: s/html/unscaled_charwidths/. + + * font/devhtml/Makefile.sub (DESC): Set `image_generator' keyword. + + * man/groff_font.man: Document `unscaled_charwidths' and + `image_generator'. + + * src/preproc/html/pre-html.cpp: Include `device.h'. + (image_gen): New global variable. + (imageList::createPage): Use `image_gen'. + (main): Use `image_generator' keyword. + +2004-10-04 Gaius Mulley + + * tmac/html.tmac: Handle \[sqrtex]. + +2004-10-04 Gaius Mulley + + * src/include/printer.h (printer): New virtual method `round_width'. + + * src/devices/grodvi/dvi.cpp, src/devices/grolbp/lbp.cpp, + src/devices/grolj4/lj4.cpp, src/devices/grops/ps.cpp, + src/devices/grotty/tty.cpp (printer::round_width): New function + member. + + * src/devices/grohtml/post-html.cpp (printer::round_width): New + function member. + (html_printer::set_numbered_char): Use it. + +2004-10-03 Gaius Mulley + + * aclocal.m4 (GROFF_GHOSTSCRIPT_PATH): New macro. + + * configure.ac: Call GROFF_GHOSTSCRIPT_PATH. + + * configure: Regenerated. + + * Makefile.in (GHOSTSCRIPT): New variable. + (MDEFINES): Add GHOSTSCRIPT. + +2004-10-03 Werner LEMBERG + + * INSTALL.gen: Updated (taken from texinfo CVS). + +2004-09-28 Werner LEMBERG + + * NEWS: Updated. + +2004-09-28 Heinz-Jürgen Oertel + + * tmac/groff_www.man: Revised and updated. + +2004-09-26 Werner LEMBERG + + Fix \$@ and \$* to handle any number of arguments. + + * src/roff/troff/input.h (BEGIN_QUOTE, END_QUOTE): New special + characters. + + * src/roff/troff/input.cpp (input_iterator::internal_level): + Removed. + (input_stack): New member functions `increase_level' and + `decrease_level'. + (input_stack::get_level): Don't use `internal_level'. + (get_copy, token::next): Handle BEGIN_QUOTE and END_QUOTE. + (end_quote_iterator): Completely removed. + (interpolate_arg): Build string for \$@ and \$* which is then + pushed onto the input stack. + +2004-09-23 Keith Marshall + + * tmac/groff_ms.man, doc/groff.texinfo: Document changes from + 2004-09-19. + +2004-09-23 Werner LEMBERG + + * tmac/an-old.tmac (ne): Using default scaling operator. + +2004-09-19 Keith Marshall + + This change implements the following features: + + PORPHANS + New numeric register: Defines number of lines following LP, PP, + QP, IP or XP, which must be kept together, before any automatic + page break. If insufficient space remains on the current page, a + page break is forced before the new paragraph begins. + + HORPHANS + New numeric register: Sets number of lines of following paragraph + which must be kept with a heading, defined by NH or SH, before any + automatic page break. If insufficient space remains on the + current page, a page break is forced before the heading. + + GROWPS + (Thanks to Joerg van den Hoff, for this idea). + + New numeric register: Sets the first level of heading (set with + NH), which will keep the same point size as body text; e.g. if + GROWPS is set to 3, .NH 3, .NH 4, ... will produce headings at the + point size specified by \n[PS], but .NH 2 and .NH 1 will have + progressively larger point sizes, determined by \n[PSINCR] (see + below). + + PSINCR + New numeric register: Sets the point size increment for each level + of heading, (set with NH), below the threshold level set by + GROWPS; e.g. if \n[PS] = 10, \n[GROWPS] = 3 and \n[PSINCR] = 2.0p, + then .NH 1 will produce 14pt headings, .NH 2 will produce 12pt, + and all other levels will remain at 10pt, (because \n[PS] = 10). + + SH + Existing macro now accepts a numeric argument, to make heading + size match that of NH with same argument value, when the + GROWPS/PSINCR feature is enabled. + + SN-DOT + New string, set by NH macro, replaces the existing (undocumented) + use of SN, to represent the assigned section number. + + SN-NO-DOT + New string, set by NH macro, represents the assigned section + number, but omits the terminal period (periods at intermediate + levels are retained). + + SN + String set by NH macro, originally undocumented, now implemented + as an alias for SN-DOT (which reproduces original behaviour). + + * tmac/s.tmac (PORPHANS): New register. + (par*start): Use it. + (HORPHANS, GROWPS, PSINCR): New registers. + (SH-NO-TAG, @SH): Use them. + (@NH): Improved. + +2004-09-19 Keith Marshall + + * NEWS, doc/groff.texinfo, tmac/groff_ms.man: Document the deletion + of `Ds' and `De' macros. + +2004-09-10 Werner LEMBERG + + In tbl, handle \a as an interpreted leader character if in + compatibility mode. + + * src/preproc/tbl/table.h (PREFIX, PREFIX_CHAR, LEADER, + LEADER_CHAR): New macros. + (compatible_flag): New declaration. + + * src/preproc/tbl/main.cpp (table_input): Add LEADER_1, LEADER_2, + LEADER_3, and LEADER_4 to `state'. + (table_input::get): Handle `\a'. + + * src/preproc/tbl/table.cpp (PREFIX): Removed. + (LEADER_REG): New macro. + (table::init_output): Define LEADER_REG string register if in + compatibility mode. + + * src/preproc/tbl/tbl.man: Document it. + +2004-08-18 Werner LEMBERG + + * tmac/doc.tmac (An): Fix error message. + +2004-08-06 Werner LEMBERG + + * src/preproc/tbl/main.cpp (main): Call `fatal' not `error' if a + file can't be opened. UNIX tbl has the same behaviour. + +2004-08-05 Y T + + * src/preproc/grn/hdb.cpp (compatibility_flag): Add declaration. + (DBRead): If in compatibility mode, take into account the text + when computing figure boundaries. + +2004-08-05 Werner LEMBERG + + * src/preproc/soelim/soelim.man: Improved. Based on suggestions + from Tadziu Hoffmann. + +2004-08-03 Werner LEMBERG + + * doc/meref.me: Document `_M' register. + +2004-08-03 Martin Husemann + + Make hpftodit work correctly on big-endian systems. + + * src/utils/hpftodit/hpftodit.cpp (File): New method + `get_uint32(char *)'. + (entry): New member `orig_value'. + (read_tags): Use new method. + (output_font_name, read_and_output_pcltypeface, dump_ascii): + Updated. + +2004-08-01 Werner LEMBERG + + * tmac/s.tmac: Undo change 2003-06-29. The proper macro definitions + are already in X11's `macros.t' file. + +2004-08-01 Jeff Conrad + + * src/utils/hpftodit/hfptodit.cpp (output_font_name, dump_ascii): + Fix casting bug. + (read_and_output_pcltypeface): Handle strings with length <= 4. + +2004-07-27 Egil Kvaleberg + + * tmac/s.tmac (pg@top): Don't save `PO' register. + (pg*end-col, pg*end-page): Directly use `PO' register. + +2004-07-27 Werner LEMBERG + + * man/groff_tmac.man: Mention `trace' and `pic' macro packages. + + * src/preproc/refer/refer.cpp (output_references): Check for + empty hash table. + * src/preproc/refer/refer.man: Improve documentation of + `bibliography' command. + +2004-07-26 Werner LEMBERG + + Add requests `fcolor' and `gcolor'. + + * src/roff/troff/env.cpp (fill_color_change, glyph_color_change): + New functions. + (init_env_requests): Add `fcolor' and `gcolor'. + + * src/roff/troff/input.h: Export do_glyph_color and do_fill_color. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new requests. + +2004-07-24 Werner LEMBERG + + Add support for fractional point sizes in ms macros. A value for + PS, VS, FPS, and FVS greater than or equal to 1000 is always divided + by 1000. For example, `.nr PS 10250' sets the font size to 10.25p. + + * tmac/s.tmac (@AU, @AI, par@load-init, par@init, par@reset, NL, + PX): Handle fractional point sizes for PS, VS, FPS, and FVS. + + * tmac/groff_ms.man, docs/groff.texinfo, NEWS: Document it. + +2004-07-19 Werner LEMBERG + + * src/preproc/pic/lex.cpp (for_input): Add member `from'. + Update constructor. + (do_for, for_input::get, for_input::peek): Handle negative `by'. + * src/preproc/pic/pic.man, doc/pic.ms, NEWS: Document it. + +2004-07-08 Thomas Klausner + + * tmac/doc-syms (doc-str-St--p1003.1-2004): New string. + * tmac/groff_mdoc.man: Updated. + +2004-07-05 Werner LEMBERG + + * doc/groff.texinfo: Further improve documentation of `hcode'. + +2004-07-04 Sang Dae Yu + + Improve appearance of arrows in pic. + + * src/preproc/pic/object.cpp (draw_arrow): Make outline of filled + arrow head thin. + Use two line segments for drawing non-filled arrow head. + (line_object::print, spline_object::print): Shorten line length to + avoid arrow sticking. + (arc_object::print): Take arrow direction into account. + +2004-07-03 Heinz-Jürgen Oertel + + * tmac/groff_www.man: Update documentation of .MPIMG. + +2004-07-03 Werner LEMBERG + + * tmac/an-old.tmac (RI): Always start with font `R'. + (RI, IR): Properly end with font `R'. + +2004-07-02 Paul Eggert + + * man/ditroff.man, man/groff_font.man, man/groff_out.man, + src/devices/grohtml/grohtml.man, src/preproc/grn/grn.man, + src/preproc/pic/pic.man, tmac/groff_man.man, tmac/groff_ms.man: + Don't pass more than six arguments to .R, .I, .B, etc., for + compatibility with traditional troff macros. + +2004-07-02 Werner LEMBERG + + * src/roff/troff/input.h: s/COMPATIBLE_SAVE/PUSH_GROFF_MODE/. + s/COMPATIBLE_RESTORE/POP_GROFFCOMP_MODE/. + Update all users. + (PUSH_COMP_MODE): New internal character constant. + Update all users. + + * src/roff/troff/input.cpp (get_copy): Handle PUSH_GROFF_MODE, + PUSH_COMP_MODE, and POP_GROFFCOMP_MODE. + (token::next, macro::append): Handle PUSH_COMP_MODE. + (decode_args): Add PUSH_GROFF_MODE or PUSH_COMP_MODE before and + POP_GROFFCOMP after each of the decoded arguments to make them + independent from the compatibility mode status. + (comp_mode): Add `COMP_ENABLE'. + (do_define_string, do_define_macro): Handle COMP_ENABLE. + (define_string, append_string, define_macro, define_indirect_macro, + append_macro, append_indirect_macro): Handle `compatible_flag'. + (chop_macro, substring_request, asciify): Handle PUSH_COMP_MODE. + + * man/groff_diff.man, doc/groff.texinfo: Updated. + +2004-07-01 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of `hcode'. + Use @documentencoding and convert document to latin-1; to do that + make latin characters active and assign proper macros (within a + @tex...@end tex environment). + * doc/Makefile.in (.texinfo.html, groff): Use --enable-encoding. + * doc/Makefile.sub (groff): Ditto. + +2004-06-29 Werner LEMBERG + + Implement two new conditional operators `F ' and `S ' + which check whether is a valid font or style, respectively. + + * src/libs/libgroff/font.cpp (text_file): Add `silent' member. + (text_file::text_file): Updated. + (text_file::error): Don't emit message if `silent' is set. + (font::load_font): Add optional third argument (which is directly + passed to `load'. + (font::load): Add optional second argument to check the header of + a font only, without emitting warning or error messages. + * src/include/font.h (font): Updated. + + * src/roff/troff/input.cpp (do_if_request): Implement `S' and `F' + conditionals. + * src/roff/troff/node.cpp (mount_font_no_translate): Add optional + fourth argument to check a font without mounting. + (check_font, check_style): New functions. + * src/roff/troff/node.h: Updated. + + * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: + Updated. + +2004-06-27 Werner LEMBERG + + Implement new string-valued register `.sty' to return the current + style name. + + * env.cpp (environment::get_style_name_string): New function. + (init_env_requests): Add `.sty' register. + * env.h (environment): Updated. + * node.cpp (font_info): Make `get_style_name' a friend. + (get_style_name): New function. + * node.h: Updated. + + * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: + Updated. + +2004-06-15 Werner LEMBERG + + * src/preproc/tbl/main.cpp (process_data) : Handle + `nospaces' option. + +2004-06-10 Colin Percival + + * doc/meintro.me, doc/meref.me: Don't use \*[td], \n[dy], \*[mo], + and \n[mo] to avoid dependency on current date. + +2004-06-08 Werner LEMBERG + + * Makefile.sub (install_data): New target. + +2004-06-04 Werner LEMBERG + + * src/libs/libxutil/Makefile.sub (EXTRA_CFLAGS): Define. + +2004-06-03 Werner LEMBERG + + * src/devices/xditview/Makefile.sub (EXTRA_LDFLAGS): Fix typo and + order of libraries. + (install_data): Add $(srcdir). + + * src/utils/xtotroff/Makefile.sub (EXTRA_LDFLAGS): Fix order of + libraries. + +2004-06-02 Werner LEMBERG + + * aclocal.m4 (GROFF_X11): s/have_no_x/groff_no_x/. + Add X11 stuff to CFLAGS, LDFLAGS, and LIBS temporarily. + Add test for Xmu library. + (GROFF_APPRESDIR_OPTION, GROFF_APPRESDIR_CHECK, + GROFF_APPRESDIR_DEFAULT): New macros. + + * configure.ac: Call GROFF_APPRESDIR_OPTION, GROFF_APPRESDIR_CHECK, + and GROFF_APPRESDIR_DEFAULT. + + * configure: Regenerated. + + * Makefile.in (appresdir): New variable. + (MDEFINES): Add appresdir. + + * src/devices/xditview/Makefile.sub (EXTRA_LDFLAGS): Add -Xmu and + -Xt. + (install_data, uninstall_sub): New targets to handle GXditview.ad. + + * src/utils/indxbib/Makefiles.ub (install_data): Depend on + `$(srcdir)/eign', not `eign'. + + * MANIFEST, INSTALL, NEWS, PROBLEMS: Updated. + + * man/groff_out.man, man/roff.man, src/devices/grops/grops.man, + src/devices/xditview/gxditview.man, src/roff/groff/groff.man: + Protect (g)xditview with `\%' to avoid hyphenation. + Other minor formatting. + +2004-06-01 Werner LEMBERG + + Integrate gxditview into groff's standard directory hierarchy. + + * src/xditview/*: Moved to ... + * src/devices/xditview/*: Here. + Moved DviChar.h and XFontName.h to src/include. + Moved DviChar.c and XFontName.c to new directory src/libs/libxutil. + Split off `xmalloc' into new file src/libs/libxutil/xmalloc.c. + Moved xtotroff.c to new directory src/utils/xtotroff. + Provide proper Makefile.sub files (reusing the stuff from + Imakefile.in). + DESC renamed to DESC.in. + Removed GXDitview-ad.h, INSTALL, Imakefile.in. + Converted everything from K&R to ANSI C. + Decorated with const where appropriate. + Cast string constants with `String' and `char *' where appropriate. + Made it compile with C++ (used as a C compiler). + Removed other minor compiler warnings. + + * src/devices/xditview/device.c: Include config.h, string.h, and + defs.h. + Don't declare `exit', `strtok', `strchr', and `getenv'. + (FONTPATH): Remove. + + * src/devices/xditview/font.c: Don't declare `XParseFontName' and + `XFormatFontName'. + + * src/devices/xditview/xditview.c: Include config.h. + Include stdio.h earlier. + Protect declaration of `popen' and `pclose' with + NEED_DECLARATION_POPEN and NEED_DECLARATION_PCLOSE. + Replace `caddr_t' with `XtPointer'. + (MakePromptFunc): New typedef. + (DoPrint): Use RETSIGTYPE. + (promptfunction): Change type to MakePromptFunc. + (MakePrompt): Use MakePromptFunc for third argument. + (xmalloc): Removed. + + * src/devices/xditview/ad2c: Add casts to `String'. + + * src/include/XFontName.h (XFontNameString): Don't use array + notation. + Add prototypes for `XParseFontName', `XFormatFontName', + `XCompareFontName', and `XCopyFontName'. + + * src/include/Makefile.sub (HDRS): Add `DviChar.h' and + `XFontName.h'. + + * src/utils/xtotroff/xtotroff.c: Include getopt.h. + Don't declare `XParseFontName' and `XFormatFontName'. + (xmalloc): Removed. + (main): Remove `optind' and `optarg'. + + * Makefile.in (XDEVDIRS, XPROGDIRS, XLIBDIRS): New variables + (to select programs which need X). + Make XDEVIDIRS depend on `FORCE'. + (X_CFLAGS, X_LIBS, X_EXTRA_LIBS, X_PRE_LIBS): New variables (for + X support). + (MDEFINES): Updated. + (LIBDIRS): Use XLIBDIRS. + (CPROGDIRS): Use XPROGDIRS. + (DEVDIRS): Remove font directories for gxditview. + (ALLDIRS, DISTDIRS): Add XDEVDIRS. + (EXTRADIRS): Remove src/xditview. + + * Makefile.sub (DISCLEANFILES): Updated. + + * Makefile.comm (LIBXUTIL): New variable. + (.cpp.o, .cpp.obj): Handle EXTRA_CCFLAGS. + (.c.o, .c.obj, .y.o): Handle EXTRA_CFLAGS. + + * Makefile.cpg, Makefile.ccpg ($PROG): Handle EXTRA_LDFLAGS. + + * aclocal.m4 (GROFF_X11): New function. + + * configure.ac: Call GROFF_X11. + Don't create src/xditview/Imakefile. + Don't emit notice how to build gxditview. + + * configure: Regenerated. + + * test-groff.in (GROFF_BIN_PATH, XENVIRONMENT): Updated. + +2004-05-28 Akihiro Sagawa + + * Makefile.in (CPPFLAGS): Define. + (MDEFINES): Add CPPFLAGS. + +2004-05-27 Werner LEMBERG + + * arch/misc/Makefile.sub (shdeps.sed): Use $(srcdir). + +2004-05-26 Niklas Edmundsson + + Fix problems with `friend name injections'. + + * src/preproc/eqn/box.h (make_mark_box, make_lineup_box, + make_script_box), src/roff/troff/div.h (end_diversions), + src/roff/troff/env.h (title), input.cpp (process_input_stack): Undo + change 2004-04-08. + +2004-05-25 Bernd Warken + + * src/preproc/pic/pic.man, doc/pic.ms: Add example for `command'. + +2004-05-25 Werner LEMBERG + + * src/libs/libgroff/cset.cpp, src/libs/libgroff/lf.cpp, + src/libs/libgroff/color.cpp: Include lib.h. + +2004-05-25 Paul Eggert + + * PROBLEMS: Update documentation for problems with Sun C++ 5.0 + through Forte 6u1, and for how to get GNU make on Solaris. + +2004-05-24 Werner LEMBERG + + * PROBLEMS: Document problems with gcc 3.4.0 on Sun. Reported + by Paul Eggert. + +2004-05-15 Keith Marshall + + * arch/misc/Makefile.sub (shdeps.sed): Don't use `$<' in explicit + rule. + +2004-05-14 Werner LEMBERG + + * REVISION: Set to 2. + + * aclocal.m4 (GROFF_STDINT_H): Removed. + (GROFF_INTTYPES_H): Define HAVE_CC_INTTYPES_H. + + * configure.ac: Updated. + * configure, src/include/config.hin: Regenerated. + + * src/libs/libgroff/tmpname.cpp: Don't include stdint.h but + inttypes.h conditionally. + +2004-05-13 Werner LEMBERG + +Version 1.19.1 released +======================= + +2004-05-10 Stephen Gildea + + * src/preproc/refer/label.y (same_author_last_name, + same_author_name): Handle empty sort keys. + +2004-05-10 Werner LEMBERG + + * NEWS, README, TODO, PROJECTS, PROBLEMS, MANIFEST, doc/webpage.ms, + tmac/TODO: Updated. + + * tmac/doc-syms (doc-str-Lb-libposix, doc-str-Lb-libpthread, + doc-str-Lb-librt): Reset font. + (Lb): Rename `doc-str-Lb' to `doc-str-Lb1'. + Provide `doc-str-Lb' to reset font. + * tmac/groff_mdoc.man: Updated. + +2004-05-08 Jan Schaumann + + * src/preproc/html/pre-html.cpp (make_message): Make it work for + snprintf versions which don't conform to ANSI C 99 (this is, + counting the string's trailing null byte in the return value). + +2004-05-07 Keith Marshall + + * src/roff/troff/node.cpp (suppress_node::tprint): Don't expect + that all implementations of sprintf handle null pointers correctly. + +2004-05-04 Werner LEMBERG + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document `.U' register. + + * src/roff/troff/env.cpp (environment::mark_last_line) + [WIDOW_CONTROL]: Fix scope of `p' for new C++ compilers. + +2004-05-04 Larry Kollar + + New read-only register `.U'; it returns 1 in safer mode and 0 + otherwise. + + * src/roff/troff/input.cpp (init_input_requests): Implement `.U' + register. + +2004-05-03 Werner LEMBERG + + * install-sh, mkinstalldirs: New versions; taken from texinfo CVS. + +2004-04-17 Werner LEMBERG + + * src/include/font.h (font): Use `int' for ch_index. + * src/libs/libgroff/font.cpp (font::alloc_ch_index, + font::compact): Updated. + + * src/roff/groff/pipeline.c (run_pipeline) [_WIN32]: Fix compiler + warnings. + + * src/roff/troff/div.cpp (begin_page), src/roff/troff/env.cpp + (hyphen_word): Fix compiler warnings. + * src/roff/troff/input.cpp (get_char_for_escape_name): Return + `char'. + Update all callers. + (get_delim_number, get_line_arg): Change second argument type to + `unsigned char'. + (macro_header::copy, token::next, do_define_string, + do_define_character, substring_request, asciify_macro, + unformat_macro, read_size, non_interpreted_node::interpret, + while_request, main: Fix compiler warnings. + (read_color_draw_node): Initialize `col'. + + * src/preproc/tbl/table.cpp (horizontal_span, table_entry): Make + `start_col' and `end_col' of type `int'. + (vertical_rule): Make `col' of type `int'. + + * src/preproc/grn/hdb.cpp (DBRead): Protect call to getc with check + for EOF. + + * src/preproc/refer/label.y (uppercase_array, lowercase_array): + New arrays. + (format_serial): Use them to remove dependency on ASCII. + + * src/devices/grops/ps.cpp (ps_printer::define_encoding): Fix + compiler warning. + * src/devices/grops/psrm.cpp (resource_manager::supply_resource): + Ditto. + + * src/devices/grotty/tty.cpp (tty_font::load_tty_font): Fix + compiler warnings. + (glyph): Change type of `hpos' to `int'. + + * src/devices/lbp/lbp.cpp (strsep): Removed. Unused. + * src/devices/lbp/lbp.h (splinerel): Fix compiler warnings. + + * src/utils/tfmtodit.cpp (gf::load): Fix compiler warnings. + + * src/utils/pfbtops/pfbtops.c (get_text): Fix compiler warning. + +2004-04-16 Werner LEMBERG + + * src/devices/grolbp/lbp.h, src/preproc/grn/gprint.h, + src/preproc/grn/hgraph.cpp, src/preproc/grn/hpoint.cpp, + src/preproc/html/pushback.cpp, src/preproc/html/pushback.h: Use + `double' instead of `float' everywhere. + * src/preproc/grn/main.cpp: Use `double' instead of `float' + everywhere. + (main): Add return value. + * src/preproc/grn/hdb.cpp: Use `double' instead of `float' + everywhere. + Update all user functions. + + * src/include/search.h, src/include/ptable.h, src/include/printer.h, + src/preproc/eqn/box.h, src/preproc/pic/object.h, + src/preproc/refer/refer.h, src/preproc/tbl/table.h, + src/preproc/tbl/table.cpp, src/roff/troff/env.h, + src/roff/troff/div.h, src/roff/troff/token.h, src/roff/troff/node.h, + src/roff/troff/input.cpp, src/roff/troff/request.h, + src/roff/troff/node.cpp: Don't mix `struct' and `class' in forward + declarations. + + * src/utils/indxbib/signal.c: Include stdlib.h. + +2004-04-14 Keith Marshall + + * tmac/s.tmac (@init, RP): Allow initialization of the PO register + before the first page. + +2004-04-14 Thomas Klausner + + * tmac/doc-common (doc-volume-as-*): Use lowercase names. + (doc-operating-system-*): Updated. + * tmac/doc-syms (doc-str-St-*): Various small fixes. + (doc-str-Lb-*): Add more library names. + +2004-04-10 Art Haas + + * src/utils/hpftodit/hpuni.cpp (hp_msl_to_unicode_list): Don't + use anonymous type. + +2004-04-09 Art Haas + + * src/utils/tfmtodit.cpp (lig_chars): Don't use anonymous type. + +2004-04-09 Keith Marshall + + * arch/misc/shdeps.sh: Generate better comment for sed script. + +2004-04-08 Art Haas + + * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), + src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list), + src/libs/libgroff/uniuni.cpp (unicode_decompose_list), + src/preproc/eqn/box.cpp (param_table), src/preproc/grn/hgraph.cpp + (polyfill), src/preproc/grn/main.cpp (polyfill), + src/preproc/refer/command.cpp (command_table), + src/utils/tfmtodit.cpp (lig_table): Don't use anonymous types (which + gcc 3.5 doesn't like). + +2004-04-08 Werner LEMBERG + + Removing many compiler warnings. groff should now compile with + a C++ compiler used for C files also. [Simple variable renamings + to avoid shadowing aren't logged in detail.] + + * src/devices/grodvi/dvi.cpp: Some local variable renamings. + (draw_dvi_printer::draw) ['c']: Enclose in block. + + * src/devices/grohtml/post-html.cpp: Some local variable renamings. + (page::add_line): Fix typos. + * src/devices/grohtml/html-text.cpp: Some local variable renamings. + + * src/devices/grolbp/lbp.cpp: Don't define _GNU_SOURCE. + Some local variable renamings. + * src/devices/grolbp/lbp.h: Some local variable renamings. + + * src/devices/grolj4/lj4.cpp, src/devices/grotty/tty.cpp: Some local + variable renamings. + + * src/libs/libbib/index.cpp (index_search_item_iterator::get_tag): + Remove redundant local variable declaration. + * src/libs/libbib/map.c (mapread, unmap): Don't use K&R style. + Don't use `caddr_t' but `void *'. + Enclose functions with `extern "C"' for C++. + + * src/libs/libdriver/input.cpp (remember_filename, + remember_source_filename): Use cast for string constant. + + * src/libs/libgroff/font.cpp, src/libs/libgroff/fontfile.cpp, + src/libs/libgroff/nametoindex.cpp, src/libs/libgroff/paper.cpp, + src/libs/libgroff/geometry.cpp: Some local variable renamings. + * src/libs/libgroff/iftoa.c, src/libs/libgroff/itoa.c: Don't use K&R + style. + Enclose functions with `extern "C"' for C++. + * src/libs/libgroff/quotearg.c (TRUE,FALSE): Define as macros. + (needs_quoting): Return `int'. + (quote_arg): Add proper casts to malloc and realloc. + * src/libs/libgroff/spawnvp.c: Compile code only for MS-DOS and + various MS Windows environments. + (spawnvp_wrapper): Add proper cast to malloc. + + * src/preproc/eqn/box.h: Remove redundant declarations of + `make_script_box', `make_mark_box' and `make_lineup_box'. + * src/preproc/eqn/eqn.y: Remove redundant declaration of `strsave'. + * src/preproc/eqn/script.cpp, src/preproc/eqn/pile.cpp: Some local + variable renamings. + + * src/preproc/grn/hpoint.cpp: Some local variable renamings. + * src/preproc/grn/hgraph.cpp: Some local variable renamings. + (dx, dy): Renamed functions to... + (deltax, deltay): This. + * src/preproc/grn/main.cpp: Some local variable renamings. + (deffont): Add `const'. + (initpic, conv): Use cast for string constant. + + * src/preproc/html/pre-html.cpp: Some local variable renamings. + (makeFileName, alterDeviceTo, addZ): Use cast for string constant. + (char_buffer::run_output_filter): Second argument is unused. + * src/preproc/html/pushback.cpp: Some local variable renamings. + + * src/preproc/pic/pic.y: Remove redundant declaration of `do_copy'. + * src/preproc/pic/object.cpp: Some local variable renamings. + + * src/preproc/refer/label.y (lookup_label): Remove redundant + declaration of local variable. + + * src/preproc/soelim.cpp: Remove redundant declaration of + `interpret_lf_args'. + + * src/preproc/tbl/main.cpp: Some local variable renamings. + + * src/roff/groff/groff.cpp (main): Use cast for string constant. + * src/roff/groff/pipeline.c: Enclose declarations of `error', + `c_fatal', and `i_to_a' with `extern "C"' for C++. + Don't use C++-style comments. + + * src/roff/troff/env.h: Remove redundant declaration of `title'. + * src/roff/troff/node.h, src/roff/troff/env.cpp, + src/roff/troff/div.cpp, src/roff/troff/node.cpp: Some local variable + renamings. + * src/roff/troff/div.h: Remove redundant declaration of + `end_diversions'. + * src/roff/troff/troff.h: Remove redundant declaration of + `cleanup_and_exit' + * src/roff/troff/input.cpp: Remove redundant declaration of + `handle_first_page_transition' and `process_input_stack'. + + * src/utils/hpftodit.cpp: Some local variable renamings. + + * src/utils/indxbib/signal.c: Enclose functions with `extern "C"' + for C++. + Don't define RETSIGTYPE. + * src/utils/indxbib/indxbib.cpp: Some local variable renamings. + + * src/utils/pfbtops/pfbtops.cpp: Don't use K&R style. + (error): Use `const' in argument. + (main): Remove redundant declaration of `optind'. + Move declaration of `Version_string' to top-level. + + * PROBLEMS: Document difficulties compiling signal.c if a C++ + compiler is used for C. + +2004-04-07 Werner LEMBERG + + * Makefile.sub (DISTCLEANFILES): Add `test-groff'. + +2004-04-06 Keith Marshall + + Make scripts like nroff.sh and neqn.sh portable across various + (Unix-like) shell implementations from Cygwin, MSYS, etc., which use + non-POSIX path separators. The idea is to extend those scripts to + decide at run-time (of the script) which path separator to use. + + * arch/misc/Makefile.sub: New file. + * arch/misc/shdeps.sh: New file, generating OS dependency fixups. + This script handles @GROFF_BIN_PATH_SETUP@, replacing it with + a proper definition of the variable `GROFF_RUNTIME'. + + * Makefile.in (SH_DEPS_SED_SCRIPT): New variable. + (MDEFINES): Add SH_DEPS_SED_SCRIPT. + (PROGDEPDIRS): New variable. + `FORCE' it. + (PROGDIRS): Add PROGDEPDIRS. + + * src/preproc/eqn/Makefile.sub (neqn): Call SH_DEPS_SED_SCRIPT. + Don't substitute @SEP@ and @BINDIR@. + * src/preproc/eqn/neqn.sh: Use @GROFF_BIN_PATH_SETUP@. + (PATH): Use GROFF_RUNTIME. + + * src/roff/nroff/Makefile.sub (nroff): Call SH_DEPS_SED_SCRIPT. + Don't substitute @SEP@ and @BINDIR@. + * src/roff/nroff/nroff.sh: Use @GROFF_BIN_PATH_SETUP@. + (PATH): Use GROFF_RUNTIME. + +2004-04-05 Keith Marshall + + * src/roff/nroff/nroff.sh: Implement work-around for sh.exe from + Cygwin which doesn't handle stderr correctly. + +2004-03-08 Werner LEMBERG + + * Makefile.comm (install_dev, uninstall_dev): Protect `for' loops + against empty argument. Problem reported by . + +2004-03-05 Keith Marshall + + * Makefile.in (SEP): Replaced with... + (RT_SEP, SH_SEP): Separators for the target platform's native path + separator and the build environment, respectively. + (fontpath, tmacpath): Use RT_SEP. + (MDEFINES): Updated. + + * contrib/mom/Makefile.sub (GROFF_BIN_PATH): Use SH_SEP. + * doc/Makefile.sub (GROFF_BIN_PATH): Use SH_SEP. + * src/preproc/eqn/Makefile.sub (neqn): Use SH_SEP. + * src/roff/nroff/Makefile.sub (nroff): Use SH_SEP. + +2004-03-05 Werner LEMBERG + + * fonts/devlj4/Makefile.sub (LJ4RES): Set to 1200. This helps to + reduce alignment problems with newer printers which use built-in + TrueType fonts (instead of the older Intellifonts). The ideal + solution is to provide a second set of groff metric files, but this + is extremely time-consuming to produce, given that HP's metric + files are very rudimentary. + +2004-03-01 Werner LEMBERG + + * src/devices/grolj4/lj4.cpp (main): Fix argument of getopt_long. + s/operand/argument/ in error message. + +2004-03-01 Keith Marshall + + * src/roff/groff/groff.cpp (main): Don't allow option -o if -Thtml + is in use. + +2004-03-01 Antti Kantee + + * tmac/s.tmac (XE): Fix error message. + +2004-02-27 Jeff Conrad + + * src/include/nonposix.h (write, dup, dup2, close) [_MSC_VER]: + New macros. + + * src/roff/groff/pipeline.c: Declare strcasecmp. + (run_pipeline) [_WIN32]: Use function name variants which don't + start with `_'. + Fix stream handling. + +2004-02-27 Keith Marshall + + * src/include/nonposix.h: Fix declaration of `system_shell_name'. + Declare `spawnvp_wrapper' and macro definitions of spawnvp only + for platforms which use the native Win32 runtime libraries. + (FLUSH_INPUT_PIPE) [_UWIN]: Provide non-empty version. + + * src/libs/libgroff/quotearg.c (QUOTE_ARG_MALLOC_ERROR, + QUOTE_ARG_REALLOC_ERROR): Fix string. + + * src/preproc/html/pre-html.cpp: Remove declaration of + `spawnvp_wrapper'. + Don't use __MINGW32__. + s/DEBUG_FILE/DEBUG_FILE_DIR/. + (DEBUG_TEXT, DEBUG_NAME, DEBUG_FILE) [DEBUGGING]: New macros. + (OUTPUT_STREAM, PS_OUTPUT_STREAM, REGION_OUTPUT_STREAM): New macros. + (char_buffer::run_output_filter) [MAY_FORK_CHILD_PROCESS]: Fix + calls to `set_redirection' and `WAIT'. + [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Remove unused variable `i' and `j'. + Fix calls to `set_redirection' and `save_and_redirect'. + (char_buffer::do_html, char_buffer::do_image) [DEBUGGING]: Fix calls + to `set_redirection' and `save_and_redirect'. + (usage): Fix message. + (makeTempFiles, main): Use `DEBUG_FILE'. + +2004-02-21 Werner LEMBERG + + * src/roff/troff/troff.h (WARN_TOTAL): Fix value. + +2004-02-21 Keith Marshall + + * src/libs/libgroff/quotearg.c: New file, providing proper argument + quoting for MSVC's spawn* and exec* functions. + * src/libs/libgroff/spawnvp.c: New file, providing a wrapper around + spawnvp with proper quoting for MSVC. + + * src/libs/libgroff/assert.cpp (program_name), + src/libs/libgroff/new.cpp (program_name): Declare as `extern "C"'. + * src/libs/libgroff/Makefile.sub (OBJS, CSRCS): Updated. + + * src/roff/troff/input.cpp (program_name): Declare as `extern "C"'. + + * src/include/error.h (program_name): Declare as `extern "C"'. + * src/include/nonposix.h [__MSDOS__ ...]: Handle spawnvp. + +2004-02-21 Jeff Conrad + + * src/preproc/html/pre-html.cpp [__CYGWIN__ ...]: Declare + spawnvp_wrapper. + [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Declare i and j. + +2004-02-20 Jeff Conrad + + * src/roff/groff/pipeline.c (cmd) [__MSDOS__ || ...]: New global + variable. + (sbasename) [__MSDOS__ || ...]: New function. + (system_shell_name) [__MSDOS__ || ...]: Use a different, more + generic algorithm. + (system_shell_dash_c, is_system_shell) [__MSDOS__ || ...]: Updated. + (run_pipeline) [_WIN32]: Use _XXX variants for some macros instead + of XXX. + Use STDOUT_FILENO instead of hardcoded file handle. + (signal_catcher) [__MSDOS__]: Moved to non-_WIN32 section. + +2004-02-19 Werner LEMBERG + + * src/roff/troff/div.cpp: Include nonposix.h after troff.h to + avoid warnings w.r.t. redefinition of P_tmpdir for some compilers. + +2004-02-18 Werner LEMBERG + + * font/devlj4/Makefile.sub (DEVFILES): Updated to contain all + new font and mapping files. + +2004-02-18 Jeff Conrad + Keith Marshall + + * src/include/nonposix.h (FLUSH_INPUT_PIPE): New macro to empty + an input pipe. This is needed for the MSVC compiler to make troff's + `-o' option work. + + * src/roff/troff/div.cpp: Include nonposix.h. + (cleanup_and_exit): Call FLUSH_INPUT_PIPE. + +2004-02-17 Werner LEMBERG + + * font/devlj4/generate/special.awk: New script. + * font/devlj4/generate/Makefile (S): Use special.awk. + * font/devlj4/*: Regenerated, including the following new files: + Arial (AR, AB, AI, ABI), Times New Roman (TNRR, TNRB, TNRI, TNRBI), + MS Symbol (SYMBOL), Wingdings (WINGDINGS). + * NEWS: Document new lj4 fonts and revised hpftodit. + +2004-02-17 Paco Andrés Verdú + + * src/devices/grolbp/lbp.h (vmdvarc): Fix formatting string. + +2004-01-25 Werner LEMBERG + + * src/libs/libgroff/progname.cpp: Replaced with... + * src/libs/libgroff/progname.c: New file. + * src/libs/libgroff/Makefile.sub: Updated accordingly. + +2004-01-17 Werner LEMBERG + + * font/devlj4/generate/Makefile (SYMBOL): Use 9nb28703.tfm. + +2004-01-16 Jeff Conrad + + * font/devlj4/generate/wingdings.map, + font/devlj4/generate/symbol.map: Include unnamed glyphs. + Use groff glyph names where possible. + * src/devices/grolj4/lj4_font.man: Minor updates. + +2004-01-13 Werner LEMBERG + + * tmac/www.tmac (DC): Handle TTY devices. + + * doc/webpage.ms: Document viewCVS from ffii.org. + * NEWS, README: Updated. + + * src/roff/groff/groff.man: Mention lj4_font man page. + + * font/devlj4/generate/Makefile (SYMBOLMAP, WINGDINGSMAP): New + variables. + (FONTS): Add SYMBOL and WINGDINGS. + (SYMBOL, WINGDINGS): New targets. + +2004-01-13 Jeff Conrad + + * src/devices/grolj4/lj4_font.man: New man page. + * src/devices/grolj4/Makefile.sub (MAN5): New variable. + * src/devices/grolj4.man: Mention lj4_font man page. + + * src/utils/hpftodit/hpftodit.cpp (read_map): Handle line comments. + * src/utils/hpftodit/hpftodit.man: Document it. + (CW): New macro. + Remove details about fonts (which are now in lj4_font.man). + + * font/devlj4/generate/symbol.map, + font/devlj4/generate/wingdings.map: New files. + +2004-01-12 Werner LEMBERG + + * README: Mention ffii's viewcvs access. + +2004-01-09 Werner LEMBERG + + * font/devlj4/generate/special.map: Map MSL 228 to U+221F. + +2004-01-09 Jeff Conrad + + Revert most of the change from 2004-01-03 to better control used + symbol sets. + + * src/utils/hpftodit/hpftodit.cpp (symbol_set): New structure. + (text_symbol_sets, special_symbol_sets): New arrays. + (symbol_set_table): New global variable. + (read_symbol_sets): Use search order given in the text_symbol_sets + and special_symbol_sets arrays. If command line flag -a is not + given, search both arrays. + (output_charset): Require x_height_tag only for command line flag -i. + +2004-01-06 Werner LEMBERG + + Implement string-valued registers \n[.m] and \n[.M] to return the + name of the current drawing and background color, respectively. + + * src/roff/troff/symbol.h: Moved to... + * src/include/symbol.h: Here. + Small fixes to make it work outside of the `troff' directory. + * src/roff/troff/symbol.cpp: Moved to... + * src/libs/libgroff/symbol.cpp: Here. + Small fixes to make it work outside of the `troff' directory. + + * src/include/Makefile.sub (HDRS), src/libs/libgroff/Makefile.sub + (OBJS, CCSRCS), src/roff/troff/Makefile.sub (OBJS, CCSRCS, HDRS): + Updated. + + * src/include/color.h: Include symbol.h. + (color): Add new field `nm'. + * src/libs/libgroff/color.cpp (color::color): Updated. + + * src/roff/troff/dictionary.cpp, src/roff/troff/div.cpp, + src/roff/troff/node.cpp, src/roff/troff/number.cpp, + src/roff/troff/reg.cpp: Don't include symbol.h. + + * src/roff/troff/env.cpp: Don't include symbol.h. + (environment::get_glyph_color_string, + environment_get_fill_color_string): New member functions. + (init_env_requests): Handle `.m' and `.M' registers. + * src/roff/troff/input.cpp: Don't include symbol.h. + (default_symbol): Moved to symbol.cpp/symbol.h. + (do_glyph_color, do_fill_color, define_color): Pass symbol name + to color constructor. + * src/roff/troff/env.h: Updated. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new registers. + +2004-01-05 Werner LEMBERG + + * src/roff/troff/node.cpp (space_node::get_breakpoints, + space_node::nbreaks): Protect against zero `next' field. + +2004-01-03 Jeff Conrad + + In hpftodit, use the symbol sets offered in the TFM. + + * src/utils/hpftodit/hpftodit.cpp (NO_GLYPH): New constant. + (symbol_set, text_symbol_sets, special_symbol_sets, + symbol_set_table): Removed. + (get_printcode): Removed. + (read_symbol_sets): Initialize `symbol_set' field with + `NO_SYMBOL_SET'. + Simplify code to just use the `kind' value. + (output_charset): Improve output formatting. + (dump_symbols): Simplified. + +2004-01-02 Werner LEMBERG + + * font/devlj4/generate/text.map: Add more MSL numbers. + +2004-01-02 Jeff Conrad + + * src/utils/hpftodit/hpftodit.cpp (is_decomposed): New macro. + (text_symbol_sets): Add more symbol sets. + (debug_flag): New static variable (moved from `main'). + (get_printcode, show_symset): New functions. + (main): Remove `debug_flag'. + (output_charset): Use `show_symset'. + (dump_symbols): Use `show_symset'. + Print symsets for all glyphs. + (read_map): Actually call `unicode_to_ucode_make' but this time + correctly. + +2004-01-01 Werner LEMBERG + + * font/devlj4/generate/text.map, font/devlj4/generate/special.map: + Fix placement of comments. + +2004-01-01 Jeff Conrad + + * src/utils/hpftodit/hpftodit.cpp (main): Read map file also if + option `-d' is given. + (output_charset): Improve warning messages to give more information. + (dump_symbols): Make information more precise. + (usage): Updated. + (read_map): Don't call unicode_to_ucode_name; the glyph names must + appear as-is and shouldn't be decomposed. + +2003-12-31 Werner LEMBERG + + * src/utils/hpftodit/hpftodit.cpp (dump_tags): Handle posture_tag. + * font/devlj4/generate/Makefile (IFLAG): Updated to new units. + (FONTS): Add TrueType font families Arial and Times New Roman. + (TNRR, TNRB, TNRI, TNRBI, AR, AB, AI, ABI): New targets. + * font/devlj4/generate/text.map: Fix Unicode values of `fi' and + `fl'. + +2003-12-31 Jeff Conrad + + * test-groff.in (SEP): Quote value. + * src/roff/troff/node.cpp (suppress_node::tprint): Change type of + `tem' to `char*' to avoid deallocation of a pointer to a constant + object which some compilers don't like. + +2003-12-31 Werner LEMBERG + + * font/devlj4/generate (text.map, special.map): Rewritten to work + with the new hpftodit version. + +2003-12-30 Jeff Conrad + + * src/utils/hpftodit/hpftodit.cpp (output_charset): Emit HP symbol + set and 8bit character code for all glyphs also. + +2003-12-30 Werner LEMBERG + + * src/libs/libgroff/strcasecmp.c: Updated from gnulib. + +2003-12-29 Werner LEMBERG + + More fixes for MSVC compiler. + + * doc/Makefile.sub, contrib/mom/Makefile.sub (GROFF_BIN_PATH): Use + $(SEP). + + * src/include/nonposix.h (STDIN_FILENO, STDOUT_FILENO, + STDERR_FILENO) [_MSC_VER]: Define conditionally. + (getpid) [_MSC_VER]: Remove. + Include direct.h and process.h conditionally. + + * src/roff/troff/node.cpp (suppress_node::tprint): Don't use + parentheses for a_delete. + + * src/utils/lookbib/lookbib.cpp: Include nonposix.h. + + * test-groff: Replaced with... + * test-groff.in: This new template to handle path separator + properly. + + * configure.ac: Check for direct.h and process.h. + Generate test-groff script. + * configure, src/include/config.hin: Regenerated. + +2003-12-28 Werner LEMBERG + + Add integral extension glyph. + Add new option `-x' to afmtodit to suppress use of built-in AGL. + + * font/devhtml/R.proto, font/devutf8/R.proto: Add `u23AE'. + + * font/devps/generate/textmap: Provide entry for `integralex' to + override (old) PUA value of the AGL. + * font/devps/generate/Makefile (SS): Add afmtodit option `-x'. + * font/devps/*: Regenerated. + + * src/utils/afmtodit/afmtodit.pl: Add option `-x'. + * src/utils/afmtodit/afmtodit.man, NEWS: Updated. + +2003-12-27 Werner LEMBERG + + Add forgotten `coproduct' symbol (already available for DVI). + + * font/devhtml/R.proto, font/devps/generate/textmap, + font/devps/symbolmap, font/devutf8/R.proto, man/groff_char.man, + src/libs/libgroff/uniglyph.cc, src/libs/libgroff/glyphuni.cpp: Add + U+2210 (\[coproduct]). + +2003-12-26 Jeff Conrad + + hpftodit has been extended to handle TrueType metric files and + more glyphs. See hpftodit.man for more details. + + * src/utils/hpftodit/hpftodit.cpp: Include stdio.h, string.h, + ctype.h, and unicode.h. + s/msl/charcode/ everywhere since we now handle Unicode values also. + (equal, NO, YES, MSL, SYMSET, UNICODE, UNICODE): New macros. + Use it where appropriate. + (MULTIPLIER): Replaced with... + (multiplier): New global static variable. + (scale): Updated. + (tag_type): Add more TFM tags. + (tag_name): New array. + (ENUM_TYPE, FLOAT_TYPE): Removed. + (BYTE_TYPE): New value assigned. + (ASCII_TYPE, RATIONAL_TYPE): New enumeration values. + (text_symbol_sets, special_symbol_sets): Extended to cover more + sets. + (check_type): Add return value. + (check_units): Add parameters to get ppi and upem values. + Handle TrueType TFM data. + (output_font_name): New function. + (output_charset): Add parameter to handle TFM type. + Handle TrueType TFMs also. + (em_fract): New macro. + (dump_tags): Be much more verbose and handle more tags. + (dump_ascii, dump_symbol_sets, dump_symbols): New functions. + (hp_msl_to_ucode_name, unicode_to_ucode_name, is_uname): New + functions. + (read_map): Add parameter to handle TFM type. + Handle both MSL and Unicode mappings. + (main): Add two new command line options `-a' and `-q'. + Updated to make use of new functions. + (usage): Updated. + + * src/utils/hpftodit/hpuni.cpp: New file. + + * src/utils/hpftodit/Makefile.sub, src/utils/hpftodit/hpftodit.man: + Updated. + +2003-12-25 Werner LEMBERG + + * src/include/nonposix.h (read) [_MSC_VER]: Define. + +2003-12-24 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.man: Some reformulations as suggested + by Michail Vidiassov . + +2003-12-20 Werner LEMBERG + + * font/devhtml/R.proto: Add u00{47,67}_0306, u00{53,73}_0327, + and u0049_0307. + Add missing latin-2 glyphs. + * font/devutf8/R.proto: Add missing latin-2 glyphs. + + * tmac/troffrc: Load `composite.tmac' earlier. + + * tmac/dvi.tmac, tmac/ps.tmac, tmac/lbp.tmac: Add u00{47,67}_0306, + u00{53,73}_0327, and u0049_0307. + * tmac/X.tmac: Add u00{47,67}_0306. + * tmac/tty-char.tmac: Use composite glyph names for readability. + + * NEWS: Updated. + + * src/include/unicode.h: Remove `extern' keywords. + +2003-12-20 Nilgün Belma Bugüner + + * tmac/latin5.tmac: New file. + +2003-12-19 Werner LEMBERG + + Add some glyphs needed for Turkish. + + * font/devutf8/R.proto: Add u00{47,67}_0306, u00{53,73}_0327, + and u0049_0307. + + * tmac/composite.tmac: Add `,' as a synonym for `ac' accent. + * tmac/tty-char.tmac: Add representations for u00{47,67}_0306, + u00{53,73}_0327, and u0049_0307. + +2003-12-18 Werner LEMBERG + + * src/devices/grops/ps.cc (ps_output::put_float): Revert change + from 2001-10-04. + Remove trailing zeros. + +2003-12-17 Werner LEMBERG + + Make \? transparent to end-of-sentence recognition. + + * src/roff/troff/input.cc (non_interpreted_node): Add + `ends_sentence' member function. + +2003-12-16 Werner LEMBERG + + * doc/groff.texinfo: Document `dt' request correctly. + Other minor typographical improvements. + +2003-12-10 Michail Vidiassov + + * src/utils/afmtodit/Makefile.sub (afmtodit): Fix typo. + +2003-12-10 Richard Stallman + + * LICENSE: Better wording. + +2003-12-09 Werner LEMBERG + + * aclocal.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Set default value to 0. + * configure, NEWS: Updated. + +2003-12-08 Werner LEMBERG + + * FDL: Updated to version 1.2 (from www.gnu.org/copyleft). + +2003-12-07 Bernd Warken + + * LICENSE: Updated. + +2003-12-07 Werner LEMBERG + + * INSTALL: Improved. + +2003-12-05 Keith Marshall + + Use path separator character of target platform for compiled-in + default paths. + + * aclocal.m4 (GROFF_TARGET_PATH_SEPARATOR): New macro. + * configure.ac: Use GROFF_TARGET_PATH_SEPARATOR. + * configure: Regenerated. + * Makefile.in (SEP): Use GROFF_PATH_SEPARATOR. + +2003-12-05 Werner LEMBERG + + * src/include/nonposix.h (PATH_SEP_CHAR): New definition. + Replace `PATH_SEP[0]' with `PATH_SEP_CHAR' everywhere. + +2003-12-04 Bernd Warken + + * LICENSE: New file. + +2003-12-03 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Comment out code which handles + ligatures present in AFM files since groff currently only + understands some standard ligatures and nothing else. + +2003-12-03 Jeff Conrad + + * src/roff/groff/groff.cpp (main): Don't run the spooler if + option -v is given. + + * src/roff/groff/pipeline.c (run_pipeline) [_WIN32]: Fix error + messages. + Close stdout copy. + Don't use Unix wait flags. + +2003-12-02 Werner LEMBERG + + * src/roff/troff/glyphuni.cpp, src/roff/troff/unicode.cpp, + src/roff/troff/unicode.h, src/roff/troff/uniglyph.cpp, + src/roff/troff/uniuni.cpp: Moved to... + * src/libs/libgroff/glyphuni.cpp, src/libs/libgroff/unicode.cpp, + src/libs/libgroff/unicode.h, src/libs/libgroff/uniglyph.cpp, + src/libs/libgroff/uniuni.cpp: Here. + + * src/include/Makefile.sub.old (HDRS), + src/libs/libgroff/Makefile.sub (OBJS, CCSRCS), + src/roff/troff/Makefile.sub (HDRS, PBJS, CCSRCS): Updated. + +2003-12-01 Keith Marshall + + * src/preproc/htlp/pre-html.cpp (__tmpfile): Renamed to + `DEBUG_FILE'. + Updated all users. + +2003-12-01 Werner LEMBERG + + * groff.texinfo: Document special behaviour of `.vs 0'. + Improve documentation of `cflags' request. + * NEWS: Updated. + +2003-11-29 Werner LEMBERG + + * font/devlj4/generate/Makefile (CORONET): Use correct TFM. + * font/devlj4/CORONET: Regenerated. + +2003-11-24 Werner LEMBERG + + * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Fix loop + if processing hyphenation patterns in traditional mode. + Improve error messages. + +2003-11-20 Werner LEMBERG + + * src/roff/troff/node.cpp (troff_output_file::put_char_width, + troff_output_file::put_char): Fix type of local variable `c'. + +2003-11-19 Werner LEMBERG + + * src/roff/groff/pipeline.c (P): Removed. Updated all function + declarations. + (i_to_a): Removed. libgroff already provides this function. + (run_pipeline) [_WIN32]: Don't use itoa but i_to_a. + +2003-11-18 Keith Marshall + + * src/roff/groff/pipeline.c (xstrsignal): Fix usage of + HAVE_DECL_SYS_LIST. + +2003-11-17 Werner LEMBERG + + * COPYING: Use correct version. + +2003-11-11 Werner LEMBERG + + LynxOS 4.0.0 doesn't declare vfprintf. + + * configure.ac: Check for vfprintf. + * configure: Regenerated. + * src/include/lib.h: Handle `NEED_DECLARATION_VFPRINTF'. + * src/include/config.hin: Regenerated. + +2003-11-10 Werner LEMBERG + + LynxOS 4.0.0 has snprintf (without declaration) but no vsnprintf. + + * configure.ac: Check for vsnprintf. + * configure: Regenerated. + * src/include/lib.h: Handle `NEED_DECLARATION_VSNPRINTF' and + `HAVE_VSNPRINTF'. + * src/include/config.hin: Regenerated. + +2003-11-09 Werner LEMBERG + + * aclocal.m4: Updated syntax to autoconf 2.59. + (GROFF_HTML_PROGRAMS): Use AC_FOREACH. + Don't check for gsos2. + (GROFF_SRCDIR, GROFF_BUILDDIR): Removed. autoconf 2.59 provides + working abs_top_srcdir and abs_top_builddir. + + * configure.ac: Updated syntax to autoconf 2.59. + Don't call GROFF_SRCDIR and GROFF_BUILDDIR. + Replace call to AC_DECL_SYS_SIGLIST with call to AC_CHECK_DECLS. + * configure: Regenerated. + + * Makefile.in, doc/Makefile.in: s/@top_srcdir@/@abs_top_srcdir@/, + s/@groff_top_builddir@/@abs_top_builddir@/. + + * src/roff/groff/pipeline.c (xstrsignal): + s/SYS_SIGLIST_DECLARED/HAVE_DECL_SYS_SIGLIST/. + +2003-11-07 Werner LEMBERG + + * src/devices/grodvi/dvi.cpp (draw_dvi_printer::draw) ['a']: Always + make start angle smaller than end angle to circumvent a bug in tpic + handling of some versions of dvipdfm (and dvipdfmx). + +2003-10-30 Werner LEMBERG + + * src/devices/grops/grops.man: Improve section on creating EPS. + +2003-10-29 Werner LEMBERG + + * contrib/pic2graph/pic2graph.sh: Fix typo (-P-letter -> + -P-pletter). + +2003-10-28 Werner LEMBERG + + * doc/groff.texinfo: Fix documentation of `.if'. + +2003-10-27 Michail Vidiassov + + * src/utils/afmtodit/afmtodit.pl: Handle unmapped characters of + the form `uniXXXX' also. + +2003-10-27 Werner LEMBERG + + * contrib/eqn2graph/eqn2graph.sh, contrib/grap2graph/grap2graph.sh, + contrib/pic2graph/pic2graph.sh: Implement secure management of + temporary files. + Pass `-P-pletter' to groff to avoid data outside of the converted + area -- some versions of `convert' (for example 5.3.8) don't check + the bounding box of the image but always use a fixed image size + (letter paper format). + * contrib/eqn2graph/eqn2graph.man, contrib/grap2graph/grap2graph.man, + contrib/pic2graph/pic2graph.man: Updated. + + * src/roff/groff/groff.man: Document $TMP and $TEMP. + +2003-10-26 Werner LEMBERG + + * src/preproc/pic/troff.cpp (troff_output::simple_circle, + troff_output::simple_ellipse, troff_output::simple_arc, + troff_output::simple_line, troff_output::simple_spline, + troff_output::simple_polygon): Insert a space before arguments. + (troff_output::set_fill): Emit `\&' before `\D'Fg...' since the + latter doesn't produce a node, so the following `.sp -1' would do + the wrong thing. + Don't emit `.sp -1' after \M. This also doesn't produce a token + (and we don't have to care about compatibility mode). + (troff_output::set_color, troff_output::reset_color): Don't emit + `.sp -1' after \M and \m. + + * src/roff/troff/input.cpp (old_have_input): New global variable. + (input_stack::get): Handle `old_have_input'. + (process_input_stack) : Call + `trapping_blank_line' depending on `old_have_input', not + `have_input'. + +2003-10-20 Keith Marshall + + * src/libs/libgroff/tmpfile.cpp [__MSDOS__, _Win32] + (WIN32_TMPDIR_ENVVAR, MSDOS_TMPDIR_ENVVAR): New macros, providing + default directory names for temporary files. + [__MSDOS__, _Win32] (temp_init::temp_init): Use them. + + * src/roff/groff/pipeline.c [__MSDOS__]: Include stdlib.h. + [__MSDOS__] (run_pipeline): Honour environment variables. + Don't use `tmpnam' but `tempnam' to work around messy + implementation. + + * README.MinGW: New file. + +2003-10-16 Werner LEMBERG + + * src/preproc/html/pre-html.cpp (write_upto_newline): Don't use + `(*t)->next' without testing validity of `*t'. + (usage): Make it more readable. + +2003-10-16 Keith Marshall + + Make html device run under both MS-DOS and Win32. + + * src/preproc/html/pre-html.cpp (MAY_FORK_CHILD_PROCESS, + MAY_SPAWN_ASYNCHRONOUS_CHILD): New macros to control whether + spawn or fork+exec has to be used, and whether parent must sleep + until the child process terminates. Used in + `char_buffer::run_output_filter'. + (copyofstdoutfd): Removed. + (char_buffer): Replace `write_file_html' and `write_file_troff' + member functions with `emit_troff_output' and `run_output_filter'. + (DEVICE_FORMAT, HTML_OUTPUT_FILTER, IMAGE_OUTPUT_FILTER): New + macros. + (replaceFd): Replaced with... + (set_redirection): New auxiliary function. + (waitForChild): Replaced with... + (save_and_redirect): New auxiliary function for. + + (char_buffer::do_html, char_buffer::do_image): Simplified, using new + functions. + +2003-10-14 Keith Marshall + + * aclocal.m4 (GROFF_SYS_NERR): Check stdlib.h also. + (GROFF_LIBC): New function. + * configure.ac: Call GROFF_LIBC. + Check for `kill'. + * configure: Regenerated. + + * src/include/lib.h: Handle __MINGW32__. + * src/include/nonposix.h [_MSC_VER]: Handle __MINGW32__. + Add macro for `pipe'. + Define P_tmpdir. + + * src/roff/groff/pipeline.c (run_pipeline): Handle `no_pipe' + correctly. + + * src/utils/indxbib/signal.c (handle_fatal_signal) [!HAVE_KILL]: + Implement. + +2003-10-13 Werner LEMBERG + + Finally fix change 2003-08-26, based on ideas from Chuck Silvers + . + + * contrib/mom/Makefile.sub: Use a stamp file in the `examples' + directory. + +2003-10-12 Werner LEMBERG + + * src/roff/groff/groff.cpp (help), src/devices/grops/ps.cpp (usage), + src/roff/troff/input.cc (usage): Updated. + + * NEWS, doc/groff.texinfo: Updated. + +2003-10-12 Peter Miller + + * src/libs/libgroff/searchpath.cpp + (search_path::open_file_cautious): New function which also handles + `-' as stdin and stdout depending on the access mode. + * src/include/searchpath.h (search_path): Updated. + + * src/devices/grops/ps.cpp (main): Handle new `-I' switch. + * src/devices/grops/ps.h: Include `searchpath.h'. + * src/devices/grops/psrm.cpp (resource_manager::supply_resource): + Open resource file with `include_search_path.open_file_cautious'. + * src/devices/grops/grops.man: Document new `-I' switch. + + * src/devices/grodvi/dvi.cpp (main), src/devices/grolbp/lbp.cpp + (main), src/devices/grolj4/lj4.cpp (main), + src/devices/grotty/tty.cpp (main): Ignore new `-I' switch. + + * src/preproc/soelim/soelim.cpp (include_list_length, include_list): + Replaced with... + (include_search_path): New global variable. + (include_path_append): Removed. + (main): Use `include_search_path.command_line_dir' to handle `-I'. + (do_file): Simplify, using new + `include_search_path.open_file_cautious'. + + * src/roff/groff/groff.cpp (print_commands): Accept file handle as + parameter. + (main): Pass arguments to `-I' to both troff and devices. + Improve handling of `-V'. + * src/roff/groff/groff.man: Document changes to -I and -V. + + * src/roff/troff/input.cpp (include_search_path): New global + variable. + (next_file, source, ps_bbox_request, transparent_file, + process_input_file): Use new + `include_search_path.open_file_cautious'. + (main) Handle `-I' switch. + * src/roff/troff/node.cpp (troff_output_file::really_copy_file): + Use new `include_search_path.open_file_cautious'. + * src/roff/troff/node.h: New extern symbol `include_search_path'. + * src/roff/troff/troff.man: Document new `-I' switch. + +2003-09-15 Ruslan Ermilov + + Support multiple calls of .Lb in LIBRARY section. + + * tmac/doc-common (doc-in-library-section): New register. + (doc-section-library): New string. + (Sh): Set `doc-in-library-section'. + (Rd): Updated. + * tmac/doc-syms (Lb): Insert breaks before and after arguments + if in LIBRARY section. + * tmac/doc.tmac (doc-save-global-vars): Updated. + * NEWS, tmac/groff_mdoc.man: Updated. + +2003-09-14 Ruslan Ermilov + + * tmac/doc-common (doc-default-operating-system): New variable. + (Os): Use it. + +2003-09-08 Werner LEMBERG + + * tmac/doc.tmac (doc-reset-reference): Handle data for `%I' also. + +2003-08-31 Werner LEMBERG + + * contrib/mom/Makefile.sub: Fix last change to make it really work. + * Makefile.comm: Use `test ... ||' in favor of `if test ...; then'. + (install_dev, uninstall_dev): Check whether $(DEVSCRIPTS) and + $(DEVFILES) are not empty. + * Makefile.in: Use `test ... ||' in favor of `if test ...; then'. + +2003-08-26 Chuck Silvers + + * contrib/mom/Makefile.sub (prepare_make_examples): Make it work + with parallel runs of `make'. + +2003-08-23 Stephen Gildea + + * src/preproc/ref/ref.cpp (reference::compute_sort_key): Always + insert SORT_SEP. With certain combinations of sort specifications, + refer sorted entries in the wrong order. In particular, entries + with a missing field should be be sorted before all entries that + have that field, before refer looks to the next field. + +2003-08-23 Werner LEMBERG + + * src/utils/pfbtops/Makefile.sub (LINK.c): Define it so that the + g++ linker is used. Reported by Mark J. Reed + . + +2003-08-16 Heinz-Jürgen Oertel + + Add key character `x' to tbl which makes tbl call a user-defined + macro on a table cell. + + * src/preproc/tbl/table.h (entry_modifier): Add `macro'. + * src/preproc/tbl/table.cpp (block_entry::do_divert): Call + `set_modifier' after printing the compatibility request. + (set_modifier): Print call to `m->macro' if not empty. + * src/preproc/tbl/main.cpp (entry_format::debug_print): Handle + `macro'. + (process_format): Implement cases `x' and `X'. + * src/preproc/tbl/tbl.man, NEWS: Updated. + +2003-08-15 Werner LEMBERG + + * doc/groff.texinfo: Minor fixes. + +2003-08-09 Werner LEMBERG + + * tmac/an-old.tmac [cR]: Fix redefinition of `bp'. + +2003-08-07 Werner LEMBERG + + * doc/Makefile.sub: Not all shells expand wildcards in the `for' + argument list to nothing if there is no file to match. Use `ls' as + a protection, similar to autoconf. + + * Makefile.comm (install_dev, uninstall_dev): Protect `for' against + empty argument lists. + + * doc/groff.texinfo: Improve documentation how vertical spacing + and line breaks interact. + Other minor fixes. + + * tmac/www.tmac: Initialize `www-htmlimage-gap'. + +2003-08-03 Werner LEMBERG + + * NEWS, src/devices/grops/grops.man: -b16 is necessary to produce + EPS (using eps2eps or similar programs to compute the bounding box). + +2003-07-24 Werner LEMBERG + + * doc/groff.texinfo: Use the new @/ command to avoid overlong lines. + * doc/texinfo.tex: Updated from texinfo 4.6. + * README.CVS: From now on we need texinfo 4.6. + +2003-07-23 Werner LEMBERG + + Add requests `dei1' and `ami1' for completeness. + + * src/roff/troff/input.cc (calling_mode): Remove + CALLING_DISABLE_COMP. + (comp_mode): New enumeration. + (do_define_string, define_string, define_nocomp_string, + append_string, append_nocomp_string): Updated. + (do_define_macro): Add third parameter. + (define_macro, define_nocomp_macro, define_indirect_macro, + append_macro, append_nocomp_macro, append_indirect_macro): Updated. + (define_indirect_nocomp_macro, append_indirect_nocomp_macro): New + functions. + (ignore): Updated. + (init_input_requests): Add `dei1' and `ami1'. + + * tmac/trace.tmac: Handle de1 and am1. + (de): Improve tracing message. + (am): Add missing `do'. + (return): Use de1. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new requests. + +2003-07-22 Heinz-Jürgen Oertel + + Add option -G to .MPIMG to insert a gap between text and the image. + + * tmac/www.tmac (www-finish-left-po, www-finish-right-ll, + www-finish-left-ll): Updated. + (www-image-just, www-image-gap, www-htmlimage-gap): New variables. + (MPIMG): Make option -L and -R optional. + Implement option -G. + +2003-07-22 Gaius Mulley + + * src/devices/grohtml/post-html.cpp + (html_printer::do_file_components): Don't use `stdout' as lvalue + since it can be a macro. + +2003-07-22 Werner LEMBERG + + * src/libs/libgroff/strerror.c: Include errno.h to be in sync with + the corresponding test in aclocal.m4. + +2003-07-21 Werner LEMBERG + + * src/preproc/html/pre-html.cpp (TRANSPARENT): Don't use colour + names but RGB values directly. Otherwise pnmtopng depends on + an external file `rgb.txt' which maps colour names to values. + +2003-07-20 Werner LEMBERG + + * aclocal.m4 (GROFF_SYS_ERRLIST): Include stdlib.h for MinGW. + * configure, src/include/config.hin: Regenerated. + + * src/libs/libgroff/strerror.c: Include stdlib.h for MinGW. + +2003-07-19 Werner LEMBERG + + * PROBLEMS: Add solution for UTF-8 problem with hyphens. + +2003-07-18 Werner LEMBERG + + * *.man: Switch to non-compatibility mode temporarily if GNU + syntax extensions are used in the particular man page. + + * PROBLEMS: Add solutions for SGR problems. + +2003-07-17 Werner LEMBERG + + Don't ignore grotty's command line options if \X'tty: sgr ...' is + used to change the drawing scheme. + + * src/devives/grotty/tty.cpp (bold_flag_option, + underline_flag_option, italic_flag_option, reverse_flag_option, + bold_underline_mode_option): New global variables. + (update_options): New function. + (tty_printer::special): Call update_options. + (main): Don't set xxx_flag but xxx_flag_option, then call + update_options. + +2003-07-14 Werner LEMBERG + + Make grotty emit proper Unicode box drawing characters for -Tutf8. + + * src/devices/grotty/tty.cpp (START_LINE, END_LINE): New enum + values. + (hline_char, vline_char): New global variables. + (tty_printer::tty_printer): Initialize them. + (tty_printer::draw): Emit START_LINE and END_LINE flags for both + horizontal and vertical lines. + (crossings): New global array. + (tty_printer::end_page): Use it to determine the proper crossing + character for -Tutf8. + +2003-07-12 Werner LEMBERG + + * doc/Makefilesub (HTMLDOCFILESALL): New macro. + (HTMLDOCFILES): Revert to `pic.html'. + (CLEANADD, install_html, uninstall_sub): Use HTMLDOCFILESALL. + +2003-07-11 Werner LEMBERG + + * doc/pic.ms: Improve documentation of absolute coordinates. + Document absolute positioning of pictures. + + * NEWS: Add new pic capability. + +2003-07-09 Hartmut Henkel + + * src/libs/libgroff/geometry.cpp (check_output_arc_limits): + Rewritten. + +2003-07-07 Werner LEMBERG + + Implement support for dashed and dotted ellipses in pic. Based on + a patch from Hartmut Henkel . + + * src/preproc/pic/common.cpp (common_output::ellipse_arc, + common_output::dashed_ellipse, common_output::dotted_ellipse): New + functions. Ellipse arcs are approximated with circle arcs. + * src/preproc/pic/common.h (common_output): Updated. + * src/preproc/pic/tex.cpp (tex_output::ellipse): Use new ellipse + functions. + * src/preproc/pic/troff.cpp (simple_output::ellipse): Ditto. + + * src/preproc/pic/TODO, src/preproc/pic/pic.man: Updated. + +2003-07-06 Werner LEMBERG + + Make grotty work on platforms which have unsigned char as the + default for char. Based on a patch by Thomas Klausner + . + + * src/devices/grotty/tty.cpp (schar): New typedef. + Updated calls to declare_ptable and implement_ptable. + (glyph): Use schar for back_color_idx and fore_color_idx. + (tty_printer): Use schar for curr_fore_idx and curr_back_idx. + (tty_printer::tty_color, tty_printer::tty_printer, + tty_printer::color_to_idx, tty_printer::put_color): Updated. + +2003-07-06 Ruslan Ermilov + + * src/roff/nroff/nroff.sh: Add option -d for completeness. + * src/roff/nroff/nroff.man: Updated. + +2003-07-05 Werner LEMBERG + + * NEWS, tmac/groff_www.man: Updated. + * doc/Makefile.sub: Updated. + +2003-07-05 Gaius Mulley + + Implement support for multiple HTML output files. + + * src/preproc/html/pre-html.cpp (scanArguments): Dummy handling for + -j command line option. + + * src/devices/grohtml/post-html.cpp (job_name, multiple_files): New + global variables. + (file): New fields `new_output_file', `require_links', + `output_file_name'. + (file::file): Updated. + (files::set_file_name, files::set_links_required, + files::are_links_required, files::is_new_output_file, + files::file_name, files::next_file_name): New functions. + (header_desc): New fields `no_of_level_one_headings', + `header_filename'. + (header_desc::header_desc): Updated. + (header_desc::write_headings): Handle multiple files. + (html_printer::write_header): Save file name in which header occurs. + (html_printer::determine_header_level): Possibly split files on + level one headings. + (html_printer::do_links, html_printer::troff_tag): Updated. + (html_printer::insert_split_file, html_printer::do_job_name, + html_printer::emit_link, html_printer::write_navigation, + html_printer::do_file_components): New functions. + (html_printer::~html_printer): Handle multiple files. + (main): Handle command line option `-j'. + + * src/devices/grohtml/grohtml.man: Updated. + + * doc/Makefile.sub (pic.html), doc/Makefile.in (pic.html): New rule + which splits file. + + * tmac/www.tmac (JOBNAME): New macro. + * tmac/s.tmac (SH-NO-TAG): New macro. + (@SH): Call SH-NO-TAG. + (@NH): Updated. + +2003-07-05 Ruslan Ermilov + + * tmac/groff_mdoc.man: Improve documentation of punctuation + characters. + +2003-07-04 Ruslan Ermilov + + * tmac/doc.tmac (Bd): Change to doc-Li-font later. + +2003-07-03 Werner LEMBERG + + * tmac/an-old.tmac [cR]: Redefine `bp' to avoid empty lines. + +2003-07-01 Ruslan Ermilov + + * tmac/doc.tmac (doc-do-func, doc-do-func-args): Don't print a comma + after `/*' and `*/'. + Fix spacing. + (Fn, Fo): Reduce indentation in synopsis. + + * tmac/doc-common (doc-check-depth): New macro. + (doc-end-macro, Sh, Ss): Use it. + (Cd): Fix behaviour in synopsis. + (In): Make it parsed and callable. + If not in the synopsis, represent the C header file enclosed in + angle brackets. + (doc-str-Rv-std-suffix, doc-str-Rv-stds-suffix, doc-str-Rv-std0): + Use minus, not hyphen. + + * tmc/groff_mdoc.man: Updated. + +2003-07-01 Werner LEMBERG + + Integrated grap2graph, contributed by Eric S. Raymond. + + * contrib/grap2graph/{Makefile.sub, grap2graph.sh, grap2graph.man}: + New files. + * Makefile.in, NEWS, MANIFEST, contrib/eqn2graph.man, + contrib/pic2graph.man, src/roff/groff/groff.man: Updated. + +2003-07-01 Colin Watson + + * src/xditview/*.c: Add prototypes, fix return types, add includes. + Based on work by Fumitoshi UKAI . + +2003-06-31 Ruslan Ermilov + + * tmac/tty-char.tmac: Provide `lb', `rb', `lk', `rk', `lt', `rt'. + +2003-06-31 Werner LEMBERG + + * doc/Makefile.sub (CLEANADD): Remove all files created by + running `make groff.{pdf,dvi}'. + + * Makefile.sub (DISTCLEANFILES): Remove all non-source files from + src/xditview also. + +2003-06-30 Werner LEMBERG + + * Makefile.in (SHELL): Define as @SHELL@. + (mkinstalldirs): Use $(SHELL). + (MDEFINES): Add $(SHELL). + * Makefile.comm (SHELL): Removed. + +2003-06-29 Werner LEMBERG + + * tmac/s.tmac (De, Ds): New aliases for .DE and .DS, respectively. + The X11 documentation files use them. + * tmac/groff_ms.man, doc/groff.texinfo: Document them. + +2003-06-15 Robert Goulding + + * tmac/e.tmac (@C): Handle .ad also. + +2003-06-12 Werner LEMBERG + + * src/preproc/tbl/tbl.man: Document formatting of text blocks. + + * src/roff/troff/input.cc (token::next) : + Assign `n' even here. It is possible to construct a node + immediately following an escape character: + + .di xx + \?\\\?a + .br + .di + .xx + +2003-06-10 Werner LEMBERG + + * README.WIN32: Removed. + * MANIFEST: Updated. + +2003-06-07 Werner LEMBERG + + * src/roff/nroff/nroff.sh: Don't emit SGR for option -u. + +2003-06-05 Werner LEMBERG + + * src/preproc/pic/pic.y : Implement workaround for bug + in Compaq C++ V6.5-033 for Compaq Tru64 UNIX V5.1A (Rev. 1885). + +2003-06-03 Werner LEMBERG + + * src/preproc/grn/hdb.cpp (DBRead): Don't close file handle; this + is done by the calling function. + +2003-05-22 Ruslan Ermilov + + * tmac/X.tmac: Fix definition of `em'. + +2003-05-22 Werner LEMBERG + + * src/roff/troff/input.cc (return_macro_request): Fix detection of + argument. + +2003-05-18 Werner LEMBERG + + * tmac/doc.tmac (doc-tag-list): Force horizontal mode after tag + to make items work which consist only of a tag. + +2003-05-17 Werner LEMBERG + + * tmac/doc.tmac (doc-tag-list): Don't use \Z to assure that spaces + aren't stretched in a tag (this can fail with unformatted boxes). + Instead, insert a break and go back one line. + +2003-05-16 Werner LEMBERG + + * src/roff/troff/input.cc (return_macro_request): If called with + argument pop macro twice. We need this to trace `return'. + + * tmac/trace.tmac: Handle `return'. + Fix typos. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document. + +2003-05-15 Larry Kollar + + * tmac/groff_ms.man, doc/groff.texinfo: Improve documentation of + registers `FPS', `FVS', and `FPD'. + +2003-05-15 Werner LEMBERG + + * src/utils/pfbtops/pfbtops.c (get_text): Handle loop counter + correctly. + +2003-05-03 Ruslan Ermilov + + * tmac/groff_mdoc.man: Slight improvements. + +2003-05-03 Werner LEMBERG + + * tmac/doc-common (doc-header): Emit vertical space of 1v instead of + `doc-header-space' after header line if register `cR' is set. + +2003-05-02 Werner LEMBERG + + * TODO: Updated. + +2003-05-01 Ruslan Ermilov + + * tmac/doc-common (Nd): Use \[em]. + +2003-05-01 Werner LEMBERG + + * tmac/doc-ditroff, tmac/doc-nroff (doc-header-space, + doc-footer-space): Initialize to 0.5i. + (doc-setup-page-layout): Don't set doc-header-space and + doc-footer-space. + +2003-04-30 Werner LEMBERG + + * REVISION: Set to 1. + + * doc/pic.ms: Document possible problems with `figname'. + +2003-04-29 Werner LEMBERG + +Version 1.19 released +===================== + + * VERSION: Set to 1.19. + * REVISION: Set to 0. + * doc/groff.texinfo, doc/webpage.ms, NEWS: Updated. + + * src/devices/grohtml/post-html.cpp (html_printer::~html_printer): + Define charset as `US-ASCII' in html output. + + * tmac/www.tmac (ULE): Add missing scaling indicator. + + * win32-diffs: Removed. + +2003-04-28 Werner LEMBERG + + * doc/groff.texinfo: Document `dn' and `dl' registers if used with + `.da' and `.boxa'. + Document how to insert discardable whitespace with `.ss'. + +2003-04-27 Werner LEMBERG + + * src/preproc/pic/tex.cpp (tex_output::start_picture): Make code + work with plain TeX also. + + * src/preproc/pic/pic.man, doc/pic.ms: Fix TeX code example. + +2003-04-25 Gaius Mulley + + * src/devices/grohtml/post-html.cpp (html_printer::~html_printer): + Use a loose DTD. + +2003-04-24 Werner LEMBERG + + * src/preproc/pic/pic.man, doc/pic.ms: Explain how to get a + vbox with positive height and zero depth if in TeX mode. + + * NEWS: Document glyph name changes for grodvi and grolj4. + +2003-04-23 Werner LEMBERG + + * src/preproc/pic/tex.cpp (tex_output::start_picture): Fix TeX code. + * doc/pic.ms: Fixed. + +2003-04-21 Werner LEMBERG + + HP-UX 10.20 has `snprintf' but it isn't declared. + + * configure.ac: Add declaration test for snprintf. + * configure: Regenerated. + * src/include/lib.h: Handle `NEED_DECLARATION_SNPRINTF'. + * src/include/config.hin: Regenerated. + +2003-04-19 Werner LEMBERG + + Add keyword `figname' to pic, specifying the name of the picture + box in TeX mode. Based on a patch from William J Poser + . + + * src/preproc/pic/pic.y: New token `FIGNAME'. + (macro_name): New rule of type . + (placeless_element): Handle `FIGNAME'. + * src/preproc/pic/lex.cpp (lookup_keyword): Add `figname'. + * src/preproc/pic/main.cpp (graphname): New global variable. + (do_picture): Initialize `graphname'. + * src/preproc/pic/pic.h: Updated. + * src/preproc/pic/tex.cpp (tex_output::start_picture): Use + `graphname'. + Simplify TeX code. + (tex_output::text): Beautify output. + * src/preproc/pic/object.cpp (object_spec::~object_spec): Deallocate + `shaded' and `outlined' unconditionally. + * NEWS, src/preproc/pic/pic.man, doc/pic.ms: Updated. + Minor improvements. + + * PROBLEMS, README.CVS: Mention that bison version 1.875b or + greater is necessary. + +2003-04-17 Hartmut Henkel + + Add option -r to soelim to avoid emission of `.lf' lines. + Add option -t to produces TeX comment lines instead of `.lf' lines. + + * src/preproc/soelim/soelim.cpp: New global variables `raw_flag' + and `tex_flag'. + (usage): Updated. + (main): Handle `-r' and `-t'. + (set_location): Handle `raw_flag' and `tex_flag'. + * src/preproc/soelim/soelim.man, NEWS: Updated. + +2003-04-17 Werner LEMBERG + + * tmac/hyphenex.sh: Replaced with... + * tmac/hyphenex.pl: This perl script to avoid sed compatibility + nightmares. + + * aclocal.m4 (GROFF_HTML_PROGRAMS): Emit useful warning message + if --quiet is used for the configure script. + * configure: Regenerated. + +2003-04-16 Werner LEMBERG + + * src/devices/grohtml/post-html.cpp (text_glob::text_glob): + Add `const' to second argument. + (html_printer::add_table_end): Add `const' to argument. + * src/devices/grohtml/html-text.cpp (html_text::issue_tag): Add + `const' to arguments. + * src/devices/grohtml/html-text.h: Updated. + + * src/devices/grolbp/charset.h (symset): Use `unsigned char'. + * src/devices/grolbp/lbp.h (lbpputc): Use `unsigned char' for + argument. + + * src/devices/grotty/tty.cpp (tty_printer::make_rgb_string): Use + cast for integer constant. + + * src/preproc/html/pre-html.cpp (image_device): Use `const'. + (writeNbytes): Add `const' to first argument. + (writeString): Add `const' to argument. + (char_buffer::can_see): Add `const' to third argument. + * src/preproc/html/pushback.cpp (pushBackBuffer::isString): Add + `const' to argument. + * src/preproc/html/pushback.h: Updated. + + * src/preproc/soelim/soelim.cpp (include_list): Add `const'. + (include_path_append): Add `const' to argument. + (do_file): Updated. + + * src/roff/troff/uniglyph.cpp (unicode_to_glyph_list): Use `const' + for `value'. + (unicode_to_glyph_init::unicode_to_glyph_init): Updated. + * src/roff/troff/uniuni.cpp (unicode_decompose_list): Use `const' + for `value'. + (unicode_decompose_init::unicode_decompose_init): Updated. + * src/roff/troff/glyphuni.cpp (glyph_to_unicode_list): Use `const' + for `value'. + (glyph_to_unicode_init::glyph_to_unicode_init): Updated. + * src/roff/troff/input.cc (process_startup_file): Add `const' to + argument. + + * tmac/hyphenex.sh: Make script more portable by using a here + document. + +2003-04-15 Werner LEMBERG + + Renamed all `*.cc' files to `*.cpp'. + Updated all configuration files, makefiles, and documentation. + +2003-04-14 Werner LEMBERG + + * tmac/hyphenex.sh: Slight improvements. + +2003-04-13 Werner LEMBERG + + * font/devascii/R.proto, font/devcp1037/R.proto, + font/devlatin1/R.proto, font/devutf8/R.proto: Fill up remaining + character slots with unnamed glyphs. + + * tmac/an-old.tmac: Fix hyphenation value if `cR' is active. + (an-first): New global variable. + (an-header): Emit vertical space between multiple man pages. + +2003-04-11 Werner LEMBERG + + * doc/groff.texinfo, man/groff_out.man: \S only accepts integer + values. + +2003-04-10 Werner LEMBERG + + * PROBLEMS: Revised. + +2003-04-10 Bernd Warken + + * doc/webpage.ms: Improved. + +2003-04-09 Werner LEMBERG + + Add register \n[.height] which returns the value of \H. + Add register \n[.slant] which returns the value of \S. + + * src/roff/troff/env.cc (init_env_requests): Implement. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document. + +2003-04-08 Werner LEMBERG + + * tmac/html.tmac: Move some of the data into html-end.tmac. + Remove most of the character translations for eqn since html fonts + now cover those characters. + Load www.tmac. + * tmac/html-end.tmac: New file. + * tmac/troffrc: Load html.tmac not www.tmac for -Thtml. + * tmac/troffrc-end: Load html-end.tmac not html.tmac for -Thtml. + * tmac/Makefile.sub (NORMALFILES): Add html-end.tmac. + +2003-04-07 Werner LEMBERG + + * man/groff_out.man: Document negative values of `N' if -Thtml is + used. + +2003-04-06 Werner LEMBERG + + * Makefile.comm (depend.temp): Check location of YTABC. + +2003-04-05 Maciej W. Rozycki + + * contrib/mom/Makefile.sub (GROFFBIN): New variable for groff + binary path. + (groff_bin_path): Rename to GROFF_BIN_PATH. + (GROFF): Use GROFFBIN and GROFF_BIN_PATH. + * doc/Makefile.in (TROFFBIN): New variable for troff + binary path. + (GROFFBIN): New variable for groff binary path. + (groff_bin_path): Rename to GROFF_BIN_PATH. + (TROFF): Use TROFFBIN. + (GROFF): Use GROFFBIN and GROFF_BIN_PATH. + * doc/Makefile.sub (GROFFBIN): New variable for groff + binary path. + (groff_bin_path): Rename to GROFF_BIN_PATH. + (GROFF): Use GROFFBIN and GROFF_BIN_PATH. + + * Makefile.comm (install_dev): Install scripts from DEVSCRIPTS + with INSTALL_SCRIPT. + (uninstall_dev): Uninstall scripts from DEVSCRIPTS. + * Makefile.dev (all): Depend on DEVSCRIPTS. + (install_dev): Likewise. + * font/devdvi/Makefile.sub (DEVSCRIPTS): New variable to hold + scripts. + * font/devps/Makefile.sub (DEVSCRIPTS): Likewise. + (DEVGENSCRIPTS): New variable to hold generated scripts. + +2003-04-05 Werner LEMBERG + + * src/libs/libdriver/input.cc (IntArray::operator[], + IntArray::get_data): Remove meaningless `const' in return value. + + * README.CVS: New file. + +2003-04-04 Werner LEMBERG + + Check for stdint.h in C++, not in C. + + * aclocal.m4 (GROFF_STDINT_H): New function, + * configure.ac: Check for stdint.h with GROFF_STDINT_H instead of + AC_CHECK_HEADERS. + * configure, src/include/config.hin: Regenerated. + * src/libs/libgroff/tmpname.cc: Use HAVE_CC_STDINT_H. + + + Fix handling of   in grohtml. To do this, troff emits `N' + with a negative value, representing the width of the unbreakable + space (only for -Thtml). grohtml then converts this back to +   and uses the value of N as its width. + + * src/roff/troff/node.cc (space_char_hmotion_node::tprint, + unbreakable_space_node::tprint): Emit `N-'. + * src/include/printer.h (printer::set_numbered_char): Make it + virtual. + Make members `font_table' and `nfonts' protected instead of private. + * src/devices/grohtml/post-html.cc + (html_printer::set_numbered_char): New member function. + + + * src/libs/libgroff/maxfilename.cc: + s/HAVE_LIMITS_H/HAVE_CC_LIMITS_H/. + + * src/roff/troff/node.cc (unbreakable_space_node::tprint): Don't + emit word marker. + +2003-04-03 Sergey A. Osokin + + * man/roff.man: Small fixes. + +2003-04-03 Werner LEMBERG + + Make groff independent from locale's numeric settings. + + * configure.ac: Check for `setlocale'. + * configure, src/include/config.hin: Regenerated. + + * src/include/lib.h: Handle HAVE_SETLOCALE. + + * src/devices/grodvi/dvi.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/preproc/grn/main.cc + (main), src/preproc/pic/main.cc (main): Call `setlocale'. + + + * doc/groff.texinfo: Change dir category to `Typesetting'. + (Man font macros): Mention that there is no space between arguments + of .BI and friends. + + * src/libs/libdriver/printer.cc, src/devices/grotty/tty.cc + (*printer::change_color, *printer::change_fill_color): Add missing + `const'. + +2003-04-02 Werner LEMBERG + + * src/devices/grohtml/html-table.cc (html_table::emit_col, + html_table::is_gap): Compute table widths after converting border + positions to avoid rounding errors. + +2003-04-01 Werner LEMBERG + + * src/devices/grohtml/html-text.cc (html_text::do_space): Handle + `space_emitted' properly. + +2003-03-31 Werner LEMBERG + + * src/devices/grohtml/html-table.cc: Fix column width calculation. + (html_table::set_linelength): Don't add 1. + (html_table::add_indent): Don't subtract 1. + + * tmac/html.tmac: Set default page offset to zero. + +2003-03-30 Werner LEMBERG + + Make groff emit ` ' for `\ ' and `\~' if `-Thtml' is used. + + * src/roff/troff/node.cc (space_char_hmotion_node::tprint, + unbreakable_space_node::tprint): New functions. + (troff_output_file): Make space_char_hmotion_mode::tprint and + unbreakable_space_node::tprint to friends. + * src/roff/troff/node.h: Updated. + + * font/devhtml/R.proto: Add ` ' at position 0xA0 (as defined + in the HTML standard). + +2003-03-29 Werner LEMBERG + + * src/roff/troff/env.cc (point_size): Fix emission of html tag. + Otherwise, the following code + + .di xxx + .ps 10 + a + .br + .di + x\*[xxx] + + produces `x a' instead of `xa'. This is a temporary fix, disabling + font changes in diversions for -Thtml. + + * tmac/an-old.tmac (TH, SH): Use `HTML-TAG-NS' instead of + `HTML-TAG'. + (an-do-tag-html): Merge with ... + (an-do-tag): This macro. + Change code slightly to circumvent grohtml bug. + * tmac/troffrc-end: Define dummy for HTML-TAG-NS. + + * src/devices/grohtml/html-table.cc (html_table::emit_col, + html_table::is_gap): Round `width' properly. + + * tmac/html.tmac: Provide some default layout parameters for + grohtml. + + * font/devhtml/DESC.proto: Don't use discrete values for `sizes' + command. + +2003-03-28 Werner LEMBERG + + src/devices/grops/ps.cc (ps_printer::do_import): Fix error message. + +2003-03-27 Werner LEMBERG + + * tmac/an-old.tmac (BT): Don't call .tl if register `ps4html' is + defined. + +2003-03-20 Werner LEMBERG + + * src/roff/troff/env.cc (vertical_spacing): Allow zero value for + `.vs'. + * doc/groff.texinfo: Updated. + +2003-03-19 Werner LEMBERG + + * src/roff/troff/input.cc (process_input_stack) : Reset `have_input'. + +2003-03-18 Werner LEMBERG + + * src/roff/groff/groff.man: Mention groff_trace man page. + +2003-03-16 Werner LEMBERG + + * Makefile.in (LIBEXT): New variable to indicate the file extension + of library files. Computed heuristically from $(OBJEXT). + (MDEFINES): Add $(LIBEXT). + * Makefile.lib, Makefile.comm: Use it. + + * src/utils/pfbtops/pfbtops.c (get_text): New function. Split + overlong lines into smaller chunks. + (get_binary): New function. + (main): Use them. + * src/utils/pfbtops/pfbtops.man: Updated. + +2003-03-15 Colin Watson + + * src/roff/groff/groff.man: Minor syntax fix. + +2003-03-14 Egil Kvaleberg + + * src/devices/grops/ps.cc (ps_printer::media_set, + ps_printer::~ps_printer): Handle zero paper width and length. + +2003-03-13 Werner LEMBERG + + Add options -p and -l to grodvi. + + * src/devices/grodvi/dvi.cc: Include paper.h. + (landscape_flag, user_paper_length, user_paper_width): New global + variables. + (dvi_printer::begin_page): Emit `papersize' special. + Set color after initialization of `cur_h' and `cur_v'. + (main): Add options `-l' and `-p'. + * font/devdvi/Makefile.sub (DESC): Set `papersize'. + * src/devices/grodvi/grodvi.man, NEWS: Updated. + + * src/devices/grops/psrm.cc (valid_input_table): Fixed. + +2003-03-12 Werner LEMBERG + + * src/devices/grops/grops.man: Move documentation of .PSPIC to... + * man/groff_tmac.man: This man page. + * man/groff_font.man: Declare `paperwidth' and `paperlength' as + deprecated. + + * tmac/X.tmac: Don't load pspic.tmac. + +2003-03-11 Werner LEMBERG + + Make variable `pr' local to libdriver/input.cc. Based on a patch + by Bernd Warken . + + * src/include/driver.h (pr): Removed. + + * src/libs/libdriver/input.cc (pr): New global variable. + (do_file): Deallocate `pr'. + * src/libs/libdriver/printer.cc (pr): Removed. + + * src/devices/grodvi/dvi.cc (main), src/devices/grohtml/post-html.cc + (main), src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc + (main): Don't delete `pr'. + +2003-03-10 Werner LEMBERG + + * tmac/a4.tmac, tmac/composite.tmac: Use `.do'. + * tmac/papersize.tmac: New file. + * tmac/troffrc: Include `papersize.tmac'. + * tmac/Makefile.sub (NORMALFILES): Add `papersize.tmac'. + * tmac/an-old.tmac: Set LT to LL by default. + + * NEWS, MANIFEST, tmac/groff_man.man, man/groff_tmac.man, + doc/groff.texinfo: Updated. + + * src/libs/libgroff/paper.cc (add_iso_paper): Fix very embarassing + bug which caused all odd iso papers to have wrong dimensions. + + * src/devices/grops/ps.cc (user_paper_width): New global variable. + (main) <'p'>: Set `user_paper_width' also. + (ps_printer::media_width, ps_printer::media_height): Use values + given with option `-p'. + +2003-03-09 Werner LEMBERG + + * src/include/nonposix.h: Provide default for SET_BINARY. + + * src/devices/grodvi/dvi.cc, src/devices/grolbp/lbp.cc, + src/devices/grolj4/lj4.cc, src/devices/grops/ps.cc: Call SET_BINARY + unconditionally. + + * src/utils/pfbtops/pfbtops.c: Call SET_BINARY unconditionally. + (main): Treat \r\n as \n. + +2003-03-08 Werner LEMBERG + + * tmac/an-old.tmac: Use register `HY' to control hyphenation. + * NEWS, tmac/groff_man.man, doc/groff.texinfo: Document it. + +2003-03-07 Werner LEMBERG + + Added support to access more than 256 glyphs in Type 1 fonts. + + * src/devices/grops/ps.cc (subencoding): New structure. + (style): Add `sub' field. + Updated all users. + (ps_printer): Add `subencodings' and `next_subencoding_index' fields. + Add `set_subencoding', `get_subfont' and `encode_subfont' member + functions. + Updated all users. + (ps_printer::set_char): Use `set_subencoding'. + (make_subencoding_name): New function. + (ps_printer::set_style): Handle case where `sty.sub' is not zero. + (ps_printer::~ps_printer): Emit subencoding definitions. + + * src/devices/grops/psrm.cc (valid_input_table): New array to + properly support EBCDIC. + (white_space): Add `\f'. + (ps_get_line): Change first argument to be of type `string &'. + Updated all callers. + This allows to get lines of arbitrary length. + Use `valid_input_table'. + Remove warning about non-conforming PS line length. This seems + not to be of great importance -- for example, dvips don't emit + a warning either. + (PS_LINE_MAX): Removed. + (matches_comment): Change first argument to be of type `string &'. + + * src/devices/grops/grops.man, src/devices/grops/TODO: Updated. + + * src/utils/afmtodit/afmtodit.pl (%unicode_decomposed, + %AGL_to_unicode, %default_ligatures): New hash tables. + Read all map entries. + Add unencoded characters. + Check for default ligatures if there are no `L' entries. + Print all kern entries. + Print all characters in charset. + * src/utils/afmtodit/afmtodit.man: Updated. + + * font/devps/*: Regerated all fonts. + + * tmac/latin[129].tmac, tmac/cp1047.tmac: Don't test for existence + of characters, just use `.trin'. Otherwise the mapping depends + on the font encoding. + * tmac/ps.tmac: Add `fi' and `fl'. + Improve `Fi' and `Fl'. + * tmac/X.tmac, tmac/lbp.tmac, tmac/tty.tmac: Improve `Fi' and `Fl'. + * tmac/Xps.tmac: Fix `em'. + + * NEWS: Updated. + +2003-03-04 Werner LEMBERG + + * src/roff/troff/input.cc (charinfo_to_node_list): Reset + `have_input'. + +2003-03-03 Werner LEMBERG + + * Makefile.sub (DISTCLEANFILES): Add gxditview._man. + + * font/devps/generate/textmap: Remove entry `similarequal'. + * font/devps/symbolmap: Updated. + +2003-03-02 Werner LEMBERG + + * src/libs/libgroff/font.cc (font::load): Fix error message for + bad character type. + + * src/devices/grops/grops.man: Improve documentation of the -b + flag. + + * tmac/tty.tmac: Load latin1.tmac for all TTY devices except + `ascii' and `cp1047'. + +2003-03-01 Werner LEMBERG + + Document composite glyphs and the `composite' request. + + * man/groff.man, man/groff_diff.man, doc/groff.texinfo: Do it. + +2003-02-28 Werner LEMBERG + + * font/devdvi/generate/ec.map: Add some more Unicode entities. + * font/devdvi/*EC: Updated. + + * tmac/composite.tmac, tmac/latin2.tmac, tmac/latin9.tmac: New files. + * tmac/latin1 (latin1-tr): Undo any previous mapping. + * tmac/troffrc: Load `composite.tmac'. + * tmac/Makefile.sub (NORMALFILES): Updated. + + * doc/groff.texinfo (Input Encodings): New section. + * NEWS: Updated. + +2003-02-27 Werner LEMBERG + + * doc/texinfo.tex: New version 2003-02-11.06. + + * tmac/doc-common (Dt): Don't emit warning for unknown section. + * tmac/groff_mdoc.man: Fix description of `Dt'. + +2003-02-26 Egil Kvaleberg + + * font/devps/prologue.ps: Fix for included Postscript that does + a setpagedevice -- which is now safely ignored. + + * NEWS: Updated. + + * src/devices/grops/ps.cc: Now sets the page size in the generated + document. This is done in two ways: Via a %%-comment for gv and + the like, and via a PageSize and setpagedevice for programs that + understands Postscript proper, like ps2pdf. + + * src/devices/grops/ps.h: New broken-flag to avoid page size + definition, if required. + + * src/devices/grops/grops.man: New broken-flag 16 mentioned. + + * doc/Makefile.in: Added -nosetpage flag (via @pnmtops_nosetpage@). + Not really necessary due to the fix in prologue.ps, but cleaner: + Such information does not belong in an .eps file. + + * doc/Makefile.sub: See doc/Makefile.in. + +2003-02-26 Ralph Corderoy + + * aclocal.m4 (GROFF_PNMTOPS_NOSETPAGE): Use P2 format for testing + instead of P1 since the latter is broken in some versions of netpbm. + * configure: Updated. + +2003-02-26 Larry Kollar + + Make man pages more customizable. + + * tmac/an-old.tmac (FT): New register holding footer distance from + bottom. + (HF): New string holding the default heading font. + (TH): Handle registers `IN' and `SN' set on the command line. + Use `FT'. + (PT, BT): New strings to customize header and footer lines. + (an-header, an-footer): Use them. + (SH, SS): Use `HF'. + * tmac/groff_man.man: Document changes. + + * doc/groff.texinfo: Document man changes. + Document Ultrix extensions of man. + +2003-02-26 Werner LEMBERG + + * src/roff/troff/input.cc (do_width, do_if_request): Reset + `have_input' after changing back to old environment. + + * src/devices/grolbp/lbp.cc (lbp_printer::set_line_thickness): Move + function up to be defined before first call. This is necessary to + avoid a compilation problem with Sun's WorkShop 6 C++ compiler. + + * src/utils/afmtodit/afmtodit.pl: Make script search for files in + the default font directory also. Based on a patch from James + J. Ramsey . + * src/utils/afmtodit/Makefile.sub (afmtodit): Handle @FONTDIR@. + * src/utils/afmtodit/afmtodit.man: Document it. + + * NEWS: Updated. + + * tmac/groff_man.man, doc/groff.texinfo: Many minor fixes. + +2003-02-25 Gaius Mulley + + * aclocal.m4 (GROFF_HTML_PROGRAMS): Add test for pnmtops. + (GROFF_PNMTOPS_NOSETPAGE): New macro. + * configure.ac: Use it. + * configure: Regenerated. + * Makefile.in: Updated. + + * tmac/Makefile.sub (NORMALFILES): Remove www.tmac. + (CLEANADD): Add www.tmac-sed. + (pnmtops_nosetpage): Define default. + (install_data): Handle www.tmac-sed and substitute + @PNMTOPS_NOSETPAGE@. + (stamp-sed): Add www.tmac. + * tmac/www.tmac: Rewritten, based on a patch by Bernd Warken. + It now breaks URLs at suitable places. + (www:substring_ok): New register set by... + (www:@test_substring): New macro. + (www:error): New alias to www-error. + (www:lenstr, www:splitstr, www:url_breaks, www:url_breaks_splitted): + New macros. + (URL): Use www:url_breaks. + (PIMG, MPIMG): Use @PNMTOPS_NOSETPAGE@. + (CDS, CDE): New macros. + +2003-02-25 Werner LEMBERG + + * src/devices/grops/ps.cc (ps_printer::define_encoding): Avoid + buffer overflow. + +2003-02-24 Werner LEMBERG + + Contrary to the PCL5 Developer's Guide, the ascenders in TFM files + can be negative also. + + * src/utils/hpftodit/hpftodit.cc (char_info): `ascent' must be + `int16'. + (read_char_table): Avoid negative ascenders. + (output_charset): Add cast. + * font/devlj4/*: Regenerated. + + Replace unnamed glyphs for DVI fonts with `uXXXX' glyph names where + possible. + + * font/devdvi/generate/{tc,texttt,ec,texmi,texsy,textex}.map: Do it. + * font/devdvi/generate/textex.map: Map glyph 23 to `u21C6' instead + of `<>'. + * font/devdvi/*: Regenerated. + + Map `la' and `ra' to U+27E8 and U+27E9. These two characters have + normal width, while the previously used characters (U+2329 and + U+232A) are classified as wide due to canonical equivalence with the + CJK punctuation characters U+3008 and U+3009. + + * font/devutf8/R.proto: Updated. + * src/roff/troff/uniglyph.cc, src/roff/troff/glyphuni.cc: Ditto. + + * man/groff_char.man: Simplify handling of table traps by + introducing `start block' and `end block' macros. + (Ns, Ne, 2s, 2e, Ds, De): New macros. + (DL): Make it work with Unix troff also. + Fix code values of `la' and `ra'. + + * tmac/dvi.tmac: Define `<>' for CW and CWI. + +2003-02-23 Gaius Mulley + + * src/devices/grohtml/post-html.cc (element_list::~element_list): + New destructor, fixing a major memory leak. + +2003-02-22 Werner LEMBERG + + * font/devhtml/R.proto, font/devutf8/R.proto: Flip `*f' and `+f' + to be in conformance with Unicode 3.0 and newer. + + * font/devlj4/generate/text.map: Add `Eu'. + * font/devlj4/generate/special.map: Flip `*e' and `+e'. + * font/devlj4/S: Regenerated. + + * man/groff_char.man: Completely rewritten. + + * doc/groff.texinfo: Fix description of request and macro arguments. + +2003-02-20 Gaius Mulley + + Valgrind fixes. + + * src/devices/grohtml/html-table.cc (html_table::~html_table): + Deallocate `columns' list. + * src/devices/grohtml/post-html.cc (char_block::~char_block): + New destructor. + (text_glob::text_glob_html, text_glob::text_glob_special, + text_glob::text_glob_line, text_glob::text_glob_auto_image, + text_glob::text_glob_tag): Avoid memory leaks. + (text_glob::remember_table): Free memory before reassigning. + +2003-02-19 Werner LEMBERG + + Add glyph `+e', greek lunate epsilon symbol, and `-h' (with the + alias `hbar'), the Planck constant over two pi. + + * font/devdvi/generate/texmi.map: Use `*e' for position 15 and + `+e' for position 34. + * font/devdvi/generate/texsy.map: Replace `DI' and `HE' with + `u2662' and `u2661'. + * font/devdvi/{MI,S}: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `+e', `-h', `hbar'. + * font/devlbp/*: Add `hbar' alias. + * font/devlj4/generate/special.map: Ditto. + * font/devlj4/S: Regenerated. + * font/devps/generate/symbolchars: Add `+e'. + * font/devps/generate/textmap: Fix PS name for `-h'. + Add `hbar' alias. + * font/devps/symbolmap: Regenerated. + + * src/devices/grops/ps.cc (transform_fill): Removed since unused. + + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `+e', + `-h', `hbar'. + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `+e', + `-h'. + + * tmac/X.tmac, tmac/ps.tmac: Provide definitions for `-h' and + `hbar'. + * tmac/tty-char.tmac: Add `+e'. + +2003-02-17 Werner LEMBERG + + Another round trying to really fix problems with `have_input'. + + * src/roff/troff/input.cc (input_stack::get): Handle `have_input'. + (token::next) <'\n'>, <\'\n'>: Don't handle `have_input'. + + * src/devices/grotty/tty.cc (tty_printer::put_color): Fix color + handling if both foreground and background colors are default. + + * doc/groff.texinfo (Debugging): Document .lf differences to + AT&T troff. + +2003-02-16 Werner LEMBERG + + * src/devices/grotty/tty.cc (tty_printer::make_rgb_string): Avoid + null-bytes in created string. + + * src/roff/troff/input.cc (lookup_color, interpolate_macro, + alias_macro, lookup_request): Improve warning messages. + + * src/roff/troff/node.cc (suppress_node::tprint): Use `strsave', + not `strdup'. + Free `last_image_filename'. + + * src/preproc/html/pre-html.cc (char_block::char_block): Initialize + `buffer'. + (imageList::createPage, imageList::createImage): Use `free', not + `a_delete'. + (imageItem::~imageItem): Free `imageName'. + (addRegDef): Use `strsave', not `strdup'. + (get_resolution): Free `pathp'. + +2003-02-15 Werner LEMBERG + + * src/devices/grotty/tty.cc (tty_printer::tty_printer): Fix pointer + to `dummy'. + +2003-02-14 Werner LEMBERG + + Add memory management for colors to deallocate unnamed colors + properly. + + * src/include/color.h (color): New members `free_list' and `next'. + New member functions `new' and `delete'. + Add destructor. + * src/libs/libgroff/color.cc: Implement it. + + * src/libs/libgroff/font.cc (font::add_kern): Use integer cast + for array size of new operator. + + * src/libs/libdriver/input.cc (IntArray::operator[]): Remove + redundant comparison. + + * src/roff/troff/input.cc (word_space_node::reread, + hmotion_node::reread): Avoid warning about unused parameter. + (reset_output_registers): Remove redundant parameter. + (define_color): Undo change 2003-02-12. + + * src/roff/troff/reg.h: Updated. + + * src/roff/troff/node.cc (troff_output_file::really_print_line, + output_file::put_filename, real_output_file::really_put_filename, + ascii_output_file::really_print_line, + break_char_node::get_hyphen_list): Avoid warning about unused + parameter. + (suppress_node::tprint): Updated. + + * configure.ac: Check declaration for rand() and srand(). + * configure: Regenerated. + + * src/preproc/pic/pic.h: Declare fmod(), rand(), and srand() + conditionally. + * src/preproc/pic/pic.y: Remove declaration of fmod(), rand(), + and srand(). + + * src/preproc/eqn/delim.cc (delim_table): Add missing initializers + to avoid compiler warnings. + + * src/preproc/grn/hgraph.cc (HGPrintElt): Second parameter is + unused. + + * src/devices/grops/ps.cc (ps_printer::set_char): Last parameter + is unused. + * src/devices/grops/psrm.cc (skip_possible_newline): Remove first + (unused) parameter. + Updated all callers. + + * src/devices/grotty/tty.cc (tty_printer::set_char): Last parameter + is unused. + * src/devices/grodvi/dvi.cc (dvi_printer::set_char): Ditto. + * src/devices/grolj4/lj4.cc (lj4_printer::set_char): Ditto. + + * src/devices/grohtml/post-html.cc (html_printer::emit_line): + Parameter is unused. + (html_printer::add_table_end): Define parameter conditionally. + * src/devices/grohtml/output.cc (simple_output::special): Parameter + is unused. + + * src/devices/grolbp/lbp.cc: Define _GNU_SOURCE conditionally. + (lbp_printer::set_char): Last parameter is unused. + + * src/utils/indxbib/indxbib.cc (main): Remove redundant comparison. + +2003-02-13 Werner LEMBERG + + New commands \D'Fr ...', \D'Fc ...', etc. for orthogonality. + Make \D'f ...' move horizontally again for backwards compatibility. + Replace it with \D'Fg ...' where appropriate to avoid dependency + on horizontal resolution. + + * src/roff/troff/input.cc (do_get_long_name): New function. + (get_long_name): Call it. + + (read_draw_node): Handle `\D'Fx ...' by calling ... + (read_color_draw_node): New function. + + (read_rgb, read_cmy, read_cmyk, read_gray): New optional argument + `end'. + Pass it to `do_get_long_name' which is used instead of + `get_long_name'. + + * src/libs/libdriver/input.cc (color_from_Df_command): Remove + unnecessary value guard. + (parse_D_command) <'f'>: Add horizontal shift. + + * src/preproc/grn/hgraph.cc (HGPrintElt) : Use \D'Fg ...'. + * src/preproc/pic/troff.cc (troff_output::set_fill): Ditto. + (FILL_MAX): Removed. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Updated. + +2003-02-12 Werner LEMBERG + + * src/roff/troff/input.cc (do_name_test, do_expr_test, + do_zero_width): Push `\n' if closing delimiter is missing. + + (token::next) , <'\n'>, <\'\n'>: Reset `have_input'. + <'F'>: Make \F non-transparent at the beginning of line. + (process_input_stack) : Don't handle + `have_input'. + + (define_color): Free color in case of reassignment. + + * doc/groff.texinfo (@Defesc, @DefescList, @DefescItem, + @DefescListEnd): Use @Var, not @var. + Fix all calls. + + * src/preproc/grn/hgraph.cc (HGPrintElt): Fix typo. + + * src/preproc/pic/object.cc (object_spec::~object_spec): Free + `shaded' and `outlined' arrays. + (object_spec::object_spec): Initialize `shaded' and `outlined'. + (graphic_object::set_fill_color, graphic_object::set_outline_color): + Use strsave. + (closed_object::set_fill_color): Ditto. + * src/preproc/pic/troff.cc (troff_output::set_color): Use strsave + instead of strdup. + (troff_output::reset_color): Use a_delete instead of free. + * src/preproc/pic/main.cc (do_file): Free `out' in case of error. + +2003-02-11 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of `ad'. + Document that \D'f...' is dependent on the horizontal resolution. + * man/groff_diff.man: Improve documentation of \D'f...'. + + * src/preproc/grn/hgraph.cc (HGPrintElt) : Don't emit + compensating \h'...' for \D'f ...' since the latter no longer moves + current position. + * src/preproc/pic/troff.cc (troff_output::set_fill): Ditto. + +2003-02-10 Werner LEMBERG + + Improve error messages for `x F' (and `F') commands. + + * src/include/error.h: Add declaration for + `current_source_filename'. + * src/libs/libgroff/filename.cc: Add `current_source_filename'. + * src/libs/libgroff/error.cc (do_error_with_file_and_line): Add + parameter for source file string. + Updated all callers. + + * src/libs/libdriver/input.cc: Add `current_source_filename'. + (remember_source_filename): New function. + (parse_x_command <'F'>, do_file <'F'>): Use it. + +2003-02-09 Werner LEMBERG + + Make grotty not emit warnings about unknown colors more than + necessary. + + * src/devices/grotty/tty.cc: Include `ptable.h'. + (TTY_MAX_COLORS): Removed. + (DEFAULT_COLOR_IDX): Defined to -1. + (glyph): Change `back_color_idx' and `fore_color_idx' to `char'. + (tty_printer): Change `curr_back_idx' and `curr_fore_idx' to `char'. + Change `tty_colors' to be a ptable. + First arg of `put_color' is now `char'. + New functions `make_rgb_string' and `tty_color'. + (tty_printer::tty_printer): Use `tty_color'. + (tty_printer::color_to_idx): Return value is now `char'. + Use `tty_color'. + + * src/include/color.h (color): Add `print_color' member function. + * src/libs/libgroff/color.cc (color::print_color): Implement it. + +2003-02-08 Werner LEMBERG + + Valgrind fixes. + + * src/devices/grops/ps.cc (ps_printer::define_encoding): Close + encoding file. + + * src/include/ptable.h (PTABLE::~PTABLE, PTABLE::define): Always + assume that value has been allocated with `new[]', thus use + `a_delete' for deallocation. + + * src/libs/libdriver/input.cc (get_integer_arg, + get_possibly_int_args, parse_x_command, do_file): Use `a_delete' + where appropriate. + + * src/libs/libgroff/new.cc (delete) [!COOKIE_BUG]: Define. + * src/libs/libgroff/nametoindex.cc + (character_indexer::named_char_index): Use `new [1]'. + + * src/preproc/eqn/lex.cc (init_table, do_definition): Use `new + [1]'. + * src/preproc/eqn/text.cc (set_special_char_type): Ditto. + (split_text): Use `a_delete'. + + * src/preproc/pic/pic.y (define_label, define_variable): Use `new + [1]'. + + * src/roff/troff/env.cc (environment::choose_breakpoint): Avoid + harmless memory leak. + (hyphen_trie::read_patterns_file): Initialize `buf'. + * src/roff/troff/node.cc (troff_output_file::troff_output_file): + Initialize `current_fill_color'and `current_glyph_color'. + * src/roff/troff/glyphuni.cc + (glyph_to_unicode_init::glyph_to_unicode_init): Use `new [1]'. + * src/roff/troff/uniuni.cc + (unicode_decompose_init::unicode_decompose_init): Ditto. + * src/roff/troff/uniglyph.cc + (unicode_to_glyph_init::unicode_to_glyph_init): Ditto. + +2003-01-26 Werner LEMBERG + + * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Check with + `access' before calling `unlink'. + (do_file): Handle __EMX__. + + * src/include/nonposix.h: Handle __EMX__. + + * Makefile.in (SEP): New variable; set to @PATH_SEPARATOR@. + (fontpath,tmacpath): Use it. + (MDEFINES): Add it. + Sorted alphabetically. + + * src/preproc/eqn/neqn.sh, src/roff/nroff/nroff.sh: Use + @SEP@. + * src/preproc/eqn/Makefile.sub, src/roff/nroff/Makefile.sub: Handle + @SEP@. + +2003-01-27 Werner LEMBERG + + * src/libs/libgroff/strcasecmp.c, src/libs/libgroff/strncasecmp.c: + New files, copied from gnulib. + * src/libs/libgroff/Makefile.sub (CSRCS): Add them. + * configure.ac: Updated. + * configure: Regenerated. + + * src/include/config.hin: Regenerated. + * src/include/lib.h [!HAVE_STRCASECMP]: Declare `strcasecmp'. + Don't define `strcasecmp' as `strcmp'. + [!HAVE_STRNCASECMP]: Declare `strncasecmp'. + Dont define `strncasecmp' as `strncmp'. + + * src/roff/groff/pipeline.c [!HAVE_STRCASECMP, !HAVE_STRNCASECMP]: + Removed. + +2003-01-26 Werner LEMBERG + + * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Fix typo: + s/unline/unlink/. + +2003-01-25 Werner LEMBERG + + * doc/groff.texinfo (Ligatures and Kerning): Mention limitations. + +2003-01-24 Werner LEMBERG + + Add US-english hyphenation exceptions (converted from Barbara + Beeton's hyphenation exception log reports which appear irregularly + in TUGBoat). + + * tmac/hyphen.us: Updated to latest version. + * tmac/README: Updated. + * tmac/hyphenex.us, tmac/hyphenex.sh: New files. + * tmac/troffrc: Load `hyphenex.us'. + * tmac/Makefile.sub (NORMALFILES): Add `hyphenex.us'. + * doc/groff.texinfo: Updated. + +2003-01-23 Werner LEMBERG + + Improve hyphenation slightly. This is a first step in redesigning + the hyphenation algorithm to make it more flexible (e.g. allowing + kerns and ligatures between the hyphenation character and the + following character -- while not used normally in English, other + languages like German would benefit). + + * src/roff/troff/env.cc (environment::hyphenate_line): Use + assertion instead of if-clause. + Let `get_hyphen_list' return the number of involved characters in + the hyphenation pattern instead of computing it directly (which + often yields too small values). + * src/roff/troff/node.h (*::get_hyphen_list): Add second parameter. + * src/roff/troff/node.cc (*::get_hyphen_list): Handle new second + parameter. + +2003-01-22 Werner LEMBERG + + Fixing a bug which caused groff to hang if the hyphenation exception + dictionary tried to grow. + + * src/roff/troff/env.cc (hyphen_trie::insert_hyphenation, + hyphen_trie::read_patterns_file, do_hyphenation_patterns_file): Use + pointer to dictionary. + +2003-01-20 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Add switch `-m' to suppress + negative left italic correction. + * src/utils/afmtodit/afmtodit.man: Document it. + + * font/devps/generate/Makefile (RFLAG): Add `-m'. + * font/devps/{AB,AR,BMB,BMR,CB,CR,EURO,HB,HR,HNB,HNR,NB,NR,PB,PR, + S,TB,TR,ZD,ZDR}: Regenerated with afmtodit options `-i 0 -m'. + + * NEWS: Updated. + +2003-01-16 Werner LEMBERG + + * NEWS: Updated. + +2003-01-16 Jörgen Grahn + + * src/preproc/refer/refer.man: Mention REFER environment variable. + +2003-01-05 Werner LEMBERG + + Similar to \[is], the square root glyph (\[sr]) and the square root + extension glyph (\[radicalex]) are now text symbols. The new + mathematical versions are called \[sqrt] and \[sqrtex], + respectively. + + * font/devX*/S: Regenerated. + * font/devdvi/generate/texex.map: Rename `sr[0123]' to `sqrt[0123]'. + * font/devdvi/generate/texsy.map: Rename `sr' to `sqrt'. + * font/devdvi/EX, font/devdvi/S: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `sqrt'. + * font/devlj4/generate/special.map: Add `sqrt'. + * font/devlj4/S: Regenerated. + * font/devps/generate/textmap: Add `sqrt'. + * font/devps/S, font/devps/symbolmap: Regenerated. + + * src/preproc/eqn/sqrt.cc (SQRT_CHAR, RADICAL_EXTENSION_CHAR, + SQRT_CHAIN, BAR_CHAIN): Use `sqrt*' and `sqrtex*'. + * src/roff/troff/input.cc (init_charset_table): Make `sqrtex' + overlap horizontally. + + * tmac/X.tmac, tmac/ps.tmac, tmac/lj4.tmac: Add `sqrtex'. + * tmac/dvi.tmac: Add `sr', and `sqrtex'. + Fix `radicalex'. + + * doc/groff.texinfo, man/groff_diff.man: Document that `radicalex' + and `sqrtex' are overlapping glyphs. + +2003-01-04 Werner LEMBERG + + * font/devdvi/generate/texsy.map: Add `is'. + * font/devps/symbolmap: Regenerated. + * font/devdvi/*TC, MI, S: Regenerated. + + * tmac/dvi.tmac: Remove `is'. + +2003-01-03 Werner LEMBERG + + `is' is now a text symbol (only relevant for dvi). The math variant + can be accessed with `integral'. + + * font/devX*/S: Regenerated. + * font/devdvi/generate/texex.map: Remove `is'. + * font/devdvi/EX: Updated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `integral'. + * font/devlj4/generate/special.map: Ditto. + * font/devlj4/S: Regenerated. + * font/devps/generate/textmap: Add `integral'. + * font/devps/S: Regenerated. + + * tmac/dvi.tmac: Define `is'. + + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `integral'. + + * src/preproc/tbl/main.cc (process_format): Fix error message. + +2003-01-02 Werner LEMBERG + + * font/devhtml/R.proto, font/devutf8/R.proto: Add `ne' and `nc'. + * font/devps/textmap: Fix entries for `ne' and `nc'. + * font/devps/symbolmap: Regenerated. + + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list), + src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `18', + `38', `58', `78', `-+', `|=', `nc', `ne'. + + * tmac/dvi.tmac: Add `nm', `ne', `nc'. + Use `schar' for `aq'. + * tmac/ps.tmac, tmac/X.tmac: Add `nc' and `ne'. + * tmac/ec.tmac: Add `SC' to special fonts for `CW' and `CWI'. + * tmac/tty.tmac: Add `ne'. + + * src/roff/troff/node.cc (make_glyph_node): Test with `get_macro' + for fallback glyphs. + +2002-12-29 Werner LEMBERG + + Add glyph `|='. + + * font/devX*/*: Regenerated. + * font/devdvi/generate/ec.map: Remove `eq'. + * font/devdvi/generate/texsy.map: Make `~=' the same as `~~'. + Assign `|=' to position 39. + * font/devdvi/*EC, S: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `|='. + * font/devlj4/generate/special.map: Make `~=' the same as `~~'. + Assign `|=' to position 549. + * font/devps/generate/textmap, font/devps/enerate/symbolmap: Remove + `equalmath'. + Add `uni2243' for `|='. + + * tmac/ec.tmac: Add `eq'. + * tmac/dvi.tmac: Add `=~'. + * tmac/tty-char.tmac, tmac/ps.tmac, tmac/X.tmac, tmac/lbp.tmac: Add + `|='. + +2002-12-21 Werner LEMBERG + + * font/devdvi/generate/tc.map: Remove `**'. + * font/devdvi/*TC: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `18', `38', `58', + `78', `<<', `>>'. + * font/devutf8/NOTES: Updated. + + * src/roff/troff/charinfo.h (charinfo): Add `setx_macro' function. + Don't give default parameter to `set_macro'. + * src/roff/troff/input.cc (do_define_character): Use `setx_macro' + instead of `set_macro'. + (charinfo::setx_macro): Implement it. + (charinfo::set_macro): Don't change `mode'. + + * tmac/tty.tmac: Add `18', `38', `58', `78', `<<', `>>'. + * tmac/ps.tmac, tmac/X.tmac: Add `<<', `>>'. + * tmac/dvi.tmac: Define `!=' with `.schar'. + +2002-12-20 Werner LEMBERG + + * font/devX*/S: Regenerated. + * font/devdvi/generate/ec.map: Remove `pl'. + * font/devdvi/generate/tc.map: Remove `mi', `14', `12', `34'. + * font/devdvi/*{TC,EC}: Regenerated. + * font/devhtml/R.proto: Add `-+'. + Remove double entries for `rk', `lk', `lt', `rt', `rb', `lb'. + * font/devlbp/*: Remove `or'. + * font/devlj4/generate/special.map: Remove `or'. + * font/devlj4/S: Regenerated. + * font/devps/generate/textmap: Add `fiveeighths', `oneeighth', + `seveneighths', `threeeighths'. + Remove `plusmath'. + Replace `minusplus' with `uni2213'. + * font/devps/symbolmap: Regenerated. + * font/devutf8/R.proto: Replace `shc' with unnamed glyph. + Add `-+'. + + * src/roff/troff/charinfo.h (charinfo): Add `is_normal' inline + function. + * src/roff/troff/node.cc (troff_output_file::put_char_width): + Call glyph_color and fill_color even if tcommand_flag isn't set. + (make_node, node::add_char): Check not ci->is_fallback but + ci->is_normal. + + * tmac/lj4.tmac, tmac/lbp.tmac: Define `or'. + * tmac/ec.tmac: Add .rchar entry for `f/'. + Don't remove `12', `14', `34'. + Define `pl' to be always roman. + * tmac/ps.tmac (ps-frac, ps-frac-mono): New macros. + Define `18', `38', `58', `78'. + * tmac/tty.tmac: Add `-+'. + * tmac/dvi.tmac: Define `f/'. + (dvi-frac): Use `f/'. + * tmac/X.tmac (X-frac, X-frac-mono): New macros. + Define `18', `38', `58', `78'. + +2002-12-15 Colin Watson + + * contrib/pic2graph/pic2graph.sh: Add missing `;;'. + +2002-12-10 Werner LEMBERG + + Add glyph `tno', a textual variant of `no'. + + * font/devX*/*: Regenerated. + * font/{devcp1047,devlatin1,devutf8,devhtml}/R.proto: Add `tno'. + * font/devdvi/generate/{tc.map: Replace `no' with `tno'. + * font/devdvi/generated/{texsy,textex}.map: Add `tno'. + * font/devdvi/*: Regenerated. + * font/devlbp/*: Add `tno'. + * font/devlj4/generate/tex.map: Replace `no' with `tno'. + * font/devlj4/*: Regenerated. + * font/devps/generate/textmap: Replace `no' with `tno'. + * font/devps/generate/symbolchars: Add `no'. + * font/devps/*: Regenerated. + + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `tno'. + + * tmac/cp1047.tmac, tmac/latin1.tmac: Replace `no' with `tno'. + * tmac/tty-char.tmac: Add entry for `tno' and `3d'. + + * NEWS: Updated. + + * tmac/dvi.tmac: Replace most `\\' with `\E'. + Add definition for `sd'. + * tmac/X.tmac, tmac/ps.tmac: Replace most `\\' with `\E'. + + * tmac/eqnrc : Use `integral' instead of `is' glyph. + +2002-12-08 Werner LEMBERG + + * tmac/an-old.tmac (TH): Use integer value for `IN' if in nroff + mode to avoid rounding errors. + (an-do-tag, an-do-tag-html, RS, RE): Remove redundant `.br'. + + * src/roff/groff/groff.man, src/roff/nroff/nroff.man, + src/roff/troff/troff.man: Improve documentation of -T. + +2002-12-07 Jeff Conrad + + * src/roff/groff/pipeline.c: Don't define `const' for _WIN32. + (run_pipeline) [_WIN32]: Provide working function without `fork'. + +2002-12-06 Werner LEMBERG + + * font/devps/generate/freeeuro.sfd: Make dimensions of Euro.symbol + glyphs compatible to Adobe's Euro fonts (scaling them down a bit). + Scaling Euro.sansserif glyphs down to have the same height as + digits. + Removed unnecessary points; added some extrema. + + * font/devps/EURO, font/devps/freeeuro.afm, font/devps/freeeuro.pfa: + Regenerated. + +2002-12-04 Werner LEMBERG + + * font/devps/generate/freeeuro.sfd: Add glyphs `Euro.symbol.slanted' + and `Euro.symbol.bold.slanted'. + Improve some glyph offsets and widths. + * font/devps/EURO, font/devps/freeeuro.afm, font/devps/freeeuro.pfa: + Regenerated. + * font/devps/generate/Makefile (freeeuro.afm freeeuro.pfa): Fix + typo. + * font/devps/generate/sfdtopfa.pe: Generate PFA in current + direcory. + + * tmac/europs.tmac: Updated to new glyph indices. + Use Euro.symbol for font familiy `A'. + + * doc/groff.texinfo: Minor improvements. + +2002-12-02 Werner LEMBERG + + * font/devdvi/generate.tc.map: s/%O/%0/. + * font/devdvi/*TC: Regenerated. + + * src/roff/troff/div.cc (init_div_requests): Sorted. + + * tmac/dvi.tmac: Remove `Ye'. + * tmac/ec.tmac: Remove `Ye'. + Add .rchar entry for `de'. + + * man/groff.man, man/groff_diff.man: Document register `.pe'. + * doc/groff.texinfo: Document registers `.pe', `.n', and `.w'. + * NEWS: Updated. + +2002-11-30 Werner LEMBERG + + Add PS font for various Euro glyphs. + + * font/devps/generate/freeeuro.sfd: New master font file for + pfaedit. + * font/devps/generate/sfdtopfa.pe: New conversion script for + pfaedit. + * font/devps/generate/Makefile (FONTS): Add `EURO'. + (EURO, freeeuro.afm, freeeuro.pfa): New rules. + * font/devps/freeeuro.pfa, font/devps/freeeuro.afm: Generated from + `freeeuro.sfd'. + * font/devps/EURO: Generated from `freeeuro.afm'. + * font/devps/download: Add `freeuro.pfa'. + * font/devps/Makefile.sub (NORMALFILES): Adde `EURO' and + `freeeuro.pfa'. + + * tmac/europs.tmac: New file. + * tmac/ps.tmac: Include `europs.tmac'. + * tmac/Makefile.sub (DISTFILES): Add `europs.tmac'. + +2002-11-29 Werner LEMBERG + + * font/devdvi/generate/texsy.map: Remove `lh' and `rh'. + * font/devdvi/S: Regenerated. + * font/devhtml/R.proto: Fix `CR' and `ci'. + Add `OK'. + * font/devps/generate/textmap: Fix `lh', `rh', and `sq'. + Remove `bs'. + * font/devps/symbolmap: Regenerated. + * font/devutf8/R.proto: Fix `CR' and `ci'. + Add `OK'. + * font/devutf8/NOTES: Updated. + + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Fix `CR' and + `ci'. + Add `OK'. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Ditto. + + * tmac/dvi.tmac: Add `lh' and `rh'. + * tmac/Xps.tmac: Fix `lh' and `rh'. + * tmac/X.tmac: Add `OK'. + * tmac/lj4.tmac: Ditto. + +2002-11-24 Werner LEMBERG + + * font/devX*/S: Regenerated. + * font/devascii/R.proto, font/devcp1047/R.proto: Remove glyphs `lb', + `lc', `lf', `lk', `lt', `rb', `rc', `rf', `rk', and `rt'. + * font/devdvi/generate/texsy.map: Remove `or' glyph. + * font/devdvi/S: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add/fix glyphs + `parenlefttp', `parenleftex', `parenleftbt', `parenrighttp', + `parenrightex', `parenrightbt', `bracketlefttp', `bracketleftex', + `bracketleftbt', `bracketrighttp', `bracketrightex', + `bracketrightbt', `bracelefttp', `braceleftmid', `braceleftbt', + `braceex', `braceleftex', `bracerightex', `bracerighttp', + `bracerightmid', `bracerightbt', `lt', `lk', `lb', `rt', `rk', + `rb', and `bv'. + * src/roff/troff/glyphuni.cc, src/roff/troff/uniglyph.cc: Ditto. + * font/devutf8/NOTES: Updated. + * font/devlj4/generate/special.map: Add glyph `braceex'. + * font/devlj4/S: Regenerated. + + * tmac/tty-char.tmac: Add glyphs `lf', `rf', `lc', and `rc'. + +2002-11-14 Werner LEMBERG + + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `va' + and `vA'. + Fix code for `an'. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Ditto. + + * doc/texinfo.tex: New version from texinfo 4.3. + * doc/groff.texinfo: Updated for texinfo 4.3. + Use @tie{} where appropriate. + * font/devdvi/generate/ec.map: Don't include `or' and `bv'. + * font/devdvi/generate/tc.map: Remove `rn'. + * font/devdvi/*TC, font/devdvi/*EC: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `vA'. + Fix code for `an'. + * font/devX100/*, font/devX100-12/*, font/devX75/*, + font/devX75-12/*: Regenerated. + + * tmac/dvi.tmac: Add special fonts `SA' and `SB'. + Use .char (again) for `br', `ul', `rn', `or', and `ru'. + Improve definition of `an'. + * tmac/ps.tmac: Use .char (again) for `br', `ul', `rn', `or', and + `ru'. + * tmac/lj4.tmac: Use .char (again) for `br', `ul', `rn', and `ru'. + * tmac/X.tmac: Add definition for `or'. + * tmac/Xps.tmac: Undo change 2002-11-05. + * tmac/lbp.tmac: Add definitions for `br', `rn', `ul', and `ru'. + +2002-11-11 Werner LEMBERG + + * src/roff/troff/node.cc (troff_output_file::put_char): Always + call flush_tbuf. + +2002-11-10 Werner LEMBERG + + Added three new requests `schar', `fschar', and `rfschar'. `schar' + defines a glyph which is searched after the check for fonts declared + with `.special' (and before the check for all mounted special + fonts). `fschar' defines a glyph for a particular font which is + searched after the check for fonts declared with `.fspecial' (and + before the check for fonts declared with `.special'). `rfschar' + removes glyphs defined with `fschar'. + + * src/roff/troff/token.h (char_mode): New enum. + Declare do_define_character. + * src/roff/troff/charinfo.h (charinfo): Replace `fallback' with + `mode'. + (charinfo::is_fallback): Updated. + (charinfo::is_special): New method. + * src/roff/troff/input.cc (do_define_character): Add and use + optional second parameter used as a prefix for font-specific glyph + names. + (define_character, define_fallback_character): Updated. + (define_special_character): New function. + (init_input_requests): Add `schar'. + (charinfo::charinfo, charinfo::set_macro): Updated. + * src/roff/troff/node.cc: Include `stringclass.h'. + (make_glyph_node): Handle special glyphs defined with `.schar' and + `.fschar'. + (define_font_special_character, remove_font_special_character): New + functions. + (init_node_requests): Sorted. + Add `fschar' and `rfschar'. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new requests. + + * font/devhtml/R.proto, font/devutf8/R.proto: Add `va'. + * tmac/dvi.tmac: Add `va' for CW and CWI (using `.fschar'). + +2002-11-08 Werner LEMBERG + + Added new font `SC' (cmtex10) to devdvi. + + * devdvi/generate/Makefile (FONTS): Add `SC'. + (SC): New rule. + * devdvi/generate/textex.map: New map file for cmtex. + * devdvi/SC: New. + * devdvi/Makefile.sub (DEVFILES): Updated. + * tmac/dvi.tmac: Add fspecial entries for SC. + Add `MI', `S' and `CW' to the `special' call. Otherwise, `SC' is + found before `S' since the font position of `SC' is lower due to the + gaps in DESC's `font' line. + * tmac/ec.tmac: Add a `special' call. + * NEWS: Updated. + + * font/devhtml/R.proto: Remove double entry for `ti'. + * tmac/tty.tmac: Add entries for `IJ', `ij', and `bq'. + * tmac/tty-char.tmac: Remove entry for `bq'. + * tmac/lbp.tmac: Add entries for `lq', `rq', `fo', `fc', and `em'. + * tmac/ec.tmac: Don't remove `aq' glyph. + * tmac/X.tmac: Fix entry for `em'. + Add entries for `fo' and `fc'. + * tmac/dvi.tmac: Add entries for `em', `en', `hy', `fo', and `fc'. + + * doc/groff.texinfo, man/groff.man, man/groff_diff.man: Fix + documentation of `special' and `fspecial' requests. + +2002-11-05 Werner LEMBERG + + * font/devascii/R.proto, font/devcp1047/R.proto, + font/devlatin1/R.proto: Remove entry for `.i'. + * font/devdvi/generate/textt.map: Add entry for `ad'. + * font/devdvi/generate/texr.map, font/devdvi/generate/texb.map, + font/devdvi/generate/texi.map: Add dummy glyph name `slash@for@l'. + We need this for getting kerning values to compose `/l' and `/L'. + * font/devdvi: Regenerated font definition files for CM fonts. + * font/devhtml/R.proto: Add entries for "'C", "'c", `IJ', and `ij'. + * font/devutf8/R.proto: Ditto. + Remove double entry for `ti'. + + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Fix entries + for (groff) ligatures, `la', and `ra'. + Add "'C", "'c", `IJ', and `ij'. + Remove double entry for `ti'. + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Remove all + double entries. + Add "'C", "'c", `IJ', and `ij'. + Fix entries for (groff) ligatures, `la', and `ra'. + + * tmac/ps.tmac (ps-achar): New macro. + Define "'c" and "'C". + * tmac/tty.tmac: Add entry for `.i'. + * tmac/X.tmac (X-achar): New macro. + Define "'c", "'C", and `:Y'. + Add entries for `IJ' and `ij'. + * tmac/Xps.tmac (Xps-achar): New macro. + Define "'c" and "'C". + Add entries for `IJ' and `ij'. + * tmac/lbp.tmac (lbp-achar): New macro. + Add fallback characters for all groff ligatures and many other + glyphs. + * tmac/dvi.tmac: Fix definitions of `_' and `ul'. + Add entries for `/l' and `/L'. + Define "'c" and "'C". + Add entries for `IJ' and `ij'. + +2002-11-02 Larry Kollar + + * PROBLEMS: Document how to solve Mac OS X compilation problems. + +2002-11-02 Werner LEMBERG + + Adding support for composite glyphs: \[xxx yyy ...] and the + `composite' request. + + * src/roff/troff/glyphuni.cc: New file for mapping groff glyph names + to Unicode-based glyph names. + * src/roff/troff/uniglyph.cc: New file for mapping Unicode-based + glyph names to groff glyph names. + * src/roff/troff/uniuni.cc: New file for canonically decomposing + Unicode-based glyph names. + * src/roff/troff/unicode.cc, src/roff/troff/unicode.h: New files + for handling Unicode glyph names. + * src/roff/troff/input.cc: Include unicode.h. + (composite_glyph_name): New function. + (token::next) <'['>: Handle Unicode glyph names and composite + glyphs. + (composite_dictionary): New dictionary for the `composite' request. + (composite_request): Implement `composite' request. + (init_input_requests): Add `composite'. + Alphabetically sorted. + * src/roff/troff/env.cc (tabs_save, tabs_restore): Removed (already + commented out). + (init_env_requests): Alphabetically sorted. + Removed `tas' and `tar' (already commented out). + * src/roff/troff/Makefile.sub: Updated. + +2002-10-31 Ruslan Ermilov + + * src/roff/nroff/nroff.man, src/roff/nroff/nroff.sh: Fix description + of options. + +2002-10-29 Werner LEMBERG + + Fix computation of .trunc register. Additionally, its value (and + the value of the .ne register) is now always set before entering the + trap. + + * src/roff/troff/div.cc (diversion::need): Set `truncated_space' and + `needed_space' before calling `space'. + (top_level_diversion::space): Remove special code for 'sp before the + first page. + Call `begin_page' with the discarded space as a parameter. + (top_level_diversion::begin_page): Add optional parameter to set + `truncated_space'. + * src/roff/troff/div.h: Updated. + + * doc/groff.texinfo: Improve documentation of .sp, \n[.trunc], and + \n[.ne]. + + * tmac/an-old.tmac (SH, SS, TP, IP, HP, TS): Undo change 2002-10-26. + (LP): Remove superfluous call to `br'. + * tmac/doc-common (doc-paragraph): Undo change 2002-10-26. + * tmac/doc.tmac (Bd, Bl, doc-set-vertical-and-indent): Ditto. + +2002-10-26 Werner LEMBERG + + * tmac/doc-ditroff: Remove useless switch/variable -rC. + (doc-setup-header): Don't set page register `%'. + * tmac/doc-nroff: Remove variable `C'. + (doc-setup-page-layout): Set doc-header-space to .5i unconditionally. + (doc-setup-header): Don't set page register `%'. + Don't call `bp'. + * tmac/doc-common (doc-header): Call `ns'. + (doc-paragraph): Protect .sp with .br so that it survives traps + possibly set by the user. + * tmac/doc.tmac (Bd, Bl, doc-set-vertical-and-indent): Ditto. + + * tmac/doc*: Replace ' with . for consistency if no effect. + +2002-10-26 Werner LEMBERG + + * tmac/an-old.tmac (SH, SS, TP, IP, HP, TS): Protect .sp with .br + so that it survives traps possibly set by the user. + + * src/roff/troff/node.cc: Fix the changes from 2002-10-23. + (troff_output_file::set_font): Call flush_tbuf if necessary. + (troff_output_file::fill_color, troff_output_file::glyph_color): Call + flush_tbuf and do_motion only if necessary. + (troff_output_file::start_special, + troff_output_file::put_char_width, troff_output_file::put_char, + troff_output_file::draw): Updated. + (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, + vmotion_node::tprint): Undo change 2002-10-23. + +2002-10-25 Werner LEMBERG + + * tmac/www.tmac (DC): Fix case of overlapping images. + +2002-10-23 Werner LEMBERG + + * src/roff/troff/node.cc (troff_output_file::fill_color, + troff_output_file::glyph_color): Set current color before testing + color_flag. + (troff_output_file::put_char_width, troff_output_file::put_char, + troff_output_file::draw): Don't call flush_tbuf and/or do_motion + before glyph_color. + (troff_output_file::file_color, troff_output_file::glyph_color): + Call do_motion. + (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, + vmotion_node::tprint): Move first, then call fill_color. + +2002-10-20 Werner LEMBERG + + * doc/groff.texinfo, man/groff_tmac.man: Document that it is not + possible to use multiple main macro packages. + +2002-10-19 Werner LEMBERG + + * src/devices/grops/ps.cc (cmyk_flag): New global variable. + (ps_printer::set_color): Set `cmyk_flag' for CMY and CMYK colors. + (ps_printer::~ps_printer): Emit `%%Extensions: CMYK' if `cmyk_flag' + is set. + * font/devps/prologue.ps (Fk, Ck): Enclose definitions with a + `where' construction since `cmyksetcolor' is a PS Level 2 operator. + +2002-10-16 Werner LEMBERG + + * NEWS, doc/webpage.ms: Updated. + +2002-10-14 Werner LEMBERG + + * src/roff/troff/node.cc (troff_output_file::put_char_width, + troff_output_file::put_char, troff_output_file::fill_color, + troff_output_file::glyph_color): Handle case where color pointer + is null. + +2002-10-13 Ruslan Ermilov + + Add the new -r option to grotty. It is similar to the -i option + except it tells grotty(1) to use the "reverse video" attribute to + render italic fonts. + + * src/devices/grotty/tty.cc (reverse_flag): New global variable. + (SGR_REVERSE, SGR_NO_REVERSE): New macros. + (tty_printer::make_underline, tty_printer::put_color, + tty_printer::end_page): Use it. + (main): Add -r switch. + (usage): Updated. + * src/devices/grotty/grotty.man: Document it. + +2002-10-11 Ruslan Ermilov + + * src/roff/troff/env.cc (hyphen_trie::read_patterns_file): Add + cast to `unsigned char' to properly read patterns with 8bit + characters. + +2002-10-08 Werner LEMBERG + + * REVISION: Increased to 2. + +Local Variables: +version-control: never +coding: latin-1 +End: diff --git a/ChangeLog.115 b/ChangeLog.115 new file mode 100644 index 0000000..1d994f3 --- /dev/null +++ b/ChangeLog.115 @@ -0,0 +1,6147 @@ + +Version 1.15 released +===================== + +1999-12-28 Werner LEMBERG + + * NEWS, VERSION: Changed to 1.15 + +1999-12-27 Paul Eggert + + * nroff/nroff.man: -S is safer, not safe. + + * groff/groff.cc (main): Use `safer', not `safe', in variable + names. This does not change the behavior. + + * troff/input.cc (main): Likewise. + + * nroff/nroff.sh: Likewise. + + * troff/input.cc (prepend_string): New function. + (main): Prepend -msafer, so that we check macro libraries for + safety. + + * PROBLEMS: Report problem with Sun C++ 5.0 and 5.1. + +Version 1.14 released +===================== + +1999-12-26 Werner LEMBERG + + * NEWS, VERSION: Changed to 1.14. + +1999-12-24 Werner LEMBERG + + * refer/refer.cc: Fixing the last fix. + +Version 1.13 released +===================== + +1999-12-23 Werner LEMBERG + + * tmac/tmac.an: A typo (`.if' instead of `.ie') made the page + number disappear. + + * NEWS: Updated. + + * tmac/tmac.safer: Forgot to remove `so' from the `rm' request. + + * VERSION: Changed to 1.13 -- to be compliant with the Adobe 3.0 + document conventions, the version number must be a real. + +Version 1.12.1 released +======================= + +1999-12-22 Werner LEMBERG + + * VERSION: Changed to 1.12.1. + +1999-12-22 Alan Rooks + + * refer/refer.cc (do_file): Slight modification to satisfy the + `Standard system CC - C++ Compilation System 3.1 03/03/99' on SCO + UnixWare 7.1. + +1999-12-20 Werner LEMBERG + + * changed prep.ai.mit.edu -> ftp.gnu.org; updated copyright + notices. + + * tmac/tmac.safer, tmac/groff_msafer.man: Remove `so' (again) from + list of unsafe requests. + + * pic/pic.man: Fixed a typo. + + * man/groff_out.man: Fixed a typo. + +1999-12-18 Werner LEMBERG + + * Makefile.in: Doc fixes. + +1999-12-17 Fabrizio Polacco + + * groff/groff.cc: Missing `U' option added to getopt(). + + * troff/troff.man: Missing `U' option added to synopsis. + +Version 1.12 released +===================== + +1999-12-14 Werner LEMBERG + + * troff/input.cc (usage), groff/groff.cc (synopsis): Added -U flag + to the synopsis. + + * nroff/nroff.sh, nroff/nroff.man: Replaced `secure', `unsecure' + with the more appropriate terms `safer' and `unsafe'. + + * libgroff/strerror.c, aclocal.m4, configure.in: Added checks for + sys_nerr and sys_errlist[]. + + * pic/pic.h, aclocal.m4, configure.in: Added check for hypot(). + + * pic/pic.y, pic/pic.cc: Added check for fmod(). + +1999-12-13 Werner LEMBERG + + * VERSION: Changed to 1.12. + + Here some patches from various sources; most of them taken from + the Debian distribution. + + * tmac/groff_mdoc.man, tmac/groff_mdoc.samples.man, + tmac/Makefile.sub: New files copied directly from the NetBSD + distribution. Probably, some additional adaptation later on is + necessary... + + * tmac/tmac.safer, tmac/groff_msafer.man: Added `so' to the list + of unsafe requests. + + * groff/groff.cc, groff/groff.man, nroff/nroff.sh, + nroff/nroff.man, pic/main.cc, pic/pic.man, troff/input.cc, + troff/troff.man: Added option `-U' for unsafe mode. Safe mode + (`-S') is now the default. + + * README, NEWS: Updated. + +1999-12-09 Werner LEMBERG + + * doc/groff.texinfo: Regenerated nodes and menus with emacs. + + * doc/Makefile (clean): Added cleaning commands for groff.texinfo. + +1999-12-06 Werner LEMBERG + + * configure.in: Removed AC_PREFIX_PROGRAM since it causes more + grief than relief today. Additionally, it is against the GNU + coding standards. + + * configure: Recreated. + +1999-12-05 Werner LEMBERG + + * configure.in: Added GROFF_LIBM. + + * configure: Recreated. + + * aclocal.m4 (GROFF_LIBM): New function which tests whether -lm is + necessary. + + * Makefile.in: Added definition of $(LIBM). + + * Makefile.comm (LIBM): Removed. + + * pfbtops/Makefile.sub: On AIX, -lm is needed also. + +1999-12-03 Gaius Mulley + + * doc/Makefile: Added rule for generation pic.html. + + (clean): Files produced by grohtml will be removed also. + + * doc/pic.ms: Small fix. + + * tmac/tmac.html: Fixed suppression of headers. + +1999-11-16 Gaius Mulley + + * tmac/tmac.html: Fixing horizontal arrows. + + Turning off hyphenation. + + * tmac/tmac.an: Improved support for grohtml; better indentation, + no footers/headers. + +1999-10-31 Gaius Mulley + + * tmac/tmac.arkup: Added CDFTP macro + + * tmac/tmac.html: All headers are turned off for ms, me, and mm + macros. + + * tmac/troffrc: Some additions for HTML stuff. + +1999-10-06 Gaius Mulley + + * tmac/tmac.html: Small changes. + +1999-09-26 Werner LEMBERG + + * doc/groff.texinfo: Minor fixes. + +1999-09-26 Gaius Mulley + + * devhtml/TR: Changed spacewidth to 3. + + * tmac/Makefile.sub (NORMALFILES): Added tmac.arkup. + + * tmac/tmac.html: Moved markup macros to tmap.arkup. + + * tmac/tmac.arkup: New file. + + * grohtml/ChangeLog: New file. + +1999-09-16 Werner LEMBERG + + * doc/groff.texinfo (Common Features): Added Copying chapter. + Changed format to @smallbook. + +1999-09-15 Werner LEMBERG + + * NEWS: Added info about groff.texinfo. + + * doc/groff.texinfo: Will now compile (using texi2dvi) without + warning messages. + +1999-09-14 Werner LEMBERG + + * groff/groff.man: More updates. + +1999-09-13 Werner LEMBERG + + * doc/groff.texinfo: New file. This manual is still very + rudimentary. It has been originally contributed by Trent + A. Fisher with first corrections and + additions by me. + + * INSTALL: Added information about the `doc' subdir + + * troff/troff.man: Minor fixes. + + * groff/groff.man: Added missing `-L arg' to SYNOPSIS section; + reordered options. + + * troff/input.cc (usage): Added missing `-ffam' to usage message. + + * Makefile.in (dist): groff-$(version).tar.gz must be removed + also, otherwise it is included itself in another call of `make + dist'. + + * groff/groff.cc (synopsis): Removed superfluous space. + + * PROJECTS, PROBLEMS, NEWS: Updated. + + * VERSION: Updated to 1.12beta. + + * BUG-REPORT: Some cosmetic fixes. Corrected email address. + + * README: Updated: Included documentation about CVS repository, + mailing lists, and daily snapshots. + + * tmac/Makefile.sub: Fixed $(tmap_wrap) finally. + +1999-09-12 Bjarni Ingi Gislason + + * tmac/tmac.an: If the tag didn't fit into the space that the + macro `TP' specifies, the rest of the tag went into the space for + the next line. + +1999-09-12 Jeffrey Copeland + + * grolj4/lj4.cc: Added duplex printing (option `-d'). + + * grolj4/grolj4.man: Document duplex printing. + +1999-09-12 Werner LEMBERG + + * doc/Makefile (pic.ps): Fixed rule which caused problems with + non-GNUish sed programs. + + * tmac/doc-syms: Removed extra space from -iso8802-3 macro + definition. + + * configure.in (LIBS): Added `-lc' + + * Makefile.comm (.man.n): Added substitution for @TMAC_AN_PREFIX@. + + * pic/tex.cc (solid_arc): Casting M_PI to double. + + * libgroff/putenv.c (putenv): Changed function header to ANSI C. + + * groff/groff.man, tmac/Makefile.sub (MAN7), tmac/groff_msafer.man + (new file), tmac/msafer.man (deleted), tmac/groff_me.man (new + file), tmac/me.man (deleted): {me,msafer} -> groff_{me,msafer}. + + * groff/groff_man.man: New file. This manual page was originally + written for the Debian GNU/Linux system by Susan G. Kleinmann + . + + * eqn/list.cc (list_box::compute_metrics, + list_box::compute_sublist_width): Removed variable declaration to + avoid shadowing warnings. + + * grops/psrm.cc (resource_manager::process_file): Ditto. + + * tfmtodit/tfmtodit.cc (main): Ditto. + + * libgroff/font.cc (font::load_desc): Renamed auxiliary variable + to avoid shadowing warnings. + + * tbl/table.cc (block_entry::do_divert, table::do_row): Renamed + shadowing loop variable. + + * groff/groff.man, troff/troff.man: Added doc about grohtml. + +1999-09-12 Gaius Mulley + + New grohtml frontend to convert groff input to html. + + * Makefile.in (CCPROGDIRS, DEVDIRS): Added html device. + + * tmac/Makefile.sub (NORMALFILES): Added tmac.html. + + * tmac/eqnrc: Added html device. + + * tmac/tmac.html: New file. + + * eqn/main.cc (do_file, inline_equation), pic/troff.cc + (troff_output::start_picture, troff_output::finish_picture), + tbl/main.cc (process_input_file): + Surrounded output with `graphics_start' and `graphics_end' so that + the html driver can identify non-text portions. + + * grodvi/dvi.cc (dvi_printer::set_char), grolj4/lj4.cc + (lj4_printer::set_char), grops/ps.cc (ps_printer::set_char), + grotty/tty.ps (tty_printer::set_char): Additional parameter + `name'. + + * include/printer.h: Class printer: New function + set_char_and_width; new variables (is_char_named, is_named_set, + named_command, named_char_s, named_char_n) to hold information + about named characters -- needed by the html driver. + + * libdriver/printer.cc (printer::set_ascii_char, + printer::set_special_char): Use set_char_and_width. + + * devhtml/*: New device files for html driver. + + * grohtml/*: New driver grohtml. + +1999-09-11 Wilfredo Sanchez + + * tmac/doc-common, tmac/tmac.an: Removed the word `UNIX' in + default strings. + +1999-09-11 Luke Mewburn + + * libgroff/string.cc (search): Small fix to test against NULL + pointer. + +1999-09-11 Jeff Conrad + + * troff/node.cc (copy): The characters in a bracket escape (e.g., + \b'abc') were stacked in reverse order when processed in a + diversion. + + * troff/node.h: Added `*last' to struct `node' to make the above + fix work. + + * troff/input.cc (read_draw_node), libdriver/input.cc (do_file): + The default scale for the 'f' and 't' graphics functions were 'm' + rather than 'u' (i.e., no scaling). + +1999-09-11 Peter Miller + + * groff/groff.cc (main), groff.man, soelim/soelim.cc (main, + do_file), soelim/soelim.man: Added `-I file' option to soelim, + defining include paths. + + * soelim/soelim.cc (include_path_append): New function. + +1999-09-11 Larry Jones + + * tbl/main.cc (process_options): Unix (at least Documenter's + Workbench) tbl allows arbitrary non-alpha characters between + options. + +1999-09-11 Paul Eggert + + Y2k fixes. Don't assume that the current year precedes 2000. + + * doc/meref.me: Add \n(y2, \n(y4. + + * tmac/doc-common (Yr): New number register. + (Dd): Don't assume current year precedes 2000. + + * tmac/tmac.e (td): Likewise. + (y2, y4): New number registers. + + * pic/pic.man: Update reference for pic paper to May, 1991 + version. + +1999-09-11 Werner LEMBERG + + * tmac/Makefile.sub (install_data, stamp-wrap, uninstall_sub): + Removed quotation marks which prevented correct expansion of + $(tmac_wrap). + + * devlj4/Makefile.sub (LJ4RES): Fixed value (600 instead of 300). + +1999-09-10 Werner LEMBERG + + * Makefile.sub (DISTCLEANFILES): Added `config.log' and + `config.cache'. + + * Removed configure.old. + +1999-08-31 Werner LEMBERG + + * VERSION: Updated to 1.11.1 + +1999-05-27 Werner LEMBERG + + * doc/Makefile: changed `.PS' postfix to `.ps' for consistency. + + * tmac/Makefile.sub (install_data, stamp-wrap, uninstall_sub): + added quotations around $(tmac_wrap) to avoid syntax error if + variable is empty. + + * configure: Newly generated using autoconf 2.13. + + * Makefile.in (LDFLAGS): Set variable to @LDFLAGS@. + +Fri Aug 15 08:51:47 1997 Eric S. Raymond + + * README, PROJECTS, NEWS, INSTALL, VERSION, + doc/Makefile. doc/pic.ms, groff/groff.man: + Prepare for 1.11 release. No code changes. + Documentation for pic added (doc/pic.ms). + +Sun Nov 26 11:45:13 1995 James Clark + + * Version 1.10 released. + +Fri Nov 24 09:56:16 1995 James Clark + + * afmtodit/afmtodit.pl: Avoid comment on first line. + +Mon Nov 20 11:13:49 1995 James Clark + + * aclocal.m4 (GROFF_INSTALL_SH): New macro. + * configure.in: Call it. + + * Makefile.sub (configure): Depends on aclocal.m4 not acgroff.m4. + (distfiles): Doesn't depend on config.log or config.cache. + +Sun Oct 1 08:45:36 1995 James Clark + + * grog/grog.sh: Use print "" rather than print in END rule. + +Wed Aug 23 13:30:52 1995 James Clark + + * tbl/main.cc (process_data): Don't give error for excess data + entries that are comments. + +Fri Jul 28 11:00:27 1995 James Clark + + * tbl/main.cc (process_data): Fix case where new for-scope rules + silently change meaning of code. + +Tue Jul 4 23:39:51 1995 James Clark + + * troff/env.cc (hyphenate): Loop over all consecutive sequences + of non-zero hyphenation codes. + +Sat Jul 1 00:42:15 1995 James Clark + + * aclocal.m4 (GROFF_POSIX): Use conflicting declaration technique. + +Thu Jun 29 13:58:36 1995 James Clark + + * tmac/tmac.e (ip): Divert the tag so as to freeze the spaces. + +Tue Jun 27 12:30:16 1995 James Clark + + * tmac/tmac.andoc: Make it work in compatibility mode. + + * refer/token.h (token_info::is_range_sep): New function. + * refer/token.cc (init_special_chars): Make \(en a RANGE_SEP. + * refer/ref.cc (reference::output): More sophisticated check for + multiple pages. + + * devps/prologue.ps (MANUAL): New procedure. + * grops/ps.cc (main): New -m option. + (usage): Include -m. + (ps_printer::~ps_printer): Implement -m. + + * aclocal.m4 (GROFF_G): New macro. + * configure.in: Call it. + * Makefile.in (g): Provided by configure. + + * hpftodit/hpftodit.cc (basename): Rename to xbasename. + + * tmac/tmac.tty: Disable warning about bad fonts. Remove font + translations. + + * Makefile.in (tmacpath): Don't include /usr/lib/tmac. + (tmac_m, tmac_s): Deleted. + (sys_tmac_prefix, tmac_wrap, tmac_prefix, tmac_an_prefix, + tmac_s_prefix): New variables. + (MDEFINES): Change accordingly. + * Makefile.comm (.man.n): Use new TMAC_* variables. + * configure.in (GROFF_TMAC): Call. + * aclocal.m4 (GROFF_TMAC): Define. + * tmac/Makefile.sub (stamp_wrap): New target. + (install_data, uninstall_sub): Handle macro wrapping. + +Mon Jun 26 14:54:39 1995 James Clark + + * tbl/main.cc (main): Ignore -T option. + +Thu Jun 22 09:08:06 1995 James Clark + + * devlj4/generate/special.map: Add definition of \(nb. + + * tmac/tmac.dvi: Add definition of \(nb. + + * troff/dictionary.c (dictionary::dictionary): association::v gets + initialized by association::association. + + * tmac/Makefile.sub: Avoid using temporary files when installing. + + * troff/env.cc (environment::set_font): Make bad font number a + warning. + + * Makefile.in (fontpath): Remove $(prefix)/lib/font from fontpath. + + * Makefile.in (datadir): Use share rather than lib. + + * groff/groff.cc (basename): Rename to xbasename. + +Wed Jun 21 16:59:46 1995 James Clark + + * Makefile (CCLIBS): Don't use. + * Makefile.ccpg: Likewise. + + * acgroff.m4: Rename to... + * aclocal.m4: Modify extensively for autoconf 2. + * configure.in: Likewise. + * Makefile.in: Likewise. + + * groff/pipeline.c (const): Declare as empty if __STDC__ not + defined. + (xstrsignal): Check for definition of NSIG. Conditionalize + on SYS_SIGLIST_DECLARED. Make return type const. + +Sat Jun 10 12:28:16 1995 James Clark + + * troff/input.cc (interpolate_macro): Rephrase missing space + warning. + +Thu May 11 01:07:16 1995 Jason Merrill + + * addftinfo/addftinfo.cc, eqn/delim.cc, eqn/lex.cc, eqn/list.cc, + grodvi/dvi.cc, groff/groff.cc, grops/ps.cc, grops/psrm.cc, + grotty/tty.cc, include/ptable.h indxbib/indxbib.cc, + libbib/index.cc, libbib/linear.cc, libbib/search.cc, + libdriver/input.cc, libdriver/printer.cc, libgroff/font.cc, + libgroff/lf.cc, libgroff/nametoindex.cc, libgroff/ptable.cc, + libgroff/string.cc, lkbib/lkbib.cc, lookbib/lookbib.cc, + pic/lex.cc, pic/object.cc, pic/pic.y refer/label.y refer/ref.cc, + refer/refer.cc, refer/token.cc, tbl/main.cc, tbl/table.cc, + tfmtodit/tfmtodit.cc, troff/dictionary.cc, troff/div.cc, + troff/env.cc, troff/input.cc, troff/node.cc, troff/symbol.cc: + Fix 'for' scoping. + +Wed Apr 19 21:15:11 1995 James Clark + + * troff/input.cc (spring_trap): Push a macro_iterator rather than a + string_iterator. + (spring_trap, postpone_traps, unpostpone_traps): Move to later in + file. + (macro_iterator::macro_iterator): Add additional argument. + +Mon Apr 10 12:06:02 1995 James Clark + + * troff/div.cc (vertical_size::vertical_size): In place of integer + specifying line spacing use cunits specifying post vertical + space. + (macro_diversion::output, top_level_diversion::output): Likewise. + * troff/div.h: Change declarations accordingly. + * troff/env.cc (pending_output_line): Replace ls field by post_vs + field. + (pending_output_line::pending_output_line, + pending_output_line::output, environment::output, + environment::output_line, environment::output_title, + environment::hyphenate_line): In place of + integer specifying line spacing use cunits specifying post vertical + space. + (environment::environment): Add post_vertical_spacing and + prev_post_vertical_spacing arguments. + (environment::get_post_vertical_spacing): New function. + (environment::total_post_vertical_spacing): New function. + (environment::post_vertical_spacing): New function. + (init_env_requests): Initialize pvs request and .pvs register. + * troff/env.h: Change declarations. + +Tue Mar 28 09:52:07 1995 James Clark + + * tmac/tmac.pspic: Immediately remove the temporary file. + +Sat Mar 25 10:43:11 1995 James Clark + + * tmac/tmac.pspic (PSPIC): Scale graphic uniformly even when + height is specified. + +Thu Jan 26 16:20:13 1995 James Clark + + * tbl/table.c (struct vertical rule, class table_entry): Use int + not short for start_row and end_row. + +Fri Jan 13 13:53:05 1995 James Clark + + * troff/input.cc (trapping_blank_line, blank_line_macro): New + functions. + (diverted_space_node::reread, process_input_stack): Call + trapping_blank_line() rather than blank_line(). + (init_input_requests): Bind "blm" to blank_line_macro(). + + * tmac/tmac.s (XA): Use .br and par@reset rather than XA. + +Tue Jan 10 11:40:35 1995 James Clark + + * troff/env.cc (environment::possibly_break_line): Require that + width total excluding width of final space node be greater than + the target text length. + +Tue Jan 3 09:13:37 1995 James Clark + + * troff/node.cc (kern_pair_node::vertical_extent): New function. + +Sun Dec 4 13:19:07 1994 James Clark + + * troff/node.cc (charinfo_node): New class. + (glyph_node, composite_node): Derive from charinfo_node. Change + member functions accordingly. + +Wed Nov 30 10:29:29 1994 James Clark + + * nroff/nroff.sh: Use -Tlatin1 not -TLatin1. + +Mon Aug 8 10:17:59 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.tty-char: Add definitions for \(ab and \[arrowvertex]. + + * devps/generate/textmap (notsubset): Add. + + * tmac/tmac.a4: New file. + +Sun Jul 24 20:08:42 1994 James Clark (jjc@jclark.com) + + * pic/main.cc (had_parse_error): New variable. + (do_picture, do_whole_file): Set had_parse_error if yyparse() + returns non-zero. + (main): Return 1 if had_parse_error is true. + +Tue Jul 19 13:40:31 1994 James Clark (jjc@jclark.com) + + * grolj4/lj4.cc (main): Avoid use of strtoul. + +Mon Jul 18 15:03:02 1994 James Clark (jjc@jclark.com) + + * nroff/nroff.sh: Default device is -Tlatin1 if $LC_CTYPE is + iso_8859_1 or $LESSCHARSET is latin1. + +Sun Jul 10 13:38:35 1994 James Clark (jjc@jclark.com) + + * hpftodit: New directory. + * Makefile.in (CCPROGDIRS): Add hpftodit. + * devlj4/generate: New directory. + +Thu Jul 7 23:49:48 1994 James Clark (jjc@jclark.com) + + * configure.in: Don't use AC_VFORK. + * groff/pipeline.c (run_pipeline): Use fork() always. + +Wed Jul 6 11:13:17 1994 James Clark (jjc@jclark.com) + + * grops/ps.cc (main): Use %1 not %s in error message for -w. + + * Makefile.in (CCPROGDIRS): Add grolj4. + (DEVDIRS): Add devlj4. + * grolj4, devlj4: New directories. + * tmac/troffrc: Handle lj4. + * tmac/tmac.lj4: New file. + +Fri Jun 17 18:02:53 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.e (@n): Set indent to 0 before calling |h. + +Wed Jun 1 07:33:47 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (do_if_request): At end of second string, switch + environments before getting next token. + +Fri May 20 07:39:18 1994 James Clark (jjc@jclark.com) + + * devps/psstrip.sed: Split rule that strips whitespace on either + side of delimiters. + +Wed May 18 08:13:47 1994 James Clark (jjc@jclark.com) + + * troff/node.h (font_family::make_definition): Add return value to + declaration. * troff/symbol.h (symbol::operator==, + symbol::operator!=): Likewise. + +Tue May 17 20:46:06 1994 James Clark (jjc@jclark.com) + + * groff/groff.cc (main, help, synopsis): Handle -S. + (possible_command::insert_arg): New function. + + * tmac/tmac.safer: New file. + * tmac/msafer.man: New file. + * tmac/Makefile.sub (FILES): Add tmac.safer and msafer.man. + +Thu Mar 10 01:58:30 1994 Paul Eggert (eggert@twinsun.com) + + * pic/pic.h, pic/main.cc (safer_flag): New variable. + * pic/pic.y (placeless_element): Avoid unsafe operations if + `safer_flag' is set. + * pic/main.cc (main): Add -S option, which sets `safer_flag'. + +Tue May 10 13:02:31 1994 James Clark (jjc@jclark.com) + + * eqn/lex.cc (get_token): Put call to add_context() in block to + work around Sun C++ 4.0 bug. + + * include/stringclass.h (operator +): Use ?: instead of `if' to + work around Sun C++ 4.0 bug. + +Thu May 5 11:18:03 1994 James Clark (jjc@jclark.com) + + * tbl/main.cc (process_format): Accept - as a synonym for the _ + key letter. + + * libbib/index.cc (minus_one): Don't declare as const. + +Fri Apr 29 09:32:48 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (get_char_for_escape_name): Push back a newline. + +Wed Apr 27 21:14:18 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (write_macro_request): New function. + (init_input_requests): Bind write_macro_request to writem. + +Sun Apr 17 11:15:38 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.s (@EN): Turn filling back on even if there was no + equation. + + * eqn/lex.cc (do_space): Supply missing argument to lex_error. + + * tmac/tmac.s (@TS): Renamed from TS. + (TS): Call LP then TS again. + (cov*ab-init): Alias @TS to TS. + + * tmac/tmac.s: Allow QP or RS to initialize. + + * tmac/tmac.s (par@load-init): New macro. Call at end of file. + Move initializations of PS and LL here. + (par@init): Don't initialize HY. Avoid changing environment 0. + (par*env-init): Don't all par@reset. + +Thu Apr 14 19:15:45 1994 James Clark (jjc@jclark.com) + + * include/posix.h: Include only if not using . + +Sun Apr 10 09:54:44 1994 James Clark (jjc@jclark.com) + + * Makefile.in (MDEFINES): Add LDFLAGS. + (LDFLAGS): Add definition line. + +Thu Apr 7 22:22:22 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (get_optional_char): Split off error check into... + (check_missing_character): New function. + * troff/token.h: Declare it. + * troff/env.cc (margin_character): Don't call get_optional_char. + Only call tok.next() after making the node. + + * include/lib.h (getopt): Make 2nd argument char *const *. + +Fri Mar 11 07:28:03 1994 James Clark (jjc@jclark.com) + + * nroff/conftest.sh: Deleted. + +Fri Mar 4 10:51:36 1994 James Clark (jjc@jclark.com) + + * pic/make-dos-dist: Deleted. + +Wed Mar 2 20:59:16 1994 James Clark (jjc@jclark.com) + + * devps/psstrip.sed: Strip comments before stripping trailing + white space. + +Sat Feb 19 13:07:16 1994 James Clark (jjc@jclark.com) + + * Version 1.09 released. + +Wed Feb 16 16:53:49 1994 James Clark (jjc@jclark.com) + + * tmac/doc-ditroff (hK): Don't reset page number if \nC is > 0. + +Mon Feb 14 08:26:40 1994 James Clark (jjc@jclark.com) + + * libgroff/font.cc (font::load_desc): Fix typo in error message. + +Sun Feb 13 09:37:38 1994 James Clark (jjc@jclark.com) + + * libgroff/new.cc (operator new): Rewrite so as to avoid warning + about returning without a value. + + * troff/charinfo.h (charinfo::get_special_translation): Cast + TRANSLATE_NONE to int. + + * refer/token.cc (lookup_token, store_token): Remove bogus loop + test. Fix test so that it works with n unsigned. + + * pic/pic.y (defaults_table): Fully bracket initializer. + * pic/lex.cc (lookup_keyword): Likewise. + * eqn/lex.cc (token_table, def_table): Likewise. + * eqn/box.cc (param_table): Likewise. + * troff/input.cc (warning_table): Likewise. + * libgroff/font.cc (table): Likewise. + * grops/ps.cc (ps_printer::special): Likewise. + * grops/psrm.cc (resource_manager::process_file): Likewise. + * tfmtodit/tfmtodit.cc (lig_chars, lig_table): Likewise. + * refer/command.cc (command_table): Likewise. + * addftinfo/addftinfo.cc (param_table): Likewise. + + * troff/symbol.cc (symbol::symbol): Prevent compiler warnings + about temp's being unused. + (unused): New function. + + * groff/pipeline.cc: Declare c_fatal. + + * libbib/linear.cc (bmpattern::search): Cast patterrn[--j] to + uchar. + + * libbib/index.cc (index_search_item::load): Prevent compiler + warnings about fd_closer's being unused. + (unused): New function. + +Sat Feb 12 10:31:59 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (copy_mode_error): Make `prefix' static. + Fix typo. + + * include/posix.h: Include is HAVE_CC_OSFCN_H is + defined. + * acgroff.m4, configure.in, Makefile: Rename HAVE_CC_UNISTD_H to + HAVE_CC_OSFCN_H and modify accordingly. + + * troff/input.cc (init_charset_table): radicalex overlaps + horizontally. + + * groff/acgroff.m4 (GROFF_ISC_SYSV3): New macro (from + udodo!hans@relay.NL.net). + * groff/configure.in: Call it. + + * groff/acgroff.m4 (GROFF_PCLOSE): New macro. + * groff/configure.in: Call it. + * include/lib.h: Conditionalize declaration of pclose. + + * troff/div.cc (last_page_number): New global variable. + (top_level_diversion::begin_page): Exit if we just printed the + last page. + * troff/div.h (last_page_number): Declare it. + * troff/input.cc (parse_output_page_list): Set last_page_number. + + * eqn/sqrt.cc: Rename \(rn to \[radicalex]. + * devps/S, devps/textmap, tmac/tmac.ps, tmac/tmac.dvi, + tmac/tmac.X: Likewise. + * tmac/tmac.ps, tmac/tmac.X, tmac.dvi: Add definitions of \(rn. + * tmac.dvi: Make \(ru and \(ul extend beyond their width by .04m. + +Fri Feb 11 11:45:40 1994 James Clark (jjc@jclark.com) + + * tmac/doc-ditroff (hK): Remove groff specific code which + prevented page-breaks between separate manual entries. If this is + the first page, don't set the page number to 1. + + * acgroff.m4 (GROFF_POSIX): New macro. + * configure.in: Use it. + + * troff/node.cc (class real_output_file, + real_output_file::real_output_file, + real_output_file::~real_output_file): Conditionalize use of + popen/pclose on POPEN_MISSING. + * troff/node.h: Conditionalize pipe_command on POPEN_MISSING. + * troff/input.cc (pipe_command): Give an error if POPEN_MISSING. + (pipe_source): Similarily. + + * acgroff.m4 (GROFF_PROG_CCC): Update message about libg++. + + * acgroff.m4 (GROFF_GETOPT, GROFF_PUTENV, GROFF_POPEN): Detect + presence of declarations by trying to compile example with + conflicting declarations. (gcc only gives a warning for missing + declarations.) + +Wed Feb 9 09:12:23 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.pspic (PSPIC): Allow options to specify alignment + (from Ulrich Lauther). + +Tue Feb 8 03:56:40 1994 James Clark (jjc@jclark.com) + + * libbib/linear.cc (file_buffer::load): Use S_ISREG macro. + +Thu Feb 3 09:34:35 1994 James Clark (jjc@jclark.com) + + * indxbib/indxbib.cc (write_hash_table): Add code for case where + pointers and ints have different sizes. + +Sun Jan 9 16:17:51 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.s (par*env-init): Call par@reset. + +Fri Jan 7 10:24:27 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.s (@IP): Switch to a new environment when diverting + tag. + (par*push-tag-env, par*pop-tag-env): New macros. + +Wed Jan 5 21:18:34 1994 James Clark (jjc@jclark.com) + + * grops/ps.cc (ps_printer::ps_printer): Use MAX_LINE_LENGTH for + initializing `out'. Reduce MAX_LINE_LENGTH from 79 to 72. + + * grops/ps.cc (ps_printer::~ps_printer): Output %%CreationDate + comment. Include . + +Wed Dec 15 14:14:00 1993 James Clark (jjc@jclark.com) + + * grops/ps.cc (is_small_h, is_small_v): Deleted. + (ps_printer::flush_sbuf): Use absolute motion only at beginning of + lines. + +Tue Dec 14 10:06:34 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (read_request): Only print a prompt if reading + from the terminal. Also clearerr on EOF if reading from the + terminal. Declare isatty. + +Mon Nov 29 08:38:15 1993 James Clark (jjc@jclark.com) + + * refer/label.y: Rename map_t to map_func and extractor_t to + extractor_func. + +Sat Oct 30 06:38:12 1993 James Clark (jjc@jclark.com) + + * include/assert.h: Don't use volatile. + * libgroff/assert.cc: Likewise. + +Fri Oct 29 15:00:23 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (abort_request): Look at character in tok before + calling get_copy(). + +Thu Oct 28 14:09:48 1993 James Clark (jjc@jclark.com) + + * troff/troff.h (NO_RETURN): Deleted. + * troff/div.cc (cleanup_and_exit): Don't declare aas NO_RETURN. + * troff/input.cc (exit_troff): Likewise + + * Makefile.in: Remove `Making ...' messages since GNU make now + gives these. + + * configure.in: Use AC_HAVE_HEADERS(unistd.h) instead of AC_UNISTD_H. + +Wed Oct 27 11:12:51 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.s (@init): Initialize PO to \n(.o here, rather than + to constant 1 inch. + +Sat Oct 23 10:03:52 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.e (hl): Use \n[.in] rather than \n(.i. + +Thu Oct 14 12:09:45 1993 James Clark (jjc@jclark.com) + + * eqn/delim.cc (delim_box::compute_metrics): Don't increase + MARK_REG if there was no left delimiter. + +Sat Oct 2 19:54:47 1993 James Clark (jjc@jclark.com) + + * pic/troff.cc (troff_output::text): Set line thickness to + relative before outputting text. + + * tmac/tmac.e (@k): Don't zero ?T. + ((z): Likewise. + +Sat Sep 25 11:08:43 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.e ($p): Handle possibility that $3 is empty. + +Wed Aug 18 08:51:41 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (decode_args): Warn about unquoted tabs (from + Paul Eggert). + +Tue Aug 10 08:38:32 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (ignoring): New variable. + (ignore): Set ignoring during call to do_define_macro. + (do_define_macro): Clear ignoring before interpolating terminating + macro. + (copy_mode_error): New function. + (get_char_for_escape_name, read_long_escape_name, + interpolate_arg): Use copy_mode_error. + (warning_table): Add WARN_IG. + * troff/troff.h (WARN_IG): Declare. + (WARN_TOTAL): Change accordingly. + + * groff/pipeline.c (strsignal): Rename to xstrsignal. + * groff/groff.cc (strsignal): Delete declaration. + +Fri Jul 16 01:43:12 1993 James Clark (jjc@jclark.com) + + * troff/div.cc (page_offset): Use 'm' as default scaling. + +Sat Jul 3 09:11:38 1993 James Clark (jjc@jclark.com) + + * nroff/nroff.sh: Ignore -u. + +Wed Jun 9 12:17:27 1993 James Clark (jjc@jclark.com) + + * Makefile.in (MDEFINES): Pass down MAKEOVERRIDES. + +Fri Jun 4 17:35:47 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.s (par*box-draw): Set adjustment mode to l while + drawing box. + (B2): With -Tascii, leave additional vertical space before + and after. Ensure that the left and right indent is restored to + what it was even if the point size changes. Don't call + par@finish. Change the indent, line length and title length + directly. With -Tascii, make the width of the box 1n less. + (B1): Remember 1n at the current point size. Don't call + par@reset. Change the indent, line length and title length + directly. Ensure that the temporary indent is preserved. + (par*box-mark-top): Turn off no spacing mode. + +Thu Jun 3 17:47:14 1993 James Clark (jjc@jclark.com) + + * Makefile.in (dist): Use .gz suffix. + +Thu May 27 20:04:59 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (main): Add return 0. + * pic/main.cc (main): Use return instead of exit. + * tbl/main.cc (main): Likewise. + * eqn/main.cc (main): Likewise. + * grops/ps.cc (main): Likewise. + * grotty/tty.cc (main): Likewise. + * groff/groff.cc (main): Likewise. + * grodvi/dvi.cc (main): Likewise. + * refer/refer.cc (main): Likewise. + * indxbib/indxbib.cc (main): Likewise. + * lkbib/lkbib.cc (main): Likewise. + * soelim/soelim.cc (main): Likewise. + * addftinfo/addftinfo.cc (main): Likewise. + * acgroff.m4 (GROFF_PROG_CCC, GROFF_CC_COMPILE_CHECK, + GROFF_COOKIE_BUG, GROFF_CC_ANSI_BUG): Likewise. + + * troff/token.h (process_input_stack): Don't declare as static. + * troff/input.cc: Likewise. + + * troff/node.c (invalidate_fontno): Make it a static member of + class font_family. Change callers. + * troff/node.c: Change declaration. + + * tbl/main.cc (struct input_entry_format): Add explicit public + specifier. + * tbl/table.cc (struct text_stuff, struct single_hline_stuff, + struct double_hline_stuff): Likewise. + * tbl/table.h (struct entry_format): Likewise. + * pic/object.h (struct saved_state): Likewise. + + * include/stringclass.h: Add forward declarations of friend + functions that are later declared as inline. Don't include inline + specifier in friend declaration. + + * libgroff/lib.h: Declare popen and pclose. + * acgroff.m4 (GROFF_POPEN): New macro. + * configure.in: Call it. + + * include/lib.h (PI): New constant. Undef first if necessary. + * tfmtodit/tfmtodit.cc (main): Use PI rather than M_PI. + * grops/ps.cc (degrees, radians): Likewise. + * libgroff/font.cc (font::get_skew): Likewise. + + * grops/ps.cc (is_ascii): New function. + (ps_output::put_string): Use is_ascii. Use csprint rather than + isprint. + (ps_printer::define_encoding): Use csspace. + * libgroff/strtol.c (ISASCII): New macro. + (strtol): Cast arguments to is*() and tolower() to unsigned char. + Use ISASCII rather than isascii. + * libgroff/cmap.cc: Use isascii() only if defines it. + * libgroff/cset.cc: Likewise. + * libdriver/input.cc: Include cset.h. + (do_file, get_integer, possibly_get_integer): Use csdigit() rather + than isdigit(). + + * refer/refer.cc (main): Use %ld rather than %d for longs. + + * libbib/index.cc (index_search_item_iterator::get_tag): Use + S_ISREG macro. + + * addftinfo/addftinfo.cc (param_t): Add explicit `int'. + +Mon May 24 08:51:37 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (hyphenation_code): Skip white space between + char/code pairs. + +Sun May 16 08:15:52 1993 James Clark (jjc at jclark.com) + + * tbl/table.h (table::entry_list_tailp): New member. + (table::table): Initialize it. + (table::add_entry): Use entry_list_tailp to avoid O(n^2) + behaviour. + +Sat May 15 17:26:00 1993 James Clark (jjc at jclark.com) + + * grotty/tty.cc (tty_printer::add_char): Don't discard characters + with negative horizontal positions. Remove casts of glyph::hpos to + int. + (USHRT_MAX): Delete definition. + (SHRT_MAX, SHRT_MIN): New definitions. + (glyph::hpos): Change type to short. + (tty_printer::end_page): Output multiple backspaces if necessary. + Remove casts of glyph::hpos to int. + +Fri May 7 12:14:37 1993 James Clark (jjc at jclark.com) + + * tmac/tmac.s (@RT): New definition. + +Thu May 6 21:36:54 1993 James Clark (jjc at jclark.com) + + * refer/refer.cc (do_file): Make sure current_filename is set when + filename is "-". + + * pic/common.cc (common_output::dot_line): Handle zero length + lines. + +Sun May 2 19:54:16 1993 James Clark (jjc at jclark.com) + + * tmac/tmac.s (par@reset): Get value for .hy for \n[HY]. + (par@init): Initialize \n[HY]. + +Mon Apr 26 11:43:16 1993 James Clark (jjc at jclark.com) + + * troff/dictionary.cc (dictionary::remove): Continue when + r < j < i. + +Sun Apr 25 11:03:00 1993 James Clark (jjc at jclark.com) + + * Makefile.com (.y.cc): Avoid ending up with two versions of + $(YTABH). + +Thu Apr 22 21:03:45 1993 James Clark (jjc at jclark.com) + + * tmac/tmac.dvi (\(,c): Define only if it does not exist. + (\(,C): Likewise. Also fix typo. + +Wed Apr 21 08:47:32 1993 James Clark (jjc at jclark.com) + + * lib.h: Delete extraneous semi-colon. + + * Add pso request: `so' from a pipe. + * troff/input.c (file_iterator::file_iterator): Add 3rd argument. + (file_iterator::close): New function. + (file_iterator::~file_iterator, file_iterator::next_file): Use + file_iterator::close. + (file_iterator::backtrace): Say `process' rather than `file' when + the stream is popened. + (pipe_source): New function. + (init_input_requests): Bind ".pso" to pipe_source. + +Tue Apr 20 00:02:26 1993 James Clark (jjc at jclark.com) + + * afmtodit/afmtodit.pl: Avoid single quotes in comments. + + * pfbtops/pfbtops.c: Output 64 characters per line. Output hex + digits in lower case. + +Mon Apr 19 09:55:57 1993 James Clark (jjc at jclark) + + * Version 1.08 released. + + * Makefile.in (dist): Insert || true after ln -s commands that + might fail. + + * mm: Update to mm 1.16. + + * acgroff.m4 (GROFF_CSH_HACK): New macro. + * configure.in: Call GROFF_CSH_HACK. Substitute for + SH_SCRIPT_SED_CMD. + * Makefile.in (SH_SCRIPT_SED_CMD): New variable. Include in + MDEFINES. + * nroff/Makefile.sub (nroff): New target. + (install_data): Install nroff. + * eqn/Makefile.sub (neqn): Sed with SH_SCRIPT_SED_CMD. + * grog/Makefile.sub (grog): Sed grog.sh with SH_SCRIPT_SED_CMD. + +Sat Apr 17 08:24:28 1993 James Clark (jjc at jclark) + + * eqn/Makefile.sub (neqn): Add chmod +x. + + * grog/Makefile.sub (grog): Remove spurious semi-colon. + +Fri Apr 16 22:41:57 1993 James Clark (jjc at jclark) + + * troff/input.cc (string_iterator::string_iterator()): Initialize + lineno and count. + +Tue Apr 13 10:22:28 1993 James Clark (jjc at jclark) + + * troff/div.cc (macro_diversion::space, + top_level_diversion::space): Don't set high_water_mark. + (macro_diversion::output, top_level_diversion::output): Don't + include post line space in high water mark. + +Wed Apr 7 12:48:18 1993 James Clark (jjc at jclark) + + * eqn/eqn.y: Don't define YYDEBUG. + * pic/pic.y: Likewise. + +Mon Apr 5 10:15:15 1993 James Clark (jjc at jclark) + + * tmac/tmac.e ([3): Add space after comma following editors. + Change double spaces to single spaces. + ([4): Change double spaces to single spaces. + + * grops/ps.h (USE_PS_ADOBE_2_0): New flag for broken_flags. + * grops/ps.cc (ps_printer::~ps_printer): If the USE_PS_ADOBE_2_0 + bit is set in broken_flags, use 2.0 rather than 3.0 as the version + after %!PS-Adobe- (for Newsprint). + + * troff/div.cc (top_level_diversion::begin_page): When + before_first_page is 1, set page_number to 1. + +Sun Apr 4 14:28:53 1993 James Clark (jjc at jclark) + + * eqn/box.cc (box::top_level): Protect equation with \&. + +Sat Apr 3 23:27:25 1993 James Clark (jjc at jclark) + + * groff/groff.cc (possible_command::set_name): Delete old name. + + * groff/groff.cc (possible_command::~possible_command): Use + a_delete. + + * troff/node.cc (troff_output_file::begun_page): New member. + (troff_output_file::troff_output_file): Initialize it. + (troff_output_file::really_begin_page): Only output V command if a + page has been begun. + + * pic/pic.y (placeless_element): Delete argument to PRINT after + use. + +Fri Apr 2 11:31:02 1993 James Clark (jjc at jclark) + + * Make wrapman work. + * troff/div.h (class top_level_diversion): Replace + first_page_begun by before_first_page (with opposite sense). + * Change first_page_begun to before_first_page inverting sense. + * troff/div.cc (class nl_reg): New class. + (init_div_requests): Use class nl_reg for \n(nl. + (top_level_diversion::begin_page): Don't call + output_file::begin_page if before_first_page is 2; + reset before_first_page afterwards. If have_next_page_number is + false, then always increment page_number. + * tmac/tmac.an: Set traps within TH rather than at the top-level. + Restore compatibility mode after loading, and then disable + compatibility mode in TH. + +Thu Apr 1 11:09:34 1993 James Clark (jjc at jclark) + + * grotty/tty.cc (tty_printer::end_page): Don't discard characters + past last line. + * troff/node.h (output_file::trailer): Declare. + * troff/div.cc (cleanup_and_exit): Call output_file::trailer(). + * troff/node.cc (output_file::trailer): New function. + (troff_output_file::~troff_output_file): Move most code into... + (troff_output_file::trailer): New function. + (class troff_output_file): Delete page_length member. Declare + trailer(). + (troff_output_file::really_begin_page): Use current page length + for final V command. + + * tbl/main.cc (struct options): New decimal_point_char member. + (options::options): Initialize this. + (process_options): Implement decimalpoint option. + (process_data): Pass decimal_point_char option to table::table. + * tbl/table.h (class table): New decimal_point_char member. + (table::table): Add additional argument. + * tbl/table.cc (find_dot): Rename to find_decimal_point. Add + second argument specifying decimal point character. Use this + instead of '.'. + (table::table): Initialize decimal_point_char. + (table::add_entry): Change call to find_dot. + + * troff/input.cc (get_copy, token::next): Implement \V. + (interpolate_environment_variable): New function. + +Tue Mar 30 14:41:39 1993 James Clark (jjc at jclark) + + * pic/lex.cc (lookup_keyword): Rename MIN to K_MIN, MAX to K_MAX. + * pic/pic.y: Likewise. + + * grotty/tty.cc (tty_printer::add_char, tty_printer::end_page): + Add casts to int. + * refer/ref.cc (reference::insert_field, reference::delete_field): + Likewise. + * troff/number.cc (parse_term): Likewise. + + * acgroff.m4 (GROFF_PROG_YACC): New macro. + * configure.in: Use GROFF_PROG_YACC. + + * acgroff.m4 (GROFF_PROG_CCC): Don't add -O automatically for gcc + and g++. + * Makefile.in (OPTIMIZE): New define. + (DEBUG): Empty by default. + (CCFLAGS, CFLAGS): Include $(OPTIMIZE). + + * acgroff.m4 (GROFF_SYS_SIGLIST): Don't quote program. + (GROFF_ARRAY_DELETE): Likewise. + (GROFF_CC_COMPILE_CHECK): Quote use of $2 and $3. + + * troff/env.cc (trie::~trie): Make virtual to shut up g++. + + * devps/psstrip.sed: Use different delimiter on last line (so that + it works with BSD 4.4 sed.) + +Mon Mar 29 17:07:14 1993 James Clark (jjc at jclark) + + * devps/psstrip.sed: Delete comments. + + * acgroff.m4 (AC_GETOPT): Don't test whether declares + optind, opterr, optarg. + * lib.h: When UNISTD_H_DECLARES_GETOPT is defined, declare optind, + opterr, optarg. + +Sun Mar 28 17:44:25 1993 James Clark (jjc at jclark) + + * Makefile.in (check): Dummy target. + +Wed Mar 3 04:53:38 1993 James Clark (jjc at jclark) + + * Version 1.07 released. + + * Integrate mm 1.11. + + * tbl/table.cc (alphabetic_block_entry::print): start_row was used + where start_col was meant. + +Thu Feb 25 07:55:36 1993 James Clark (jjc at jclark) + + * grog/grog.sh, grog/grog.pl: Recognize PH and SA as -mm macros. + +Wed Feb 24 10:15:34 1993 James Clark (jjc at jclark) + + * troff/input.cc (token::next): Make \z\o'...' and similar things + work. + + * env.h (MARGIN_CHARACTER_ON, MARGIN_CHARACTER_NEXT): New + constants. + (environment): Add margin_character_flags member. + * env.cc (environment::environment(symbol), + environment::environment(const environment *): Initialize + margin_character_flags. + (margin_character): Rewrite. + (environment::output_line): Add a margin character if + margin_character_flags is non-zero. Turn off the + MARGIN_CHARACTER_NEXT bit. If that makes margin_character_flags + zero, use margin_character_node without copying and then set + margin_character_node to 0. + + * devps/DESC.in: Change minimum size to 1000. + +Tue Feb 23 14:57:49 1993 James Clark (jjc at jclark) + + * troff/symbol.h (symbol::hash): Change return type to unsigned + long. + * troff/dictionary.cc (dictionary::lookup, dictionary::remove): + Add casts to int. + + * test-groff: Use -r rather than -x. + + * grops/psfig.diff: Include in distribution again. + +Mon Feb 22 09:10:44 1993 James Clark (jjc at jclark) + + * Makefile.in (dist): Use gzip. + +Sun Feb 21 11:12:53 1993 James Clark (jjc at jclark) + + * acgroff.m4 (GROFF_GETOPT): Check for declaration of getopt() in + unistd.h as well as in stdlib.h. + * include/lib.h: Include is STDLIB_H_DECLARES_GETOPT is + defined; otherwise include and if + UNISTD_H_DECLARES_GETOPT is defined. + + * configure.in: use builtin(include, ... rather than include(... + * configure: Regenerate with autoconf 1.3. + + * libdriver/print.cc (printer::adjust_arc_center): Use new + algorithm suggested by Andy Fyfe. + + * libdriver/printer.cc (printer::adjust_arc_center): New function. + * include/printer.h: Declare this. + * grops/ps.cc (ps_printer::draw): Use it. + * grodvi/dvi.cc (dvi_printer::draw): Use it. + +Fri Feb 19 23:13:51 1993 James Clark (jjc at jclark) + + * Makefile.comm (.man.n): Replace macrodir by tmacdir. + +Thu Feb 11 16:46:59 1993 James Clark (jjc at jclark) + + * eqn/main.cc (main): Handle "eqn -". + +Mon Jan 4 20:29:56 1993 James Clark (jjc at jclark) + + * tmac/tmac.e (++): Install fix from comp.bugs.4sd. + + * mm: Integrate version 1.08. + + * pic/troff.cc (troff_output::finish_picture): Set + EQN_NO_EXTRA_SPACE reg to 0 rather than removing it. + * eqn/box.cc (box::extra_space): Set EQN_NO_EXTRA_SPACE_REG to 0 + if it's not defined. Check whether the register is non-zero rather + than whether it's not defined. + * tmac.e ({, <): Make argument to \x zero if \n(0x is non-zero. + + * indxbib/indxbib.cc: Move all signal handling into... + * indxbib/signal.c: New file. + * configure.in: Call AC_RETSIGTYPE. + + * acgroff.m4 (GROFF_STRUCT_EXCEPTION): New macro. + * configure.in: Call GROFF_STRUCT_EXCEPTION. + * libgroff/matherr.c: Protect with ifdef HAVE_STRUCT_EXCEPTION. + + * troff/input.cc (token::token, token::operator=): Work round SGI + C++ bug. + * pic/object.cc (position::position): Likewise. + +Mon Dec 28 21:50:21 1992 James Clark (jjc at jclark) + + * pic/pic.h: Move declaration of hypot(). + +Wed Dec 16 12:28:29 1992 James Clark (jjc at jclark) + + * pic/pic.h: Declare hypot(). + + * pic/pic.h: Define M_PI if necessary. + +Thu Dec 10 12:03:29 1992 James Clark (jjc at jclark) + + * tmac/tmac.e (re): Add alternative version that doesn't use groff + `.ta T' feature. + + * devps/prologue.ps (RE): Handle the possibility that the old font + doesn't have a FontName entry. + +Wed Dec 2 10:25:29 1992 James Clark (jjc at jclark) + + * tmac/tmac.e (fam): Redefine to set family in environment 2. + (@C): Use @fam not fam. + +Thu Nov 26 16:01:25 1992 James Clark (jjc at jclark) + + * lookbib/lookbib.cc (main): Change type of start to const char *. + * lkbib/lkbib.cc (main): Likewise. + + * eqn/lex.cc (definition::definition): Don't use member + initializer syntax for members of anonymous unions. + + * troff/input.cc (input_stack::backtrace): Change type of to const + char *. + +Wed Nov 25 13:43:09 1992 James Clark (jjc at jclark) + + * include/stringclass.h (class string): Declare inline friend + functions as inline in class declaration. + * troff/hvunits.h (class hunits, class vunits): Likewise. + * include/refid.h (class reference_id): Likewise + * troff/troff.h (points_to_units(units), scale(units, double)): + Delete declarations. + * libdriver/input.cc (get_char): Delete declaration. + * include/lib.h: Change 2nd argument of getopt from const char ** + to char **. + * troff/symbol.cc (symbol::symbol): Cast `new char *[n]' to `const + char **' before assigning to a `const char **'. + * tbl/table.cc: Delete extra declarations of prints(). + +Tue Nov 24 14:33:13 1992 James Clark (jjc at jclark) + + * libgroff/font.cc (font::load_desc): Cast `new char *[n]' to `const + char **' before assigning to a `const char **'. + + * libgroff/errarg.cc (errarg::errarg): Don't use member + initializer syntax for members of anonymous unions. + +Sat Nov 21 05:02:23 1992 James Clark (jjc at jclark) + + * mm: Integrate version 1.07. + +Tue Nov 17 16:44:27 1992 James Clark (jjc at jclark) + + * troff/input.c (translate2): Rename to + (translate_no_transparent). + (init_input_requests): Rename tr2 to trnt. + +Mon Nov 16 09:49:32 1992 James Clark (jjc at jclark) + + * troff/charinfo.h (class charinfo): Add transparent_translate field. + (charinfo::set_translation, charinfo::set_special_translation): + Add second argument that specifies value for + transparent_translate. + (charinfo::get_translation, charinfo::get_special_translation): + Add optional second argument that specifies whether translation is + being used for transparent throughput. + * troff/input.cc (charinfo::set_translation, + charinfo::set_special_translation): Handle second argument. + (charinfo::charinfo): Initialize transparent_translate. + (translate): Split main part off into + (do_translate): New function. Pass argument saying whether + translation applies to transparent throughput. + (translate2): New request. + (init_input_requests): Bind translate2 to `tr2'. + +Wed Nov 11 11:43:20 1992 James Clark (jjc at jclark) + + * tbl/table.h (class table): Add `nokeep' flag. + * tbl/main.cc (process_options): Handle `nokeep' option. + * tbl/table.cc (table::init_output, table::do_row, table::do_top, + table::do_bottom): Don't output keep/release macro definitions or + calls when `nokeep' option has been specified. + +Sat Nov 7 01:28:33 1992 James Clark (jjc at jclark) + + * tmac/tmac.Xps (Xps-char): Use " as delimiter for \Z. + +Wed Nov 4 16:29:04 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table_entry::divert, block_entry::do_divert, + block_entry::divert, alphabetic_block_entry::divert): Add extra + argument giving column separation. + (table::compute_widths): Pass column separation to + table_entry::divert(). + (block_entry::do_divert): If an entry spans multiple columns and a + minimumum width has been specified for each column, then set the + line length to the sum of the widths (plus possibly the column + separations). + + * troff/input.cc (set_escape_char): Don't set the escape_char + until after calling has_arg(). + +Tue Nov 3 11:23:27 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table::do_top): Add missing \s0 for double box + case. + + * tbl/table.cc (table::print_double_hline): Avoid extra new line + in case where r > nrows - 1. + + * tbl/table.cc (BODY_HEIGHT): Deleted. + (LINE_SEP): New definition. + (table::print_single_hline, table::print_double_hline, + table::compute_vrule_top_adjust, table::compute_vrule_bot_adjust, + table::do_row, table::do_top): Use LINE_SEP space before a line + instead of \n[.v]-BODY_HEIGHT-BODY_DEPTH. + + * tbl/table.cc (text_entry::print_contents): New function. + (text_string_name, right_text_string_name): Deleted. + (TEXT_STRING, RIGHT_TEXT_STRING): Deleted. + (simple_text_entry::do_width, numeric_text_entry::do_width, + alphabetic_text_entry::do_width): Don't store the contents of the + entry in a string. + (left_text_entry::simple_print, right_text_entry::simple_print, + center_text_entry::simple_print, + alphabetic_text_entry::simple_print, + numeric_text_entry::simple_print): Print the entry directly + instead of using the stored string. + +Fri Oct 30 10:39:32 1992 James Clark (jjc at jclark) + + * devps/Makefile: Strip PostScript files. + * devps/prologue: Rename to... + * devps/prologue.ps. + * devps/psstrip.sed: New file. + * devps/download: Use .pfa rather than .ps for installed versions + of fonts. + +Thu Oct 29 09:14:43 1992 James Clark (jjc at jclark) + + * troff/env.cc (input_trap): Give a warning if the argument is out + of range. + + * troff/env.cc (adjust): Treat negative argument as missing. Round + argument > 5 down to 5. + + * troff/env.cc (center, right_justify): Make negative argument zero. + + * troff/div.cc (page_offset, vertical_position_traps): Treat + invalid argument as missing. + * troff/env.cc (line_spacing, line_length, title_length, indent, + underline, hyphen_line_max_request, control_char, + no_break_control_char, widow_control_request, adjust, input_trap, + point_size): Likewise. + * troff/node.cc (ligature, kern_request, bold_font, track_kern, + constant_space): Likewise. + * troff/input.cc (compatible, shift, warn_request, + set_escape_char): Likewise. + + * tbl/main.cc (format::format): Avoid doing `new int[0]'. + * tbl/table.cc (table::table): Likewise. + + * Makefile.dev (install_dev): depends on $(DEVFILES). + +Wed Oct 28 08:30:57 1992 James Clark (jjc at jclark) + + * devX75, devX75-12, devX100, devX100-12: New directories. + * Makefile.in: Add these to DEVDIRS. + + * troff/Makefile.sub, eqn/Makefile.sub, indxbib/Makefile.sub, + afmtodit/Makefile.sub, tmac/Makefile.sub, nroff/Makefile.sub, + grog/Makefile.sub, mm/Makefile.sub (uninstall_sub): New target. + * Makefile.in (uninstall, uninstall_sub, uninstall_dirs): New + targets. + * Makefile.ccpg, Makefile.cpg, Makefile.dev, Makefile.man + (uninstall): New target. + * Makefile.comm (uninstall, uninstall_sub, uninstall_man, + uninstall_prog, uninstall_dev): New targets. + + * troff/div.cc (return_request): Treat an invalid argument as + missing. + +Mon Oct 26 11:33:47 1992 James Clark (jjc at jclark) + + * tmac/tmac.e ((f): Set up the environment even when there's a + current diversion. Transperently throughput a call to @N. + (@N): New macro. + +Thu Oct 22 05:05:59 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table::compute_vrule_top_adjust): Round adjustment + up to vertical resolution. + + * tbl/table.cc (table::do_row): Change row number after printing + stuff list. + + * pic/lex.cc (get_token_after_dot): Make .left and .right work. + +Wed Oct 21 14:46:45 1992 James Clark (jjc at jclark) + + * Rename CHANGES to NEWS. + +Tue Oct 20 23:25:21 1992 James Clark (jjc at jclark) + + * libgroff/new.cc (operator new): Avoid calling malloc(0). + +Mon Oct 19 09:10:13 1992 James Clark (jjc at jclark) + + * man.ultrix: Removed. + +Sun Oct 18 06:35:15 1992 James Clark (jjc at jclark) + + * Makefile.comm (extraclean): Delete files whose names begin with + `='. + + * pic/troff.cc (troff_output::text): Fix typo in implementation of + aligned text. + +Sat Oct 10 09:32:29 1992 James Clark (jjc at jclark) + + * troff/env.cc (hyphenate_request, vertical_spacing, no_number): + * troff/div.cc (page_length, need_space, space_request): Treat + invalid optional argument as missing. + * troff/env.cc (number_lines): If the first argument is present + but not a number, turn on line numbering, don't change the next + line number and parse the remaining arguments. + + * tmac/tmac.e (@q): Do the `ne' before changing to environment 2. + +Thu Oct 8 10:24:40 1992 James Clark (jjc at jclark) + + * eqn/box.h: Change declaration accordingly. + * eqn/box.cc (set_gsize): Change return type to int. Return 0 if + the specified size was bad but don't give an error. Check for + overflow. + * eqn/main.cc (main): Change caller. Leave validation to set_gsize. + * eqn/lex (do_size): Likewise. + +Wed Oct 7 09:48:59 1992 James Clark (jjc at jclark) + + * acgroff.m4 (GROFF_PROG_CCC): Use fopen when checking for C++ + compatible headers. + +Sun Oct 4 18:24:02 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table::init_output): Improve error message when + table won't fit on one page. + +Fri Oct 2 10:41:40 1992 James Clark (jjc at jclark) + + * pic/troff.cc (troff_output::start_picture): Generate line + containing a horizontal motion equal to the width of the picture. + + * groff/groff.cc (main): Allow PROG_PREFIX to be set at runtime + using GROFF_COMMAND_PREFIX environment variable. + +Fri Sep 25 11:40:40 1992 James Clark (jjc at jclark) + + * mdate.sh: Use $NF rather than $(NF). + +Tue Sep 22 09:47:24 1992 James Clark (jjc at jclark) + + * pic/main.cc (main): Use %1 not %c in argument to warning. + + * eqn/main.cc (main): Output code to check that geqn was given the + correct -T option. + +Mon Sep 21 10:59:16 1992 James Clark (jjc at jclark) + + * Makefile.in (dist): Instead of doing `make -f ../Makefile', do + `ln -s ../Makefile .; make; rm -f Makefile'. + + * troff/hyphen: Rename to... + * troff/hyphen.us: + * troff/input.cc (main): Delete -H option. Don't call + read_hyphen_file(). + * troff/env.cc: Include searchpath.h and macropath.h. + (exception_dictionary): Deleted. + (ht): Deleted. + (read_hyphen_file): Deleted. + (hyphenation_language): New struct. + (class trie, class hyphen_trie): Move declarations up. + (trie_node::~trie_node): Deleted. + (trie::delete_trie_node): New function. + (trie::do_delete): New pure virtual function. + (hyphen_trie::do_delete): New function. + (trie::~trie): New function. + (hyphen_trie::~hyphen_trie): New function. + (trie::clear): No need to chcek that tp is not 0. + (current_language, language_dictionary): New variables. + (hyphen_word): Give an error if no current language. Use + exceptions dictionary in current language. + (hyphen_trie::read_patterns_file): Find file using macro_path. + Allow comments (starting with %) in patterns file. Don't make it + a fatal error if the file can't be found. + (hyphenate): Return if no current language. Get the exceptions + dictionary and the hyphenation patterns from the current language. + (set_hyphenation_language): New variable. + (hyphenation_patterns_file): New function. + (hyphenation_language_reg): New class. + (hyphenation_language_reg::get_string): New function. + (init_hyphen_requests): Bind "hla" to set_hyphenation_language and + "hpf" to hyphenation_patterns_file. Initialize `.hla' number + register. + * groff/groff.cc (main, help, synopsis): Delete -H option. + * include/Makefile.sub: Don't define HYPHENFILE. + * Makefile.in: Delete hyphenfile variable and remove from MDEFINES. + * Makefile.comm (.man.n): Don't substitute for HYPHENFILE. + * tmac/troffrc: Set hyphenation language to `us'. Load `hyphen.us' + hyphenation patterns. + +Sun Sep 20 09:33:02 1992 James Clark (jjc at jclark) + + * eqn/neqn.sh: New file. + * eqn/Makefile.sub: Handle neqn.sh. + + * eqn/eqn.h: Declare `nroff' variable. + * eqn/box.cc (param_table): Add `nroff' param. + (nroff): Define it. + * eqn/lex.cc (yylex): Handle TDEFINE and NDEFINE using `nroff' + variable. + * tmac/eqnrc: Set `nroff' to 1 for -Tascii or -Tlatin1. + + * troff/troff.h (WARN_FONT): New warning. + (WARN_TOTAL): Change accordingly. + * troff/input.cc (DEFAULT_WARNING_MASK): Include WARN_FONT. + (warning_table): Add WARN_FONT. + * troff/node.cc (mount_font_no_translate): Pass argument to + font::load_font. If this is non-zero, give a warning. + Don't give an error message when accessing a font that has already + been found to be invalid. + * include/font.h (font::load, font::load_font): Add additional + optional argument which suppresses error message if the font is + not found. + * libgroff/font.cc (font::load_font): Handle additional argument. + (font::load): Add additional argument. If this is non-null, set it + to 1 and don't give error message. + + * include/printer.h (printer::end_page): Add argument giving + length of page. + * libdriver/input.cc (do_file): Pass this. + * grops/ps.cc (ps_printer::end_page): Add argument. + * grodvi/dvi.cc (dvi_printer::end_page, + draw_dvi_printer::end_page): Add argument. + * grotty/tty.cc (class tty_printer): Remove lines_per_page and + columns_per_page members. New member nlines. + (DEFAULT_LINES_PER_PAGE): Deleted. + (tty_printer::tty_printer): Don't compute lines_per_page from + font::paperlength. Don't compute columns_per_page from + font::paperwidth. + (tty_printer::add_char): Don't check horizontal position against + columns_per_page. Grow glyphs vector if neccessary. + (tty_printer::end_page): Add argument giving page_length in units. + Discard lines past end of page. + +Wed Sep 16 06:29:52 1992 James Clark (jjc at jclark) + + * tmac/tmac.tty-char: Fix definition of \(/l. + + * tmac/tmac.X: Define \(en. + +Tue Sep 15 10:37:13 1992 James Clark (jjc at jclark) + + * acgroff.m4 (GROFF_PRINT): If a system has lpr and lp but not + lpq, then use lp rather than lpr. + + * tmac/tmac.s (par@reset): Don't call `ad'. + (par*env-init): Call `ad'. + +Sun Sep 13 18:48:20 1992 James Clark (jjc at jclark) + + * mdate.sh: Use $(NF) instead of $6 to extract year from output of + date. + + * troff/symbol.cc: #undef BLOCK_SIZE if it's defined. + * indxbib/indxbib.cc: Likewise. + +Sun Sep 6 09:44:46 1992 James Clark (jjc at jclark) + + * libgroff/putenv.c: New file. + * libgroff/Makefile.sub: Add putenv.c to CSRCS. + * Makefile.in: Say that putenv.o can be one of LIBOBJS. + * configure.in: Test for putenv with AC_REPLACE_FUNCS. Test for + stdlib.h with AC_HAVE_HEADERS. + +Sat Sep 5 18:11:52 1992 James Clark (jjc at jclark) + + * indxbib/dirnamemax.c: Include only if + does not exist. + +Fri Sep 4 09:43:26 1992 James Clark (jjc at jclark) + + * eqn/box.cc (gsize): Make it an int. + (set_gsize): Parse argument handling increment or decrement. + (box::top_level): Convert gsize to a string. + + * troff/input.cc (exit_troff): Make buf unsigned char []. + Call to make_temp_iterator casts buf to char*. + + * Makefile.in ($(TARGETS), dot): Pass $(MDEFINES) to recursive makes. + + * Makefile.ccpg (depend.temp): Depends on $(YTABC). + * Makefile.cpg (depend.temp): Likewise. + + * Makefile.dep: Remove Makefile.dep from $(REALCLEANFILES). + + * Makefile.comm: Add y.output to MOSTLYCLEANFILES. + +Thu Sep 3 08:01:55 1992 James Clark (jjc at jclark) + + * tmac/tmac.s (B, I, BI, CW): Rewrite avoiding aliases. + +Tue Sep 1 18:24:53 1992 James Clark (jjc at jclark) + + * Version 1.06 released. + + * Integrate mm 1.04. + +Fri Aug 28 11:28:19 1992 James Clark (jjc at jclark) + + * Makefile.comm, Makefile.ccpg, Makefile.cpg: Fix TAGS target. + +Thu Aug 27 11:03:33 1992 James Clark (jjc at jclark) + + * afmtodit/afmtodit.pl: Add -n option that disables generation of + ligatures command. + * devps/generate/Makefile (CR, CB, CI, CBI): Pass -n flag to + afmtodit. Regenerate. + + * tmac/tmac.e ()z): Adjust _b if necessary so as to avoid moving + @f back past the current position. + + * tmac/tmac.e: Change calls to @R so that comments are not part of + arguments. + +Tue Aug 25 10:42:07 1992 James Clark (jjc at jclark) + + * configure.in: Check for mkstemp with AC_HAVE_FUNCS. + + * acgroff.m4 (GROFF_PROG_CCC): Don't check for . Instead + check that we can link a call to a function declared in . + (GROFF_UNISTD_H): New macro. + * configure.in: Call it. + * Makefile.in: Document it. + * include/posix.h: New file. + * troff/troff.h: Don't include + * troff/input.cc: Include posix.h. + * libgroff/new.cc, libgroff/tmpfile.cc: Include posix.h rather than + osfcn.h. + * indxbib/indxbib.cc, libbib/{search.cc,linear.cc,index.cc}: + Include posix.h rather , , , + . + * indxbib/indxbib.cc (S_IRUSR, S_IRGRP, S_IROTH): Delete definitions. + * libbib/index.cc (S_ISREG, O_RDONLY): Delete definitions. + * libbib/search.cc (O_RDONLY): Delete definition. + * refer/refer.cc, include/driver.h, pic/pic.h, groff/groff.cc: + Don't include . + + * acgroff.m4 (GROFF_TIME_T): New macro. + * configure.in: Call it. + * Makefile.in: Document it. + + * acgroff.m4 (GROFF_TRADITIONAL_CPP): New macro. + * configure.in: Call it. + * Makefile.in: Document -DTRADITIONAL_CPP. + * include/ptable.h: Don't include generic.h. + (name2): Define it. + + * tmac/tmac.s (][): Make [T1 and [T2 aliases for [T. + Afterwards remove [T1 and [T2. + (ref*spec!0, ref*spec!2): Use T1 rather than T. + (ref*spec!1, ref*spec!4, ref*spec!4): Use T2 rather than T. + (ref*add-T2): Renamed from ref*add-T. + (ref*add-T1): New macro. + +Mon Aug 24 11:11:11 1992 James Clark (jjc at jclark) + + * acgroff.m4 (AC_PROG_CCC): Use GROFF_EXIT rather than exit 1. + + * libbib/index.cc: Include . + (O_RDONLY): Define if necessary. + (make_index_search_item, index_search_item_iterator::get_tag, + index_search_item::check_files): Use O_RDONLY. + * libbib/seach.cc: Include , , . + (O_RDONLY): Define if necessary. + (search_list::add_file): Use O_RDONLY. + * indxbib/indxbib.cc: Include , , + . + (S_IRUSR, S_IRGRP, S_IROTH): Define if necessary. + (main): Use these. + + * libbib/index.cc (S_ISREG): Define it if necessary. + (index_search_item::load): Use S_ISREG. + + * include/driver.h: Include . + +Sun Aug 23 11:32:18 1992 James Clark (jjc at jclark) + + * eqn/box.cc (body_height): Increase default value to 85. + (body_depth): Increase default value to 35. + +Fri Aug 21 05:34:42 1992 James Clark (jjc at jclark) + + * eqn/pbox.h (SAVE_FONT_STRING): Define it. + * eqn/box.cc (box::top_level): Hide use of \R in a string that is + protected from expansion with \E. + + * acgroff.m4 (GROFF_PAGE): Use `case' to test domain. + + * Makefile (Makefile): New target. + + * Makefile.sub (configure, distfiles): New targets. + + * acgroff.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Avoid using ${var:-val} + construct. + +Thu Aug 20 12:27:26 1992 James Clark (jjc at jclark) + + * eqn/box.cc (param_table): Add body_height and body_depth. + + * eqn/lex.cc (def_table): Make circumflex in hat_def roman. + +Tue Aug 18 16:24:25 1992 James Clark (jjc at jclark) + + * psbb/Makefile.sub: Don't link with libgroff.a. + + * acgroff.m4 (GROFF_PUTENV): New macro. + * configure.in: Call GROFF_PUTENV. + * Makefile.in: Document STDLIB_H_DECLARES_PUTENV. + * groff/groff.cc: Don't declare putenv if STDLIB_H_DECLARES_PUTENV + is defined. + + * troff/env.cc (distribute_space): Rename force_forward argument + to force_reverse. Reverse the list if force_reverse is true. + +Mon Aug 17 17:49:05 1992 James Clark (jjc at jclark) + + * tmac/tmac.an: Don't define a string `T'. Just define Tm. + + * eqn/pile.cc (matrix_box::compute_metrics): Don't allow computed + height or depth to be negative. Guard against SUP_RAISE quantity + being negative. + +Sat Aug 15 08:18:54 1992 James Clark (jjc at jclark) + + * devps/generate/textmap: Add `an' (arrowhorizex). + * tmac/tmac.ps: \(an overlaps horizontally. + * tmac/tmac.dvi, tmac/tmac.tty: Add `an'. + + * devps/symbolchars: Add arrowverttp, arrowvertbt. + * devps/textmap: Add arrowvertex. + * eqn/delim.cc (delim_table): Add uparrow, downarrow and + updownarrow delimiters. + * tmac/tmac.ps, tmac/tmac.X: Add definition of \(va. + + * tbl/table.cc (simple_entry::position_vertically, + block_entry::position_vertically): For a centered entry, perform + the motion in two stages. + + * refer/refer.cc (split_punct): Don't call lookup_token if there + is no token. + +Fri Aug 14 11:14:58 1992 James Clark (jjc at jclark) + + * troff/input.cc (token::next): Delete token_node after copying + token. + + * grodvi/grodvi.cc (dvi_printer::dvi_printer): Initialize + cur_point_size. + + * libdriver/printer.cc (printer::load_font): Delete old_font_table. + + * grops/ps.cc (ps_printer::define_encoding): Delete elements of vec. + +Tue Aug 11 13:50:38 1992 James Clark (jjc at jclark) + + * grops/ps.cc (usage): -b option takes an argument. + + * devps/prologue (PLG): New procedure. + * grops/ps.cc (main, usage): New -g option. + (ps_printer::~ps_printer): If guess_flag is set, guess the paper + length using PLG. + +Mon Aug 10 11:17:53 1992 James Clark (jjc at jclark) + + * include/cset.h: Include if we have it. + + * libgroff/illegal.cc: New file. + * include/lib.h (illegal_input_char): Use table. + * troff/input.cc (ESCAPE_RIGHT_PARENTHESIS): Renumber to 0206. + * pic/lex.cc (ARG1): Renumber to 14. + * eqn/lex.cc (ARG1): Likewise. + + * troff/Makefile.sub (majorminor.cc): Handle 3 part versions + (eg 1.05.90) correctly. + +Sun Aug 9 13:35:43 1992 James Clark (jjc at jclark) + + * tmac/tmac.e (sr): Deleted. Set $r and $R directly. + Rename $r and $R registers to $v and $V. + ($r, $R): Initialize to 0. + (@v, @V): New macros. + (sz): Call @v. + (@M): Call @V. + + * troff/input.cc (main, usage): Add -R option that says not to + load troffrc. + * eqn/main.cc (main, usage): Rename -n to -R. + +Sat Aug 8 00:16:00 1992 James Clark (jjc at jclark) + + * devps/DESC.in: Leave font positions 5-9 blank. + * devdvi/DESC.in: Likewise. + + * grog/grog.pl: Handle `.PS 0. + + * macros/tmac.e (@R, @S): New macros. + Declare @, po, $0, $i, $p, df, so, fu, bt, *, ?a, ?b, ?C, ?e, ?H, + ?I, ?n, ?o, ?R, ?s, ?T, ?W, ?w registers with @R. + Declare $H, $[0-9], .. macros with @S. + Declare |0, |1, |2, |3 strings with @S. + + * macros/tmac.e (@S): Rename to @U. + + * macros/tmac.e (@z): Define @b and bp as empty instead of + deleting them, + + * macros/tmac.e (@m): Deleted. + (@h): Don't call @m. + (@z): Don't set @m trap. + + * macros/tmac.e ($h, $f): Define |z as empty string. + + * macros/tmac.e (@D): Rework to avoid unbalanced .el requests. + (@q): Likewise. + + * macros/tmac.e (@h): Set ?H, ?C , ?s registers to 0 rather than + removing them. + ()f): Likewise for * register. + + * macros/tmac.e (sr): Don't ever scale the arguments. If the third + argument is missing, don't change $R. Call sr with three + arguments when initializing. + +Thu Jul 16 12:17:12 1992 James Clark (jjc at jclark) + + * macros/tmac.e (sr): New macro. + Initialize $r and $R using sr. + + * macros/tmac.e (,): Delete \*(#[. + + * troff/env.c (set_tabs): Read the tab type even if the position + is bad. Allow the position of the first tab stop to be negative. + +Wed Jul 15 13:14:37 1992 James Clark (jjc at jclark) + + * refer/dirnamemax.c: Use pathconf() if defines + _POSIX_VERSION. + * refer/Makefile: Compile dirnamemax.c using -DHAVE_UNISTD_H + rather than -DPATHCONF_MISSING. + * Makefile: Get rid of PATHCONF_MISSING. + + * refer/map.c: New file. + * refer/index.c: Interface to mmap through map.c. Rename map_size + to map_len. + * refer/Makefile: Handle map.c. + * Makefile: Include -DHAVE_MMAP in OLDCFLAGS rather than CFLAGS. + +Tue Jul 14 14:15:20 1992 James Clark (jjc at jclark) + + * Makefile: RANLIB should be `true' if there is no ranlib. + * lib/Makefile (libgroff.a): Simplify. + * driver/Makefile (libdriver.a): Simplify. + + * Makefile: Change -DWAIT_COREDUMP_0200 to -DWCOREFLAG=0200. + * groff.c (WCOREDUMP): Use WCOREFLAG. Define only if not already + defined. + +Sat Jul 11 09:19:17 1992 James Clark (jjc at jclark) + + * troff/env.c (compare_ranges): Declare as extern "C". + + * troff/input.c (init_registers): Use `struct tm' instead of `tm'. + + * macros/tmac.s, macros/tmac.e: Change .nx /dev/null to .nx. + +Wed Jul 8 11:52:27 1992 James Clark (jjc at jclark) + + * pic/troff.c (troff_output::text): Merge in grops_output::text, + but conditionalize use of \X based on \*(.T. + (grops_output::*): Deleted. + * pic/output.h: Delete declaration of make_grops_output. + * pic/main.c (main): Ignore -p and -x. driver_extension_flag is 1 + by default. -n sets it to 0. + (usage): Corresponding changes. + * groff.c (main): Don't pass -x or -p to pic. + * groff.sh: Likewise. + + * ps/ps.c (ps_printer::do_exec, ps_printer::do_file): Force ndefs + to be non-zero. + + * ps/devps/afmtodit: Change calculation of asc_boundary and + desc_boundary. Make these bounds inclusive. + * ps/devps: Regenerate font files. + +Tue Jul 7 13:14:15 1992 James Clark (jjc at jclark) + + * macros/tmac.latin1: New file. + * macros/tmac.tty-char: Use tmac.latin1. + (tmac.tty-tr): Deleted. + * macros/Makefile: Install tmac.latin1. + * macros/tmac.dvi: Use tmac.latin1. + * macros/troffrc: Translate \[char160] onto no-break space here. + * macros/{tmac.dvi,tmac.ps,tmac.tty,tmac.X75}: Don't do it here. + +Mon Jul 6 11:06:52 1992 James Clark (jjc at jclark) + + * macros/tmac.Xps: Use `do' request. + + * macros/tmac.ps: Use `do' request. + + * macros/tmac.e (@C): Use `do' request. + + * macros/tmac.X, macros/tmac.Xps: Moved from xditview. + * macros/Makefile: Install tmac.X*. + + * tty/tmac.tty, tty/tmac.tty-char: Move to macros. + * tty/Makefile: Don't install tmac.tty*. + * macros/Makefile: Install tmac.tty*. + + * dvi/tmac.dvi: Move to macros. + * dvi/Makefile: Don't install tmac.dvi. + * macros/Makefile: Install tmac.dvi. + + * ps/tmac.ps*: Move to macros. + * ps/Makefile: Don't install tmac.ps*. + * macros/Makefile: Install tmac.ps*. + + * eqn/box.c: Provide draw_lines parameter corresponding to -D + option. + * macros/eqnrc: Set draw_lines parameter based on device. + * groff.c: Don't pass -D flag to eqn. + * groff.sh: Likewise. + * eqn/main.c: Warn about use of -D. + + * troff/input.c (process_startup_file): New function. + (main): Call process_startup_file(). + * macros/troffrc: New file. + * macros/Makefile: Install troffrc. + * groff.c (main): Don't pass extra -m option to troff. For a + pseudo device pass the name of the pseudo device to troff using + -d. + * groff.sh: Likewise. + * groff.c (possible_command::prepend_arg): Deleted. + + * troff/input.c (do_request): New function. + (init_input_requests): Bind "do" to do_request. + + * eqn/main.c (main): Instead of loading eqnchar from device directory, + load eqnrc from macro directory. + * macros/eqnrc: New file. + * macros/Makefile: Install eqnrc. + * ps/devps/eqnchar: Deleted. + * ps/devps/Makefile: Don't install eqnchar. + * dvi/devdvi/eqnchar: Deleted. + * dvi/devdvi/Makefile: Don't install eqnchar. + * groff.c (main): Pass -M to eqn. Don't pass -F to eqn. New + variable optM. + + * lib/device.[ch]: New files. + * lib/font.h (font::set_device_name, font::get_device_name): + Deleted. + * lib/fontfile.c: Use device.h. + * lib/Makefile: Handle device.[ch]. Make paths.h define DEVICE. + * troff/input.c: Delete definition of `device'. + (main): Don't initialize device. + * troff/troff.h: Include device.h rather than declaring device. + * troff/Makefile: No need to handle DEVICE. + * driver/input.c: Include device.h. Don't use + font::{set,get}_device_name. + * groff.c, Makefile: Rename device.h to config.h. + * groff.c: Use library device variable. + * eqn/main.c: Use library device variable. + * eqn/Makefile: No need to handle DEVICE. + + * lib/searchpath.[ch]: New files. + * lib/Makefile: Handle searchpath.[ch]. + * troff/input.c (open_file, init_dirs): Deleted. + (macro_dirs): Deleted. + (open_mac_file, macro_source): Use class search_path. + (add_string, struct string_list): Move definition. + (main): Change -M option to use macro_path. Delete call to + init_dirs(). + * lib/fontfile.c (font::command_line_font_dir, font::open_file): + Rewrite to use class search_path. + * lib/font.h, lib/fontfile.c (font::cl_font_dirs): Deleted. + * lib/Makefile: fontfile.c depends on searchpath.h. + * lib/Makefile: Rename fontpath.h to paths.h. Make paths.h define + MACROPATH. + * lib/macropath.[ch]: New files. + * troff/Makefile: No need to handle MACROPATH. + + * troff/input.c: Delete DUMP code. + * lib/fontfile.c, lib/font.h: Delete + font::forget_command_line_font_dirs. + + * troff/input.c (push_token): New function. + (handle_first_page_transition): Use push_token(). + (process_input_stack): Change handling of a space at the beginning + of the line. + +Sun Jul 5 17:11:09 1992 James Clark (jjc at jclark) + + * troff/input.c (font_dirs): Delete unused variable. + + * eqn/lex.c (do_set): Correct error messages. + +Sat Jul 4 10:20:55 1992 James Clark (jjc at jclark) + + * troff/input.c (do_define_string): Allow the string name to be + followed immediately by a tab. + (define_character): Likewise. + +Thu Jul 2 10:59:15 1992 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::draw): When drawing an arc, don't allow k to + be negative. + + * troff/input.c (input_iterator::is_file): New virtual function. + (file_iterator::is_file): New function. + (input_stack::end_file): New function. + (input_stack::next_file): Handle the situation where there is no + file on the input stack correctly. Avoid making two passes over + the input stack. + (next_file): Make the filename optional; in this case call + input_stack::end_file(). + +Wed Jul 1 10:17:25 1992 James Clark (jjc at jclark) + + * dvi/tmac.dvi: Change the definitions of \(ul and _ so that they + produce a real _ charater when the current font is CW and _ + otherwise. + + * lib/errarg.c (errarg::errarg(const char *)): Invert conditional + expression to work around gcc 2.2 bug. + +Wed Jun 24 08:12:24 1992 James Clark (jjc at jclark) + + * eqn/main.c (main): Don't give an error if we can't find eqnchar. + + * troff/env.c (environment::add_padding): New function. + (environment::add_char): Use add_padding(). + (environment::space): Likewise. + (environment::wrap_up_field): Add some padding if there is none + and there's no current tab. + * troff/env.h: Declare environment::add_padding. + +Mon Jun 22 08:37:45 1992 James Clark (jjc@jclark) + + * pic/pic.y: undef fmod and rand before declaring them. + +Sun Jun 14 11:40:18 1992 James Clark (jjc@jclark) + + * troff/input.c (main): If the DESC file specifies a font name of + 0, then leave the corresponding font position empty. + + * nroff.sh: New file. + * Makefile (install.nobin): Install nroff.sh. + + * tty/devlatin1/R.proto: Add ao as synonym for de. + * tty/tmac.tty-char: Define ao as o. + + * tty/dev{ascii,latin1}/R.proto: Add aq. + * tty/tmac.tty-char: Delete definition of aq. + +Mon Jun 8 11:43:20 1992 James Clark (jjc@jclark) + + * troff/input.c (init_charset_table): Don't translate 0240. + * ps/tmac.ps: Translate char160 to space. + * dvi/tmac.dvi: Likewise. + * tty/tmac.tty: Likewise. + +Sun Jun 7 10:52:35 1992 James Clark (jjc@jclark) + + * dvi/tmac.dvi: Add support for all Latin-1 characters. + + * macros/tmac.s: Delete definitions of \(rg, \(ah, \(ad, \(a-, + \(ao, \(ac, \(ho, \(-D, \(Sd, \(TP, \(Tp, \(ss, \(AE, \(ae, \(OE, + \(oe, \(r?, \(r!. + + * tty/tmac.tty-char: Add \(ah. + + * dvi/tmac.dvi: Add definitions of Tp, TP, Sd, -D, ho. + No need to define \(FM and \(!/. Conditionalize all character + definitions. + + * ps/devps/lgreekmap: Add +h, +f, +p. + + * ps/tmac.psnew: New file. + * ps/Makefile: Install tmac.psnew. + + * troff/input.c (charinfo_to_node_list): Don't ever interpret + character definitions in compatible mode. + + * troff/input.c (remove_character): New function. + (init_input_requests): Bind remove_character to "rchar". + + * ps/tmac.psold: New file. + * ps/Makefile: Install tmac.psold. + * ps/tmac.ps: Load tmac.psold. Move definitions of ISO Latin-1 + characters into tmac.psold. Make these definitions unconditional. + + * tty/tmac.tty-char: Define \n(_C only if it is not already defined. + + * ps/tmac.ps: Don't define \('c and \('C. + + * ps/devps/textmap: Move Greek characters to... + * ps/devps/symbolchars: + +Sat Jun 6 16:41:17 1992 James Clark (jjc@jclark) + + * ps/devps/text.enc: Add quotesingle. + * ps/devps/textmap: Add +h, +f, +p, Fn, Bq, bq, aq, lz. + * tty/tmac.tty-char: Likewise. + * dvi/devdvi/texmi.map: Add +h, +f, +p. + * dvi/devdvi/texi.map: Add Fn. + * dvi/devdvi/msam.map: Add lz. + * dvi/tmac.dvi: Handle Bq, bq, aq. + + * pic/lex.c (get_token): Recognize 'th. + * pic/map.y: Allow `expr'th in contexts where ORDINAL was allowed. + +Fri Jun 5 11:20:46 1992 James Clark (jjc@jclark) + + * ps/devps/textmap: Move di, mu, +- to... + * ps/devps/symbolchars: + + * macros/tmac.s (@XS): Don't call par@reset or fi. + (XA): Call LP. Turn off adjustment. Reduce line length. + + * macros/tmac.s: Initially alias XS to LP. + (XS): Rename to @XS. + (cov*ab-init): Alias XS to @XS. + +Thu Jun 4 09:12:05 1992 James Clark (jjc@jclark) + + * troff/token.h: Delete TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, + TOKEN_FONT_NAME, TOKEN_FONT_POSITION, TOKEN_SIZE tokens. + (token::is_size, token::changes_env): Deleted. + * troff/number.c (parse_term): No need to process \s explicitly. + Call tok.next() only after scale indicator has been processed. + * troff/input.c (do_overstrike, do_bracket): No need to process \s, + \f etc explicitly. + (token::next): Handle \s, \f, \S, \H immediately rather than + returning them as tokens. + (token::operator==, token::description, token::add_to_node_list, + token::process): Remove handling of deleted tokens. + + * troff/env.c (environment::add_char): When adding padding + indicator character, call start_line() if necessary. + +Wed Jun 3 09:55:50 1992 James Clark (jjc@jclark) + + * ps/devps/afmtodit: Don't output 0 kerns. + + * ps/devps/afmtodit: Remove directory from name of encoding in + font description file. + + * ps/devps/afmtodit: Improve error messages. + + * ps/devps/afmtodit: Allow DESC file to be specified with -d. + + * ps/devps/Makefile: Incorporate FontMakefile. Rework. + * ps/devps/FontMakefile: Deleted. + * ps/devps/afmname: New file. + + * ps/devps/symbol.sed: New file. + * ps/devps/symbol.diff: Deleted. + * ps/devps/FontMakefile: Generate symbol.afm using symbol.sed. + Generate zapfdr.afm from zapfd.afm. + + * tty/tmac.tty (tty-char): Prefix definition with ". + + * macros/tmac.an (TP): Don't start a diversion if one has already + been started. + + * tty/tmac.tty-char: Add Latin-1 characters. + + * tty/tmac.tty-char: Incorporate suggestions from Paul Eggert. + +Tue Jun 2 00:54:34 1992 James Clark (jjc@jclark) + + * tbl/table.c (table::allocate): Delete old_vline, old_entry. + Move declaration of struct horizontal_span. + + * tbl/table.c (table::table): Initialize span_list. + (table::~table): Delete span_list. + + * lib/ptable.h (PTABLE(T)::~PTABLE(T)): Delete v. + + * ps/devps/Makefile: Avoid dependency on GNU make. + + * ps/tmac.ps: Check that character does not already exist before + defining it. + + * tty/tmac.tty: Add definitions of \(ff, \(!=, \(==, \(~=, \(sq, + \(OE, \(oe, \(AE, \(ae, \(lh, \(rh. Delete definitions of \(en, + \(ru, \(ul, \(br, \(bv, \(sl which are in the font description + files. + + * tty/tmac.tty-char: New file. + * tty/Makefile: Install tmac.tty-char. + * tty/tmac.tty: Move definitions of \(ua, \(da, \(uA, \(dA into + tmac.tty-char. + + * tty/tmac.tty: Fix definition of \(34. + + * tty/dev{ascii,latin1}/R.proto: Add ha and ti. Map + bracket-drawing characters onto |. Add *o. + + * troff/env.c (environment::wrap_up_tab): Increment field_spaces + only if current_field. + + * troff/dictionary.c (dictionary::lookup): Free old_table after + rehashing. + +Mon Jun 1 10:15:22 1992 James Clark (jjc@jclark) + + * tty/dev{ascii,latin1}/R.proto: Add uppercase Greek characters + whose glyphs are identical to glyphs of some Roman character. + + * tty/devlatin1/R.proto (bu): Deleted. + * tty/devascii/R.proto (bu): Deleted. + * tty/tmac.tty: Add definition of \(bu. + + * eqn/main.c (do_file): Pass FILE as argument. + (main): Automatically load eqnchar. New options -F and -n. + Pass do_file an opened FILE. + * groff.c: Don't pass eqnchar to eqn. Pass -F options onto eqn. + No need to include font.h. + * groff.sh: Likewise. Don't need to use - for standard input. + Prefix files with -- if first file starts with -. + + * macros/tmac.e: Conditionalize use of \$* on \n(.g. + + * troff/env.c (environment::possibly_break_line): Don't set line + to 0 across call to output_line(). Don't call output_line() until + after discarding nodes after break. + +Sun May 31 10:45:29 1992 James Clark (jjc@jclark) + + * request.h (macro::empty): Declare it. + * input.c (macro::empty): New method. + (interpolate_macro): Don't give a WARN_SPACE if the two-character + macro is empty. + +Sat May 30 10:27:15 1992 James Clark (jjc@jclark) + + * troff/env.c (environment::start_field): Decrement space_total + when a space is frozen. + +Fri May 22 14:34:38 1992 James Clark (jjc@jclark) + + * macros/tmac.an (R): Delete macro. + + * troff/input.c (get_copy, token::next): Support \# (like \" but + newline is ignored). + + * troff/input.c (token::next): Fix error message in 'Y' case. + +Thu May 21 09:26:24 1992 James Clark (jjc@jclark) + + * eqn/delim.c (define_extensible_string): Recognize any prefix of + a delimiter name. + +Fri May 15 10:20:41 1992 James Clark (jjc at jclark) + + * c++test.c: Include . + + * lib/strtol.c, lib/getcwd.c, ps/psbb.c: Declare errno in case + doesn't. + +Fri May 8 09:37:19 1992 James Clark (jjc at jclark) + + * tbl/table.c (table::divide_span): Don't count column separation + if expand was specified. + + * tbl/main.c (process_format): Don't ignore width specs in + continued format. Give warning for changing equal widths or + column separation in continued format. + (process_data): Set column separation, minimum width, equal + columns at end of table. + +Thu May 7 08:50:40 1992 James Clark (jjc at jclark) + + * troff/node.c (kern_pair_node::add_discretionary_hyphen, + node::add_discretionary_hyphen): Use soft_hyphen_char. + (set_soft_hyphen_char): New function. + (init_node_requests): Bind to shc. Initialize soft_hyphen_char. + + * Makefile (c++tested): Give more helpful message if test fails. + +Tue May 5 10:58:39 1992 James Clark (jjc at jclark) + + * troff/input.c (init_charset_table): Translate 0240 to + an unbreakable space. + + * troff/token.h (token::hyphen_indicator): New function. + * troff/charinfo.h (TRANSLATE_HYPHEN_INDICATOR): New special + translation. + * troff/input.c (translate): Allow translation to \%. + * troff/node.c (node::add_char): Handle + TRANSLATE_HYPHEN_INDICATOR. + (make_node): Don't allow TRANSLATE_HYPHEN_INDICATOR here. + + * troff/input.c (init_charset_table): Don't set BREAK_AFTER flag + for \(hy. + + * tty/devlatin1/R.proto: \(hy and - should print as 055. + +Tue Apr 21 09:24:42 1992 James Clark (jjc at jclark) + + * groff.c (run_commands): If the last command gets a SIGPIPE send + a SIGPIPE to all children than haven't yet terminated. When + command terminates, set pid field to -1. + +Fri Apr 17 11:20:48 1992 James Clark (jjc at jclark) + + * groff.c (main): Pass an appropriate -filename option to gxditview. + +Thu Apr 16 15:11:40 1992 James Clark (jjc at jclark) + + * Makefile.bd (install): Remove existing program before copying. + + * Makefile, */Makefile, Makefile.bd, groff.sh, groff.c: Allow + programs which have Unix counterparts to be installed with + user-specified prefix. + + * troff/input.c (exit_troff): Don't check if exit_started. + (exit_request): Don't call exit_troff if exit_started. + + * Makefile.bd (install.mm): Rename to install.dwbmm. + +Tue Apr 14 10:05:10 1992 James Clark (jjc at jclark) + + * driver/input.c (do_file): Add missing break for '#' case. + +Mon Apr 13 10:11:02 1992 James Clark (jjc at jclark) + + * troff/input.c (input_stack::clear): Clear past any boundaries and + then add the boundaries back. + + * troff/input.c (exit_troff): Return immediately if already + exiting. + + * macros/tmac.s (pg@end-text): New macro. Use pg@end-text for the + end macro. + (pg*end-page): If the text has ended and there are no more + footnotes or keeps, exit. + + * macros/doc-ditroff (Lq, Rq): Define as \(lq and \(rq. + + * troff/input.c (init_charset_table): Make \(rq transparent by + default. + + * macros/tmac.an: Define lq and rq strings. + + * macros/tmac.s (Q, U): Define as \(lq and \(rq. + +Sun Apr 12 12:54:37 1992 James Clark (jjc at jclark) + + * troff/env.c (environment::final_break): New function. + (environment::newline): Set prev_line_interrupted to 2 if + exit_started. + * troff/env.h: Declare environment::final_break. + * troff/input.c (exit_troff): Call environment::final_break() + instead of environment::do_break(). + + * macros/Makefile: Install man.local if $(MACRODIR)/man.local + doesn't already exist. + * macros/man.local: New file. + * macros/tmac.an: Load man.local. + * macros/man.ultrix: New file. + +Sat Apr 11 17:32:04 1992 James Clark (jjc at jclark) + + * troff/input.c (exit_groff): Rename to... + (exit_troff): New function. + + * troff/div.c (exit_started, done_end_macro, + seen_last_page_ejector): New global variables. + (began_page_in_end_macro): New static variable. + (exit_flag): Deleted. + (top_level_diversion::top_level_diversion): Initialize + last_page_count. + (top_level_diversion): More elaborate test for whether + cleanup_and_exit() should be called. + Set began_page_in_end_macro if the end macro isn't yet finished. + * troff/div.h (top_level_diversion::last_page_count): New data + member. + (top_level_diversion::set_last_page): New function. + (exit_started, done_end_macro, seen_last_page_ejector): Declare. + * troff/env.c (do_break): Zero prev_line_interrupted. + * troff/input.c (exit_flag): Delete declaration. + (LAST_PAGE_EJECTOR): New magic cookie. + (token::next): Handle LAST_PAGE_EJECTOR. + (exit_groff): Set exit_started and done_end_macro instead of + exit_flag. Call top_level_diversion::set_last_page. Push a + LAST_PAGE_EJECTOR instead of calling push_page_ejector(). Do + another ejection after setting seen_last_page_ejector. + +Thu Apr 9 04:37:11 1992 James Clark (jjc at jclark) + + * etc/grog.sh, etc/grog.sh: Recognize -me sh macro. + + * macros/tmac.e (TH): Make sure there's room for the initial + header. + + * macros/tmac.s (par@init): Make PD and DD at least \n(.V. + Set FVS in points rather than units. + +Mon Apr 6 11:21:32 1992 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::add_trap): Don't consider the + position of empty slots. + +Fri Apr 3 10:46:45 1992 James Clark (jjc at jclark) + + * ps/devps/S: Fix height and depth of parenrightex. + * ps/devps/symbol.diff: Regenerate. + +Sat Mar 28 21:17:52 1992 James Clark (jjc at jclark) + + * tmac.e (u): Do underlining as in -mgs. + +Fri Mar 27 09:23:44 1992 James Clark (jjc at jclark) + + * tty/tty.c (tty_printer::end_page): If overstriking is + suppressed, still turn overstruck horizontal and vertical lines + into +. + + * lib/new.c: Back out Feb 24 change; no longer needed with gcc + 2.1. + + * refer/label.y (format_expr::evaluate): Avoid use of %0*d. + +Wed Mar 18 09:29:10 1992 James Clark (jjc at jclark) + + * Version 1.05 released. + +Tue Mar 17 16:50:45 1992 James Clark (jjc at jclark) + + * tty/tty.c: Instead of keeping an array of glyphs and then + sorting it, keep a ordered linked list of glyphs for each line. + + * driver/driver.h: Include stddef.h. + + * tty/tty.c (compare_glyph): + * refer/refer.c (rcompare): + * troff/env.c (compare_ranges): Arguments of qsort comparison + function should be const void *. + + * troff/number.c (parse_term): + * dvi/dvi.c (draw_dvi_printer::draw): Avoid initialization in + switch statement. + + * refer/label.y (consider_authors): Don't access variables + constructed under a condition outside that condition: put braces + round for statement containing declaration; redeclare use of same + variable later. + + * pic/pic.y (text_expr): Delete production that allows + parenthesised text_expr. + (expr): Allow a conditional_expr to appear in parentheses. + (conditional_expr): Rename to any_expr. + + * mm: Install new version 1.01 from jh. + + * lib/font.c (font::get_width): Cache scaled widths. + (font::font): Initialize widths_cache. + (font::~font): Destroy widths_cache. + * lib/font.h: Add font::widths_cache. Declare font_widths_cache. + +Mon Mar 16 10:16:10 1992 James Clark (jjc at jclark) + + * c++test.c, c++test.ref: New files. + * Makefile: Check that the C++ compiler works. + + * ps/tmac.pspic (PSPIC): Do a break. + + * ps/tmac.ps: Move definition of PSPIC into... + * ps/tmac.pspic: New file. + (PSPIC): Draw box around picture, but make it invisible to grops. + * ps/tmac.ps: Load tmac.pspic. + * ps/Makefile: Install tmac.pspic. + +Sun Mar 15 14:18:08 1992 James Clark (jjc at jclark) + + * lib/font.c (scale_round): If n is negative, + subtract .5 before truncating floating point result. + + * lib/fontfile.c: Include . + +Tue Mar 10 14:17:03 1992 James Clark (jjc at jclark) + + * driver/input.c (get_char): Inline. Don't update current_lineno. + Change callers to up date current_lineno if necessary. + Use get_char() instead of getc(current_file). + +Sun Mar 8 18:05:28 1992 James Clark (jjc at jclark) + + * ps/tmac.ps: Fix up spacing of \(mo and \(nm. + +Fri Mar 6 19:38:58 1992 James Clark (jjc at jclark) + + * tty/tty.c (tmac.tty): Define \(rg as (R). + +Tue Mar 3 10:11:25 1992 James Clark (jjc at jclark) + + * lib/lib.h: New define a_delete. + * Use a_delete instead of delete when deleting an array of objects + without destructors. + + * lib/lib.h: Rename adelete to ad_delete. + * Change uses of adelete. + +Mon Mar 2 12:41:05 1992 James Clark (jjc at jclark) + + * eqn/eqn.y: Include lib.h. + + * troff/node.c (grow_font_table): Delete old_font_table. + + * mm: Install new version from jh. + +Fri Feb 28 10:42:23 1992 James Clark (jjc at jclark) + + * tbl/table.h (format_type): Make global instead of local to class + entry_format. Prefix enumerators with FORMAT_. + * tbl/table.c, tbl/main.c: Corresponding changes. + * refer/token.h (token_type): Make global. Prefix enumerators + with TOKEN_. + * refer/token.[ch]: Corresponding changes. + * Makefile: Get rid of -DNO_NESTED_TYPES configuration option. + + * troff/div.c (node::set_vertical_size): Don't name argument. + +Thu Feb 27 10:29:19 1992 James Clark (jjc at jclark) + + * Makefile: New configuration option ARRAY_DELETE_NEEDS_SIZE. + * lib/lib.h: Define adelete accordingly. + * pic/object.c (graphic_object::graphic_object): + * tbl/main.c (format::~format): + * tbl/table.c (table::~table): + * refer/ref.c (reference::~reference, reference::merge, + reference::insert_field, reference::delete_field): Use adelete. + + * Makefile: Change NESTED_TYPES to NO_NESTED_TYPES. + * refer/token.h: + * tbl/table.h: Corresponding changes. + + * common.c (common_output::dashed_arc, common_output::dotted_arc): + Ensure total_angle is positive. + +Wed Feb 26 08:49:26 1992 James Clark (jjc at jclark) + + * refer/ref.c (reference::merge, reference::insert_field, + reference::delete_field): Avoid delete[0]. + + * refer/token.c (init_special_chars): Move calls to cmupper + outside calls to init_two_char_letter to work around bug in gcc + 2.0. + +Mon Feb 24 14:20:00 1992 James Clark (jjc at jclark) + + * lib/new.c (operator new): Use __builtin_new for g++. + + * pic/object.c (graphic_object::~graphic_object): Don't use + delete [] on 0. + + * pic/object.c (output::compute_scale): Initialize max_width and + max_height. + +Sat Feb 15 09:55:20 1992 James Clark (jjc at jclark) + + * troff/input.c (write_request): Call fflush. + + * troff/node.h (class composite_node): Move declaration to node.c + * troff/input.c (charinfo_to_node): Rename to ... + (charinfo_to_node_list): Return node list rather than composite + node. + * troff/node.c (make_composite_node): New function. + (make_node, add_char): Call make_composite_node instead of + charinfo_to_node. + (class composite_node): Add a tfont * member. Delete font_size + member. + (composite_node::composite_node, composite_node::copy, + composite_node::size): Corresponding changes. + (composite_node::tprint): Provide constant spacing, emboldening + and track kerning as specified in tfont. + (composite_node::width): Change width calculation accordingly. + * troff/env.h (environment::composite): New member. + (environment::is_composite, environment::set_composite): New + functions. + * troff/env.c (environment::environment): Initialize composite. + * troff/input.c (charinfo_to_node): Call + environment::set_composite. + * troff/node.c (make_composite_node, make_glyph_node): Use the + plain version of the tfont if the environment is composite. + + * troff/node.c (font_info::get_space_width): Additional argument + giving space_size. Handle constant space correctly. Scale by + space_size unless constant spaced. + (env_sentence_space_width): New function. + * troff/node.h: Declare it. + * troff/env.h (environment::get_space_size, + environment::get_sentence_space_size, + environment::get_narrow_space_width, + environment::get_half_narrow_space_width): Make inline. + (environment::get_space_width): Make inline. Just call + env_space_width. + * troff/env.c: Delete definitions for funtions made inline. + (environment::space_newline, environment::space): Use + env_sentence_space_width(). Don't scale by space_size. + * troff/node.h: Move declarations of env*space_width() functions + into env.h. + +Sat Feb 8 09:30:22 1992 James Clark (jjc at jclark) + + * macros/tmac.s (PS): Don't try to set negative indent. + +Thu Feb 6 09:00:35 1992 James Clark (jjc at jclark) + + * pic/pic.y: Fix min function. + +Tue Jan 28 07:52:29 1992 James Clark (jjc at jclark) + + * man/mdate.sh: Clear LANGUAGE. + +Sun Jan 19 13:02:41 1992 James Clark (jjc at jclark) + + * pic/pic.y, pic/lex.c: Rename COMMAND token to COMMAND_LINE. + * pic/lex.c: New COMMAND keyword. + * pic/pic.y (print_args, print_arg): New rules. + (placeless_element): Use print_args for PRINT. + New COMMAND element. + +Tue Jan 7 13:14:31 1992 James Clark (jjc at jclark) + + * troff/input.c (terminal): Handle missing argument correctly. + + * pic/pic.y (text_expr): New rule. + + * pic/pic.y: Implement := operator. + +Sun Jan 5 10:23:02 1992 James Clark (jjc at jclark) + + * etc/grog.pl, etc/grog.sh: Distinguish old and new versions of + mdoc. + +Sat Jan 4 14:42:26 1992 James Clark (jjc at jclark) + + * ps/devps/dingbatsrmap: Include this in the distribution. + + * macros/tmac.doc: Replace with new version from 2nd Networking + Release. Fix loading of doc-* files. + * macros/{doc-common,doc-ditroff,doc-nroff,doc-syms}: New files. + * macros/tmac.doc.old: New file. Apply fixes that had been + applied to old tmac.doc. + * macros/tmac.andoc: Check that we're running under groff. + * macros/Makefile: Rework. + +Fri Jan 3 13:27:51 1992 James Clark (jjc at jclark) + + * tbl/table.h (format_type): + * refer/token.h (token_type): If NESTED_TYPES is defined, use + typedef to make these types visible at file scope. + * Makefile: Add NESTED_TYPES configuration option. + + * troff/div.c (mark): At the top level use the value of + nl_reg_contents rather than the current vertical position. + +Thu Jan 2 10:34:51 1992 James Clark (jjc at jclark) + + * tty/tty.c: Implement \D for horizontal or vertical lines. + (tty_printer::set_char): Use vec_used+2 as serial number. + Don't allow size of vector to exceed USHRT_MAX-2. + Split off part into... + (tty_printer::add_char): New function. + (tty_printer::draw): New function. + (compare_glyph): Handle equal serial numbers. + (tty_printer::end_page): Handle overstruck characters from \D. + (main, usage): Implement -d option. + +Mon Dec 23 10:37:51 1991 James Clark (jjc at jclark) + + * tbl/main.c (process_format): + * eqn/text.c (split_text): + * troff/input.c (token::next): Use inner block for declarations + with initializers in switch statement. + +Mon Dec 16 20:52:03 1991 James Clark (jjc at jclark) + + * pic/common.c (common_output::dash_line): Cope with zero-length + lines. + +Sun Nov 17 12:04:08 1991 James Clark (jjc at jclark) + + * Version 1.04 released. + +Wed Nov 13 05:27:21 1991 James Clark (jjc at jclark) + + * macros/tmac.an (TH): Define a macro an-init to define variables + based on command line arguments. + (an-header): Call it. + +Sun Nov 3 12:07:34 1991 James Clark (jjc at jclark) + + * Makefile (install.mm): Rename to install.dwbmm. + + * Makefile: Integrate mm. + * mm: New directory. + +Wed Oct 30 10:11:34 1991 James Clark (jjc at jclark) + + * refer/dirnamemax.c: If PATHCONF_MISSING is defined, include + . + + * pic/troff.c (troff_output::simple_spline, + troff_output::simple_polygon): Rename variable `v' to `d' to avoid + shadowing parameter. + + * lib/tmpfile.c (xtmpfile): Declare dir as const char *. + + * lib/ptable.h: Add explicit casts when converting from unsigned + long to unsigned. + + * dvi/devdvi/{SA,SB,msam.map,msbm.map}: New files. + * dvi/devdvi/Makefile: Install SA, SB. + + * refer/indxbib.c: Add declaration of mktemp. + + * refer/lookbib.c: Add declaration of isatty. + +Fri Oct 25 09:00:17 1991 James Clark (jjc at jclark) + + * pic/lex.c (interpolate_macro_with_args): While collecting + arguments, keep track of whether we're in a string. + +Wed Oct 23 08:42:48 1991 James Clark (jjc at jclark) + + * ps/tmac.ps (PSPIC): Do the .sp after the \X, and move the \X + down with \v, so as to avoid problems with top of page trap + setting no space mode. + +Tue Oct 22 17:38:49 1991 James Clark (jjc at jclark) + + * eqn/lex.c (get_delimited_text): Allow tab before macro body. + +Tue Oct 15 17:24:53 1991 James Clark (jjc at jclark) + + * ps/psrm.c (ps_get_line): Fix bug when lines longer than 255. + Improve error message. + +Fri Oct 11 11:09:38 1991 James Clark (jjc at jclark) + + * ps/psrm.c (print_ps_string): Don't pass negative numbers to + printf("%03o"); + +Wed Oct 9 17:50:14 1991 James Clark (jjc at jclark) + + * groff.c (possible_command::execp): Always use _exit() after a + failed exec. + + * Makefile: Add HAVE_UNION_WAIT, HAVE_PID_T, WAIT_COREDUMP_0200, + NO_SYS_WAIT_H configuration options. + * groff.c: Use these options. Use POSIX-style macros to extract + fields from the status returned by wait(). + +Fri Oct 4 12:12:27 1991 James Clark (jjc at jclark) + + * tbl/table.c (table::compute_separation_factor): Allow the + separation factor to drop to 0. + +Tue Oct 1 18:12:38 1991 James Clark (jjc at jclark) + + * refer/search.c: Include . + +Sun Sep 29 08:40:57 1991 James Clark (jjc at jclark) + + * pic/pic.y (YYDEBUG): Don't define for Borland C++. + + * lib/lib.h: #ifdef out declarations of itoa and iftoa for Borland + C++. + + * pic/lex.c (input_stack::bol): Move definition out of class body. + + * pic/main.c: On MSDOS munge argv[0]. + + * lib/ptable.h: Define name2 as _Paste2 for Borland C++. + + * lib/ptable.c (hash_string): Use unsigned long rather than + unsigned. + (next_ptable_size): Use unsigned rather than int. Give an error + message if we've hit the largest table size. + * lib/ptable.c: Corresponding changes. Also use unsigneds for the + table size. + + * pic/object.h (object_spec): Make flags unsigned long. Declare + flags as const unisgned long rather than as enums. + + * pic/output.c: Deleted. + + * pic/troff.c (troff_output::simple_ellipse): Remove spurious %. + + * tbl/table.c (simple_entry::note_double_vrule_on_{left,right}): + Add additional argument. + (line_entry::note_double_vrule_on_{left,right}): Set value of + douvle_vrule_on_{right,left} flag according to argument. + (simple_line_entry::simple_print, + simple_line_entry::double_line_print): If adjacent to double vrule + on a corner extend rather than shorten the rule by half the double + vrule sep. + + * troff/number.c (parse_term): In checking for overflow, handle the + case where the current horizontal position is negative. + +Thu Sep 12 08:26:09 1991 James Clark (jjc at jclark) + + * pic/object.c (draw_arrow): Check for object having zero length. + +Wed Sep 11 10:32:38 1991 James Clark (jjc at jclark) + + * eqn/main.c (do_file): Split off inline equation handling into... + (inline_equation): New function. Search for starting delimiter + using... + (delim_search): New function. Don't recognize a delimiter that + occurs in the name of an escape sequence, number register, string + etc. + +Tue Sep 10 04:01:11 1991 James Clark (jjc at jclark) + + * eqn/delim.c (delim_box::compute_metrics): Don't call + define_extensible_string if left is 0. + (delim_box::output): Don't print the left delimiter if left is 0. + (delim_box::debug_print): Check for left == 0 before calling printf. + +Fri Aug 23 13:02:30 1991 James Clark (jjc at jclark) + + * troff/Makefile (majorminor.c): Include only digits in + minor_version. + +Thu Aug 22 09:35:37 1991 James Clark (jjc at jclark) + + * refer/dirnamemax.c: new file. + * refer/genlimits.c: Deleted. + * refer/indxbib.c (main): Use dir_name_max() instead of NAME_MAX. + Don't check path length. + * refer/Makefile: Add dir_name_max.o; delete genlimits. + * Makefile: Add PATHCONF_MISSING option. + + * refer/indxbib.c (get_cwd): New function. + (main): Use get_cwd(). + * lib/getcwd.c: New file. + * Makefile: Delete -DHAVE_GETWD. Include GETCWD variable. Pass + GETCWD in SUBFLAGS. + * lib/Makefile: Compile getcwd.o. + + * ps/tmac.psatk (psatk-defs): Define showpage after pushing + userdict. + + * refer/indxbib.c (main): Check success of mktemp. + + * lib/tmpfile.c: New file. + * lib/Makefile: Add tmpfile.c. + * lib/lib.h: Declare xtmpfile(); include . + * ps/ps.h: Delete declaration of mktemp(). + * ps/ps.c (ps_printer::ps_printer): Use xtmpfile(). + * refer/refer.c (divert_to_temporary_file): Use xtmpfile(). + * driver/driver.h: No need now to include errno.h. + + * everywhere: Set errno to 0 before calling fopen(). + + * eqn/eqn.h, etc/soelim.c, driver/driver.h, etc/addftinfo.c, + dvi/tfmtodit.c, groff.c, refer/index.c, refer/linear.c, + refer/lookbib.c, refer/refer.h, ps/psbb.c: Include . + +Mon Aug 19 10:52:18 1991 James Clark (jjc at jclark) + + * troff/env.h (translate_space_to_dummy): Declare it. + * troff/env.c (environment::space_newline, environment::space): + If translate_space_to_dummy is set then make the width of spaces 0. + * troff/input.c (translate): If the second character of a + translation is a space, translate to unbreakable space. If the + first character is a space, set or clear translate_space_to_dummy + according to whether the second character is \&. Weird! + +Tue Jul 30 10:03:56 1991 James Clark (jjc at jclark) + + * groff.c (run_commands): Don't use non-zero exit code because a + command gets SIGPIPE. + + * groff.c, groff.sh: Use -mXps with -TXps. + + * ps/ps.c (ps_printer::special): Move call to flush_sbuf() into... + (ps_printer::do_exec, ps_printer::do_file, ps_printer::do_def, + ps_printer::do_mdef, ps_printer::do_import): Call flush_sbuf(). + (ps_printer::special): New specials invis and endinvis. + (ps_printer::do_invis, ps_printer::do_endinvis): New functions. + (ps_printer::set_char, ps_printer::draw): Return if invis_count>0. + (ps_printer::end_page): Check that invis_count == 0. + (ps_printer::invis_count): New member. + (ps_printer::ps_printer): Initialize invis_count to 0. + + * troff/env.c (environment::hyphenate_line): Hyphenation + indicator at beginning of word inhibits splitting after -, \(em + etc. + + * pic/pic.y (element): Allow another element to follow } without + any intervening separator. + +Mon Jul 22 12:27:37 1991 James Clark (jjc at jclark) + + * pic/lex.c (get_delimited): Allow tabs before delimiter. + +Wed Jul 17 10:59:08 1991 James Clark (jjc at jclark) + + * groff.c: Get rid of HAVE_UNION_WAIT stuff. Instead suppress + declaration of wait() in header files. + * Makefile: Get rid of -DHAVE_UNION_WAIT. + + * tbl/table.c (alphabetic_text_entry::add_tab): New function. + + * lib/lib.h: Declare return type of strerror as char *. + + * man/Makefile: Add g flag to sed substitutions. + * Makefile (shgroff, bindist): Likewise. + +Sun Jul 14 11:57:02 1991 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::do_import): Move push of userdict into... + * ps/devps/prologue (PBEGIN): Define showpage after pushing + userdict. + +Sat Jul 13 20:53:04 1991 James Clark (jjc at jclark) + + * ps/devps/prologue (PBEGIN): Zap any definition of showpage in + userdict. + +Fri Jul 12 07:10:09 1991 James Clark (jjc at jclark) + + * man/mdate.sh: Handle the fact that BSD ls -l does not print the + group. + +Sun Jul 7 08:00:23 1991 James Clark (jjc at jclark) + + * troff/input.c (define_number_reg): If currently undefined, + don't define it if the argument is an invalid expression. + + * Makefile: Ignore return value of `if' commands without `else' + parts. + + * Makefile: Split up CPPDEFINES into a series of separate + configuration options. + + * troff/input.c (init_registers): Use time_t instead of long + unless LONG_FOR_TIME_T is defined. Use returned result rather + than passing pointer. + * Makefile: Document LONG_FOR_TIME_T as a CPPDEFINE. + + * lib/Makefile (fontpath.h): Use gendef. + +Thu Jul 4 09:48:05 1991 James Clark (jjc at jclark) + + * troff/input.c (input_iterator::shift): Delete argument name. + * troff/node.c (suppress_output_file::really_begin_page, + suppress_output_file::really_transparent_char, node::ascii_print, + node::tprint): Delete names of unused arguments. + +Wed Jul 3 17:34:57 1991 James Clark (jjc at jclark) + + * refer/label.y (string): Pass $4 to command_error. + +Tue Jul 2 15:06:01 1991 James Clark (jjc at jclark) + + * Version 1.03 released. + +Sat Jun 29 08:14:01 1991 James Clark (jjc at jclark) + + * Makefile: Pass definition of SHELL in SUBFLAGS. + + * gendef: New file. + * Makefile, eqn/Makefile, refer/Makefile, troff/Makefile, + ps/Makefile: Use gendef to construct header files that are + constructed from the Makefile. + + * macros/Makefile: make all should build stripped version of tmac.e. + + * refer/Makefile (clean): Remove y.output. + +Fri Jun 28 09:44:36 1991 James Clark (jjc at jclark) + + * ps/pfbtops.c (main): Add -v option which prints out a version + number. + * ps/Makefile (pfbtops): Link with libgroff.a. + +Fri Jun 21 07:43:23 1991 James Clark (jjc at jclark) + + * refer/search.h (linear_searcher::get_nkeys): Delete declaration. + * refer/linear.c (linear_searcher::get_nkeys): Delete definition. + + * refer/lkbib.c (main): Always terminate reference with blank + line. + * refer/lookbib.c (main): Likewise. + + * refer/linear.c (file_buffer::load): Check that the file is not a + binary file. + + * refer/Makefile (genlimits): Possibly add -DHAVE_SYS_DIR_H. + (genlimits.c): Include if HAVE_SYS_DIR_H is defined. + Delete second inclusion of . + +Tue Jun 18 01:32:26 1991 James Clark (jjc at jclark) + + * troff/token.h (token::special): Deleted. + + * tbl/main.c (process_format): Rework so that opt->tab_char is + recognized only when appropriate. + + * ps/Makefile (clean): Remove pfbtops. + +Sun Jun 16 09:37:19 1991 James Clark (jjc at jclark) + + * lib/font.c (text_file::next): Don't return if we have got a + blank line. + +Fri Jun 14 09:52:26 1991 James Clark (jjc at jclark) + + * refer/refer.c (store_reference): Get hash code from old_table[i] + when rehashing the table. + +Thu Jun 13 01:26:43 1991 James Clark (jjc at jclark) + + * eqn/box.c (box::top_level): Save size and prev size using \R and + restore it afterwards. Set the size to the size at the beginning + of the line. + * eqn/pbox.h: Declare SAVED_INLINE_PREV_SIZE_REG, + SAVED_INLINE_SIZE_REG, and SAVED_SIZE_REG. + + * refer/Makefile (limits.h): Use ./genlimits. + +Wed Jun 12 16:05:34 1991 James Clark (jjc at jclark) + + * refer/index.c: Delete declarations of stat() and fstat(). + +Tue Jun 11 14:52:49 1991 James Clark (jjc at jclark) + + * tty/tmac.tty: Add character definitions for \(>= and \(<=. + +Mon Jun 10 22:49:48 1991 James Clark (jjc at jclark) + + * etc/grog.sh, etc/grog.pl: Change regex for .PS. + +Fri Jun 7 09:13:06 1991 James Clark (jjc at jclark) + + * troff/input.c (token::get_char): Handle \e. + + * refer/linear.c: Delete declarations of fstat() and stat(). + +Wed Jun 5 09:11:59 1991 James Clark (jjc at jclark) + + * troff/node.c, troff/env.c, troff/input.c, Makefile: Remove + OP_DELETE_BROKEN stuff, since we now have a fix for g++. + +Mon Jun 3 13:41:32 1991 James Clark (jjc at jclark) + + * troff/input.c (do_define_macro): Improve error handling for end + of file while defining macro. + +Sun Jun 2 10:20:24 1991 James Clark (jjc at jclark) + + * eqn/box.h: Fix declaration of set_gsize. + * eqn/box.c (set_gsize): Make argument const char *. + (gsize): Declare as char *. + * eqn/main.c (main): Don't convert gsize to int. + * eqn/lex.c (do_gsize): Pass char * to set_gsize. + + * Version 1.02 released. + +Sat Jun 1 12:19:46 1991 James Clark (jjc at jclark) + + * macros/tmac.andoc: New file. + * macros/Makefile: Install tmac.andoc. + + * troff/node.c, troff/env.c, troff/input.c: Conditionalize use of + operator new and delete on OP_DELETE_BROKEN not being defined. + * Makefile: Mention OP_DELETE_BROKEN. + +Mon May 27 13:49:07 1991 James Clark (jjc at jclark) + + * Makefile (bindist): Pass SUBFLAGS. + +Sun May 26 14:13:22 1991 James Clark (jjc at jclark) + + * Makefile, groff.c: Pass definitions to groff.c via device.h. + + * tty/tty.c (tty_font::load_tty_font): Avoid shadowing + parameter. + + * ps/Makefile, ps.c: Pass BROKEN_SPOOLER_FLAGS via broken.h. + + * ps/ps.h, ps/psrm.c: Make comment_table and + header_comment_table local to resource_manager::process_file. + + * groff.sh: With -TXps pass -printCommand option to gxditview. + + * groff.c (possible_command::print): Implement using + append_arg_to_string. + + * xditview: Merge in new implementation with own ChangeLog. + +Sat May 25 18:33:20 1991 James Clark (jjc at jclark) + + * groff.c (main): Implement PRINT_OPTION. + (append_arg_to_string): New command. + (device_table): Set PRINT_OPTION flag for Xps. + +Fri May 24 09:48:58 1991 James Clark (jjc at jclark) + + * troff/groff.h: Rename to troff.h. + + * pic/lex.c (lookup_keyword, docmp): New functions. + (get_token): Use new lookup_keyword. + Don't include key.h. + * pic/key.[ch], pic/pic.gperf: Deleted. + * pic/Makefile: Remove gperf stuff. + + * pic/Makefile, pic/output.h: Move definition of TEX_SUPPORT + into output.h. + * pic/tex.c: Move include of pic.h before test of TEX_SUPPORT. + + * troff/Makefile, troff/node.c: Move definition of + STORE_WIDTH into node.c. + + * etc/grog.pl, etc/grog.sh: Support -mdoc. + +Thu May 23 12:30:49 1991 James Clark (jjc at jclark) + + * dvi/devdvi/texr.map, dvi.devdvi/texi.map, + dvi/devdvi/texb.map: Add lq and rq. + dvi/devdvi: Regenerate fonts. + * ps/devps/textmap: Add lq and rq. + * ps/devps: Regenerate fonts. + * tty/devascii/R.proto, tty/devlatin1/R.proto: Add lq and rq. + * macros/tmac.e: Define \*(lq and \*(rq to be \(lq and \(rq. + + * pic/object.c (position_rectangle): When checking radius + cope with possiblity that width or height is negative. + (box_object::box_object): Have separate xrad and yrad with + signs matching signs of dim components. + (box_object::{north,south}_{east,west}): Use xrad and yrad. + (box_object::print): With rounded boxes use absolute values + for dim and rad arguments. + + * lib/Makefile, lib/fontfile.o: Pass definition of FONTPATH + in fontpath.h. + + * eqn/Makefile, eqn/main.c: Pass definition of DEVICE in device.h. + + * various files: Add explicit destructors to keep Saber CC +d + happy. + +Wed May 22 11:37:11 1991 James Clark (jjc at jclark) + + * eqn/box.c (box::top_level): Restore fonts correctly after + font changes in line containing inline equation. Also + restore previous font as well as current font. + * eqn/pbox.h: Define necessary string and register names. + + * troff/input.c (token::next): Case 'R' calls do_register. + (do_register): New function. + +Tue May 21 11:28:23 1991 James Clark (jjc at jclark) + + * groff.c, groff.sh: Support Xps device. Allow each device + to have a pseudo_name and a real_name. + + * groff.c (run_commands): Don't print `Broken pipe' messages. + + * ps/pfbtops.c: New file. + * ps/Makefile: Add pfbtops. + + * troff/number.c (parse_term): Improved error message. + +Mon May 20 11:22:14 1991 James Clark (jjc at jclark) + + * groff.c, groff.sh, etc/grog.sh, etc/grog.pl: Support grefer. + + * Makefile: Integrate refer. + * refer: New directory. + * man/grefer.man, man/glookbib.man, man/gindxbib.man, + man/lkbib.man: New files. + * man/Makefile: Support refer man pages. + + * lib/lib.h: Declare is_prime. + * lib/prime.c: New file. + + * troff/input.c (macro_source): New function. + (init_input_requests): Bind "mso" to macro_source. + + * troff/env.c (environment::possibly_break_line): Maintain + pointer to pointer to node to be split in ndp so as to avoid + using address of freed node. + + * troff/env.c (environment::hyphenate_line): Maintain pointer to + pointer to first node to be hyphenated in startp so as to + avoid using address of freed node. + + * troff/env.c (class trie, class hyphen_trie): Make the + elements of the trie be of type char not unsigned char. + Declare arguments to be const char* instead of unsigned char *. + + * troff/env.c (hyphenate): Initialize hbuf[0]. + + * troff/input.c (set_string): Declare p to be char * and cast + *p to unsigned char when necessary. + + * troff/input.c (do_define_macro): Declare s to be const + char*. Cast element to unisgned char when necessary, Declare + d to be an int. Handle EOF better. + + * troff/Makefile, troff/input.c: Different scheme for passing + definitions of MACROPATH, HYPHENFILE and DEVICE. + +Tue May 14 13:41:36 1991 James Clark (jjc at jclark) + + * tty/devascii/R.proto: Delete entry for em. + * tty/devlatin1/R.proto: Likewise. + +Sat May 11 11:13:28 1991 James Clark (jjc at jclark) + + * troff/input.c (translate): Stop when we get a space. Treat eof + like newline. + + * macros/tmac.an (IP): Only pass quoted argument to TP when \n(.$>1. + +Wed Apr 24 19:24:33 1991 James Clark (jjc at jclark) + + * tbl/main.c (process_format): A font name following a `f' + modifier that starts with a digit can be only one character long. + Also deal with EOF on the second character of the font name. + +Wed Apr 17 11:23:43 1991 James Clark (jjc at jclark) + + * troff/input.c (token::next): Turn \~ into an + unbreakable_space_node. + * troff/node.c (unbreakable_space_node): New class. + * troff/node.h: Declare it. + +Tue Apr 16 10:47:12 1991 James Clark (jjc at jclark) + + * dvi/dvi.c (dvi_printer::set_char): Make code an int. Check that + it's >= 0, before outputting it as a single byte. + +Mon Apr 15 11:20:23 1991 James Clark (jjc at jclark) + + * lib/font.c: Make font_char_metric::code an int. + (font::get_code): Change return type to int. + (font::load): Allow code to be arbitrary integer. + * lib/font.h (font::get_code): Change return type to int. + (font::number_to_index): Change argument type to int. + * troff/input.c (token::next): In case 'N', allow any value. + Store value in token::val. + (token::operator==): For TOKEN_NUMBERED_CHAR test equality of val. + (token::get_char, token::add_to_node_list, token::process): Get + number from val. + (charinfo::set_number): Change argument to int. + (charinfo::get_number): Require that NUMBERED flag be set. + (get_charinfo_by_number): Store numbered characters not between 0 + and 255 in a dictionary. + * troff/charinfo.h (get_charinfo_by_number): Change argument type + to int. + (charinfo::number): Change type to int. + (charinfo::set_number): Change type of set_number to int. + * troff/node.c (troff_output_file::put_char_width, + troff_output_file::put_char): Test whether character is numbered + using charinfo::numbered(). + * driver/printer.c (printer::set_numbered_char): Allow arbitrary + values of num. + * lib/nametoindex.c: New implementation to cope with arbitrary + number characters. + + * troff/input.c (token::operator==): Test val for + TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, TOKEN_FONT_POSITION, and + TOKEN_SIZE. + + * man/Makefile: Add definiton of BROKEN_SPOOLER_FLAGS. + (.man.n): sed out @BROKEN_SPOOLER_FLAGS@. + +Sun Apr 14 12:57:00 1991 James Clark (jjc at jclark) + + * ps/devps/zapfdr.ps: Don't copy UniqueID. Avoid use of newdict + variable. + + * all Makefiles: rm targets of cp and >. + + * xditview/xtotroff.c (MapFont): Unlink troff_name before opening + it. + + * eqn/lex.c (def_table): Add dollar. + +Sat Apr 13 13:02:44 1991 James Clark (jjc at jclark) + + * troff/input.c (do_width): Push back newline before closing delim + like do_bracket. + +Fri Apr 12 15:16:03 1991 James Clark (jjc at jclark) + + * groff.c (possible_command::prepend_arg): New function. + (main): Prepend device -m option. + * groff.sh: Put device -m options before command-line options. + +Tue Apr 9 10:24:43 1991 James Clark (jjc at jclark) + + * macros/tmac.an (IP): Quote argument to TP. + + * ps/ps.c (main): New option -b, which sets... + (broken_flags): New variable. + (ps_printer::~ps_printer): Incorporate the setup section in the + prolog if (broken_flags & NO_SETUP_SECTION). + (ps_printer::begin_page): Generate {Begin,End}PageSetup comments. + (ps_printer::merge_download_fonts, ps_printer::merge_import_fonts, + ps_printer::merge_ps_fonts, ps_printer::print_font_comment, + ps_printer::print_needed_font_comment, + ps_printer::print_supplied_font_comment, + ps_printer::print_include_font_comments, + ps_printer::lookup_doc_font, ps_printer::download_fonts, + ps_printer::read_download_file, read_document_fonts, add_font, + skip_line, parse_fonts_arg, document_font::document_font, + document_font::~document_font, document_font::download, + ps_output::include_file): Deleted. + (ps_printer::~ps_printer): Generate %%EOF. Generate %!PS-Adobe-3.0 + rather than %!PS-Adobe-2.0. Make calls to + resource_manager::need_font for each font that we used. Replace + calls to merge_ps_fonts, merge_download_fonts, print_font_comment, + print_supplied_font_comment, print_needed_font_comment by call to + resource_manager::print_header_comments. Output %%Orientation + comment. Output %%Requirements: numcopies comment if ncopies > 1. + Don't output the prolog directly. Instead call + resource_manager::output_prolog. Only define #copies when ncopies + > 1. Delete calls to print_include_font_comments and + download_fonts. Add call to resource_manager::document_setup. + (ps_printer::do_file): Call resource_manager::import_file instead + of including it ourselves. + (ps_printer::do_import): Likewise. Also don't call + merge_import_fonts. Push userdict on the dictionary stack before + and pop it afterwards. + Move declaration of ps_output into ps.h. + * ps/psrm.c: New file implementing resource_manager class. + * ps/ps.h: New file declaring ps_output and resource_manager + classes. + * ps/devps/zapfdr.ps: + * ps/devps/symbolsl.ps: + * ps/devps/prologue: Use 3.0 conventions. + * ps/Makefile: Pass definition of BROKEN_SPOOLER_FLAGS in DEFINES. + Add default definition of BROKEN_SPOOLER_FLAGS. + * Makefile: New variable BROKEN_SPOOLER_FLAGS. Add + BROKEN_SPOOLER_FLAGS to SUBFLAGS. + +Mon Apr 8 09:26:54 1991 James Clark (jjc at jclark) + + * etc/grog.pl: New file. + * Makefile (GROG): New variable. + Add GROG to SUBFLAGS. + * etc/Makefile (GROG): New variable. + (install.nobin): Install $(GROG) rather than grog.sh. + +Thu Apr 4 11:36:45 1991 James Clark (jjc at jclark) + + * eqn/special.c (special_box::compute_metrics): Make the input and + output strings the same. Get the new height and depth from the + predefined height and depth registers. Also make subscript kern + and skew available. + (special_box::compute_subscript_kern, special_box::compute_skew): + New functions. + + * eqn/box.c (pointer_box::compute_skew, + simple_box::compute_metrics, box::top_level) + * eqn/text.c (prime_box::compute_metrics, + prime_box::comput_subscript_kern) + * eqn/limit.c (limit_box::compute_metrics): + * eqn/delim.c (build_extensible, delim_box::compute_metrics): + * eqn/sqrt.c (sqrt_box::compute_metrics): Protect possibly + negative numbers in `nr' requests with a leading 0. + +Wed Apr 3 15:58:23 1991 James Clark (jjc at jclark) + + * eqn/special.c: New file. + * eqn/eqn.y: Declare token SPECIAL. Make it right associative. + Add new rule for simple. + * eqn/lex.c (token_table): Add SPECIAL. + * eqn/box.h: Declare make_special_box. + * eqn/Makefile: Add special.[co]. + +Sat Mar 30 10:57:53 1991 James Clark (jjc at jclark) + + * ps/devps/prologue: Possibly set packing to true while defining. + Create grops dictionary here. Initialize local variables before + defining procedures. + (PICTURE): Rename to PBEGIN. Also do save, noop showpage, count + the dictionary stack. Set strokeadjust and overprint to false if + the relevant operators are defined. + (PEND): New procedure. + * ps/ps.c (ps_printer::~ps_printer): In the prolog just include + prologue. Do everything else in the setup section. + (ps_printer::do_import): Just call PBEGIN and PEND around the + picture. Also push userdict before, and pop it afterwards. + +Wed Mar 27 07:59:50 1991 James Clark (jjc at jclark) + + * troff/node.c (bracket_node::tprint): Brackets were being printed + 1m too low. + + * macros/tmac.an (SH, SS): Set fill mode. + +Tue Mar 26 07:46:31 1991 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::begin_page): Set + high_water_mark to 0. + +Fri Mar 22 09:19:46 1991 James Clark (jjc at jclark) + + * man/mdate.sh: New file. + * man/mdate.c: Deleted. + * man/Makefile: Use mdate.sh instead of mdate. + (mdate): Deleted. + + * eqn/lex.c (do_gsize): Supply missing argument to error message. + +Tue Mar 19 11:06:50 1991 James Clark (jjc at jclark) + + * man/mdate.c: New file. + * man/*.man: Replace modification date by @MDATE@. + * man/Makefile (.man.n): Replace @MDATE@ by `mdate $<`. + (mdate): New target. + + * lib/font.c (text_file::next): Deal with arbitrarily long lines. + Remove illegal input characters. + +Mon Mar 18 08:32:25 1991 James Clark (jjc at jclark) + + * macros/tmac.s (pg*start-col): Do .ns *after* running the hooks. + +Sat Mar 16 03:52:25 1991 James Clark (jjc at jclark) + + * troff/div.c (begin_page): Change behaviour when + !first_page_begun and !break_flag. + + * troff/input.c (do_name_test): Return 0 if argument is empty. + + * troff/input.c (read_long_escape_name): Require closing ] to be + at same input level as opening [. + + * troff/input.c (read_increment_and_escape_name): New function. + (get_copy, process_input_stack): Use this for \n. + +Fri Mar 15 00:31:48 1991 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::begin_page): Ignore the + current value of page_number if !first_page_begun. + + * groff.c (main): Fix declaration of buf. + + * troff/input.c (do_name_test): New function. + (token::next): Implement \A. + (token::next): Implement \e by turning it into a TOKEN_ESCAPE. + (token::description, token::add_to_node_list, token::process): + Handle TOKEN_ESCAPE. + * troff/token.h: New token TOKEN_ESCAPE. + +Thu Mar 14 10:22:26 1991 James Clark (jjc at jclark) + + * pic/main.c (do_picture): Allow space before and after filename + following `<'. Check that the filename is not empty. + +Wed Mar 13 12:49:40 1991 James Clark (jjc at jclark) + + * Version 1.01 released. + + * dvi/devdvi/CompileFonts: Add cm*ss10 fonts. + + * dvi/tmac.dvi: ftr HR to H. + + * macros/tmac.e: Round up computation of $r. + + * xditview/tmac.X: Don't give up completely in compatibility mode. + Use \n(.s instead of \n[.s]. + + * dvi/tmac.dvi: Don't give up completely in compatibility mode. + Use \(ci instead of \[ci]. Use \n(.s instead of \n[.s]. + Add u to factors inside \s[...]. Rename frac to dvi-frac. + Translate \(FM onto \[prime] and \(!/ onto \[slashnot]; use these + short names in the char definitions. + + * ps/tmac.ps: Don't give up completely in compatibility mode. + Fix the fraction definitions to use \n(.s and \(f/. Add an extra + quote in front of \n(.s. Add u to factors inside \s[...]. + +Mon Mar 11 12:01:20 1991 James Clark (jjc at jclark) + + * tty/tmac.tty: Call the nroff request. + + * macros/tmac.e ((x, )x): Better definitions that work properly + in a diversion. + (@0, @1): Helper macros for (x. + + * macros/tmac.e ($s, hl): Use \l rather than \D. + + * tty/tmac.tty: Make it work better in compatibility mode. + (pchar): Rename to tty-char. + + * macros/tmac.e (@E): New macro. + (r, i, b, rb, bi): Use @E. + + * macros/tmac.e (@F): Don't use (;...) syntax. + + * macros/tmac.e: Remove mention of \*(||/revisions. Mention that + it was modified for groff. + + * macros/tmac.e: Make sure \n(ps and \n(es are >= \n(.V. + + * macros/tmac.e (<., .>): Removed. + ([., .]): If \n(.V>=1v, use [] instead of superscripting. + + * macros/tmac.e: Remove check that groff is being used. + + * macros/tmac.e (@C): Change families only if using groff; turn + compatibility mode off while changing familes. Save compatibility + mode before changing families and restore it afterwards. + + * macros/tmac.e (@h): Remove test for offset + line length. + + * macros/tmac.e (sorry): Rename to @S. Use \$1 instead of \$0 + (lo, th, ac): Define to call @S instead of using als. + + * macros/tmac.e: Make $r and $R now contain \n(.v*100/\n(.sp, ie + the ratio of the vertical spacing to the point size in units + expressed as a percentage. Use these instead of $10r and $10R, + Delete $10r and $10R. + + * lib/font.c (font::load): In default computation of space_width, + divide by sizescale. Use scale_round. + + * macros/tmac.an (TP): Don't call `nf'. + (an-do-tag): Don't call `fi'. + +Sun Mar 10 09:52:35 1991 James Clark (jjc at jclark) + + * troff/input.c (process_input_stack): Handle the case where + spaces at the beginning of an input line are followed by a + newline. + +Thu Mar 7 20:18:07 1991 James Clark (jjc at jclark) + + * groff.c (device_table): Add PIC_X_OPTION for dvi device. + * groff.sh: Use pic -x with the dvi device. + + * dvi/devdvi/FontMakefile (H): Don't use -s. + + * dvi/devdvi/HI, dvi/devdvi/HB: New files. + * dvi/devdvi/Makefile: Add HI and HB to FONTS. + * dvi/devdvi/FontMakefile: Add rules for HI and HB. Include these + in FONTS. + +Mon Mar 4 13:20:14 1991 James Clark (jjc at jclark) + + * ps/psfig.diff: New file. + * ps/tmac.psfig: New file. + +Sat Mar 2 00:15:09 1991 James Clark (jjc at jclark) + + * macros/tmac.s (]=, ref*do-tl, ref*bib-print): Deleted. + (]-): Don't call ref*do-tl. + + * macros/tmac.s (ref*end-print): Use XP if [F not defined. + + * macros/tmac.s (ref*normal-print): Call FS rather than fn@do-FS. + (fn@do-FS): Rename to fn*do-FS. + + * troff/input.c (transparent_translate): New function. + (process_input_stack): Apply transparent_translate before calling + diversion::transparent_output(unsigned char). + +Wed Feb 27 00:13:25 1991 James Clark (jjc at jclark) + + * troff/input.c (do_define_macro): Define the macro before calling + skip_line. + + * xditview/Makefile: Add DEVICES variable. Change install target + to use this. + +Tue Feb 26 10:46:22 1991 James Clark (jjc at jclark) + + * groff.c (run_commands): Handle the possibility that there are + child processes other than those forked by us. + +Sun Feb 24 21:32:30 1991 James Clark (jjc at jclark) + + * lib/string.c (string::append): New function. + * lib/stringclass.h: Declare it. + +Thu Feb 21 11:49:26 1991 James Clark (jjc at jclark) + + * eqn/main.c (main): New option -N which sets + no_newline_in_delim_flag. + (do_file): If no_newline_in_delim_flag is set don't allow newlines + in delimiters. + * groff.c (main): Pass -N on to eqn. + (help, synopsis): Mention -N. + * groff.sh: Implement -N. + +Wed Feb 20 15:16:10 1991 James Clark (jjc at jclark) + + * macros/tmac.s (]=, ref*bib-print, ref*do-tl): New macros. + (]-): Call ref*do-tl if ref*need-tl is non-zero. + (XP): Allow as initializer. + +Tue Feb 19 14:09:06 1991 James Clark (jjc at jclark) + + * troff/env.c (environment::wrap_up_field): If field_spaces are + non-zero and we have a current_tab, subtract padding from + tab_distance. If this makes tab_distance <= 0, use the next tab + stop instead. If there isn't any next tab or it's a left tab, + wrap up the current tab. + (environment::start_field): Initialize tab_precedes_field. + (environment::wrap_up_tab): If there's a current field, update + pre_field_width, field_distance and tab_precedes_field. + * troff/env.h (environment::tab_precedes_field): New member. + +Fri Feb 15 01:24:00 1991 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::do_file): New function. + (ps_printer::special): Bind to `file' special. + (ps_printer::do_exec): Set ndefined_styles to 0. + +Sat Feb 9 03:03:04 1991 James Clark (jjc at jclark) + + * eqn/text.c (split_text): Grok \* and similar escapes sequences. + Avoid stripping first character from the start of unrecognized + escapes. Use lex_error instead of error to report errors. + * eqn/lex.c (get_token): Rework handling of escapes. + (lex_error): Move declaration into... + * eqn/eqn.h. + + * xditview/xditview.c (main): Make -page option work. + + * Makefile: Correct comment about -DBROKEN_SPOOLER and pageview. + +Wed Feb 6 12:28:43 1991 James Clark (jjc at jclark) + + * macros/tmac.s (B2): Correct size of box. + +Tue Feb 5 00:37:35 1991 James Clark (jjc at jclark) + + * macros/tmac.s (B2): Postpone drawing the box until in the + top-level diversion. + + * tty/tmac.tty: Add font translations for C, CR, CW. + + * groff.c (synopsis, help): Document -i. + * groff.sh: Implement -i. + + * macros/tmac.s (@NH): Put a `.' after multi-part numbers. + Simplify the construction of SN. + + * troff/number.c (parse_term): Give `|' a higher precedence. + * tbl/table.c (numeric_text_entry::simple_print): Parenthesise + accordingly. + + * macros/tmac.s (B2): Use par@finish instead of par@reset. + +Mon Feb 4 12:36:09 1991 James Clark (jjc at jclark) + + * lib/string.c (string::move): New function. + * lib/stringclass.h: Declare it. + +Sat Feb 2 16:02:16 1991 James Clark (jjc at jclark) + + * troff/env.c (distribute_space): Add optional argument + `force_forward'. + (environment::wrap_up_field): Call distribute_space with + `force_forward' argument of 1. + +Fri Feb 1 19:36:33 1991 James Clark (jjc at jclark) + + * lib/string.c, lib/stringclass.h (string::operator+=(char)): + Inline it. Move reallocation into... + (string::grow1): New function. + * pic/Makefile, tbl/Makefile, eqn/Makefile, ps/Makefile: Redo + dependencies to include library header files. + * lib/Makefile: Make string.c and lf.c depend on stringclass.h. + +Thu Jan 31 15:02:27 1991 James Clark (jjc at jclark) + + * macros/tmac.s (@NH): Use the same number registers than -ms does + for the heading level counters. Use the same string that -ms does + for the number for this heading. + +Wed Jan 30 14:25:40 1991 James Clark (jjc at jclark) + + * lib/new.c (operator new): Cast result of malloc to char *. + + * troff/input.c (spring_trap, lookup_request): Add assert that nm + is not null. + +Tue Jan 29 18:08:05 1991 James Clark (jjc at jclark) + + * groff.c (main): Support -i. + +Sun Jan 27 13:23:17 1991 James Clark (jjc at jclark) + + * pic/pic.h: Include . + + * ps/ps.c: Add declaration of mktemp. + + * Makefile: Add -DHAVE_UNION_WAIT option for CPPDEFINES. + * groff.c: If HAVE_UNION_WAIT is defined, declare wait()'s + argument as union wait *. + (run_commands): If HAVE_UNION_WAIT is defined cast wait()'s + argument to union wait *. + +Sat Jan 26 12:04:52 1991 James Clark (jjc at jclark) + + * tty/tmac.tty: Add definition of \(co. + + * pic/object.c (make_arc): Only increase radius when radius + strictly less than d. + (arc_object::update_bounding_box): May need to add 4.0 to end_quad + more than once. + + * troff/env.c (environment::environment(symbol), + environment::environment(const environment *)): Initialize + input_trap_count. + +Sat Jan 19 08:18:35 1991 James Clark (jjc at jclark) + + * tbl/main.c (main): Add exit(0). + + * ps/ps.c (ps_printer::~ps_printer): Use fseek instead of rewind. + + * pic/main.c (main): + * eqn/main.c (main): + * tbl/main.c (main): + * etc/soelim.c (main): + * driver/printer.c (printer::~printer): + * troff/node.c (real_output_file::~real_output_file, + real_output_file::flush): Check for errors on stdout. + + * most files: Add 1991 to copyright notice. + + * macros/tmac.s: Don't test \n(.x and \n(.y. + + * troff/input.c (token::next): Rename `escape_char' label to + `handle_escape_char' and `normal_char' label to + `handle_normal_char'. + +Thu Jan 17 15:46:35 1991 James Clark (jjc at jclark) + + * groff.c (main, synopsis, help): Support -a option. + * groff.sh: Likewise. Also eliminate Zflag variable by adding -z + to trflags while parsing options. + +Tue Jan 15 13:07:27 1991 James Clark (jjc at jclark) + + * troff/number.c (parse_term): With `m', `M' and `n' scale + indicators, convert scale factor to hunits before scaling. + +Mon Jan 14 12:39:12 1991 James Clark (jjc at jclark) + + * lib/font.c (scale_round): Better test for overflow when n is + negative. + +Thu Jan 10 11:10:56 1991 James Clark (jjc at jclark) + + * tbl/main.c (process_format): Add second argument of type + options*. Change callers. Allow opt->tab_char as well as '\t' + between format items. + +Mon Jan 7 12:30:18 1991 James Clark (jjc at jclark) + + * macros/tmac.an (PD): With no arguments, make sure register PD is + at least \n[.V]. + (TH): Call PD with no argument, instead of setting register PD + directly. + +Sun Jan 6 11:18:39 1991 James Clark (jjc at jclark) + + * Version 1.00 released. + +Sat Jan 5 08:44:30 1991 James Clark (jjc at jclark) + + * ps/tmac.ps, xditview/tmac.X: Add font translation of C to CR. + + * dvi/devdvi/DESC: Mount CW instead of CR. + + * dvi/tmac.dvi: Add definition of \(tm. + + * dvi/devdvi/texsy.map: Add lh, and rh. + * dvi/devdvi/texex.map: Add lt, rt, lb, rb, lk, rk. + * dvi/devdvi/texmi.map: Add *o. Regenerate fonts. + + * dvi/devdvi/FontMakefile: Generate H from cmss10. + * dvi/devdvi/Makefile: Install H. + * dvi/devdvi/H: New file. + +Fri Jan 4 15:04:57 1991 James Clark (jjc at jclark) + + * troff/env.c (vertical_spacing): Don't allow vertical spacing to + be 0. + +Thu Jan 3 13:41:19 1991 James Clark (jjc at jclark) + + * macros/tmac.s (@EN): Add \n(.V to the argument to ds@need. + + * macros/tmac.pic (PS): Avoid attempting to set negative indent. + + * macros/tmac.s (@EN): Handle the case where the equation is empty + but the label is not. + +Wed Jan 2 10:31:44 1991 James Clark (jjc at jclark) + + * troff/groff.h: New warning category WARN_SPACE. + * troff/input.c: Add WARN_SPACE to DEFAULT_WARNING_MASK. Add + WARN_SPACE to warning_table. + (interpolate_macro): Give a warning of type WARN_SPACE if the name + is longer than two characters and is not defined, but the first + two characters do make a defined name. + + * PROBLEMS: New file. + + * CHANGES: New file. + * README-0.6, README-1.00: Deleted. + + * groff.c, groff.sh: Add X75-12 and X100-12 devices. + * xditview/devX75/Makefile: Make devX75-12. + * xditview/devX100/Makefile: Make devX100-12. + + * xditview/devX100/eqnchar, xditview/devX75/eqnchar, + dvi/devdvi/eqnchar, ps/devps/eqnchar: Remove use of \R. + +Tue Jan 1 19:24:01 1991 James Clark (jjc at jclark) + + * README-0.7: Rename to README-1.00. + + * macros/tmac.pic: New file. + * macros/Makefile (install.nobin): Install tmac.pic. + +Mon Dec 31 10:40:53 1990 James Clark (jjc at jclark) + + * troff/env.c (hyphen_word): Correct the test for whether the + token is a hyphen. Reset npos to 0. + + * macros/tmac.s (par@sup-start, par@sup-end): New implementations. + +Sun Dec 30 15:53:13 1990 James Clark (jjc at jclark) + + * macros/tmac.s (ds*common-end): Call par*reset. + (PE): Likewise. + (par@reset-indent): Deleted. + + * macros/tmac.s (@IP): Divert the label. + +Sat Dec 29 14:33:32 1990 James Clark (jjc at jclark) + + * xditview/draw.c (setGC): Use a line width of .1m rather than + .04m by default; round rather than truncate value. + + * tbl/table.c (class empty_entry): New class. + (empty_entry::empty_entry, empty_entry::line_type): New functions. + (table::add_entry): Represent empty entries by objects of type + empty_entry. + (table_entry::line_type): Return -1. + (table::determine_row_type): Ignore entries with line_type 0. + Treat type -1 as non-lines. + +Fri Dec 28 15:04:41 1990 James Clark (jjc at jclark) + + * ps/devps/textmap, xditview/libXdvi/DviChar.c, tty/devlatin1/R.proto, + macros/tmac.s: Rename \(-d to \(Sd. + +Thu Dec 27 12:35:47 1990 James Clark (jjc at jclark) + + * ps/devps/textmap: Add `sd', `/_' and `3d' characters. + * xditview/libXdvi/DviChar.c: Likewise. + * dvi/devdvi/texsy.map: Add `<<', `>>'. + +Wed Dec 26 13:33:23 1990 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::begin_page): Call + init_output() if the_output is 0. + +Sat Dec 22 12:35:29 1990 James Clark (jjc at jclark) + + * troff/input.c: Replace ESCAPE_E by ESCAPE_e and ESCAPE_C by + ESCAPE_c. + (get_copy): Turn \E into ESCAPE_E. + (token::process, asciify): Handle ESCAPE_E. + + * macros/tmac.s (ds*common-end, par@reset): Add `.rj 0'. + (RD): New macro. + (DS): Implement `.DS R'. + +Fri Dec 21 11:41:53 1990 James Clark (jjc at jclark) + + * macros/tmac.s (FS): New macro. + + * macros/tmac.s (fn@do-FS): Use @LP instead of LP. + + * macros/tmac.s (cov*tl-init): Remove after first execution + instead of aliasing to @nop. Call top of page macro explicitly + instead of setting trap; call @init first. Set pg@top as top of + page macro. + (cov*auto-init): Deleted. Set cov*tl-init instead of + cov*auto-init as top of page trap. + (TL, LP): Do a break instead of calling cov*tl-init. + (cov*print): With RP format but no TL, alias FS and FE to @FS and + @FE; in this case also give a warning and always start another + page. No need to set pg@top here. + (cov*tl-init): Rename to cov*first-page-init. + + * macros/tmac.s (RP): Do `.pn 0'. + (cov*tl-init): With RP format don't do `.pn 0'. + + * macros/tmac.s (pg@cs-top): Set no space mode. + + * macros/tmac.s (par@TL, par@AU, par@AI): New macros. + (cov*ab-init): Alias TL, AU and AI to these. + +Thu Dec 20 10:10:50 1990 James Clark (jjc at jclark) + + * macros/tmac.s (@EQ): Move the space before the equation into @EN + (@EN): Do nothing unless \n[dl] is > 0. + +Tue Dec 18 12:20:47 1990 James Clark (jjc at jclark) + + * pic/object.c (ellipse_object::radius): New function. + + * VERSION: Change version to 0.7. + + * tbl/table.c (block_entry::do_divert): Declare return type as + void. + (block_entry::divert, alphabetic_block_entry::divert): Return 1. + +Mon Dec 17 12:30:34 1990 James Clark (jjc at jclark) + + * troff/column.c: New file. + * troff/Makefile: Corresponding changes. + + * troff/hvunits.c (scale(vunits, vunits, vunits)): New function. + Friend of vunits. + + * troff/div.c (top_level_diversion::space): If the space causes + the first-page transition and springs a trap, truncate the space + to 0. + +Fri Dec 14 12:30:02 1990 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::do_import): Add a `clear' after including + the document. + + * pic/troff.c (troff_output::line_thickness, + troff_output::set_fill): Do a horizontal motion to compensate for + the width of the \D escape sequence. + +Thu Dec 13 10:17:14 1990 James Clark (jjc at jclark) + + * xditview/tmac.X: Reinstate definition of \(rn, but only for X100 + (not X75). + + * eqn/sqrt.c (sqrt_box::compute_metrics): Supply missing argument + to printf. + + * tbl/table.c (simple_entry::simply_print): Don't declare as pure. + Supply empty definition. + (text_entry::simple_print, simple_text_entry::simple_print): + Delete declarations. + (table::add_entry): Represent empty entries by objects of type + `simple_entry'. + +Wed Dec 12 08:50:48 1990 James Clark (jjc at jclark) + + * troff/Makefile: Remove -DHYPHEN_CONTROL from DEFINES. + + * tbl/table.c (left_text_entry::add_tab): New function. + + * macros/tmac.s: Make @RT an alias for par@reset. Make RT + initialize like LP. + +Mon Dec 10 11:19:55 1990 James Clark (jjc at jclark) + + * troff/env.c (environment::start_field): Give an error message if + there is no next tab. + +Sun Dec 9 11:46:40 1990 James Clark (jjc at jclark) + + * troff/env.c (hyphenate): Skip initial elements with zero + hyphenation code. + + * macros/tmac.s (par@init): Keep VS in points rather than units. + +Sat Dec 8 23:00:27 1990 James Clark (jjc at jclark) + + * pic/main.c (main): Implement `-c' option. + * pic/output.h: Declare make_tpic_output(). + * pic/tex.c (tex_output::set_pen_size): Make it virtual and + protected. + (tpic_output): New class. + (tpic_output::tpic_output, tpic_output::set_pen_size, + tpic_output::command, make_tpic_output): New functions. + +Fri Dec 7 11:57:41 1990 James Clark (jjc at jclark) + + * tbl/main.c (main): Call `.ab' if \n(.g is false. Define TS/TE + if they're not already defined. + * tbl/table.c (init_output): Don't test \n(.g. + + * troff/input.c (do_if_request): Delete `g' condition. Recognize + `d', `r' and `c' conditions even in compatibility mode. + +Tue Dec 4 09:13:47 1990 James Clark (jjc at jclark) + + * ps/tmac.ps (ps-bb): Protect against negative numbers in bounding + box. + +Mon Dec 3 07:18:26 1990 James Clark (jjc at jclark) + + * troff/env.h (environment::prev_line_interrupted): New member. + (environment::get_prev_line_interrupted): New function. + * troff/env.c (environment::newline): Set prev_line_interrupted. + (environment::environment(const environment *), + environment::environment(symbol)): Initialize + prev_line_interrupted. + * troff/input.c (process_input_stack): Don't give special + treatment to space and newline at the beginning of the line if the + previous line was interrupted. + +Sat Dec 1 15:48:37 1990 James Clark (jjc at jclark) + + * eqn/eqn.y: Disallow PRIME by itself. + * eqn/lex.c (token_table): Bind `opprime' instead of `prime' to + PRIME. + (def_table): Remove definition of '. Define prime to be `. + + * eqn/eqn.y: Split off part of rule `script' into a new rule + `nonsup'. + +Fri Nov 30 10:23:44 1990 James Clark (jjc at jclark) + + * macros/tmac.s ({, }): New string aliases. + +Thu Nov 29 11:34:40 1990 James Clark (jjc at jclark) + + * README-0.7: New file. + +Wed Nov 28 10:09:57 1990 James Clark (jjc at jclark) + + * macros/tmac.s: New file. + * man/groff_ms.man: New file. + * Makefile: Add definition of TMAC_S. Pass TMAC_S in SUBFLAGS. + * Makefile.bd: Similarily. + * man/Makefile: Add groff_ms.n to MAN7PAGES. Replace @TMAC_S@. Add + definition of TMAC_S. + * macros/Makefile: Add definition of TMAC_S. Install tmac.s. + * macros/TODO: New file. + +Sat Nov 24 20:04:54 1990 James Clark (jjc at jclark) + + * troff/env.c (right_justify): New function. + (init_env_requests): Bind this to request "rj". + (center_lines): Set right_justify_lines to 0. If we get a bad + integer, center 1 line. + (environment::environment(symbol), environment::environment(const + environment *)): Initialize right_justify_lines. + (environment::get_right_justify_lines): New function. + (init_env_requests): Bind this to number_register ".rj". + + * troff/env.c (environment::choose_breakpoint): Implement + hyphenation_margin and hyphenation_space. + (environment::get_hyphenation_space, + environment::get_hyphenation_margin): New functions. + (init_env_requests): Bind these to .hys and .hym. + (hyphenation_space_request, hyphenation_margin_request): New + functions + (init_env_requests): Bind these to hys and hym. + (environment::environment(symbol), environment::environment(const + environment *)): Initialize hyphenation_margin and + hyphenation_space. + * troff/env.h: Corresponding changes to class environment. + +Fri Nov 23 09:08:16 1990 James Clark (jjc at jclark) + + * troff/div.c (blank_line): Always do a break. + + * eqn/box.c (do_text): Turn off escapes while appending text to + string. + +Thu Nov 22 10:58:59 1990 James Clark (jjc at jclark) + + * troff/input.c (while_break_request, while_continue_request): New + functions. + (init_input_requests): Bind these to "break" and "continue". + (while_depth, while_break_flag): New variables. + (while_request): Update while_depth. Break out of loop if + while_break_flag is set. + +Wed Nov 21 10:54:40 1990 James Clark (jjc at jclark) + + * tbl/table.c (init_span_reg): Initialize span_width_reg to \n(.H + rather than 0. + +Mon Nov 19 00:45:03 1990 James Clark (jjc at jclark) + + * Makefile: Include -DBROKEN_SPOOLER by default. Expand comment. + + * stringify: New file. + * Makefile (groff.o): Use stringify. + + * xditview/tmac.X: Remove definition of \(rn. + * xditview/libXdvi/DviChar.c: Remove radicalex from + Adobe_symbol_map. + +Sat Nov 17 10:44:58 1990 James Clark (jjc at jclark) + + * tbl/table.c (table::add_entry): Allow alphabetic text blocks. + (alphabetic_block_entry::alphabetic_block_entry, + alphabetic_block_entry::divert, alphabetic_block_entry::print): + New functions. + (block_entry::divert): Split off body into ... + (block_entry::do_divert): If the block is alphabetic, subtract 2n + from the line length; also update the span width to dl+2n, and the + alphabetic span width to dl. + + * driver/input.c (do_file): While reading argument to D command, + when expanding buffer, multiply szp by sizeof(int) rather than 2 + in the argument to memcpy. + + * tbl/table.c (compute_span_width): Add 2n rather than 1n to the + width of alphabetic columns. + +Fri Nov 16 06:34:27 1990 James Clark (jjc at jclark) + + * troff/node.c (lookup_family): Supply second argument to lookup. + + * troff/dictionary.c (dictionary::lookup): After an unsuccesful + search, return immediately if v is 0. + + * pic/troff.c: Define EQN_NO_EXTRA_SPACE_REG. + (troff_output::start_picture): Set this reg. + (troff_output::end_picture): Remove this reg + * eqn/box.c (box::extra_space): Don't produce `\x's if + EQN_NO_EXTRA_SPACE_REG is defined. + + * eqn/eqn.y: Allow just a PRIME to be a `simple'. + * eqn/text.c (split_text): Map ' to \(fm when it's the first + character. + +Thu Nov 15 10:35:06 1990 James Clark (jjc at jclark) + + * macros/tmac.e: Use font 3 instead of B in $c. Remove `bd' + requests. + + * troff/div.c (top_level_diversion::top_level_diversion): + Initialize page_number to 0. + +Wed Nov 14 21:41:58 1990 James Clark (jjc at jclark) + + * groff/troff (environment::environment(const environment *)): + Initialize name to e->name, rather than "anonymous". + +Sat Nov 10 01:59:37 1990 James Clark (jjc at jclark) + + * xditview/libXdvi/Dvi.c (ShowDvi): If eof is encountered, reset + requested_page. Split middle part into ... + (FindPage): New function. + (SetValues): If we don't yet know the last page, and the requested + page is greater than the current page, call FindPage. + Update the font_map_string before doing this. + + * xditview/tmac.X: Add definitions of \(sq, \(ga, \(dg and \(dd. + Translate \(lh and \(rh into left and right double arrows. + + * troff/node.c (class hyphen_inhibitor_node): New class. + (hyphen_inhibitor_node::hyphen_inhibitor_node, + hyphen_inhibitor_node::copy, hyphen_inhibitor_node::same, + hyphen_inhibitor_node::type, + hyphen_inhibitor_node::get_hyphenation_type): New functions. + (node::add_discretionary_hyphen): Use hyphen_inhibitor_node rather + than dbreak_node(0, 0) to represent a `\%' at the beginning of a + word. + +Fri Nov 9 16:05:38 1990 James Clark (jjc at jclark) + + * troff/node.h (dummy_node::get_hyphenation_type, + transparent_dummy_node::get_hyphenation_type): Declare them. + * troff/node.c: (dummy_node::get_hyphenation_type, + transparent_dummy_node::get_hyphenation_type): New functions. + +Wed Nov 7 10:09:06 1990 James Clark (jjc at jclark) + + * xditview/libXdvi/draw.c: If M_PI not defined after including + math.h, then define it. + + * xditview/Makefile: Add definition of AR. Pass it to the submake + in libXdvi. + * xditview/libXdvi/Makefile: Add definitions of AR and RANLIB. + +Tue Nov 6 10:14:27 1990 James Clark (jjc at jclark) + + * troff/dictionary.h (object_dictionary::alias): Declare return + value as int. + * troff/dictionary.c (object_dictionary::alias): Return non-zero + if the old name was defined. + * troff/input.c (alias_macro): Give a warning if the old name was + not defined. + * troff/reg.c (alias_reg): Likewise. + +Mon Nov 5 00:31:39 1990 James Clark (jjc at jclark) + + * troff/input.c (token::next): Delete implementation of \R. + + * macros/Makefile: Strip comments from tmac.e while installing it. + + * troff/input.c: New variable `nroff_mode'. + (troff_request, nroff_request): New functions. + (init_input_requests): Bind `troff' and `nroff' to troff_request + and nroff_request. + (do_if_request): Compute results of t and n conditions from + nroff_mode. + + * text/text.c (split_text): Fix typo in >=. + + * eqn/lex.c: Add definition of `==' to def_table. + +Fri Nov 2 02:49:09 1990 James Clark (jjc at jclark) + + * pic/tex.c (tex_output::start_picture): Change the definitions of + \graph and \graphtemp so that they work properly with Plain TeX. + + * pic/tex.c (tex_output::solid_arc): Ensure that the second angle + argument to `ar' is not less than the first. + + * pic/pic.y: Allow a comma between elements of the variable list + in the argument to `reset'. + + * pic/object.c (arc_object::arc_object): Fix computation of + radius. + + * eqn/main.c (main): Add exit(0). + +Thu Nov 1 02:03:50 1990 James Clark (jjc at jclark) + + * troff/div.c (begin_page): Test no_space_mode after doing the + break, but still push the page ejector cookie before doing the + break. Also set the next page number after doing the break. + + * xditview/xditview.c (NewFile): Don't set the title and icon name + if this is the first file and its name is `-'. + * groff/groff.c: Define a new device flag XT_OPTION. Set it for + the X75 and X100 devices. + (main): If a device has the XT_OPTION flag set and there's exactly + one file argument, pass the driver -xrm and -title options to set + the icon name and window title to the name of the file. + + * troff/env.c (environment_switch): If there was an argument but + it wasn't a valid number or name, then pop an environment but + don't give an error message on underflow. + + * troff/number.c (start_number): Correct spelling in error message. + + * troff/input.c (token::delimiter): Don't print an error message + if err is false. + + * xditview/libXdvi/parse.c (ParseInput): In case 'D', only call + ParseDrawFunction if dw->display_enable is true. + +Wed Oct 31 05:49:50 1990 James Clark (jjc at jclark) + + * pic/pic.y: Parse text positioning like normal attributes, so as + to allow `"text" at 0,0 ljust'. Don't allow `center' as a + positioning attribute. + +Mon Oct 29 22:50:38 1990 James Clark (jjc at jclark) + + * tbl/main.c (process_data): When in state START while reading a + text block, don't change to state MIDDLE if c is a newline. + +Sun Oct 28 21:59:56 1990 James Clark (jjc at jclark) + + * dvi/dvi.c (dvi_printer::begin_page): Rename `i' variable to `j' + so as to avoid shadowing parameter. + +Wed Oct 24 18:35:39 1990 James Clark (jjc at jclark) + + * tbl/table.c (trim_space): Deleted. + (table::add_entry): Don't call trim_space. + +Mon Oct 22 03:48:39 1990 James Clark (jjc at jclark) + + * VERSION: Change version to 0.6. + + * troff/number.c (parse_expr): Make == work. + +Sat Oct 20 11:28:17 1990 James Clark (jjc at jclark) + + * man/grog.man: New file. + * man/Makefile: Add grog.n to MAN1PAGES. + * etc/grog.sh: New file. + * etc/Makefile: Install grog.sh as grog. + +Fri Oct 19 11:17:15 1990 James Clark (jjc at jclark) + + * troff/input.c (token::next): Implement \E. + +Thu Oct 18 11:56:24 1990 James Clark (jjc at jclark) + + * xditview/tmac.X: Change font translations to match tmac.ps. + + * troff/input.c (non_empty_name_warning): Don't give a warning if + `\{' terminates the name. + +Tue Oct 16 10:04:23 1990 James Clark (jjc at jclark) + + * ps/devps/symbol.diff: New file. + * ps/devps/FontMakefile: Mention symbol.diff. + +Sun Oct 14 11:46:46 1990 James Clark (jjc at jclark) + + * troff/node.c (font_position): Use get_long_name to read the + external_name. + + * troff/env.c (environment_switch): If we get a number that's < 0 + or >= NENVIRONMENTS, treat it like a name. + Change NENVIRONMENTS to 10. + + * troff/groff.h: Remove definition of FONTS_MAX. + * troff/node.h (class font_family): Make map a pointer instead of + an array. Add a map_size member. Make it a class. Make nm const + and public. Make invalidate_fontno a friend. + * troff/node.c: Define font_table_size. Make font_info a pointer + rather than an array. + (class troff_output_file): Allocate font_position dynamically. Add + nfont_positions member. + (troff_output_file::set_font): Grow font_position if necessary. + (troff_output_file::~troff_output_file): Delete font_position. + (troff_output_file::troff_output_file): Allocate font_position. + (grow_font_table): New function. + (troff_output_file::really_begin_page, + troff_output_file:really_copy_page): Use nfont_positions rather + than FONTS_MAX. + (mount_font_no_translate, mount_style): Call grow_font_table if + necessary. + (font_family::font_family): Allocate map. + (font_family::make_definite): Grow map if necessary. Use + font_table_size instead of FONTS_MAX. + (font_family::~font_family): New function. + (invalidate_fontno): Use font_family::map_size. + (get_fontno, env_space_width, env_half_narrow_space_width, + env_narrow_space_width, symbol_fotno, is_good_fontno, + get_bold_fontno, make_glyph_node): Use font_table_size rather than + FONTS_MAX. + (next_available_font_position): Never return 0. + +Fri Oct 12 10:17:52 1990 James Clark (jjc at jclark) + + * ps/tmac.ps: Add font translations for compatibility with dpost. + +Thu Oct 11 12:09:03 1990 James Clark (jjc at jclark) + + * eqn/pile.c: Rename default_baseline_sep to baseline_sep. + Move BASELINE_SEP_FORMAT and COLUMN_WIDTH_FORMAT into pbox.h. + Move definitions baseline_sep, shift_down, column_sep, + matrix_side_sep into... + * eqn/box.c: Add them to param_table. + * eqn/pbox.h: Add declarations to pbox.h. + + * troff/input.c (set_string): Cast value to unsigned char *. + + * troff/token.h (process_input_stack): Declare it static before + declaring it a friend. + +Wed Oct 10 09:59:13 1990 James Clark (jjc at jclark) + + * dvi/devdvi/texex.map: Fix positions of extensible brace middle + and bottom. + * dvi/devdvi/EX: Regenerate. + + * troff/input.c (init_charset_table): Make ", ', ), ], *, \(dg + transparent. + +Tue Oct 9 08:34:02 1990 James Clark (jjc at jclark) + + * eqn/lex.c: In defaults_table, make definition of `dot' call + `dot_def'. Don't explicitly make it roman. Similarily for other + accents. + + * pic/lex.c (for_input::for_input): Add by_is_multiplicative + argument. + (for_input::get, for_input::peek): Use this. + (do_for): Add by_is_multiplicative argument. + * pic/pic.y: Change optional_by clause to allow '*' after `by'. + Change semantic value of optional_by to be a double plus a flag + saying whethet the by clause is multiplicative. + + * eqn/lex.c (get_delimited_text): Remember location of start of + definition. Improve error handling when EOF is encountered. + + * lib/font.h: Rename handle_x_command to + handle_unknown_font_command. + * lib/font.c (font::load): Call handle_unknown_font_command for + any unknown command in the font description file. Don't call + handle_x_command. Include the name of the command in the argv. + Improve message for unknown command after kernpairs or charset + command. + * ps/ps.c (ps_font::handle_x_command): Rename to + handle_unknown_font_command. Remove message about `x download' + command. Give error message for wrong number of arguments. + * ps/devps/afmtodit: Generate `encoding' instead of `x encoding'. + * dvi/dvi.c (dvi_font::handle_x_command): Rename to + handle_unknown_font_command. Give an error message for wrong + number of arguments. Rename design_size to designsize. + * dvi/tfmtodit.c (main): Generate `checksum' instead of `x + checksum', `designsize' instead of `design_size'. + +Mon Oct 8 00:38:55 1990 James Clark (jjc at jclark) + + * eqn/*.[chy]: Change underaccent to uaccent. + + * eqn/eqn.y: Add rule for underaccent. Declare UNDERACCENT token; + give it the same precedence as ACCENT. + * eqn/other.c (make_underaccent_box): New function. + * eqn/box.h: Declare it. + * eqn/lex.c: Add UNDERACCENT to token_table. Add utilde to + def_table. + +Sun Oct 7 11:25:16 1990 James Clark (jjc at jclark) + + * pic/pic.y (reset_all): New function. Called in rule for RESET. + (parse_init): Call reset_all. + (define_variable): When defining scale reset only those + pre-defined variables that are scaled. + (defaults_table): Add `scale' as non-scaled value. + + * pic/pic.y: Redo parsing of text adjustments: parse adjustments + together with the text; allow any number of positioning words; + allow center as a positioning word. + + * pic/object.c (output::compute_scale): Get picture maximum height + and width from variables called maxpswid and maxpsht. + * pic/pic.y: Add maxpswid and maxpsht to defaults_table. + +Sat Oct 6 10:16:56 1990 James Clark (jjc at jclark) + + * pic/object.c (object_spec::make_text): Multiply textht by number + of text items. + + * pic/pic.y: Allow `sprintf("string", expr,...)' wherever text can + occur. + (do_sprintf): New function. + (pic.gperf): Add sprintf token. + (text, sprintf): New rules. + + * pic/pic.y: `rand()' with no arguments returns a random number + in the range [0,1). + + * pic/pic.y: Allow a bare expression to be an attribute: change + precedences to support this. Change optional_ordinal rule to + optional_ordinal_last to avoid reduce/reduce conflict. + * pic/object.c (object_spec::object_spec): Initialize direction. + + * pic/pic.y: Implement ^ operator meaning exponentiation. + + * troff/node.h: Add default argument to mount_font. + * troff/node.c (font_position): Read an optional third argument + giving the external_name. + (mount_font): Add optional argument giving the external_name. + (mount_font_not_translate): Have additional argument giving + external name. Use this name to load the font. Pass both names + to font_info::font_info. + (font_info::font_info): Have additional argument giving + external_name. + (class tfont): New member external_name. + (font_info::get_tfont): Use external name to construct tfont_spec. + +Fri Oct 5 04:03:13 1990 James Clark (jjc at jclark) + + * eqn/lex.c (init_table): Add argument giving device. Define + name of device to be "1". + (do_ifdef): Counts as true if the argument has been defined with + `define'. + * eqn/main.c (main): Call init_table with device argument. Make + device local to main. + * eqn/eqn.h: Change declaration of init_table. Remove declaration + of device. + + * pic/lex.c (get_delimited): Allow text to be delimited by + matching {}s. Don't recognize ending delimiter within a string. + + * troff/input.c (get_delim_name): New function. + (token::next): Implement \C. + + * lib/font.c (font::load): Grok ---. Add an alias for each + character based on its code. + (font::get_code_width): Deleted. + * lib/font.h (class font): Declare font::number_to_index(). + Remove declaration of font::get_code_width. + * lib/nametoindex.c (font::name_to_index): Add 512 rather than 256 + to indices of named characters. + (font::number_to_index): New function. + * troff/input.c (font::number_to_index): New function. + (get_charinfo_by_number, charinfo::get_number, + charinfo::set_number): New functions. + (token::next): Turn \N into a TOKEN_NUMBERED_CHAR. + (token::process, token::description, token::get_char, + token::add_to_node_list, token::operator==): Handle + TOKEN_NUMBERED_CHAR. + * troff/charinfo.h: Declare get_charinfo_by_number, + charinfo::get_number, charinfo::set_number. Add NUMBERED flag to + charinfo class. + (charinfo::numbered): New function. + * troff/token.h: Add TOKEN_NUMBERED_CHAR. + * troff/env.h (class environment): Remove declaration of ... + * troff/env.c (environment::make_numbered_char_node): Deleted. + * troff/node.c (make_numbered_node): Deleted. + (class numbered_glyph_node): Remove. + (troff_output_file::put_char_width, troff_output_file::put_char): + Handle numbered chars. + (troff_output_file::numbered_char): Removed. + (tfont::get_code_width): Removed. + (make_glyph_node): Don't search special fonts for numbered + characters. + * troff/node.h: Remove declaration of make_numbered_node. + * driver/input.c (do_file): Handle N command. + * driver/printer.h: Add declaration of ... + * driver/printer.c (printer::set_numbered_char): New function. + * dvi/tfmtodit.c (main): Generate unnamed entries. + * ps/devps/afmtodit: Likewise. + * xditview/xtotroff.c (MapFont): Likewise. + * xditview/libXdvi/parse.c (ParseInput): Grok N command. + + * tbl/main.c (process_format): If multiple widths are specified + for a column but all the widths are the same, don't give an error + message. + + * tbl/table.c (table::do_row): If the current row is all lines and + the stuff doesn't contains a line, mark the top of the row after + printing stuff before the row. If the current row is not all + lines and the stuff doesn't contain a line, don't unnecessarily + mark the top of the row before printing the stuff. + +Mon Oct 1 11:42:00 1990 James Clark (jjc at jclark) + + * troff/groff.h: Remove MAX_PATH. + * troff/input.c (open_file): Dynamically allocate space for the + path. + (open_mac_file, process_macro_file): Corresponding changes. + +Sun Sep 23 18:56:26 1990 James Clark (jjc at jclark) + + * troff/node.h (class output_file): Make copy_file pure. Add + vspace method ifdef COLUMN. Add is_printing method. + * troff/node.c: Add class printing_reg. Add class + real_output_file. Derive other output_file classes from + real_output_file; in these classes rename begin_page to + really_begin_page, print_line to really_print_line, copy_file to + really_copy_file, transparent_char to really_transparent_char. + Move output_file::flush to real_output_file. Add printing member + to class output_file. + * troff/div.h: Remove printing member from top_level_diversion. + Add vspace member function to class diversion ifdef COLUMN. Add + some declarations ifdef COLUMN. + * troff/div.c (top_level_diversion::copy_file, + top_level_diversion::transparent_output, + top_level_diversion::output): Don't test printing member before + output. + * troff/input.c: Handle initial variable_space_request ifdef + COLUMN. + * troff/Makefile: Add column.c but comment it out. Add -DCOLUMN + but comment it out. + +Sat Sep 22 11:32:22 1990 James Clark (jjc at jclark) + + * troff/div.c (diversion::need): Make any space forced. If we + sprung a trap, set truncated_space to minus the distance to the + trap and set needed_space to the amount that was needed. + (top_level_diversion::space): A forced space turns no_space_mode + off. + (class constant_vunits_reg): New class. + (init_div_requests): Implement number registers .trunc and .ne + using constant_vunits_reg. + (class truncated_space_reg): Deleted. + + * troff/div.h: Don't have a no_space_mode member in diversion. + Instead have it in top_level_diversion. + * troff/div.c (diversion::diversion): Don't initialize + no_space_mode. + (top_level_diversion::top_level_diversion): Initialize + no_space_mode. + (no_space, restore_spacing): Do nothing if curdiv != topdiv. + (macro_diversion::output): Don't clear no_space_mode. + + * troff/input.c (diverted_space_node::reread): Don't call + environment::do_break. In fill mode, act like a blank line. + (diverted_copy_file_node::reread): Don't call + environment::do_break. + + * troff/div.c (blank_line): New function. + * troff/div.h: Declare it. + * troff/input.c (process_input_stack): Call it. + + * troff/div.c (truncated_space_reg::get_string): New function. + (init_div_requests): Bind to .trunc. + (space_request, top_level_diversion::space, + top_level_diversion::output, macro_diversion::space, + macro_diversion::output): Update truncated_space. + (macro_diversion::output): Redo calculations when trap sprung. + (macro_diversion::output, macro_diversion::space): No need for + trap_flag. + + * troff/div.c (top_level_diversion::output): Set nl_reg_contents + after truncating post line spacing. + +Fri Sep 21 11:27:25 1990 James Clark (jjc at jclark) + + * ps/devps/prologue (MF, SF): Make them work even if setfont is + defined as a procedure rather than as an operator. + +Thu Sep 20 12:55:05 1990 James Clark (jjc at jclark) + + * troff/div.c (macro_diversion::space): Ignore no_space_mode. + +Wed Sep 19 10:54:37 1990 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::output): Merge + output_file::print_line and output_file::end_of_line member + functions. + * troff/div.h (class output_file): + * troff/node.c (troff_output_file::print_line, + troff_output_file::end_of_line, output_file::end_of_line, + ascii_output_file::print_line, suppress_output_file::print_line): + Corresponding changes. + +Tue Sep 18 11:31:47 1990 James Clark (jjc at jclark) + + * troff/input.c (token::next): Don't give a warning for `\.'. + + * troff/env.c (environment::get_center_lines): New function. + (init_env_requests): Bind number register .ce to it. + * troff/env.h: Declare it. + * tbl/table.c (table::init_output): Define reset macro to restore + .ce. If center option not given, store .ce in SAVED_CENTER_REG. + Then do .ce 0. + (table::print): If center option not given, then imply center + option if SAVED_CENTER_REG > 0. + +Mon Sep 17 09:19:19 1990 James Clark (jjc at jclark) + + * ps/devps/Makefile: Remove T from FONTS. Remove TSymbol.ps and + Troff.ps from DOWNLOAD. + + * troff/Makefile: Change comment in DEFINES to avoid confusing + System V make. + + * ps/ps.c (ps_printer::do_exec): Allow newlines within PostScript + code. Don't try to catch errors with stopped. + (check_line_lengths): New function. + * ps/devps/prologue (EXEC): Deleted. + (EBEGIN, EEND): New procedures. + +Sun Sep 16 14:51:15 1990 James Clark (jjc at jclark) + + * troff/input.c: Include request.h before node.h. + * troff/node.c: Likewise. + * troff/env.c: Likewise. + * troff/div.c: Likewise. + * troff/node.h (class special_node): Store argument as a macro + rather than a char *. + * troff/node.c (special_node::special_node, special_node::copy): + Grok this. + (special_node::~special_node): Deleted. + (special_node::tprint): Deleted. + (special_node::tprint_start, special_node::tprint_end, + special_node::tprint_char): New functions. + (troff_output_file::special): Deleted. + (troff_output_file::start_special, troff_output_file::end_special, + troff_output_file::special_char): New functions. + * troff/input.c (special_node::tprint): New function. + (do_special): Use macro not char *. + (do_transparent_macro): Deleted. + (token::next): Don't call do_transparent_macro. + + * troff/input.c (token::next): Add 'Y' case. + (do_transparent_macro): New function. + * troff/node.c (troff_output_file::special): Handle newlines with + argument using new continuation convention. + * driver/input.c (get_string): Cope with continuation convention. + (do_file): Don't call skip_line after calling get_string(1). + * ps/ps.c (ps_printer::special, ps_printer::do_import, + ps_printer::do_def, ps_printer::do_exec): Cope with newlines in + arg. + * xditview/libXdvi/parse.c (ParseInput): Ignore lines starting + with +. + +Sat Sep 15 19:00:10 1990 James Clark (jjc at jclark) + + * troff/input.c (asciify): By default, illegal input characters + should return empty string. + + * troff/input.c (copy_file): Handle first page transition like title. + (token::next, process_input_stack): Grok COPY_FILE_REQUEST. + + * troff/input.c (token::next): Improve error message for EOF after + escape character. + (input_char_description): New function. + (get_char_for_escape_name): Use input_char_description. + (token::next): Warn about unrecognized escape sequences. + (warning_table): Add WARN_ESCAPE. + * troff/groff.h: Declare WARN_ESCAPE. Change WARN_TOTAL + accordingly. + + * troff/token.h: Remove declaration of process_input_stack. + + * troff/input.c: Remove declaration of init_hyphen_requests. + * troff/request.h: Correct spelling in declaration of same. + + * troff/input.c (token::next): Check whether escape_char is 0. + +Fri Sep 14 12:09:25 1990 James Clark (jjc at jclark) + + * groff.c (main, usage, help): Implement -P and -L options. + * groff.sh: Likewise. + + * troff/input.c (token::next): Use some gotos to avoid code + duplication. + + * troff/input.c (get_long_name, get_name, read_long_ecsape_name): + Avoid calling symbol::symbol if name empty. + +Thu Sep 13 06:21:45 1990 James Clark (jjc at jclark) + + * troff/input.c (init_input_requests): Make \n(.x return the major + version number and \n(.y return the minor version number. + * troff/Makefile: Construct file majorminor.c defining + major_version and minor_version automatically from ../VERSION. + + * troff/node.c (class glyph_node): Make operator new and operator + delete public. + (class ligature_node): Similarily. + + * troff/input.c (operator==(const macro &, const macro &)): New + function. + (non_interpreted_node::same): Use this. + (string_iterator::string_iterator): Make macro& argument const. + + * troff/input.c (input_iterator::get): New function. Don't make + asciify_macro or class non_interpreted_node friends of class + input_iterator. + (non_interpreted_node::interpret): Use input_iterator::get. + (asciify_macro): Likewise. + + * troff/input.c (~token_node, ~string_iterator, ~arg_list, + ~non_interpreted_node): Deleted. + * troff/node.c: (~suppress_output_file, ~ascii_output_file): + Deleted. + + * troff/symbol.h: Make all symbol member functions const. + + * lib/strtol.c: New file. + * lib/Makefile: Add strtol.c. + * Makefile: Define STRTOL as strtol.o to include strtol in + libgroff.a. + +Wed Sep 12 10:00:49 1990 James Clark (jjc at jclark) + + * pic/troff.c (troff_output::simple_circle): Divide by scale. + +Tue Sep 11 14:17:16 1990 James Clark (jjc at jclark) + + * troff/input.c (do_special): Use input_level. + + * troff/token.h (TOKEN_BACKSPACE): New token. + (token::backspace): New function. + * troff/input.c (token::description, token::next, token::process): + Grok TOKEN_BACKSPACE. + (do_special): Turn TOKEN_BACKSPACE back into \b. + + * troff/token.h (token::leader): New function. + * troff/input.c (do_special): Turn TOKEN_LEADER back into \001. + + * troff/input.c (do_special): Turn TOKEN_TAB back into \t. + + * troff/input.c (do_special): Use token::description in error + message. + +Mon Sep 10 11:06:27 1990 James Clark (jjc at jclark) + + * troff/input.c (decode_args): Combine quoted and + quote_input_level variables. Make it a for (;;) loop. + + * troff/input.c (get_char_for_escape_name): Check for \001 and \b. + + * troff/input.c (read_long_escape_name): The test for whether to + expand buffer was off by 1. + (read_string): Similarily. + +Fri Sep 7 11:45:50 1990 James Clark (jjc at jclark) + + * troff/input.c: Use `const int' rather than `static const int'. + + * troff/div.h (diversion::copy_file): Declare as pure virtual. + (macro_diversion::copy_file): New function. + * troff/node.h: New class diverted_copy_file_node. + * troff/node.c: Implement it. + * troff/input.c (copy_file): Use diversion::copy_file. Handle + first page transition by pushing a diverted_copy_file_node. + * troff/input.c (token::next, process_input_stack): Don't handle + COPY_FILE_REQUEST. + +Thu Sep 6 13:29:10 1990 James Clark (jjc at jclark) + + * ps/ps.c (flush_sbuf): Remember to add sbuf_kern when checking + whether space widths need adjusting. + + * troff/charinfo.h: Generalize translated_to_space to + special_translation so as to allow translation to \&. + * troff/input.c (translate): Allow translation to \&. + (charinfo::*): Corresponding changes. + * troff/node.c (make_node, node::add_char): Corresponding changes. + * troff/node.h (dummy_node::dummy_node): Allow optional first + argument. + + * lib/lib.h: Make codes 0200 to 0237 illegal input characters. + * troff/token.h: Remove TOKEN_TITLE. Remove token::title. Add + TOKEN_REQUEST. + * troff/input.c (token::next): Turn a TITLE_REQUEST into a + TOKEN_REQUEST with an argument of TITLE_REQUEST. + (token::process): Grok that. + * troff/input.c (copy_file): Handle first page transition like + title by pushing a COPY_FILE_REQUEST cookie. + (token::next, process_input_stack): Grok that. + * troff/node.h (output_file::copy_file): Add x and y arguments. + Make it non-pure. + * troff/div.c (top_level_diversion::copy_file): Supply them. + * troff/node.c (troff_output_file::copy_file): Add x and y + arguments; moveto specified position. Invalidate font_position + array after copying file. + (output_file::copy_file): New function. + (suppressed_output_file::copy_file, ascii_output::copy_file): + Removed. + * troff/input.c (transparent_file): New function. + (init_input_requests): Bind to "trf". + (token::next): Handle TRANSPARENT_FILE_REQUEST cookie. + (process_input_stack): Likewise. + + * troff/Makefile: Add ../lib/lib.h to GROFF_H. + + * troff/node.c (init_node_requests): New number registers .kern + pointing to global_kern_mode, and .lg pointing to + global_ligature_mode. + + * troff/node.c (ligature): Don't change it if we get a bad + integer. + + * troff/input.c (do_define_string): Don't strip tabs. + + * troff/input.c (asciify_macro): Make the string_iterator auto. + + * troff/node.c (init_font_requests): Rename to... + (init_node_requests): + * troff/node.h: Change declaration. + * troff/input.c (main): Change call. + + * troff/input.c (node::reread, diverted_space_node::reread): New + methods. + (process_input_stack): Call reread rather than + get_diverted_space_node. + * troff/node.c (node::get_diverted_space_node, + diverted_space_node::get_diverted_space_node): Removed. + * troff/node.h: Declare reread methods instead of + get_diverted_space_node methods. Make `n' member private. + * troff/input.c: (token::diverted_space): Removed. + * troff/token.h: Removed declaration. + + +Tue Sep 4 00:48:04 1990 James Clark (jjc at jclark) + + * eqn/script.c (script_box::compute_metrics): Don't let + SUP_RAISE_FORMAT become negative. + + * tbl/table.c (table::do_row): Entries that don't end in the + this row shouldn't make the row non-blank. + + * tbl/table.c (table::make_columns_equal): Only set the width of + columns which are marked as equal. + + * tbl/main.c (process_data): Before issuing excess data error, + if last character was a newline unget it; then get it again after + the error. Also include the contents of the entry in the message. + + * groff.c: New file. + * Makefile: Build groff from groff.c. Make it possible to use + either groff.sh or groff.c as groff. + * Makefile.bd: Similarily. + +Mon Sep 3 09:39:49 1990 James Clark (jjc at jclark) + + * groff.sh: Don't delay expansion of $@ in assignment to files. + Remove occurrences of \". + +Sun Sep 2 09:56:59 1990 James Clark (jjc at jclark) + + * all Makefiles: Simplify and rearrange. + + * Makefile: Handle fmod like malloc. + * lib/Makefile: Similarily. + * lib/fmod.c: Remove #ifdef NEED_FMOD. + + * Makefile: Rename OPTIMISE to OPTIMIZE. + + * groff.sh: Remove assignment to PATH. + * Makefile: Remove SHPATH variable. + * Makefile.bd: Similarily. + + * groff.sh: Add -V option to print the pipeline instead of + executing it. + +Fri Aug 31 00:56:46 1990 James Clark (jjc at jclark) + + * lib/font.c: Split off file searching into ... + * lib/fontfile.c: New file. + + * lib/strerror.c (strerror): Use `Error %d' for unknown errors. + +Thu Aug 30 13:13:55 1990 James Clark (jjc at jclark) + + * tbl/table.c (table::do_hspan): Delete assertion that e != 0. + Also change misleading comment. + (table::do_vspan): Change similarily misleading comment. + * tbl/main.c (process_data): A format row with an explicit `s' + uses up a data line, even if all the other columns are `_' or `='. + + * troff/input.c (token::description): Fix description of + TOKEN_DUMMY and TOKEN_EMPTY. + +Wed Aug 29 04:12:08 1990 James Clark (jjc at jclark) + + * groff.sh: Fix description of -Z in help message. + +Tue Aug 28 07:28:33 1990 James Clark (jjc at jclark) + + * pic/object.c (object_spec::make_object): Allow negative and zero + line thicknesses. + * pic/pic.y: Give linethick default value of -1.0. + * pic/troff.c (troff_output::troff_output): Initialize + last_line_thickness to BAD_THICKNESS. + (troff_output::finish_picture): Set thickness to BAD_THICKNESS. + (troff_output::line_thickness): Canonicalize negative thicknesses + to RELATIVE_THICKNESS. + * pic/tex.c (tex_output::set_pen_size): Silently map negative line + thicknesses to DEFAULT_PEN_SIZE. Canonicalize negative pen sizes + to -1.0. + (tex_output::start_picture): Set pen_size to -2.0. + + * ps/ps.c (ps_printer::set_line_thickness): If line_thickness is + 0, then use 0 linewidth. + (ps_printer::ps_printer): Initialize line_thickness to -1. + + * pic/troff.c (troff_output::simple_ellipse): Divide by scale. + + * ps/devps/symbolchars: Remove `or'. + * ps/tmac.ps: Implement \(or with .char. + + * ps/devps/symbolchars: Move most characters into textmap. + * ps/devps/textmap: Add names for troff bracket characters. Remove + ul, ru, br, bv. + + * ps/devps/TSymbol.ps: Removed. + * ps/devps/FontMakefile: Make S from Symbol not TSymbol. + * ps/tmac.ps: Do with .char what TSymbol did. + * ps/devps/download: Remove TSymbol. + + * ps/devps/T: Removed. + * ps/devps/Troff.ps: Removed. + * ps/devps/Troff.afm: Removed. + * ps/tmac.ps: Implement \(ru, \(ul, and \(br with .char. + * ps/devps/download: Remove Troff. + * ps/devps/FontMakefile: Remove T target. + * ps/devps/DESC-A4: Remove T from font list. + * ps/devps/DESC-letter: Likewise. + + * troff/input.c (macro_to_node): Rename to ... + (charinfo_to_node): Don't pass mac argument. Temporarily remove the + character's definition while processing it. + * troff/node.c (node::add_char, make_node): Change calls to + macro_to_node accordingly. + + * troff/input.c (token::next): Translate \_ to \(ul. + + * tty/devascii/R.proto: Add `|'. + * tty/devlatin1/R.proto: Likewise. + +Mon Aug 27 11:25:41 1990 James Clark (jjc at jclark) + + * man: Put the version number in all the man pages. + +Sun Aug 26 11:40:05 1990 James Clark (jjc at jclark) + + * Makefile.bd: New file. + * README.bd: New file. + + * VERSION: New file. + * lib/version.c: Removed. + * lib/Makefile: Create version.c from ../VERSION. Remove version.c + in clean target. + + * troff/input.c (main): Get hyphen_file from GROFF_HYPHEN + environment variable. + + * all Makefiles: Split install target into install.bin for + binaries, and install.nobin for everything else. + * Makefile: Add bindist target. + + * man/afmtodit.man: New file. + * man/Makefile: Add afmtodit.n to MAN1PAGES. + * ps/devps/Makefile: Add textmap to DEVICEFILES. Install afmtodit + in BINDIR. + * ps/Makefile: Pass BINDIR to make install in devps. + + * ps/ps.c (ps_printer::set_char): Do nothing if the character is + the space character. + + * ps/devps/FontMakefile: Rename symbol.afm to tsymbol.afm. + +Sat Aug 25 15:39:03 1990 James Clark (jjc at jclark) + + * ps/ps.c: Redo font downloading. + * ps/devps/download: New file. + * ps/devps/Makefile: Add download to DEVICEFILES. + * ps/devps/afmtodit: Remove -d option. + * ps/devps/FontMakefile: Don't use -d option with afmtodit. + * ps/devps/symbosl.ps: Add %%DocumentFonts comment. + * ps/devps/zapfdr.ps: Likewise. + * ps/devps/TSymbol.ps: Likewise. + +Fri Aug 24 20:10:30 1990 James Clark (jjc at jclark) + + * groff.sh: Initialize dev to ${GROFF_TYPESETTER:-@DEVICE@}. + +Thu Aug 23 10:03:47 1990 James Clark (jjc at yquem) + + * ps/ps.c (ps_output::include_file): If BROKEN_SPOOLER is defined, + then strip the first line if it starts with %. + * Makefile: Add a comment about this. + + * man/tfmtodit.man: New file. + * man/Makefile: Add tfmtodit.n to MAN1PAGES. + * dvi/Makefile: Install tfmtodit in BINDIR. + + * dvi/tfmtodit.c (usage): Mention -v option. + +Wed Aug 22 09:56:36 1990 James Clark (jjc at yquem) + + * troff/node.c (troff_output_file::end_of_line): Call do_motion. + * troff/node.c (troff_output_file::transparent_char): Don't call + flush_tbuf. + + * eqn: Add check_tabs method to most box classes. + * eqn/box.c (box::top_level): Call check_tabs. + + * eqn/script.c (script_box::output): Use \Z. + * eqn/limit.c (limit_box::output): Use \Z. + + * eqn/box.c (box::top_level): Use itoa. + +Tue Aug 21 09:29:28 1990 James Clark (jjc at yquem) + + * dvi/tmac.dvi: Add font translations for CR, C, TT. + * dvi/devdvi/Makefile: Don't make links to CW. + + * ps/tmac.ps: Add font translations for C, CW, CO, CX, CD, H, HO, + HX, HD. + * xditview/tmac.X: Likewise. + + * troff/node.c: Add font translation feature. + (get_font_translation): New function. + (symbol_fontno): Translate the font name. + (mount_font_no_translate): Rename to mount_font to this. + (mount_font): New function. + (font_family::make_definite): Call mount_font_no_translate instead + of mount_font. + (mount_style): Translate the font name. + (font_translate): New function. + (init_font_requests): Bind "ftr" to font_translate. + + * ps/devps/prologue (SN): New procedure that rounds a position to + the nearest (pixel + (.25,.25)). + (DL): Use SN to round endpoints. + + * lib/version.c: Changed version to 0.5. + +Sat Aug 18 04:43:21 1990 James Clark (jjc at yquem) + + * Makefile: Move definition of PAGE to the very beginning, so that + people are less likely to miss it. + +Fri Aug 17 02:15:11 1990 James Clark (jjc at yquem) + + * man/Makefile: Don't need to sed out @UPCASE_PROG_PREFIX@. + + * troff/env.c (environment::choose_breakpoint): Make `can't find + breakpoint' error a warning of type WARN_BREAK. Change message to + `can't break line'. + * troff/groff.h: Declare WARN_BREAK with code 4; change WARN_INPUT to + code 040000. + * troff/input.c: Add WARN_BREAK to warning_table. Include + WARN_BREAK in DEFAULT_WARNING_MASK. + + * tty/tmac.tty: Add definition of \(+-. + + * groff.sh: Remove `--' option to set command. + + * dvi/devdvi/texsy.map: Remove duplicate md entry. + + * ps/devps/eqnchar: Better definition of cdot using md. + * dvi/devdvi/eqnchar: Likewise. + * xditview/devX100/eqnchar: Likewise. + * xditview/devX75/eqnchar: Likewise. + * eqn/lex.c: Add definition of cdot. + +Thu Aug 16 09:33:57 1990 James Clark (jjc at yquem) + + * troff/input.c (get_optional_char): New function. + * troff/input.c (set_page_character): Use get_optional_char(), + rather than has_arg() and tok.get_char(1). + * troff/env.c (tab_character, leader_character, hyphen_char, + field_characters): Likewise. + (margin_character): Likewise. Also always delete the + margin_character_node. + + * troff/input.c (token::get_char): Use token::description. + + * troff/input.c (has_arg): Don't skip over tab and \}. + * troff/number.c (start_number): Give a warning if the number + starts with \} (WARN_RIGHT_BRACE) or tab (WARN_TAB). + +Wed Aug 15 10:04:37 1990 James Clark (jjc at yquem) + + * troff/input.c (empty_name_warning, non_empty_name_warning): New + functions. + (get_name, get_long_name): Use these. Rename `warn' argument to + `required'. + + * troff/node.c (get_fontno): Test that the symbol is not null. + + * troff/input.c (token::description): New function. + * troff/number.c (parse_term): Use token::description in `numeric + expression expected' message. + * troff/groff.h: Add WARN_MISSING. + * troff/number.c (start_number): New function. + * troff/number.c (get_vunits, get_hunits, get_number, get_integer, + get_incr_number): Use start_number(). + * troff/input.c (DEFAULT_WARNING_MASK): Enable WARN_NUMBER by + default. + * troff/input.c (get_name, get_long_name): Use WARN_MISSING. + * troff/reg.c (alter_format): Use WARN_MISSING. Also use + token::descripion. + * troff/input.c (token::get_char): Use WARN_MISSING. + * troff/input.c (token::delimiter): Use token::description. + * troff/env.c (environment_switch): Back out Aug 3 change. + * troff/input.c (has_arg): Skip over \}s and tabs but give a + warning. + * troff/token.h (token::tab): New function. + * troff/node.c (get_fontno): Use tok.skip() rather than has_arg(). + * troff/reg.c (alter_format): Likewise. + * troff/node.c (bold_font): Use has_arg() rather than tok.skip(). + +Tue Aug 14 10:11:21 1990 James Clark (jjc at yquem) + + * troff (most files): Redo warnings. Divide warnings into various + categories; warning() has an additional first argument indicating + the category it falls into. + * troff/input.c (main): -w now takes an argument. New option -W. + (enable_warning, disable_warning): New functions. + + * ps/devps/afmtodit: Add -a option to lie about the italic angle. + * ps/devps/FontMakefile: Pretend TI has an angle of 7. + +Mon Aug 13 10:11:16 1990 James Clark (jjc at yquem) + + * ps/devps/eqnchar: Better definitions of dotdot, vec, dyad, inf. + * xditview/devX100/eqnchar: Likewise. Remove definition of dot. + * xditview/devX75/eqnchar: Likewise. + * dvi/devdvi/eqnchar: Better definitions of vec, dyad, dotdot. + + * eqn/other.c: When bar or over applies to a single character + don't produce an overline_box or an underline_box. Instead produce + an accent_box or an underaccent_box, with the accent a line + whose width is accent_width. New classes underaccent_box, + overline_char_box and underline_char_box. + * eqn/box.h: Move overline_box, underline_box, accent_box class + declarations into eqn/other.c. Add declarations of + make_underline_box, make_overline_box, make_accent_box. + * eqn/eqn.y: Call make_overline_box, make_underline_box + make_accent_box instead of constructors. + * eqn/pbox.h, eqn/box.c: Add accent_width parameter. + + * eqn/other.c: Add accent_box::~accent_box. + * eqn/box.h: Declare it. + + * groff.sh: With -Tps, use eqn -D. + + * eqn/other.c (overline_box::output): Use \Z. If draw_flag use \D + rather than \l. + (underline_box::output): Similarily. + (accent_box::output): Use \Z. + + * xditview/tmac.X: Add definitions of ~ and ^ (so that they are a + bit smaller.) + +Sun Aug 12 09:41:15 1990 James Clark (jjc at yquem) + + * troff/div.c (top_level_diversion::transparent_output(unsigned + char)): Use asciify. + * troff/input.c (asciify): Don't make it static. + * troff/token.h (asciify): Declare it. + + * troff/input.c (get_name, get_long_name, token::get_char, + token::delimiter): Add an extra default argument which says + whether a warning should be printed. + * troff: Pass a non-zero argument to one of these rather than + printing a warning directly. + +Sat Aug 11 09:02:21 1990 James Clark (jjc at yquem) + + * troff: Consistently use symbol::is_null. + + * troff/dictionary.h: Move some inline functions into + dictionary.c. + + * troff/request.h: Move inline functions into input.c. + (request_or_macro::invoke): Make it pure. + + * troff/input.c, troff/reg.h: New class `constant_int_reg'. + * troff/input.c (init_input_requests): Use class constant_int_reg. + (class compatible_reg): Deleted. + * troff/div.c (init_div_requests): Use class constant_int_reg. + (class last_post_line_extra_space_reg): Deleted. + + * troff/env.c (tab_character): Don't change the tab character if + we get an invalid argument. + (hyphen_char): Similarily. + + * troff/reg.c (alter_format): Check that nm is not null. + + * Makefile, groff.sh: Make it possible to customize the commands + used for printing PostScript and dvi files. Also make it possible + to customize the path used by groff.sh. + + * eqn/eqn.y: Make `left' right associative. + +Fri Aug 10 18:20:39 1990 James Clark (jjc at yquem) + + * pic/pic.h: Added definition of M_SQRT2 for those systems that + don't have it. + + * pic/pic.h: Removed definition of INT_MAX. + + * troff/node.c (italic_corrected_node::vertical_extent): Omit + `return'. + + * troff/input.c (token::next): Handle \R like \n. + +Tue Aug 7 09:46:33 1990 James Clark (jjc at yquem) + + * ps/tmac.pc (PSPIC): Simplify. + + * troff/env.c (tab_stops::to_string): + * pic/pic.y (object_type_name): + * pic/troff.c (simple_output::line): + * pic/tex.c (tex_output::spline): + * pic/object.c (object_spec::make_object): + * tbl/main.c (process_data): Add cases to switch statements to + avoid cfront warnings. (Some of these are spurious, since the + switch already has a default case.) + + * ps/tmac.ps (PSPIC): Reformatted. Prefix all local names with + `ps-'. Don't test systat; instead check number of arguments to + ps-bb. + +Mon Aug 6 00:13:07 1990 James Clark (jjc at yquem) + + * macros/tmac.e: Do not decrease the page offset by 0.5i. + + * ps/ps.c (ps_printer::ps_printer): Use mktemp instead of tempnam. + Unlink the file as soon as we have opened it, so that we don't + have to bother with signal handlers. + (handler): Deleted. + (fatal_error_exit): Deleted. + (main): Don't call signal. + + * dvi/tfmtodit.c: Add -k option so that kerns with the skewchar + can be ignored. + * dvi/devdvi/Makefile: Use the -k option with S and MI. + + * pic/pic.y: If there is a label, or an nth construction before + the first `.' in the argument to `with', ignore it and generate a + warning. + * pic/lex.c (lex_warning): New function. + + * tbl/table.c (table::init_output): In section keep and release + macro, use 0 indent when diverting and the correct indent when + rereading. + + * troff/input.c (interpolate_number_format): Do not interpolate + anything if the number register is not defined. + + * tbl/main.c (process_data): Don't add entry when col >= ncolumns. + +Sat Aug 4 08:12:05 1990 James Clark (jjc at yquem) + + * ps/devps/prologue (PICTURE): Set components of graphics state to + their default values. + + * ps/devps/text.enc: Add trademark + * ps/devps/textmap: Add names for club, spade, heart, diamond, + carriagereturn, suchthat. Use Upsilon1 rather than Upsilon. + * ps/devps/symbolchars: Add names for summation and product. + + * dvi/devdvi/texsy.map: Add names for club, spade, heart, diamond, + suchthat. Add pp. Add upper-case letters. + + * xditview/libXdvi/DviChar.c: Add names for club, spade, heart, + diamond, carriagereturn, suchthat. Use Upsilon1 rather than + Upsilon. + + * dvi/devdvi/texsy.map: Rename lA (left angle bracket) to la, and + rA (right angle bracket) to ra. Introduce names for double-headed + arrows and double-barred arrows: <>, va, lA, rA, hA, uA, dA, vA. + * ps/devps/textmap: Likewise for ps device. + * xditview/libXdvi/DviChar.c: Likewise for X100 and X75 devices. + * tty/devascii/R.proto: Rename lA to la and rA to ra. + * tty/devascii/R.proto: Likewise. + * tty/tmac.tty: Provide definitions for \(<>, \(lA, \(rA, \(hA, + \(uA, \(dA. + * eqn/delim.c: In delim_table, rename \(lA to \(la and \(rA to \(ra. + + * xditview/tmac.X: Add definitions for \(fi \(fl \(ff \(Fi \(Fl. + + * eqn/lex.c: Added definitions of `approx', `grad' and `del' to + def_table. + +Fri Aug 3 09:59:27 1990 James Clark (jjc at yquem) + + * troff/div.c (when_request): Use symbol::is_null rather than + has_arg to determine whether we have an argument. + (change_trap): Remove the trap if we get an invalid number. Give + an error if we don't get at least the macro name. + (diversion_trap): Remove trap if we get an invalid name or number. + + * troff/env.c (environment_switch): Pop if we get an invalid + symbol or numeric expression. + + * troff/input.c (do_define_macro): If EOF is encoutered while + defining the macro, do tok.next() before returning. + + * troff/token.h (has_arg): Move definition from here, to ... + * troff/input.c (has_arg): ... here + + * troff/env.c (space_size): Do nothing if we get an invalid argument. + * troff/input.c (shift): Likewise. + + * pic/lex.c (get_token_after_dot): Accept `.center' as a synonym + for `.c'. + + * pic/troff.c (troff_output::start_picture): Comment out calls to + `..'. + + * eqn/main.c (do_file): Subtract 1 from current_lineno if + interpret_lf_args succeeds. + + * eqn/main.c (do_file): Don't recognize delimiter if preceded by + \\. This avoids problems with \$N. + + * groff.sh: Pass -C to preprocessors. + + * lib/lf.c (interpret_lf_args): Be more flexible. + + * tbl/main.c (main): Add -C option. + (table_input::get): Do not recognize TE if followed by character + other than a space or newline unless -C option given. + (process_input_file): Likewise for lf, TS. + (process_data): Likewise for lf in text blocks. + + * eqn/main.c (main): Add -C option. + (do_file): Don't recognize EQ, EN or lf if followed by character + other than space or newline unless -C option given. + * eqn/lex.c (file_input::read_line): Similarily. + * eqn/eqn.h: Declare compatible_flag. + + * etc/soelim.c (main): Add -C option. + (interpret_lf_args): Use version in libgroff. + (do_file): + + * pic/main.c (main): Add -C option, which sets compatible_flag. + (top_input::get), (top_input::peek): If -C option not given, + do not recognize .PS/.PE/.PF/.lf if followed by a character + other than space or newline. + * pic/lex.c (file_input::read_line): Similarily. + * pic/pic.h: Add declaration of compatible_flag. + +Thu Aug 2 11:11:27 1990 James Clark (jjc at yquem) + + * ps/tmac.ps (PSPIC): Avoid use of `echo -n'. + + * troff/node.c, troff/node.h: Add `asciify' methods to classes + derived from node. New class space_char_hmotion_node. + * troff/input.c (asciify_macro): New function. + * troff/input.c (init_input_requests): New request `asciify' bound + to asciify_macro. + * macros/mm.diff: New file. + * Makefile: In install.mm target use `patch' to apply + macros/mm.diff. + + * troff/input.c (macro::print_size): Just print the size in bytes. + + * troff/div.c (return_request): Correct the argument + interpretation. + +Wed Aug 1 12:38:36 1990 James Clark (jjc at yquem) + + * troff/node.h (class composite_node): Add sz member. + * troff/node.c (composite_node::size): Return sz. + * troff/input.c (macro_to_node): Use the initial size in the + environment as the size of the composite_node. + + * troff/node.c (node::zero_width_tprint): Provide a reasonable + default. + +Tue Jul 31 10:07:10 1990 James Clark (jjc at yquem) + + * troff/div.c (change_trap): If we get a bad number expression, + do nothing. + +Mon Jul 30 10:30:49 1990 James Clark (jjc at yquem) + + * lib/matherr.c (matherr): Define this only if math.h defines + TLOSS. + +Sun Jul 29 10:34:27 1990 James Clark (jjc at yquem) + + * troff/div.c (macro_diversion::distance_to_next_trap): If there + no diversion trap return vunits(INT_MAX - vresolution). + +Sat Jul 28 14:28:14 1990 James Clark (jjc at yquem) + + * troff/input.c (do_zero_width): New implementation that doesn't + use a temporary environment. Use instead: + (token::add_to_node_list): New function. + * troff/env.c (environment::get_prev_char_height), + (environment::get_prev_char_height), + (environment::get_prev_char_skew): New functions. + (environment::get_prev_char): New function. + (environment::get_prev_char_width): Change to use get_prev_char. + (init_env_request): Implement new registers .cht, .cdp, .csk. + * eqn/sqrt.c (sqrt_box::output): Don't rely upon the argument to + \Z being processed in a separate environment. + +Fri Jul 27 10:21:25 1990 James Clark (jjc at yquem) + + * tbl/table.c: Removed TABLE_BOTTOM_REG. + + * tbl/table.c (table::init_output): In the section release macro, + give a warning message if the section won't fit on one page. + + * tbl/table.c (table::do_top): Emit table keep only if table is + boxed. + (table::do_bottom): Likewise for table release. + (table::table), (table::add_vertical_rule): Remove reference to + keep member. + * tbl/table.h: Remove keep member. + + * tbl/table.c: New register SUPPRESS_BOTTOM_REG. In + SECTION_RELEASE_MACRO, if there's not enough space before the next + trap to output the diversion, call T# ourselves, set + SUPPRESS_BOTTOM_REG to 1, spring the trap, then set + SUPPRESS_BOTTOM_REG back to 0. In T#, do nothing if + SUPPRESS_BOTTOM_REG is non-zero. In T#, always mark the current + vertical position and return to it before turning traps on again. + +Thu Jul 26 02:54:32 1990 James Clark (jjc at yquem) + + * troff/node.c, troff/node.h: In classes derived from node, + replace prev_char_width method by last_char_node method. + * troff/env.c (environment::get_prev_char_width): Use + node::last_char_node rather than node::get_prev_char_width. + + * Makefile: Added comment about -fno-inline on 68030-based + Apollos. + + * troff/reg.c (number_format_to_ascii), eqn/delim.c (DELIM_TABLE_SIZE), + tty/tty.c (tty_font::load_tty_font), dvi/tfmtodit.c (main): Cast + expressions using sizeof to int. + * dvi/dvi.c (dvi_font::handle_x_command): Avoid long->int warnings. + + * macros/tmac.e (TS): Don't move @f back past the current + position. + +Wed Jul 25 09:11:08 1990 James Clark (jjc at yquem) + + * ps/ps.c (main): Buffer stderr. + * dvi/dvi.c (main): Likewise. + * tty/tty.c (main): Likewise. + + * ps/ps.c (ps_printer::do_import): Improve error handling. + + * troff/input.c (abort_request): Use asciify. + + * driver/printer.h (printer::draw), driver/printer.c (printer::draw), + ps/ps.c (ps_printer::draw), dvi/dvi.c (dvi_printer::draw): Make + type of first argument int rather than char. This works around a + bug on the 68030 based Apollo using g++ 1.37.1. + + * tbl/table.h (class table): Add `keep' member. + * tbl/table.c (table::table): Initialize `keep'. + (table::add_vertical_rule): Set `keep' to 1. + (table::do_top): Only emit table keep macro is `keep' is non-zero. + (table::do_bottom): Likewise for table release macro. + (table::do_row): Emit section keep macro even if the row is 0. + +Tue Jul 24 08:35:07 1990 James Clark (jjc at yquem) + + * macros/tmac.e (@C): Preserve the font family across the change + in environments. + +Mon Jul 23 10:15:23 1990 James Clark (jjc at yquem) + + * lib/font.c: Initialize font::hor and font::vert to 1. + (font::load_desc): Check the values of font::hor and font::vert. + + * lib/lib.h: Added definition of INT_DIGITS. Fix it so that it can + be included in a C compilation. + (iftoa): Use INT_DIGITS. Include lib.h. + (itoa): Likewise. + (as_string): Likewise. + * tbl/table.c: Removed definition of INT_DIGITS. + * eqn/box.c (box::top_level): Use INT_DIGITS + 1 instead of 12. + * troff/input.c (input_input_requests): Likewise. + * ps/ps.c (make_encoding_name): Likewise. + (ps_printer::set_style): Likewise. + (ps_output::put_number): Use 1 + INT_DIGITS + 1 instead of 12. + + * tty/devascii/R.proto: Map fm onto '. + * tty/devlatin1/R.proto: Likewise. + +Sat Jul 21 12:45:07 1990 James Clark (jjc at yquem) + + * tbl/table.c: Use ' instead of DELIMITER_CHAR in places where the + argument to \w is at a different input level. + + * tbl/table.c (table::init_output): Define a new macro + REPEATED_VPT_MACRO, like vpt but if in a diversion also + transparently outputs itself. + (table::define_bottom_macro): Use REPEATED_VPT_MACRO instead of + vpt. + (table::do_row): Likewise. + + * tbl/table.c (vertical_rule::print): Prefix the .sp -1 line with + TRANSPARENT_STRING_NAME. + + * tbl/table.c (table::init_output): In the table release macro + print an error message and don't produce any output if after + issuing the need request the table still will not fit. Also + remove the diversion after bringing it back. + + * tbl/table.c (table::init_output): Define a new macro + REPEATED_MARK_MACRO, like mk but if in a diversion also + transparently outputs itself. + (table::do_row): Mark row_top_reg using REPEATED_MARK_MACRO. This + is necessary because .TH might not call .T#. + (table::do_top): Likewise TOP_REG. + (table::define_bottom_macro): If TOP_REG is no longer valid, use + #T - DOUBLE_LINE_SEP rather than #T. This is necessary because the + table header might contain just the two top rules. + +Fri Jul 20 10:51:42 1990 James Clark (jjc at yquem) + + * troff/div.c: Implement new request `ptr' to print all traps. + + * troff/env.c (init_env_requests): Implement `.tabs' reg with + init_string_env_reg. + * troff/env.c (class tab_reg): Deleted. + +Thu Jul 19 12:07:16 1990 James Clark (jjc at yquem) + + * troff/div.c: New number register .pn returns the number of the + next page as set by the pn request. + + * macros/tmac.an: Redid headers and footers. Number each manual + entry starting from 1 unless \nC is > 0, like Sun. Added an + optional 5th argument to .TH which specifies the manual name and + appears in the center of the header. Understand the X, P and D + registers like Sun. + +Wed Jul 18 10:23:31 1990 James Clark (jjc at yquem) + + * troff/env.c (init_env_requests): New number register `.lt' to + return the title length. + + * troff/node.h (class transparent_dummy_node): New class. + * troff/node.c (class transparent_dummy_node): Provide member + functions. + * troff/env.c (interrupt): Add a transparent_dummy_node, rather + than a dummy_node. + + * troff/input.c (token::next): New escape sequence \). + * troff/input.c (get_copy): Recognize \) in copy mode. + + * troff/input.c (input_stack::clear): New function. + * troff/input.c (exit_request): Use input_stack::clear. + + * troff/token.h: Removed TOKEN_NO_PRINT_CHAR. + * troff/input.c (token::process): Removed case TOKEN_NO_PRINT_CHAR. + + * troff/env.c: Move set_page_character to input.c. Move + page_character to input.c also. + * troff/env.c (title): Split off the reading of the parts of the + title into read_title_parts. + * troff/input.c (read_title_parts): New function. Check the + input_level when testing whether a token matches the delimiter. + + * troff/input.c (exit_request): New function. + * troff/input.c (init_input_requests): Bind ex request to + exit_request rather than exit_groff. + + * troff/input.c (exit_groff): Call tok.next() before + process_input_stack(). + +Mon Jul 16 09:47:23 1990 James Clark (jjc at yquem) + + * troff/env.c: ifdef widow control support on WIDOW_CONTROL. + * troff/env.h: ditto. + * troff/input.c: ditto. + + * troff/env.c (environment::is_empty): Test pending_lines. + + * troff/env.c (environment::have_pending_lines): Removed. + + * troff/input.c: Add request to flush pending lines from the + environment. + + * troff/env.c, troff/env.h: Add automatic widow control feature. + + * troff/input.c (exit_groff): Do process_input_stack() after + do_break() but before setting exit_flag to 2. + + * troff/input.c: Remove FLUSH_PENDING_LINES and + TOKEN_FLUSH_PENDING_LINES. Instead, flush pending lines from + environment after END_TRAP token seen, but only if there aren't + any more traps still unfinished. + * troff/token.h: Remove TOKEN_FLUSH_PENDING_LINES. + +Sun Jul 15 10:50:08 1990 James Clark (jjc at yquem) + + * troff/env.c: Rename the `retain_size' member of class + pending_output_line to `no_fill'. + + * troff/env.c (title): When the line is output, make the + retain_size argument !fill. + + * troff/node.h: Add `hyphenated' member to struct breakpoint. + * troff/node.c (space_node::get_breakpoints), + (dbreak_node::get_breakpoints): Fill this in. + * troff/env.c: Allow specification of maximum number of + consecutive hyphenated lines. + + * troff/env.c (environment::is_empty): Add test for !current_tab. + +Sat Jul 14 11:23:01 1990 James Clark (jjc at yquem) + + * troff/env.c (environment::hyphenate_line): Don't completely give + up if the word is not to be hyphenated; continue so that breaks + can be made at break_char_node's. + + * lib/lib.h: Only define INT_MAX if it's not already defined; + undef INT_MIN if it's already defined. + + * Makefile: Make it easy to define CFRONT_ANSI_BUG. + + * lib/lib.h: If CFRONT_ANSI_BUG is defined, cast INT_MIN to long. + This works around a bug in AT&T C++ 2.0 used with an ANSI C + compiler. + + * macros/tmac.an (an-header): Set no-space mode. + + * macros/tmac.an (TH): Start a new page if necessary. + + * Started using ChangeLog at version 0.4. + +Local Variables: +version-control: never +coding: latin-1 +End: diff --git a/ChangeLog.116 b/ChangeLog.116 new file mode 100644 index 0000000..c3194e4 --- /dev/null +++ b/ChangeLog.116 @@ -0,0 +1,1388 @@ + +Version 1.16.1 released +======================= + +2000-07-31 Werner LEMBERG + + Preparing release 1.16.1. + + * REVISION: Revision number set to 1. + * MORE.STUFF: Added info about port to DOS. + * NEWS, win32-diffs: Updated. + + * src/include/nonposix.h: Remove first line -- this file is used + in C also. + + * Makefile.in (dist): Delete Imakefile earlier to avoid a soft + link to it. + +2000-07-30 Werner LEMBERG + + * doc/texinfo.tex: Update to latest version. + +2000-06-28 Paul Eggert + + * Makefile.in (ENVSETUP): Don't assume POSIX make semantics for + commands that fail. Don't assume that "export a=b" is valid shell + syntax. This is needed for Solaris 2.5.1. + + * src/libs/libgroff/tmpfile.cc, src/utils/indxbib/indxbib.cc: Fix + comment about missing Solaris headers. + + * PROBLEMS: Add section about problems with Sun Make and VPATH. + +2000-06-25 Werner LEMBERG + + * src/devics/grodvi/dvi.cc: Replace _setmode() (for MSC) with + SET_BINARY(). + + * src/include/posix.h: Use HAVE_UNISTD instead of _MSC_VER. + + * win32-diffs: Updated. + * README.WIN32: Added CRs to make all Windows editors happy. + + * src/roff/troff/node.cc: Added WIFSIGNALED() macro (copied from + src/roff/groff/pipeline.c). + +2000-06-23 Eli Zaretskii + + * src/roff/grog/Makefile.sub (grog): Prepend `-e' to + $(SH_SCRIPT_SED_CMD), for the case where its value is empty. + +2000-06-17 Eli Zaretskii + + * src/utils/tfmtodit/tfmtodit.cc: #include nonposix.h. + (tfm::load, gf::load): Open tfm and gf files in binary mode: these + are binary files. + (main): Support non-Posix systems with several different styles of + slash characters in file names. + + * src/utils/pfbtops/pfbtops.c: #include nonposix.h. + (main) [SET_BINARY]: Switch stdin into binary mode. + + * src/utils/indxbib/indxbib.cc: #include nonposix.h. + (main): Support file names with several possible slash-type + characters, as given by DIR_SEPS[] in nonposix.h. + (main) [__MSDOS__]: If renaming the temporary index file fails + because it has more than one dot in its trunk, replace the dot + with an underscore and try again. + (do_file): Use FOPEN_RB instead of "r". Skip every CR before a + Newline. + [__MSDOS__ || _MSC_VER]: Stop at the first ^Z character. + + * src/utils/hpftodit/hpftodit.cc: #include nonposix.h. + (File::File): Open the input file in binary mode. Strip CR + characters from each CR-LF pair. + (xbasename): Support file names with several possible slash-type + characters, as given by DIR_SEPS[] in nonposix.h. + + * src/include/Makefile.sub (HDRS): Add nonposix.h. + + * src/roff/troff/node.cc [HAVE_UNISTD_H]: Include . + (WIFEXITED, WEXITSTATUS, WTERMSIG, WIFSTOPPED, WSTOPSIG) + [!_POSIX_VERSION]: Define for traditional Unix systems. + (real_output_file::real_output_file): Remove the MSVC-specific + call to popen, use instead POPEN_WT, appropriately defined on + nonposix.h. #include nonposix.h. + (real_output_file::~real_output_file): Remove the MSVC-specific + call to pclose, a suitable macro is now defined on nonposix.h. + Use the portable macros WIFEXITED, WIFSIGNALED, WTERMSIG, WSTOPSIG + and WEXITSTATUS instead of assuming traditional Unix + interpretation of the status returned by pclose. + + * src/roff/troff/input.cc (pipe_source): Remove the MSVC-specific + call to popen, use POPEN_RT instead (appropriately defined on + nonposix.h). #include nonposix.h. + (ps_bbox_request): Open the PostScript file in binary mode. + Close the file after processing it. + (getpid) [_MSC_VER]: Remove; a suitable macro is now defined on + nonposix.h. + + * src/roff/groff/pipeline.c (run_pipeline) [__MSDOS__ || _WIN32]: + A version of run_pipeline that doesn't use `fork'. + (signal_catcher) [__MSDOS__ || _WIN32]: New function. + (system_shell_name, system_shell_dash_c) + (is_system_shell) [__MSDOS__ || _WIN32]: New functions, to hide + the ugliness of testing DOS/Windows file names for equality, and + support both stock shells and ports of Unix shells. + + * src/roff/groff/groff.cc: #include nonposix.h. + (BSHELL): Definition moved to nonposix.h. + (main): Use PATH_SEP[0] instead of literal ':'. Use BSHELL_DASH_C + instead of a literal "-c". + (xbasename): Support file names with several possible slash-type + characters, as given by DIR_SEPS[] in nonposix.h. + (possible_command::print): Use BSHELL_DASH_C and IS_BSHELL instead + of literal strings. + + * src/preproc/soelim/soelim.cc: #include nonposix.h. + (do_file): Use IS_ABSOLUTE instead of testing for a literal '/'. + + * src/preproc/pic/Makefile.sub (YTABH): Change pic.tab.h to + pic_tab.h. + + * src/preproc/pic/lex.cc: Change pic.tab.h to pic_tab.h. + + * src/preproc/eqn/Makefile.sub (YTABH): Rename eqn.tab.h to + eqn_tab.h. + + * src/preproc/eqn/lex.cc: #include eqn_tab.h, not eqn.tab.h. + + * src/libs/libgroff/tmpfile.cc (DEFAULT_TMPDIR) [P_tmpdir]: If + P_tmpdir is defined, use it instead of the literal "/tmp". + (remove_tmp_files, add_tmp_file): New functions. + (xtmpfile): Record temporary files and register an atexit function + to delete them explicitly, instead of relying on the OS to do + that, which doesn't work on non-Unix systems. + + * src/libs/libgroff/searchpath.cc: #include nonposix.h. + (search_path::search_path): Use PATH_SEP instead of a literal + colon. + (search_path::command_line_dir): Ditto. + (search_path::open_file): Use IS_ABSOLUTE, PATH_SEP and DIR_SEPS, + to support non-Posix systems. + + * src/libs/libbib/search.cc: #include nonposix.h. + (search_list::add_file): Open the file in binary mode. + + * src/libs/libbib/linear.cc: #include nonposix.h. + (file_buffer::load): Remove \r characters preceding \n from the + loaded buffer. + + * src/libs/libbib/index.cc: #include nonposix.h. + (make_index_search_item): Open index_filename in O_BINARY mode. + (index_search_item_iterator::get_tag): Ditto. Remove \r + characters before \n characters. + (index_search_item::check_files): Open files in binary mode. + (index_search_item::munge_filename): Support DOS-style file names + with backslashes and drive letters, use IS_ABSOLUTE. + + * src/devices/grops/ps.cc: #include nonposix.h. + (main) [SET_BINARY]: Switch stdout to binary mode. + + * src/devices/grolj4/lj4.cc: #include nonposix.h. + (main) [SET_BINARY]: Switch stdout to binary mode. + + * src/devices/grolbp/lbp.cc: #include nonposix.h + (fill_pattern) [SET_BINARY]: Switch stdout to binary mode. + + * src/devices/grodvi/dvi.cc: #include nonposix.h. + [_MSC_VER]: Remove inclusion of Windows-specific headers (done by + nonposix.h). + (main) [SET_BINARY]: Switch stdout to binary mode. + [_MSC_VER]: Remove an explicit call to _setmode. + + * src/include/nonposix.h: New file. + + * Makefile.in (ENVSETUP): New variable, to set up case-sensitive + operation when building with DJGPP. + ($(TARGETS), dot, $(LIBDIRS), $(CPROGDIRS), $(CCPROGDIRS)) + ($(DEVDIRS), $(TTYDEVDIRS), $(INCDIRS), $(OTHERDIRS)): Use + ENVSETUP. + + * Makefile.comm: mv y.tab.[ch] to y_tab.[ch], to make it work on + MS-DOS. + (.man.n): Replace `;' with `|', since FONTPATH, MACROPATH, + etc. can include a semi-colon on DOS/Windows. + (depend.temp): Use depend1.temp instead of depend.temp1, to + prevent files from overerwiting each other on 8+3 filesystems. + + * gendef.sh (t): Change definition to work with DOS/Windows. + + doc/groff.texinfo: Apart of some typo corrections, I also changed + some index entris, to make them more non-ambiguous, and also put + @ignore around some parts that are not yet written, to allow the + Info output be readable. + +2000-06-10 Gael Queri + + Replaced specific checks for function declarations with a generic + routine taken from GNU bfd. + + * aclocal.m4 (GROFF_NEED_DECLARATION): New function. + GROFF_PUTENV, GROFF_POPEN, GROFF_PCLOSE, GROFF_HYPOT: Removed. + * configure.in: Use it. + * src/devices/grolbp/lbp.cc, src/include/lib.h, + src/preproc/grn/hgraph.cc, src/preproc/pic/pic.h, + src/roff/groff/groff.cc: Use it. + * Makefile.in, configure: Updated. + +2000-06-07 Paco Andrés Verdú + + * src/devides/grolbp/lbp.h: Removed unused variables. + +2000-05-31 Keith Thompson + + * src/devices/grolbp/lbp.cc (set_papersizes): Add declaration of + strncasecmp(). + +2000-05-31 Werner LEMBERG + + * aclocal.m4 (GROFF_SRAND): New function to test the return value + of srand() -- at least SunOS 4.1.3 uses `int' instead of `void'. + * configure.in: Use it. + * src/preproc/pic/pic.y, src/preproc/pic/pic.cc: Use it. + * configure, Makefile.in: Updated. + + * configure.in: Add test for strncasecmp(). + * src/include/lib.h: Use it. + +2000-05-29 Andrej Borsenkow + + * src/preproc/grn/Makefile.sub: Add MLIB. + +2000-05-29 Nix + + * Makefile.in: Use @datadir@ and @mandir@ appropriately. + +2000-05-29 Werner LEMBERG + + * src/roff/grog/Makefile.sub, src/roff/grog/grog.sh: Add `@g@'. + + * PROBLEMS: Small update. + + * src/devices/grolbp/lbp.cc: Various small fixes. + +2000-05-28 Keith Thompson + + * src/roff/nroff/nroff.sh: Fix main loop syntax. + + * src/utils/indxbib/indxbib.cc: Add declaration of mkstemp(). + +2000-05-25 Werner LEMBERG + + * man/roff.man: Removed unused macro. + +2000-05-24 Werner LEMBERG + + * Makefile.in (dist): Remove src/xditview/Imakefile explicitly. + This is needed e.g. if you do + `make distclean; ./configure; make dist'. + +Version 1.16 released +===================== + +2000-05-23 Werner LEMBERG + + Adding font CWI (constant width italic) to devdvi. + + * font/devdvi/CWI: New file. + * font/devdvi/generate/Makefile: Add generating rule. + * font/devdvi/DESC.in, font/devdvi/Makefile.sub, win32-diffs, + tmac/tmac.dvi: Use it. + * NEWS: Announce it. + + * font/devlj4/*: Regenerated (only adding kernings for `cq' glyph). + * font/devlj4/generate/Makefile: Cosmetic changes only. + + * man/groff.man: Removed most of the redundant description of + special characters (which is in groff_char.man). Added font + translation CB->CR for devdvi. Other minor fixes. + + * tmac/tmac.dvi: Improved appearance of \(co (copyright) and \(rg + (registered) symbols. + +2000-05-22 Werner LEMBERG + + * doc/Makefile: Added rule for creating info files. + + * font/devdvi/*: Added kernings for `cq' glyph. Updated to latest + AMS font metrics. + * font/devdvi/generate/Makefile: Fixed dependencies. + + * font/devps/*: Regenerated. Heavy changes for Bookman and + NewCentury Schoolbook! + * font/devps/generate/afmname: Will now run with GNU awk. + * font/devps/generate/textmap: Added forgotten `cq' glyph name. + * font/devps/generate/Makefile: Cosmetic changes only. + +2000-05-21 Werner LEMBERG + + * tmac/tmac.an: Added a new command line option `-rSxx' (`xx' can be + 10, 11, or 12) to support output with 11pt and 12pt base font sizes. + `.SS' now produces a heading with a smaller size than `.SH'. + Completely formatted. + * doc/groff.texinfo, tmac/groff_man.man, NEWS: Document it. + + * man/groff.man: Improved table appearance. Use of `eo' request + to reduce number of doubled backslashes in macro definitions. + Replacing `\e' with `\(rs'. Other minor fixes. + + * src/preproc/tbl/main.cc: Insert HTML table end tag before `lf' + to have correct line number. + + * INSTALL: Small improvement. + +2000-05-20 Bernd Warken + + * man/roff.man, tmac/groff_tmac.man: Updates (with corrections by + WL). + +2000-05-19 Bernd Warken + + * man/groff.man: Complete update (with a lot of corrections by WL). + +2000-05-18 Werner LEMBERG + + Adding `cq' (PS name `quoteright') glyph name as an alias for "'". + + * font/*/*: Implement it. + * man/groff_char.man, NEWS: Document it. + + * src/include/unix.h: Removed. It isn't used. + + * doc/groff.texinfo: Slight improvements. + +2000-05-17 Werner LEMBERG + + * README, win32-diffs: Small fixes and improvements. + +2000-05-16 Werner LEMBERG + + * FDL: New file (the Free Documentation License version 1.1). + + * doc/groff.texinfo: Added many start-up values for gtroff. + Some structural improvements of the source code. + +2000-05-15 Werner LEMBERG + + * src/roff/troff/input.cc: Added small comment about troffrc-end. + * src/roff/troff/troff.man: Added info about troffrc-end. + +2000-05-14 Werner LEMBERG + + * Makefile.in (EXTRADIRS): Fix typos. + (dist): Handle deletion of old .tar.gz file correctly. + (DISTDIRS): Include all tty output devices. + + * doc/groff.texinfo: Adding more cross references; countless other + fixes. + +2000-05-13 Werner LEMBERG + + * MORE.STUFF: Added Robert Marks's utilities. + +2000-05-12 Werner LEMBERG + + Added win32 port contributed by Blake McBride + . + + * README.WIN32, win32-diffs: New files. + * NEWS: Updated. + + * src/preproc/grn/hgraph.cc (HGSetBrush): Replace `%lf' with `%f'. + (tmove, tmove2): Added parentheses to avoid compiler warnings. + (change): Removed unused variables. + + * src/preproc/grn/main.cc (main, conv): Removed unused variables. + (savebounds): Changed return value from `int' to `void'. + * src/preproc/grn/hdb.cc: Ditto. + + * src/devices/grolbp/lbp.cc (lbp_printer::draw): Removed superfluous + final backslash in comment to avoid compiler warning. + + * src/utils/pfbtops/pfbtops.c: Added `getopt.h'. + + * doc/groff.texinfo: More fixes. + +2000-05-11 OKAZAKI Tetsurou + + * tmac/tmac.doc: Documentation fix. + +2000-05-11 Werner LEMBERG + + * doc/groff.texinfo: Reading the source code shows up a lot of + omissions and incorrect data... More conversion to @Deffn macros. + +2000-05-10 Werner LEMBERG + + * src/roff/troff/reg.cc (number_value_to_ascii): Remove ASCII + dependency. + + * src/roff/troff/request.h: Removing unused `no_break_flag'. + +2000-05-09 Werner LEMBERG + + * man/groff.man, man/roff.man, tmac/groff_tmac.man: Minor + improvements. + + * doc/groff.texinfo: Extended history section. More conversion to + @Deffn macros. More .tr documentation. + +2000-05-07 Werner LEMBERG + + * doc/groff.texinfo: Completed tab section. Added info about + fields. + +2000-05-06 Mike MacIsaac + + * PROBLEMS: Describe configure script fix for OS/390 Unix. + +2000-05-05 Werner LEMBERG + + * font/devdvi/DESC.in: Change size 11pt to 10.95pt (as used in + LaTeX 2e). + * NEWS: Document it. + + * man/troff.man: Minor optical improvements. + +2000-05-03 Werner LEMBERG + + Adding `dq' (PS name `quotedbl') glyph name as an alias for `"'. + + * font/*/*: Implement it. + * man/groff_char.man, NEWS: Document it. + +2000-05-02 Werner LEMBERG + + * tmac/groff_tmac.man, man/groff.man, man/roff.man: Fixing @MANxEXT@ + expansion. + * NEWS: Document the three new man pages. + + * aclocal.m4 (GROFF_CXX_CHECK): Removing obsolete AC_C_CROSS call. + * configure: Updated. + + * font/devcp1047/R.proto: Fixing fatal bug (a missing `"' character). + +2000-05-01 Werner LEMBERG + + Added grap support to grog. + + * src/roff/grog/grog.sh, src/roff/grog/grog.pl: Implement it. + * src/roff/grog/grog.man: Document it. + + * doc/groff.texinfo, NEWS: Add info about grap support. + + Add new man pages comptributed by Bernd Warken + (with slight fixes by me). + + * tmac/groff_tmac.man: New file documenting tmac mechanism. + * tmac/Makefile.sub: Add groff_tmac.man. + * man/roff.man: New file giving overview of roff system. + * man/troff.man: A short reference of troff. + * man/Makefile.sub: Add roff.man and troff.man. + +2000-04-30 Werner LEMBERG + + Added grap support to groff. + + * src/roff/groff/groff.cc: Implement it. + * src/roff/groff/groff.man: Document it. + + * src/devices/grotty/grotty.man: Add cp1047 device. + * src/preproc/eqn/eqn.man, src/preproc/eqn/neqn.sh, tmac/eqnrc: + Ditto. + * src/roff/groff/groff.man: Ditto. + * src/roff/nroff/nroff.sh, src/roff/nroff/nroff.man: Ditto. + * doc/groff.texinfo: Ditto. + + * tmac/troffrc: Fix mapping of latin-1 char 160 (non-breakable space) + for cp1047. + +2000-04-29 Werner LEMBERG + + * man/groff_char.man: Add `pc' glyph. + * tmac/tmac.latin1: Replacing `md' glyph with `pc'. + * tmac/tmac.tty: Add `pc' glyph. + * tmac/tmac.tty-char: Use/add `pc' glyph. Don't call tmac.latin1 if + we use cp1047 output device. + + * Makefile.in, aclocal.m4: Don't build utf8 on EBCDIC hosts since + there are still hardcoded latin1->unicode values in utf8's font + definition files. + * configure: Updated. + * NEWS: Minor clarification. Updated. + + * PROBLEMS: Formatted. Added info about C++ fix pack for OS/390 + Unix. + +2000-04-28 Werner LEMBERG + + Adding EBCDIC code page 1047. + + * font/devcp1047/R.proto, font/devcp1047/Makefile.sub, + font/devcp1047/DESC.proto: New files. + + * aclocal.m4 (GROFF_EBCDIC): Introduce TTYDEVDIRS which can be + either ascii/latin1 or cp1047. + * Makefile.in: Use it. + * configure: Updated. + + Replacing and/or adding `md' (mathdot) glyph with `pc' + (periodcentered) in all text fonts. + + * font/*/*: Change it. + +2000-04-27 Werner LEMBERG + + * aclocal.m4 (GROFF_OS390): Fixing compiler flags. + + * configure.in: Add check for strings.h. + * src/include/driver.h: Use HAVE_STRINGS_H. + * src/devices/grolbp/lpb.cc: Remove string.h. + + * src/include/groff-getopt.h: New file. It will be used instead of + getopt.h (to be included in lib.h) to avoid endless problems with + picky C++ compilers. + * src/include/lib.h: Use groff-getopt.h. + * src/include/Makefile.sub: Updated. + + * configure: Updated. + * Makefile.in: Updated. + + * NEWS: Mention EBCDIC support. + +2000-04-26 Werner LEMBERG + + * TODO: Some additions. + +2000-04-25 Werner LEMBERG + + * src/roff/troff/troff.man, doc/groff.texinfo: Fixing documentation + of mso request. + +2000-04-23 Werner LEMBERG + + * src/roff/troff/troff.man: Minor fixes. + +2000-04-22 Werner LEMBERG + + * src/roff/troff/troff.man, doc/groff.texinfo, NEWS: Document the + `.T' string register and the incompatible definition of the `.T' + number register (compared to Unix troff). + + * man/groff_char.man: Add some missing characters. + * font/devutf8/NOTES: Update. + +2000-04-21 Werner LEMBERG + + * src/include/htmlindicate.h, src/include/lib.h, + src/include/posix.h: Fix copyright. + + * src/include/Makefile.sub: Update. + +2000-04-20 Werner LEMBERG + + * src/roff/troff/input.cc (input_char_description): Removing + superfluous space char. + + * tmac/tmac.X: Fix typo \(bq -> \(Bq. + + * doc/groff.texinfo: Document EBCDIC. + +2000-04-19 Werner LEMBERG + + Introducing `shc' as the glyph name for the soft hyphen character. + + * tmac/tmac.tty, tmac/tmac.latin1, tmac/tmac.html, + font/devlatin1/R.proto: Use it. + + * NEWS: Updated. + +2000-04-18 Werner LEMBERG + + * src/devices/grops/ps.cc (ps_printer::flush_sbuf): Removing + dependency on ASCII order. + +2000-04-16 Sandor BARANY + + * src/libs/libgroff/illegal.c: Added EBCDIC table. + * src/roff/troff/input.cc: Added adaptation to EBCDIC. + + * src/preproc/refer/refer.cc, src/roff/troff/env.cc: Minor changes + to increase portability. + +2000-04-15 Werner LEMBERG + + * aclocal.m4: Added GROFF_EBCDIC and GROFF_OS390 tests. + Redefined AC_OUTPUT_MAKE_DEFS to replace ASCII character `012' with + the generic `\n' if under OS/390 Unix. + + * configure.in: Call GROFF_EBCDIC and GROFF_OS390. + + * configure: Regenerated. + +2000-04-14 Werner LEMBERG + + * doc/groff.texinfo: More conversions to @Deffn. + +2000-04-12 Werner LEMBERG + + * tmac/tmac.psfig: Fix incorrect use of `&' operator by replacing it + with `:'. + + * src/roff/nroff/nroff.man: Add note about tmac.tty-char. + +2000-04-10 Werner LEMBERG + + * doc/groff.texinfo: More conversions to @Deffn. + +2000-04-08 Werner LEMBERG + + * src/libs/libgroff/{getopt.c,getopt1.c}, src/include/getopt.h: + Updated to latest version (glibc 2.1.3). + +2000-04-07 Werner LEMBERG + + * doc/Makefile (clean): Include more index files. + Add rule texinfo->dvi. + +2000-04-05 Werner LEMBERG + + * doc/groff.texinfo: Added new index `op' for operators. More + info on end of sentence characters. More use of @Deffn. + +2000-03-30 Werner LEMBERG + + * */*.man: Adding a note that a whitespace can be inserted between + a command line option and its parameter -- we are using GNU getopt. + + * src/roff/groff/groff.man: Add example of `-m mandoc'. + +2000-03-28 Werner LEMBERG + + Correct anachronism of calling the man macro file with `-man' + instead of `-m man' etc. + + * tmac/tmac.man, tmac/tmac.mandoc, tmac/tmac.markup, tmac/tmac.mdoc, + tmac/tmac.me, tmac/tmac.ms: New files tmac.m which simply + load tmac.. + + * tmac/Makefile.sub: Updated. Take care of $(tmac_an_prefix) etc. + + * NEWS: Updated. + + * doc/groff.texinfo: Updated. + + * tmac/groff_man.man: Copyright added. + +2000-03-27 Werner LEMBERG + + * doc/groff.texinfo: Introducing macros `Deffn' and `Defmac' to + typeset the request resp. escape name with a tt font -- due to a + bug in texinfo.tex it is necessary to use the `-e' switch with + texi2dvi. + + Improving info about usage of groff units. + + Other minor fixes. + +2000-03-20 Werner LEMBERG + + * doc/groff.texinfo: Added section about man macro package + (I've basically taken groff_man.man). Introducing new indices `ma' + for macros/strings and `gl' for glyph names. Other minor fixes. + + * tmac/groff_man.man: Fixed some typos. + +2000-03-19 Werner LEMBERG + + * doc/groff.texinfo: Removed all occurrences of `you', `we', etc. + Other minor fixes. + + * doc/texinfo.tex: New file. + +2000-03-18 Werner LEMBERG + + * doc/groff.texinfo: Improved section on number registers. Other + minor updates. + +2000-03-16 Werner LEMBERG + + * src/roff/groff/groff.man: Added info about grolbp. Make nicer + synopsis. + + * src/devices/grolbp/grolbp.man, src/roff/nroff/nroff.man, + src/devices/grolj4/grlj4.man, src/devices/grops/grops.man, + src/preproc/eqn/eqn.man, src/utils/afmtodit/afmtodit.man, + src/utils/tfmtodit/tfmtodit.man: Make nicer synopsis. + + * src/preproc/grn/grn.man: Better synopsis; added copyright. + + * src/roff/grog/grog.man: Updated copyright date. + +2000-03-14 Francisco Andrés Verdú + + * configure.in: Added test for strdup. + + * src/devices/grolbp/lbp.cc: Added a strdup() version in case none + is available. + + Replaced dynamic allocation of arrays `[...]' with `new' operator. + + Other minor fixes. + +2000-03-12 OKAZAKI Tetsurou + + * Makefile.comm: Add $(INCLUDES) to $(ALL_CFLAGS). + +2000-03-11 Werner LEMBERG + + * src/preproc/grn/hdb.cc (DBGetType): Added return value to make + compilers silent. + * src/preproc/grn/hgraph.cc: Add #ifdef for hypot(). + * src/include/lib.h: Remove some spaces. + +2000-03-10 Werner LEMBERG + + * src/libs/libgroff/tmpfile.cc (xtmptemplate, xtmpfile): Removing + initializers from arguments (some compilers don't like this). + +2000-03-09 Gaius Mulley + + * src/libs/libgroff/htmlindicate.cc: Added library file which is now + used by pic and eqn to tell grohtml where the graphic regions start + and end. + * src/libs/libgroff/Makefile.sub: Use it. + * src/preproc/eqn/main.cc, src/preproc/pic/troff.cc: Altered to use + graphic_start() and graphic_end() from htmlindicate.cc. + +2000-03-09 Werner LEMBERG + + * tmac/tmac.safer: Will now work correctly in compatibility mode. + * tmac/groff_man.man: More fixes. + +2000-03-08 Werner LEMBERG + + * doc/Makefile: Added texput.log to the `clean' target. + * doc/groff.texinfo: Added info about delimiters for escapes. + +2000-03-08 Bernd Warken + + * src/preproc/pic/pic.man: Add info on conversion of pic images to + other graphic formats. + +2000-03-07 OKAZAKI Tetsurou + + * Makefile.in, Makefile.sub, src/preproc/eqn/Makefile.sub, + src/roff/groff/Makefile.sub, src/roff/nroff/Makefile.sub, + src/utils/afmtodit/Makefile.sub: Use $(INSTALL_SCRIPT) for script + files. + +2000-03-07 Werner LEMBERG + + * doc/groff.texinfo: Spelling fixes. + +2000-03-06 Werner LEMBERG + + * tmac/groff_man.man: Completely revised to cover everything in + tmac.an. + + * doc/groff.texinfo, src/roff/troff/troff.man: Document evc request. + Other minor fixings. + * src/roff/troff/env.cc (environment_copy): Improve error message and + fix itoa->i_to_a. + * src/roff/troff/TODO: Updated. + + * doc/Makefile: Bug fixes -- this is still provisional, though... + + * tmac/eqnrc: Small fixes. + +2000-03-05 Abramo Bagnara + + Adding a request `evc' to copy environments. + + * src/roff/troff/env.cc (environment::copy, environment_copy): + Implement it. + * src/roff/troff/env.h: Add prototype. + +2000-03-05 Francisco Andrés Verdú + + Adding strsep() -- Solaris 8 doesn't have it. + + * configure.in: Test it. + * src/devices/grolbp/lbp.cc: Add code. + +2000-03-05 Werner LEMBERG + + * src/roff/troff/div.cc (macro_diversion::output, + top_level_diversion::output): Fixing an incompatibility with + original troff: \x'0' updates the .a register also. Thanks to + for pointing this out. + * doc/groff.texinfo: Document it. + + * Makefile.in: Create Makefile.dep if necessary before calling the + submake process to avoid warning about nonexistent file. + + * NEWS, PROJECTS: Updated. + +2000-03-04 Werner LEMBERG + + * tmac/troffrc: Add tmac.lbp. + +2000-03-03 Francisco Andrés Verdú + + * tmac/tmac.lbp: New file. + * src/devices/grolbp/grolbp.man: Add documentation of `lbpname' + command. + +2000-03-03 Werner LEMBERG + + * Makefile.in: Fixing $(subdir). + + * README, NEWS: Small fixes. + + * test-groff: Adding path to grolbp. + + * configure.in: The (new) file src/xditview/Imakefile.in will be + also configured -- it is now possible to build gxditview in a + directory different from $srcdir. + +2000-03-02 Blake McBride + + * src/libs/libgroff/searchpath.cc (open_file): Adapting to WinNT. + + * MORE.STUFF: Added website of bell labs and info about plot2dev. + +2000-03-01 Colin Phipps + + * src/utils/indxbib/indxbib.cc (main): Use mkstemp() for temporary + files. + +2000-02-29 Werner LEMBERG + + Adding GNU getopt to the groff distribution. + + * src/include/getopt.h, src/libs/libgroff/{getopt.c,getopt1.c}: + New files. + * src/include/Makefile.sub, src/libs/libgroff/Makefile.sub: Update. + * aclocal.a4: Remove GROFF_GETOPT function. + * configure.in, Makefile.in, PROBLEMS: Update. + * src/include/lib.h: Replace getopt tests with getopt.h. + * src/devices/grolbp/lpb.cc: Remove inclusion of getopt.h. + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + + * man/groff_out.man: Fix nroff mode activation (for emacs). + * man/groff_font.man: Add missing ligature. + +2000-02-28 Werner LEMBERG + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + + * src/devices/grolbp/grolbp.man: Added a comment line at the + beginning of the file (similar to shell scripts) which indicates + that `tbl' should be used as a preprocessor. + +2000-02-27 Blake McBride + + Adapting groff to MS Visual C++ 6.0 compiler (tested with + Windows NT 4.0). Uses _MSC_VER define where necessary. + + * src/devices/grodvi/dvi.cc: Making stdout a binary stream. + * src/devices/grolj4/lj4.cc: Making getopt variables `extern "C"'. + * src/devices/grohtml/html.cc, src/devices/grops/ps.cc, + src/include/lib.h, src/libs/libgroff/errarg.cc, + src/libs/libgroff/itoa.c, src/libs/libgroff/nametoindex.cc, + src/preproc/refer/label.y, src/preproc/refer/label.cc, + src/roff/groff/pipeline.c, src/roff/troff/column.cc, + src/roff/troff/div.cc, src/roff/troff/env.cc, + src/roff/troff/input.cc, src/roff/troff/node.cc, + src/roff/troff/reg.cc: Renaming itoa() to i_to_a() and iftoa() to + if_to_a() to avoid name clashes. + * src/include/posix.h: Don't use unistd.h. + * src/libs/libgroff/tmpfile.cc: Use `#ifndef...#else...#endif' + clause for integrating non-Unix xtmpfile() code. + * src/roff/troff/input.cc: Adding `public' keyword to macro_header + structure; use "rt" for popen() in pipe_source(); add getpid() + dummy function. + * src/roff/troff/node.cc: Use special versions of popen() in + real_output_file() and pclose() in ~real_output_file(). + +2000-02-27 Werner LEMBERG + + Adding a new driver, grolbp, for Canon CAPSL printers (LBP-4 and + LBP-8 series laser printers). This code has been contributed by + Francisco Andrés Verdú . + + * src/devices/grolbp/*: The grolbp output device. + * font/devlpb/*: The font description files. + * Makefile.in: Add grolpb and devlbp subdirectories. + + * src/devices/grodvi/grodvi.man, src/devices/grolj4/grolj4.man, + src/devices/grotty/grotty.man,src/roff/troff/troff.man: Minor + typographic fixes. + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + + * NEWS: Updated. + + * src/devices/grolbp/Makefile.sub: Adding $(srcdir). + + * man/groff_font.man: Adding info about obsolete DESC keywords. + * src/devices/grolj4/grolj4.man: Documenting additional DESC + keywords. + +2000-02-26 Werner LEMBERG + + * src/preproc/grn/grn.man: Added info about the gremlin file format + (contributed by Daniel Senderowicz ). + +2000-02-25 Werner LEMBERG + + * src/preproc/grn/main.cc: Allow values of `narrow' parameter and + friends to be non-integer. + + * src/preproc/grn/grn.man: Document it. + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + +2000-02-24 Werner LEMBERG + + * src/preproc/grn/main.cc: Introduce BASE_THICKNESS, defining + line thicknesses to be integer multiples of this value. + + * src/preproc/grn/grn.man: Commenting out the -s option -- the + corresponding code doesn't work (yet). + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + +2000-02-23 Werner LEMBERG + + * src/preproc/grn/{main.cc, hgraph.cc}: Using point units to + specify line thickness instead of base units. The new default + values are now 0.15,pt 0.45pt, and 0.75pt for thin, middle, and + thick lines respectively. + + Removed unused variable `prevval'. + + * src/preproc/grn/grn.man: Updated. + +2000-02-22 Werner LEMBERG + + * src/preproc/grn/main.cc: Slight formatting. + + * src/roff/groff/groff.man: Formatting fix. + * src/preproc/grn/grn.man: Ditto. + + * src/roff/grog/grog.pl: Fixing two embarassing bugs. + + * doc/groff.texinfo: Further checking/updating. + +2000-02-21 Werner LEMBERG + + * README, INSTALL, PROJECT, PROBLEMS, BUGREPORT: Updated. + + * test-groff: Added grn subdir to path. + + * doc/groff.texinfo: Some restructing and other small improvements. + + * src/roff/groff/groff.cc (help): Fixed info string. + +2000-02-20 Werner LEMBERG + + * doc/meref.me: Fix description of .GS request. + + * src/roff/troff/troff.man: Fixing typo. + + Adding the `grn' preprocessor for gremlin graphic files. + + * src/preproc/grn/*: This is the Berkeley distribution written by + David Slattengren and Barry Roitblat, adapted to groff by Daniel + Senderowicz and Werner Lemberg. + + * doc/grnexampl.{me,g}: A sample for grn. + + * Makefile.in: Added subdirectory entry for grn. + + * src/roff/groff/groff.cc: Added support for grn. It can be now + called with the switch `-g'. + + * src/roff/groff/groff.man: Updated. + + * src/roff/grog/grog.{man,pl,sh}: Updated. + + * NEWS: Updated. + +2000-02-11 Gaius Mulley + + * src/include/lib.h: Added xtmptemplate and made xtmpfile + parametrically polymorphic. + + * src/libs/libgroff/tmpfile.cc: Implemented xtmptemplate + and the alterations to xtmpfile. + xtmpfile can be requested to return the filename created + and asked not to unlink the temp file. The default behaviour + if parameters are absent is exactly the same as before. + +2000-02-11 Abramo Bagnara + + A new request `length' is available which returns the length of a + string in a number register: + + * src/roff/troff/input.cc (length_macro): Implement it. + * src/roff/troff/input.cc (init_input_requests): Register it. + +2000-02-11 Werner LEMBERG + + * doc/groff.texinfo, src/roff/troff/troff.man: Add documentation + of the `substring' request. + + * src/roff/troff/troff.man, doc/groff.texinfo: Document `length' + request. + + * src/roff/troff/TODO, NEWS: Updated. + +2000-02-09 Werner LEMBERG + + * src/roff/groff/groff.man: Added an example. + +2000-02-06 Werner LEMBERG + + I've considerably modified the directory structure of the + distribution to get a more vertical layout. For example, the number + of top level directories has been reduced from 42 to 6. + + As a consequence, many changes, especially to the makefiles, were + necessary: + + * The makefile variables `top_builddir' and `top_srcdir' have been + introduced. Virtually all relative paths have been replaced with + absolute ones using these two variables. + + * Dependencies (in the files `Makefile.dep') are no longer part of + the distribution. Instead, they are created during a `make install' + in the build directory. + + * aclocal.m4 (GROFF_SRCDIR, GROFF_BUILDDIR): Two new functions to + make `top_srcdir' and `top_builddir' absolute. + + Some other changes: + + * Man pages now depend on the files `VERSION' and `REVISION'. + + * The added shell script `mkinstalldirs' will replace `mkdir' in + almost all cases. + + * VERSION: Version number increased to 1.16. + +2000-02-04 Werner LEMBERG + + * grops/psrm.cc (read_one_of): Fixed pointer incrementation. + + * Makefile.in: Removed $(tmac_m) since it is no longer needed + (after an update of the mm stuff). + + * troff/Makefile.sub (majorminor.cc): Fix dependencies. + +2000-02-03 Werner LEMBERG + + The .psbb request will now also accept Mac PS images (i.e. using LF + as the EOL character). + + * troff/input.cc (ps_get_line): New function, taken from psrm.cc + (with slight modifications). + * troff/input.cc (do_ps_file): Use it. + + * test-groff: Add grohtml and grolj4 output devices to PATH. + +2000-01-30 Werner LEMBERG + + * NEWS, MORE.STUFF: Updated. + +2000-01-30 Cary D. Renzema + + Add the `srand' command to pic. + + * pic/lex.cc, pic/pic.y: Implement it. + * pic/pic.man: Document it. + * pic/pic.cc, pic/pic.tab.h: Regenerated (with yacc). + +2000-01-30 Werner LEMBERG + + Add a new request `.psbb'. This does exactly what the external + program psbb did. It scans a PostScript image file for a + %%BoundingBox comment and extracts the bounding box values (in + PostScript units) which are then stored in the four new (read-only) + number registers `llx', `lly', `urx', and `ury'. + + This will allow the usage of the .PSPIC macro without worrying + about unsafe behaviour of groff, i.e., it will work without the + `-U' switch of groff. + + * troff/input.cc: Implement it. + * tmac/tmac.pspic: Use it. + * troff/troff.man, grops/grops.man, NEWS: Document it. + * psbb/*, Makefile.in: Remove it since it is no longer needed. + + This is bloody C code simply adapted from psbb.c! Any improvements + welcome. + +2000-01-29 Werner LEMBERG + + * man/groff_font.man: Minor clarifications. + + * NEWS: Updated. + +2000-01-28 Werner LEMBERG + + * afmtodit/afmtodit.pl: Use new `--' comment delimiter. + +2000-01-28 Gaius Mulley + + * man/groff_font.man: Brought up to date regarding tcommand + extensions. + * libgroff/font.cc: Handle everything after `--' as a comment + in the font files. + * devps/*: Added comment delimiter inside devps font files. + +2000-01-28 Werner LEMBERG + + * tmac/tmac.arkup, tmac/groff_markup.man: Replace \fC...\fR with + \fC...\fP (which now works as expected). + + * troff/troff.man: Fix typo. + +2000-01-27 Gaius Mulley + + Completed the pass_filenames implementation in troff. + + * libdriver/input.cc: Will read the new `F' tcommand. + * troff/node.cc, troff/node.h: Will issue the new `F' tcommand. + * troff/input.cc: Use it. + +2000-01-26 Werner LEMBERG + + * troff/env.cc (set_font): Fix the behaviour of \fP. The previous + font will now be updated even if an invalid font is selected. + +2000-01-24 Werner LEMBERG + + * doc/homepage.ms: Updated for new tmac.arkup. + + * tmac/tmac.html: Disable line breaks after hyphen-like characters. + + * tmac/tmac.arkup: Cleanup. + + Added `\&' to .HTML macro to `leave vertical mode', so to say. + + Removed obsolete .LINK macro completely. + + The macros .URL, .FTP, and .MAILTO now accept a third argument which + will be immediately appended to the second argument (to be used with + punctuation, for example). + + Disabled .CDFTP macro temporarily for security reasons. + + * tmac/groff_markup.man: Complete revision for latest changes in + tmac.arkup -- note that it does not yet format correctly with + grohtml :-( + +2000-01-23 Bruno Haible + + * nroff/nroff.sh: Accept -Tutf8 option and pass it through. + * devutf8/R.proto: Add mappings for wp, lh, rh. + * devutf8/NOTES: Updated. + +2000-01-23 Werner LEMBERG + + * doc/groff.texinfo: Updated version/copyright info. + +2000-01-21 Gaius Mulley + + Added support for two new directives in device descriptions: + `pass_filenames' (to pass the input file name to the output device) + and `use_charnames_in_special' (to support e.g. accented characters + in the `X' request). + + * include/font.h, troff/charinfo.h: Declare it. + + * libgroff/font.cc, libgroff/fontfile.cc: Set it. + + * devhtml/DESC: Use it. + + * troff/input.cc: New function encoded_char. + + * troff/token.h: Add test for `specialness'. + +2000-01-21 Werner LEMBERG + + * tmac/Makefile.sub: tmac.a4 and tmac.trace have been removed by + mistake from the list of files to be installed. + +2000-01-18 Werner LEMBERG + + * README: Added info how to apply patches. + +2000-01-15 Jan Echternach + + * troff/node.cc (ligature_note::operator delete): Fix g++ warning. + +2000-01-15 Gaius Mulley + + * troff/input.cc: Add support for troffrc-end. + + * tbl/main.cc: Altered to issue table-start and table-end special + characters if using the html device. + + * devhtml/*: Modified font files to incorporate html encoding of + characters. + + * tmac/groff_markup.man: New file documenting tmac.arkup. + + * tmac/troffrc-end: New file. This is invoked after all user + specified macros. Currently used by the html device to include + tmac.html. Thus no need for users to specify -mhtml anymore. + + * tmac/Makefile.sub (NORMALFILES): Add troffrc-end. + (MAN7): Add groff_markup.man. + + * tmac/tmac.an, tmac/tmac.html: Small html updates. + + * tmac/troffrc: tmac.arkup will now be called for the html device. + + * libgroff/font.cc, libgroff/font.h: Altered to include reading of + extra device specific information about fonts. + + * doc/homepage.ms: New file. It is an example how an HTML home page + could look like with grohtml. + + * doc/Makefile: Add homepage.ms. Remove rule for pic.html. + +2000-01-12 Bruno Haible + + * devutf8/R.proto: Add mappings for ti, Fn, st, an. Change mappings + of Im, Re. + + * devutf8/NOTES: Updated. + +2000-01-08 Bruno Haible + + * eqn/box.cc, eqn/lex.cc, eqn/other.cc, eqn/over.cc, eqn/special.cc, + eqn/text.cc, grodvi/dvi.cc, grops/ps.cc, grops/psrm.cc, + libbib/index.cc, libbib/linear.cc, libbib/search.cc, + libdriver/printer.cc, libgroff/font.cc, libgroff/string.cc, + pic/lex.cc, pic/object.cc, refer/label.y, refer/ref.cc, tbl/main.cc, + tbl/table.cc, tfmtodit/tfmtodit.cc, troff/dictionary.cc, + troff/div.cc, troff/env.cc, troff/input.cc, troff/node.cc, + troff/node.h, troff/reg.cc: Avoid most "g++ -Wall -Wno-sign-compare" + warnings. + + * troff/node.cc (bracket_node::copy): Initialize last to NULL. + +2000-01-12 Fabrizio Polacco + + grolj4: Paper size will be searched case-insensitively. + + * include/lib.h: Add check for strcasecmp(). + * grolj4/li4.cc (lookup_paper_size): Use strcasecmp(). + * configure.in: Check for strcasecmp(). + +2000-01-11 Werner LEMBERG + + * troff/Makefile.sub (majorminor.cc): Fix incorrect path to + `REVISION'. + +2000-01-10 Werner LEMBERG + + * Makefile.comm, Makefile.in, doc/Makefile: More fixes for the + revision scheme. + + Add a new read-only register, `.Y', which contains the groff + revision. + + * troff/input.cc (init_input_requests): Define it. + * troff/Makefile.sub (majorminor.cc): Define `revision' string. + * doc/groff.texinfo, troff/troff.man: Document it. + + * libgroff/Makefile.sub (version.cc): Add definition of + `Version_string[]', consisting of `..' + * eqn/main.cc, grodvi/dvi.cc, grolj4/lj4.cc, grops/ps.cc, + grotty/tty.cc, hpftodit/hpftodit.cc, indxbib/indxbib.cc, pic/main.cc, + refer/refer.cc, soelim/soelim.cc, tbl/main.cc, tfmtodit/tfmtodit.cc, + troff/input.cc, pfbtops/pfbtops.c: Use it. + +2000-01-10 Fabrizio Polacco + + Add a revision scheme to the groff package. + + * REVISION: New file. + * libgroff/Makefile.sub (version.cc): Use it to define + `revision_string[]'. + * grops/psrm.cc: Use revision_string (converted to an unsigned + integer) in constructor of resource_manager. + +2000-01-10 Bruno Haible + + * devutf8/Makefile.sub, devutf8/DESC.proto, devutf8/R.proto: New + files. + * Makefile.in (DEVDIRS): Add devutf8. + * grotty/tty.cc: Include device.h. + (glyph): Change type of `code' to `unsigned int'. + (tty_printer): New field is_utf8. Constructor takes device argument. + (tty_printer::tty_printer): If device if `utf8', set is_utf8. + (tty_printer::add_char): Change type of first arg to `unsigned int'. + (tty_printer::put_char): New function. + (tty_printer::end_page): Use put_char() instead of ::putchar(). + (make_printer): Pass device to tty_printer constructor. + * nroff.sh: Determine default device by calling 'locale'. As a + fallback, look at all of $LC_ALL, $LC_CTYPE, $LANG, $LESSCHARSET. + Recognize UTF-8 locales. + * tmac/eqnrc: Recognize utf8 like latin1. + * tmac/troffrc: Device utf8 needs tmac.tty. + +2000-01-07 Werner LEMBERG + + * tmac/Makefile.sub: tmac.a4 and tmac.trace will now be installed. + +2000-01-07 Paul Eggert + + Add a new predefined writeable number register, `year', + which contains the current year. + + * doc/groff.texinfo, PROBLEMS, troff/troff.man: Document it. + * tmac/tmac.s: Use it. + * troff/input.cc (init_registers): Initialize it. + +2000-01-06 Werner LEMBERG + + * PROBLEMS: Fixed typo. + +2000-01-04 Paul Eggert + + * PROBLEMS: Add Y2k advice for the yr number register. + +2000-01-03 Paul Eggert + + * doc/groff.texinfo: Fix Y2k bug in documentation of \n(yr. + +2000-01-02 Werner LEMBERG + + * tmac/tmac.arkup: Slight modification of macros to provide better + appearance for non-HTML formats. + +2000-01-01 Charles Levert + + * soelim/soelim.cc (include_path_append): realloc(NULL, n) + does not automatically translate to malloc(n) on all OSes + (e.g., SunOS) so do it explicitly. Also, check the returned + value. + +2000-01-01 Werner LEMBERG + + * tmac/tmac.arkup: Added .LINE macro. Some formatting. + + * Makefile.in: Added $(tmac_m) again since the Makefile in `mm' + expects this variable + +2000-01-01 Gaius Mulley + + * doc/Makefile: Added instructions to create HTML and text + versions of some files. + +1999-12-31 Werner LEMBERG + + * Updated INSTALL.gen. + + * tmac/tmac.arkup: Added fixes so that .FTP and .MAILTO works + better resp. correctly with non-HTML devices. + +Local Variables: +version-control: never +coding: latin-1 +End: diff --git a/ChangeLog.117 b/ChangeLog.117 new file mode 100644 index 0000000..d2bc5c5 --- /dev/null +++ b/ChangeLog.117 @@ -0,0 +1,2190 @@ + +Version 1.17.2 released +======================= + +2001-07-07 Werner LEMBERG + + * src/utils/indxbib/indxbib.cc (main): Change type of `name_max' + to size_t. + +2001-07-06 Ruslan Ermilov + + * tmac/doc.tmac (Rv): Make `Rv' really not parseable. + Fix synopsis. + * tmac/groff_mdoc.man: Fix synopsis. + +2001-07-05 Ruslan Ermilov + + * tmac/doc.tmac (doc-inset-list, doc-hang-list, doc-ohang-list): + Restore `doc-Pa-font'. + +2001-07-04 Werner LEMBERG + + * src/utils/indxbib/dirnamemax.c: Moved to ... + * src/libs/libgroff/maxfilename.cc: Here. + s/dir_name_max/file_name_max/. + Add copyright. + * src/include/lib.h: Add file_name_max. + * src/utils/indxbib/indxbib.cc: Updated. + * src/utils/indxbib/Makefile.sub, src/libs/libgroff/Makefile.sub: + Updated. + + * src/libs/libgroff/tmpfile.cc (TMPFILE_PREFIX) [__MSDOS__]: Define + as empty. + (xtmpfile) [_MSC_VER]: Removed -- MSVC has mktemp(). + + * src/preproc/html/pre-html.cc (PAGE_TEMPLATE, PS_TEMPLATE, + REGION_TEMPLATE): New macros. + (createAllPages, makeTempFiles): Use them. + Include `nonposix.h'. + (html_system): New function. + (createAllPages, createImage): Use it. + Use EXE_EXT. + + * tmac/www.tmac: Fix typos. + +2001-07-03 Werner LEMBERG + + * tmac/www.tmac: Disable hyphenation in normal text only if output + device is html. + (URL, FTP, MAILTO): Disable hyphenation of actual URL with `\%'. + * tmac/groff_mwww.man, NEWS: Updated. + +2001-07-03 Gaius Mulley + + * tmac/www.tmac (.IMAGE): Add fourth parameter to specify vertical + image location. + +2001-07-02 Ruslan Ermilov + + * tmac/doc-common, tmac/doc.tmac (doc-display-ft-stack, + doc-display-ps-stack): Implement font and font size stack for + displays. + +2001-07-02 Werner LEMBERG + + * REVISION: Increased to 2. + * src/roff/troff/input.cc (read_size): Fix special case `\s[0]'. + + * src/groff/grog/grog.pl (process): Handle `Oo' and `Oc' not at the + beginning of a line. + * src/groff/grog/grog.sh: Ditto. + +2001-06-29 Peter Marquardt + + * src/preproc/eqn/neqn.sh: Put `export' keyword in a new line to + make it portable. + +2001-06-27 Werner LEMBERG + + Fix problems with preprocessor string for `man' program. + + * *.man: Don't use `s' in preprocessor string -- it doesn't exist. + Updated/added copyright. + Moved Emacs's local variable to identify nroff mode to the end of + the file; add local variable if missing. + +2001-06-26 Andras Salamon + + * aclocal.m4: Replace AC_LANG_SAVE + AC_LANG_CPLUSPLUS with + AC_LANG_PUSH(C++) and AC_LANG_RESTORE with AC_LANG_POP(C++). + * configure: Regenerated. + +2001-06-25 Andras Salamon + + * aclocal.m4 (GROFF_PAGE): Fix page detection code. + * configure: Regenerated. + +2001-06-24 Werner LEMBERG + + * doc/homepage.ms: Don't include arkup.tmac (which no longer exists) + but www.tmac. + * doc/pic.ms: Fix typos. + +Version 1.17.1 released +======================= + +2001-06-21 Golubev I. N. + + * aclocal.m4 (GROFF_NEED_DECLARATION): Fix inclusion of strings.h. + * configure: Updated. + +2001-06-20 Gaius Mulley + + * src/roff/preproc/html/pre-html.cc (make_message): Fix incorrect + image names. + * src/roff/troff/dic.cc (blank_line): Add html tag. + +2001-06-19 Gaius Mulley + + * src/roff/troff/input.cc (do_suppress): Fix typo. + +2001-06-18 Gaius Mulley + + Added two new options (-D and -I) to specify image names and a + subdirectory to place the images in. + + Change syntax from \\Ox to \\O[x]. + + * src/devices/grohtml/post-html.cc (main): Add options. + (usage): Updated. + * src/preproc/html/pre-html.cc: Include `stdarg.h'. + Use `NULL' instead of `0' for null string pointers. + (MAX_RETRIES): New macro. + (lengthOfintToStr, intToStr, make_message): New functions. + (makeFileName): Make function static. + Implement -D and -I options. + (checkImageDir): New function. + (write_end_image, write_start_image): Use new syntax of \O. + (createAllPages, removeAllPages): Implement -D and -I options. Use + make_message(). + (createImage): Use make_message(). + (addps4html): Add guard for malloc(). + (usage, scanArguments): Updated. + (makeTempFiles): Use mkstemp(). + (removeTempFiles): Use unlink(). + (findPrefix): Add guard for malloc(). + (main): Updated. + * src/roff/troff/input.cc (get_delim_file_name): New function to + parse \O. + (do_suppress): Updated to parse new syntax. + * src/devices/grohtml/grohtml.man: Updated. + * tmac/www.tmac: Updated to new syntax. + + * NEWS: Updated. + +2001-06-15 Werner LEMBERG + + * src/roff/grog/Makefile.sub: Remove NAMEPREFIX. + + * src/devices/grohtml/grohtml.man: Minor improvements. + +2001-06-14 Werner LEMBERG + + * src/preproc/html/Makefile.sub: Remove NAMEPREFIX. + +2001-06-11 Werner LEMBERG + + * man/roff.man, mann/groff.man: Use '\" instead of .\" in the first + line to specify preprocessor options -- mandb 2.3.1 only recognizes + the former. + * src/preproc/grn/grn.man: Add proper '\" string. + +2001-06-11 OKAZAKI Tetsurou + + * test-groff: Don't use PATH but GROFF_BIN_PATH. + +2001-06-08 Werner LEMBERG + + Updated to autoconf 2.50. + + * configure.in: Renamed to... + * configure.ac: This. + * aclocal.m4 (AC_OUTPUT_MAKE_DEFS): Removed. + (GROFF_OS390): Updated. + * configure: Regenerated. + +2001-05-18 Werner LEMBERG + + * src/roff/troff/env.c, src/roff/troff/env.h, + src/roff/troff/input.cc, src/roff/troff/troff.man: Undo `ss' change + from 2000-12-21. + +2001-05-17 Jeffrey Friedl + + * src/roff/troff/input.cc (read_size): Fix special case `\s0'. + +2001-05-16 Werner LEMBERG + + * src/roff/troff/input.cc (read_size): Emit warning if value becomes + less than or equal zero; set it to 1 then. + * src/roff/troff/node.h (node::node): Initialize `last'. + +2001-05-08 Werner LEMBERG + + * tmac/an-old.tmac: Make predefined strings work in compatibility + mode. + Add troff version guard. + * tmac/doc.tmac: Simplify version guard. + +2001-05-07 Werner LEMBERG + + The .ns and .rs requests are now honoured not only in the top-level + but in all diversions (similar to UNIX troff). + + This change is based on a patch from Tadziu Hoffmann + . + + * src/roff/troff/div.h (diversion): Add `no_space_mode' member. + (top_level_diversion): Remove `no_space_mode' member. + * src/roff/troff/div.cc (diversion::diversion, + top_level_diversion::top_level_diversion): Updated. + (macro_diversion::output): Reset `no_space_mode'. + (no_space, restore_spacing): Use `curdiv' unconditionally. + (space_request, blank_line): Check `curdiv->no_space_mode'. + (no_space_mode_reg::get_value, no_space_mode_reg::get_string): Use + `curdiv' unconditionally. + * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: + Updated. + +2001-05-06 Werner LEMBERG + + Added two new requests `de1' and `am1' which are similar to `de' and + `am' with the difference that compatibility mode is saved on entry, + switched off during macro execution, and restored on exit. + + * src/roff/troff/input.h: Added two new special characters + (COMPATIBLE_SAVE, COMPATIBLE_RESTORE). + * src/roff/troff/input.cc (input_iterator): Added two member + functions `save_compatible_flag' and `get_compatible_flag'. + (input_stack): Ditto. + (string_iterator): Ditto. Also add private member + `saved_compatible_flag'. + (token::next): Use COMPATIBLE_SAVE and COMPATIBLE_RESTORE. + (calling_mode): New enumeration. + (do_define_macro): Use it. Insert COMPATIBLE_SAVE and + COMPATIBLE_RESTORE at the beginning and end of macro, respectively. + (define_macro, define_indirect_macro, append_macro, ignore): Use + `calling_mode'. + (define_nocomp_macro, append_nocomp_macro): New functions. + (init_input_requests): Updated. + (do_request): Rename local variable `saved_compatible_flag' to + `old_compatible_flag'. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * tmac/an-old.tmac: Use `de1' instead of `de' request for all + public and trap-invoked macros. As a consequence, the man macros + work in compatibility mode also. + +2001-05-06 Solar Designer + + * Makefile.in: Use $(mandir). + +2001-05-06 Alexios Zavras + + * src/utils/afmtodit/afmtodit.pl: Fix serious typo. + +2001-05-05 Werner LEMBERG + + Added `.ns' number register: Returns 1 in no-space mode (if in + top-level diversion), 0 otherwise. + + * src/roff/troff/div.cc (no_space_mode_reg): New class. + (init_div_requests): Updated. + * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: + Document it. + +2001-05-04 Werner LEMBERG + + * src/roff/nroff/nroff.man: Improved documentation (especially + locales). + +2001-05-02 Werner LEMBERG + + Added `brp' request: This is \p as a request. + + * src/roff/troff/env.cc (environment::do_break): Add parameter + `spread'. + (do_break_request): New function (was `break_request'). + (break_request): Calls `do_break_request'. + (break_spread_request): New; calls `do_break_request'. + (init_env_requests): Updated. + * src/roff/troff/env.h: Updated. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * REVISION: Increased to 1. + * win32-diffs: Updated. + +2001-05-01 Werner LEMBERG + + * tmac/an-old.tmac: Fix minor compatibility mode issue. + * tmac/troffrc-end: Make it really work in compatibility mode. + +2001-04-27 Werner LEMBERG + + * src/utils/lkbib/lkbib.cc: Switch inclusion order of stdio.h and + stdlib.h. + +2001-04-22 Werner LEMBERG + + * src/libs/libgroff/getopt.c, src/include/getopt.h: Updating to + latest versions from glibc CVS archive. + + * MORE.STUFF: Updated, using a patch from Kees Zeelenberg + . + +2001-04-21 Werner LEMBERG + + * configure.in: Move check for mkstemp() to... + * aclocal.m4 (GROFF_MKSTEMP): This new function. + * configure: Regenerated. + + * src/include/groff-getopt.h: Don't use variable names in + declarations. + + * src/devices/grohtml/html-chars.h: Removed. It isn't used. + * src/devices/grohtml/Makefile.sub, + src/devices/grohtml/post-html.cc: Updated. + +2001-04-21 Albert Chin-A-Young + + * configure.in: Add special check for mkstemp(). + * src/libs/libgroff/tmpfile.cc: Use it. + * src/utils/indxbib/indxbib.cc: Ditto. + * src/utils/pfbtops/pfbtops.c (main): Don't use C++ comment style. + * src/devices/grolbp/lbp.h (lbpprintf, lbpputs, vdmprintf): Use + `const'. + +2001-04-20 Bruce Lilly + + `Version_string' as C++ object was not visible to linker from C + object files. + Add `const' to `Version_string'. + + * src/utils/pfbtops/pfbtops.c (main), src/roff/groff/groff.cc + (main), src/roff/troff/input.cc (main), src/preproc/tbl/main.cc + (main), src/preproc/pic/main.cc (main), src/preproc/eqn/main.cc + (main), src/preproc/grn/main.cc (main), src/preproc/html/pre-html.cc + (scanArguments), src/preproc/refer/refer.cc (main), + src/preproc/soelim/soelim.cc (main), src/devices/grotty/tty.cc + (main), src/devices/grodvi/dvi.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grohtml/post-html.cc (main), + src/devices/grolbp/lbp.cc (main), src/utils/tfmtodit/tfmtodit.cc + (main), src/utils/hpftodit/hpftodit.cc (main), + src/utils/lookbib/lookbib.cc (main), src/utils/indxbib/indxbib.cc + (main), src/utils/lkbib/lkbib.cc (main), + src/utils/addftinfo/addftinfo.cc (main): Implement it. + + * src/roff/groff/pipeline.c: Add _UWIN. + * src/include/nonposix.h: Ditto. + +2001-04-20 Werner LEMBERG + + * src/include/lib.h: Use HAVE_STRERROR. + * src/roff/groff/pipeline.c: Ditto. + * src/preproc/html/pre-html.cc: Remove declaration of `strerror'. + * src/libs/libgroff/Makefile.sub (version.cc): Add `extern "C"'. + * src/utils/pfbtops/pfbtops.c: Add copyright notice. + * win32-diffs: Updated. + * src/utils/hpftodit/hpftodit.cc (read_map): Fix compiler warning. + +2001-04-19 Werner LEMBERG + + * src/preproc/html/pre-html.cc (scanArguments): Use `troff_command' + instead of hardwired `"troff"'. + (char_buffer::read_file): Remove unused variables. + (char_buffer::write_file_troff): Ditto. + (char_buffer::write_file_html): Ditto. + (generateImages): Ditto. + (abs): Removed. + * src/utils/addftinfo/addftinfo.cc (main): Fix compilation problem. + + * src/include/lib.h: Don't include `groff-getopt.h' for UWIN. + + * src/libs/libgroff/font.cc (font::load_desc): Fix compiler warning. + * src/libs/libbib/index.cc (index_search_item_iterator::get_tag, + index_search_item::search1): Ditto. + * src/roff/troff/node.h (width_list): Reorder members. + * src/roff/troff/input.cc (do_define_macro): Fix compiler warning. + (lookup_warning): Ditto. + (prepend_string): Commented out. + * src/roff/troff/dictionary.cc (is_good_size): Fix compiler warning. + * src/roff/troff/reg.cc (number_value_to_ascii): Ditto. + * src/preproc/tbl/main.cc (process_format): Ditto. + * src/preproc/pic/pic.y (define_variable, reset, reset_all): Fix + compiler warnings. + * src/preproc/pic/pic.cc: Updated. + * src/preproc/eqn/lex.cc (init_table): Fix compiler warnings. + * src/preproc/eqn/over.cc (over_box::compute_metrics): Ditto. + * src/preproc/refer/command.cc (execute_command): Ditto. + * src/preproc/refer/ref.cc (sortify_title, find_month): Ditto. + * src/preproc/refer/token.cc (lookup_token): Ditto. + * src/preproc/soelim/soelim.cc: Ditto. + * src/preproc/html/pushbackbuffer.cc (ERROR): Ditto. + (isHexDigit): Commented out. + (pushBackBuffer::isString): Remove unused variable. + * src/devices/grops/ps.cc (ps_printer::special): Fix compiler + warning. + * src/devices/grops/psrm.cc (resource_manager::lookup_font, + resource_manager::read_resource_arg, read_one_of, parse_extensions): + Ditto. + * src/devices/grodvi/dvi.cc (dvi_printer::draw): Ditto. + * src/devices/grolj4/lj4.cc (lj4_font::handle_unknown_font_command, + lookup_paper_size): Ditto. + * src/devices/grohtml/post-html.cc (is_subsection): Commented out. + (text_glob, element_list): Reorder members. + * src/devices/grohtml/html-text.cc (html_text::do_pre): Remove + compiler warning. + * src/devices/grohtml/html-text.h (html_text::emit_space): Change + return value to `void'. + * src/devices/grohtml/output.cc (word_list::word_list): Fix order + of initializers. + * src/devices/grohtml/html.h (simple_output::check_newline, + simple_output::space_or_newline, simple_output::enable_newlines): + Add return value. + * src/devices/grolbp/lbp.cc (wp54charset, set_papersize): Remove + compiler warnings. + * src/utils/tfmtodit/tfmtodit.cc (tfm::load, gf::load, main): Ditto. + * src/utils/hpftodit/hpftodit.cc (File::seek, read_symbol_sets, + output_ligatures, output_charset, read_map): Ditto. + * src/utils/lookbib/lookbib.cc (main): Ditto. + * src/utils/indxbib/indxbib.cc (main, fwrite_or_die): Ditto. + (do_file): Fix typo (`=' -> `=='). + * src/utils/lkbib/lkbib.cc (main): Remove compiler warning. + * src/utils/addftinfo/addftinfo.cc (main): Ditto. + +2001-04-18 Ruslan Ermilov + + * src/roff/nroff/nroff.sh: Adding -p (pic) and -t (tbl) options. + Fix usage of GROFF_BIN_PATH. + * src/roff/nroff/nroff.man: Updated. + +2001-04-18 Werner LEMBERG + + * NEWS: Fixing typos. + Updated. + +Version 1.17 released +===================== + +2001-04-17 Werner LEMBERG + + * tmac/Makefile.sub (install-data): mdoc.local-s is in current + directory, not in $(srcdir). + +2001-04-16 Werner LEMBERG + + * doc/groff.texinfo: More info on conditionals. + +2001-04-15 Werner LEMBERG + + * doc/groff.texinfo: Added some info about groff internals. + + * src/roff/troff/node.cc (make_glyph_node): Emit warning message + about missing special character only if the name is non-null. + +2001-04-14 Werner LEMBERG + + Removing the grohtml-old device driver which is now obsolete. + + * src/devices/grohtml-old/*: Removed. + * font/devhtml-old/*: Removed. + * src/libs/libgroff/htmlindicate.cc (graphic_start, graphic_end): + Remove comments. + * Makefile.in (CCPROGDIRS, DEVDIRS): Updated. + * test-groff (PATH): Updated. + * tmac/Makefile.sub (NORMALFILES): Updated. + * tmac/an-old.tmac: Remove special code for html-old device. + Replace `html-or-html-old' register with `an-html'. + * tmac/eqnrc: Updated. + * tmac/html-old.tmac: Removed. + * tmac/troffrc, tmac/troffrc-end: Updated. + * tmac/www.tmac: Remove special code for html-old device. + Replace `html-or-html-old' register with `www-html'. + + * src/libs/libgroff/tmpfile.cc (remove_tmp_files), + src/libs/libgroff/htmlindicate.cc (graphic_end), + include/htmlindicate.h, src/preproc/grn/*.cc, + src/roff/groff/env.{cc,h}: Remove `void' parameter if used as a + single argument for consistency with rest of source code. + + * aclocal.m4, tmac/an-old.tmac: Fix copyright. + +2001-04-13 Ruslan Ermilov + + * src/roff/troff/troff.man: Fixing typos. + +2001-04-13 Werner LEMBERG + + * doc/pic.ms: Fixing many font switches. + * doc/groff.texinfo: Fixes, additions. + * MORE.STUFF: Updated. + +2001-04-12 Gaius Mulley + + * src/devices/grohtml/grohtml.man: Updated manual page regarding + simple anchor. + * src/preproc/html/pre-html.cc (createImage): Fixed right hand + cropping of images. + (removeTempFiles): New function to tidy up temporary files. + * src/preproc/html/pre-html.cc (main): Calls `removeTempFiles()'. + Many fixes to do with the new inline suppress node and image regions + are much tighter. + * src/devices/grohtml/post-html.cc: New method `is_auto_img'. + (generate_img_src): New function. + (html_printer::do_auto_image): Utilizes it. + (do_heading, do_title): Include inline images within their contents. + (html_printer::begin_page): Tidied up comments that are issued to + the html output file. + (html_printer::do_fill): Fixed so that `.nf' works with fonts other + than courier. + (text_glob::is_br): New method used by do_heading. + * tmac/s.tmac: If -Thtml then emit $1 in .IP rather than its + equivalent diversion. + * src/include/html-strings.h: Altered image tags to reflect the + inline image node. + * src/include/htmlindicate.h (html_end_suppress): Added `is_inline' + parameter. + * src/preproc/eqn/main.cc: Will suppress generation of image tags if + it is already inside a pic image. Only emit tags if the argument + `-Tps:html' is present. + * src/preproc/tbl/main.cc: Changes to reflect additional + `html_end_suppress' parameter. + * src/roff/troff/env.cc: Only emit eol tag if a node has been + emitted since the last eol tag was written. + * src/roff/troff/env.h: New boolean `emitted_node'. + * src/roff/troff/input.cc (do_suppress): Handles extra suppress + nodes \O3, \O4, \O5. No longer use `output_low_mark_miny'. + * src/roff/troff/node.cc (check_charinfo): New method. + (troff_output_file::determine_line_limits): Alterations to limit + checking. + * tmac/www.tmac: Changes to reflect new suppress nodes. + +2001-04-12 Bruno Haible + + * src/devices/grohtml/post-html.cc (html_printer::add_to_sbuf): + Escape the html_glyph in the buffer. + (str_translate_to_html): Output the unescaped escaped_char. + * src/devices/grohtml/html-text.cc (issue_table_begin): Set + `frame=void', not `frame=none'. Add `border=0'. + +2001-04-12 Werner LEMBERG + + * PROBLEMS: Add some words on how to avoid wrapper macros. + +2001-04-11 Blake McBride + + * src/include/nonposix.h (fileno) [_MSC_VER]: Removed. + +2001-04-11 Werner LEMBERG + + * font/devlbp/Makefile.sub (CLEANADD): Set it. + * tmac/Makefile.sub (CLEANADD): Add tmac.local-s. + * Makefile.in (dist): Don't remove src/xditview/Imakefile, but ... + * Makefile.sub (DISTCLEANFILES): Here. + + * libs/libgroff/new.cc: Include `nonposix.h'. + * win32-diffs: Updated. + +2001-04-10 Ruslan Ermilov + + Added skeleton macro for defunct macros. + + Updated documentation. + + When inside displays, an empty input line warning should be + suppressed. If another macro call is put inside a display, + all subsequent empty lines found in that display caused a + warning to be emitted. + + * tmac/doc.tmac (doc-defunct-macro): New macro. + (Db, Ds, Ex, Or, Sf): Reimplemented using this macro. + (doc-restore-global-vars): Fixed typo. + (doc-empty-line): Check the `doc-display-depth' register to + determine whether we are inside display or not. + + * tmac/doc-common: Removed `Or' and `Sf' registers. + Moved obsolete `Ds' macro to doc.tmac. + + * tmac/groff_mdoc.man: Bump document date. + Document `.Vt' under ``Variable Types''. + Removed documentation for obsolete `.Or' macro. + +2001-04-10 Werner LEMBERG + + * NEWS: Updated. + * doc/groff.texinfo: Many fixes, additions, clarifications, etc. + +2001-04-10 Bruno Haible + + * src/devices/grodvi/dvi.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grohtml/post-html.cc (main): Accept --help and --version. + Write --version output to stdout, not stderr. + (usage): Add stream argument. Don't exit. + * src/devices/grohtml-old/html.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grolbp/lbp.cc (long_options): Use symbolic getopt.h + constants. + (usage): Add stream argument. Don't exit. + (main): Write --help output to stdout, not stderr. + * src/devices/grolj4/lj4.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grops/ps.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grotty/tty.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/preproc/eqn/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/preproc/grn/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/preproc/html/pre-html.cc (usage): Add stream argument. + (scanArguments): Accept --help and --version. + * src/preproc/pic/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/preproc/refer/refer.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/preproc/soelim/soelim.cc (usage): Add stream argument. Don't + exit. + (main): Accept --help and --version. + * src/preproc/tbl/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/roff/groff/groff.cc (main): Accept --help and --version. + (synopsis): Add stream argument. + (help): Write --help output to stdout, not stderr. + (usage): Add stream argument. Don't exit. + * src/roff/grog/grog.pl: Accept --help and --version. + (help): New sub. + * src/roff/grog/grog.sh: Accept --help and --version. + * src/roff/nroff/nroff.sh: Accept --help and --version. + * src/roff/troff/input.cc (USAGE_EXIT_CODE): Remove macro. + (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/utils/addftinfo/addftinfo.cc (main): Accept --help and --version. + (usage): New function with stream argument, doesn't exit. + * src/utils/hpftodit/hpftodit.cc (main): Accept --help and --version. + (usage): New function with stream argument, doesn't exit. + * src/utils/indxbib/indxbib.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/utils/lkbib/lkbib.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/utils/lookbib/lookbib.cc (usage): Add stream argument. Don't + exit. + (main): Accept --help and --version. + * src/utils/pfbtops/pfbtops.c (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/utils/tfmtodit/tfmtodit.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + +2001-04-10 Ruslan Ermilov + + Fix indentation in SYNOPSIS. + + Updated to include changes of latest BSD mdoc version (basically, + the only change is that `.Fn' and `.Fc' put a final semicolon after + a function declaration in the SYNOPSIS section). + + * tmac/doc.tmac (doc-in-synopsis-count): Replaced with ... + (doc-in-synopsis-section): New variable. Updated all related + functions. + (doc-indent-synopsis-active): New register. + (Nd, Fn, Fo): Use it. + (Cd): It requires manipulation of \n[doc-indent-synopsis] so that + `.Cd' with long argument line produces indented wrapped lines. + Also, the misplaced `.nop \*[doc-Nm-font]\c'' caused extra + undesirable line break to be output. + (doc-do-func-decl, Nm, Vt, Fn, Fo): Remove extraneous calls to + `.rs'. + (Fn, Fc): Add final `;' to output. + (doc-save-global-vars, doc-restore-global-vars): Updated. + * tmac/doc-common: Remove `Ex' register. + Updated. + * tmac/doc-ditroff, tmac/doc-nroff, tmac/doc-syms: Updated + copyright. + +2001-04-06 Ruslan Ermilov + + * tmac/doc.tmac (Cd): Simplify code. + * tmac/groff_mdoc.man: Document some behaviour of `Cd' request. + +2001-04-06 Werner LEMBERG + + Implement continuous underlining for nroff mode. To do that, a new + request in the ditroff language has been added: `x u N' (N is 0 + or 1). + + \X and \Y are now transparent to end-of-sentence recognition. + + * src/include/printer.h (printer): Add `type' parameter to `special' + method. + * src/libs/libdriver/printer.cc (printer::special): Updated. + * src/libs/libdriver/input.cc (do_file): Handle `x u N'. + + * src/devices/dvi/dvi.cc (dvi_printer::special): Handle only + specials of type `p'. + * src/devices/grohtml/post-html.cc (html_printer::special): Ditto. + * src/devices/grohtml-old/html.cc (html_printer::special): Ditto. + * src/devices/grops/ps.cc (ps_printer::special): Ditto. + * src/devices/grotty/tty.cc: Add new enum CU_MODE. + (glyph::order): New method. + (tty_printer::add_char): Use it. + (tty_printer::special): New method. + (tty_printer::end_page): Implement it. + + * src/roff/troff/node.h (special_node): Add `no_init_string' member. + * src/roff/troff/node.cc (special_node::special_node): Add parameter + to set `no_init_string'. + (special_node::tprint_start): Use it. + (special_node::same, special_node::copy): Updated. + (special_node::ends_sentence): New method. + (troff_output_file::start_special): Add parameter to include + inititialization of special conditionally. + + * src/roff/troff/env.h (environment): New member `underline_spaces'. + * src/roff/troff/env.cc (do_underline_special): New function. + (environment::set_font): Use it. + (do_underline): Use it. This was `underline()'. + (underline): Call `do_underline()'. + (continuous_underline): New function which calls `do_underline()'. + (environment::newline): Use `do_underline_special()'. + (init_env_requests): Updated. + + * NEWS, man/troff_out.man: Updated. + +2001-04-06 Bruno Haible + + * font/devutf8/R.proto: Fix code of 'shc'. + +2001-04-06 Ruslan Ermilov + + Many fixes. Diag lists can now be nested also; additionally, + `-compact' and `-offset' are supported. + + * tmac/doc.tmac (doc-have-indent): Replaced with ... + (doc-list-have-indent-stackXXX): A new register stack. + (doc-have-diag-list): Removed. + (Bl): Use `doc-list-have-indent-stackXXX'. + (El): Updated. + (doc-diag-list): Use `doc-compact-list-stackXXX'. + (doc-tag-list): Use `doc-list-have-indent-stackXXX'. + (doc-set-vertical-and-indent): Ditto. + (doc-next-list-depth): Removed. + (doc-increment-list-stack): Updated. + (doc-decrement-list-stack): Use `doc-list-depth' instead of + `doc-next-list-depth'. + (doc-end-list, doc-end-column-list): Don't use + `doc-increment-list-stack'. + (doc-set-column-tab): Don't use `doc-list-offset-stackXXX'. + (doc-save-global-vars, doc-restore-global-vars): Updated. + * tmac/doc-common: Updated. + * tmac/groff_mdoc.man: Updated. + * NEWS: Fix typo. + +2001-04-02 Werner LEMBERG + + * src/devices/grotty/grotty.man: Fix grammatical error. + +2001-03-30 Ruslan Ermilov + + Remove .Ld from mdoc package; replace it with special handling of + `...'. + + * tmac/doc-common: Remove `Ld' register. + Uncomment `doc-volume-ds-*' strings. + Remove `doc-operating-system-default'. + (Os): Updated. + * tmac/doc-syms (Ld): Removed. + * tmac/doc.tmac (doc-parse-args, doc-parse-arg-vector): Handle + `...' specially. + * NEWS: Updated. + + * tmac/groff_mdoc.man: Many fixes and updates. + +2001-03-29 Werner LEMBERG + + * tmac/troffrc-end: Protect data with `.do'. Reported by T. Kurt + Bond . + * tmac/www.tmac: Save compatibility mode. + +2001-03-28 Ruslan Ermilov + + * tmac/groff_mdoc.man: Many fixes. + +2001-03-28 Werner LEMBERG + + * src/preproc/soelim/soelim.man: Document that `.so' + isn't recognized. + +2001-03-27 Werner LEMBERG + + * tmac/an-old.tmac (TP, an-do-tag): Reduce line length while in + diversion. This fixes overlong tags. + +2001-03-26 Werner LEMBERG + + * doc/groff.texinfo: Fixed and improved documentation of fonts. + * tmac/doc-syms: Fix error messages. + * tmac/an-old.tmac: Remove incorrect double backslashes. + +2001-03-24 Ruslan Ermilov + + * tmac/Makefile.sub: Strip mdoc.local also + * tmac/strip.sed: Fixed. + +2001-03-24 Werner LEMBERG + + * tmac/doc-nroff, tmac/doc-ditroff: Implement -rSxx switch for + selecting the font size. + * tmac/groff_mdoc.man, NEWS: Document it. + +2001-03-23 Werner LEMBERG + + * src/roff/troff/div.cc (save_vertical_space): Add default argument + to `sv' request. + * src/roff/troff/env.cc (family_change): Make `.fam' accept no + argument to restore previous font family. + * src/roff/troff/troff.man, man/groff.man, NEWS: Updated. + + * doc/groff.texinfo: More fixes and additions (mainly for font + manipulating commands). + + * tmac/groff_mdoc.reference.man: Small updates and renamed to ... + * tmac/groff_mdoc.man: This. The quick reference has been removed. + * tmac/Makefile.sub, NEWS: Updated. + +2001-03-23 Werner LEMBERG + + Replaced mdoc implementation. The new version is `state of the + art', using almost all new features of groff 1.17 -- it won't run + with older versions. + + * tmac/doc.tmac: Completely rewritten. + * tmac/doc-common: Ditto. + * tmac/doc-nroff: Ditto. + * tmac/doc-ditroff: Ditto. + * tmac/doc-syms: Ditto. + * tmac/mdoc.local: New file. + * tmac/groff_mdoc.samples.man: Replaced with ... + * tmac/groff_mdoc.reference.man: New file, covering mdoc completely. + * tmac/strip.sed: Updated. + * tmac/Makefile.sub: Updated. + * INSTALL: Updated. + + * tmac/groff_man.man: Add `man.local' to the FILES section. + +2001-03-22 Werner LEMBERG + + * doc/groff.texinfo: Added many @noindent. + Replaced @end_Example -> @endExample. + Added info whether registers are r/o. + Many other additions and fixes. + +2001-03-21 Werner LEMBERG + + * doc/groff.texinfo: Added macro @Var (and some hacks due to bugs + in makeinfo of texinfo 4.0) to be used in @Def* macros. + Improved @Def* macros: Now the exact syntax of request, register, + and escapes is shown. + Added macros for parentheses and brackets to be used in @Def*. + Many fixes and improvements of the documentation. + +2001-03-20 Werner LEMBERG + + * doc/groff.texinfo: Added new index: `st' (for strings). + Added macros @Defstr(x). + Added macro @Example (adding @group). + Other minor improvements. + +2001-03-19 Werner LEMBERG + + * doc/groff.texinfo: Added two new indices: `es' (for escapes) and + `rq' for requests. `fn' is no longer used. + Added macros @Defreq(x), @Defreg(x), and @Defesc(x). + Removed @Deffn(x). + + * tmac/an-old.tmac (an-p-footer): If `cR' is set, replace page + number with name of man page. + +2001-03-19 Larry Kollar + + * doc/groff.texinfo: Complete revision. Added many @Deffn to gain + consistency. + +2001-03-19 Werner LEMBERG + + * man/groff_font.man: Document `prepro', `postpro', and `print'. + * src/roff/groff/groff.man: Improve documentation of `-l' and `-L'. + * src/devices/grohtml/grohtml.man: Fixing typos. + +2001-03-19 Gaius Mulley + + * tmac/s.tmac (@IP): Pass `.ip' html tag. + * tmac/groff_mwww.man: Remove .LINE macro + * tmac/www.tmac (LINE): Add `.ti'. + + * src/devices/grohtml/post-html.cc (html_printer): New member + `indent'. + (html_printer::emit_raw): Use it. + (html_printer::do_linelength): Ditto. + (html_printer::do_pageoffset): Ditto. + (html_printer::do_indentation): Ditto. + (html_printer::do_tempindent): Ditto. + (html_printer::do_break): Ditto. + (html_printer::begin_page): Ditto. + (html_printer::do_indentedparagraph): New function. + (html_printer::troff_tag): Handle `.ip'. + * src/devices/grohtml/html-text.cc (html_text::issue_table_begin): + Add `' handling. + (html_text::do_table): Add parameter. + (html_text::do_indent): Updated. + * src/devices/groohtml/html-text.h: Updated. + +2001-03-16 Gaius Mulley + + Introduced simple html tables to implement indentation. + + * src/devices/grohtml/html.h (word, word_list): New structures. + (simple_output): Use it. + * src/devices/grohtml/post-html.cc: Add `INDENTATION'. + (html_printer): Improve indentation handling. + (html_printer::emit_raw): Set `in_table' element. Handle + indentation if set. + (html_printer::write_header): Move conditional downwards. + Don't allow whitespace in tags. + (html_printer::do_linelength): Handle line length and indentation + conditionally. + (html_printer::do_pageoffset): Handle indentation conditionally. + (html_printer::do_indentation): Ditto. + (html_printer::do_tempindent): New function member. + (html_printer::do_fill): Take care of indentation. + (html_printer::do_flush): Finish table. + (html_printer::do_links): Ditto. + (html_printer::do_break): New function for handling `.br' and `.ti'. + (html_printer::troff_tag): Use it. + Handle `.ti'. + (html_printer::flush_globs): Fix. + (html_printer::flush_page): Finish table. + (html_printer::html_printer): Fix error message. Set up + `linelength'. + (html_printer::add_to_sbuf): Remove special handling of character + code 255. + (to_unicode): Remove `stop()'. + (html_printer::write_title): Cleanup. + (html_printer::begin_page): Use `put_string()'. Handle indentation. + (html_printer::~html_printer): Flush text and end the line. + Use `put_string()'. + * src/devices/grohtml/html_text.h: Add more *_TAG enum values. + * src/devices/grohtml/html_text.cc (html_text::end_tag): Fix + emission of tags. + (html_text::start_tag): Disable newlines. + (html_text::table_is_void): New function. + (html_text::issue_table_begin): Ditto. + (html_text::issue_table_end): Ditto. + (html_text::push_para): Better table handling. + (html_text::do_indent): New function. + (html_text::do_table): Ditto. + (html_text::done_table): Ditto. + (html_text::do_tt): Handle PRE_TAG. + (html_text::is_in_table): New function. + (html_text::check_emit_text): Handle tables. + (html_text::do_emittext): Use `nl()'. + (html_text::do_para): Handle table. + (html_text::remove_def): New function. + * src/devices/grohtml/output.cc (word, word_list): Implement + methods. + (simple_output::end_line): Flush last word. + (simple_output::simple_comment): Ditto. + (simple_output::begin_comment): Recoded. + (simple_output::end_comment): Ditto. + (simple_output::comment_arg): Removed. + (simple_output::check_newline): Improve test and flush last word. + (simple_output::space_or_newline): Improved. + (simple_output::write_newline): Replaced with... + (simple_output::nl): This. + (simple_output::put_raw_char): Flush last word. + (simple_output::check_space): Removed. + (simple_output::put_translated_string): Ditto. + (simple_output::put_string): Simplified. + (simple_output::put_number): Updated. + (simple_output::put_float): Ditto. + (simple_output::put_symbol): Removed. + (simple_output::enable_newlines): Add `check_newline()'. + (simple_output::flush_last_word): New function. + + * src/roff/troff/enc.cc (no_fill): Remove call to add_html_tag(). + * src/roff/troff/div.cc (page_offset): Add call to add_html_tag(). + + * tmac/s.tmac (@PP, @IP): Add html conditional code. + * tmac/an-old.tmac (TP): Ditto. + +2001-03-09 Ruslan Ermilov + + * mdate.sh: Make it POSIX compliant. + +2001-03-09 Werner LEMBERG + + Added the `return' request to end a macro immediately. It simply + pops iterators from the input stack until a macro iterator is found. + + * src/roff/troff/input.cc (input_iterator::is_macro, + macro_iterator::is_macro): New member. + (input_return_boundary): New class to signal an immediate return + to while_request(). + (input_stack::add_return_boundary, input_stack::is_return_boundary): + New functions. + (input_stack::clear): Use it. + (input_stack::pop_macro): New function. + (while_request): Use `is_return_boundary()'. + (return_macro_request): New function. + (init_input_requests): Use it. + + * src/roff/troff/TODO: Updated. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + +2001-03-08 Werner LEMBERG + + * src/roff/troff/input.cc (input_iterator::is_boundary): Minor + cleanup. + +2001-03-07 Werner LEMBERG + + Make `\B' more rigid. + + * src/roff/troff/number.cc (parse_expr, parse_term): Add `rigid' + parameter. + (get_number_rigidly): New function. + * src/roff/troff/input.cc (do_expr_test): Use it. + * src/roff/troff/token.h: Updated. + + * src/roff/troff/request.h: Fix typo (init_html_request -> + init_markup_request). + +2001-03-04 Gaius Mulley + + Fixed grohtml handling of any named glyph for glyph indexes < 0x80. + Cosmetic changes to `.html-begin', `.html-end', `.html-image' which + are now `.begin', `.end', `.image'. + + * src/devices/grohtml/post-html.cc: Adding UNICODE_DESC_START. + (html_printer::add_to_sbuf): Changing type of `code' parameter. + Use add_char_to_sbuf(). + (to_unicode): New function. + (char_translate_to_html): Changing type of `ch' parameter. + Use `to_unicode()'. + (html_printer::~html_printer): Comment out doctype string. + * src/preproc/html/pre-html.cc (write_end_image): Use `.end' + instead of `.html-end'. + (write_start_image): Use `.begin' and `.image' instead of + `.html-begin' and `.html-image'. + * src/roff/troff/input.cc: Rename `html_level' to `begin_level'. + (html_begin): Renamed to ... + (begin): This. + (html_end): Renamed to ... + (end): This. + (html_image): Renamed to ... + (image): This. + (init_html_requests): Renamed to ... + (init_markup_requests): This. + * tmac/www.tmac: Updated. + +2001-02-28 Bram + + * src/libs/libgroff/font.cc (font_widths_cache): Fixing syntax of + constructor. + +2001-02-26 David Leonard + + * doc/meref.me: Fixing some typos. + +2001-02-16 Werner LEMBERG + + * src/roff/troff/node.cc (space_node::get_hyphenation_type): New + method. Return `HYPHEN_MIDDLE' if it was `\:'. + * src/roff/troff/node.h: Updated. + +2001-02-17 Ruslan Ermilov + + * tmac/groff_tmac.man: Fix typo. + +2001-02-16 Werner LEMBERG + + Fixing a bug which prevented proper end-of-sentence recognition + between an `unformatted' box and the following text. As a + consequence, vertical line distances are no longer preserved in + boxes after a call to `.unformat' -- because boxes aren't + line-oriented (contrary to diversions), this doesn't make sense + anyway. + + * src/roff/troff/node.cc (*node::set_unformat_flag): Add return + value. + (vertical_size_node::set_unformat_flag): New method. + * src/roff/troff/node.hh: Updated. + * src/roff/troff/input.cc (word_space_node::reread, + hmotion_node::reread): Reset `unformat' flag after usage. + (unformat_macro): Append only if `set_unformat_flag()' returns + non-zero. + * src/roff/troff/troff.man: Updated. + +2001-02-15 Werner LEMBERG + + * src/roff/troff/troff.man, NEWS, man/groff.man: Improved + documentation of `asciify' and `unformat' requests. + +2001-02-13 Werner LEMBERG + + Redesigned the `unformat' request. It is no longer connected with + `asciify' but rather uses new `reread()' methods if the `unformat' + flag is set. Additionally, the handling of space characters after + unformatting has been fixed so that they retain their width. + + * src/roff/troff/node.h (width_list): New structure to store + original widths of spaces. + (node): Added `unformat' member. + Replaced `num_spaces' variable with `orig_width' list. + * src/roff/troff/node.cc (*node::asciify, + asciify_reverse_node_list): Removed `unformat_only' flag and related + code. + (word_space_node::asciify, word_space_node::word_space_node): Use + `orig_width'. + (word_space_node::~word_space_node): New destructor. + (word_space_node::copy): Updated to handle `orig_width'. + (hmotion_node::copy, unbreakable_space_node::copy): Updated. + (*node::merge_space): Update `orig_width' list if necessary. + (*node::set_unformat_flag): New methods to set the `unformat' flag. + * src/roff/troff/enc.cc (environment::space_newline): Use + `width_list'. + (environment::space): Added method to handle space width and + sentence space width as parameters. Use `width_list'. + (environment::make_tab_node): Updated. + * src/roff/troff/env.h: Updated. + * src/roff/troff/input.cc (word_space_node::reread, + unbreakable_space_node::reread, hmotion_node::reread): New methods + to handle nodes specially if `unformat' flag is set. + (do_asciify_macro): Renamed back to ... + (asciify_macro): This. + (unformat_macro): New implementation to simply set the `unformat' + flag. + + * MORE.STUFF: Added more info about deroff. + +2001-02-08 Werner LEMBERG + + * src/roff/troff/node.h (unbreakable_space_node, hmotion_node, + space_char_hmotion_node, overstrike_node): Add `get_hyphen_list()' + and `add_self()' methods to avoid hyphenation. For example, the + hyphen list for `foo\0\0bar' was `foobar', causing insertion of a + soft hyphen after `foo'. Now the hyphen list is correctly + `foobar'. + +2001-02-05 Yoshiteru Kageyama + + * tmac/groff_tmac.man: Fix `BIR' macro. + +2001-02-04 Werner LEMBERG + + A new escape sequence `\:', inserting a zero-width break point. + + * src/roff/troff/input.h: Adding `ESCAPE_COLON'. + * src/roff/troff/input.cc (get_copy, token::next, asciify): + Implement it. + * src/roff/troff/node.h (node): Add `is_escape_colon()' virtual + method. + (space_node): Add `was_escape_colon' member. Add `is_escape_colon()' + and `asciify()' methods. + * src/roff/troff/node.cc (space_node::space_node): Updated. + (space_node::asciify): Handle `was_escape_colon'. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + Handle `\~' similar to other comparable requests. + + * src/roff/troff/input.cc (process_input_stack): Remove now obsolete + label. + (token::next): Move creation of an unbreakable_space_node to... + (token::add_to_node_list): Here. + + Fix a bug which sometimes prevented hyphenation of words connected + with `\~' or `\ ' (and other escape sequences handled as + TOKEN_NODE). This also fixes a hyphenation problem with boxes + (after a call to the `unformat' request). + + * src/roff/troff/env.h (environment::possibly_break_line, + environment::hyphenate_line): Introducing `start_here' parameter. + * src/roff/troff/env.cc (environment::space_newline, + environment::space): Use it. + (environment::possibly_break_line, environment::hyphenate_line): + Implement it. + * src/roff/troff/input.cc (process_input_stack): Use it. + * src/roff/troff/node.h (unbreakable_space_node, hmotion_node, + space_char_hmotion_node, overstrike_node): Add + `get_hyphenation_type()' method. + * src/roff/troff/node.cc (break_char_node::asciify): Don't asciify + if `unformat_only' is active. + +2001-01-30 Werner LEMBERG + + Implemented new read-only number register `.linetabs' which + returns 1 if in line-tabs mode, 0 otherwise. + + * src/roff/troff/env.h (environment): Add get_line_tabs() member. + * src/roff/troff/env.cc (get_line_tabs): New function. + (init_env_requests): Use it. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * VERSION, REVISION: Changing to 1.17.0. + +2001-01-28 Werner LEMBERG + + Fixed a bug which prevented hyphenation of words which are finished + with `\)'. + + * src/roff/troff/token.h (token): Add enum type + `TOKEN_TRANSPARENT_DUMMY' and method `transparent_dummy()'. + * src/roff/troff/input.cc (token::next, token::description, + get_line_arg, token::add_to_node_list, token::process): Use it. + +2001-01-27 Werner LEMBERG + + * src/roff/troff/div.h (diversion): Add `saved_prev_line_interrupted'. + * src/roff/troff/div.cc (do_divert): Use it. + + * src/roff/troff/input.cc (asciify): Add ESCAPE_RIGHT_PARENTHESIS. + +2001-01-25 Werner LEMBERG + + Adding the `linetabs' request. If set, tab distances are not + computed relative to the input line but relative to the output line. + + * src/roff/troff/env.h (environment): New member `line_tabs'. + * src/roff/troff/env.cc (line_tabs_request): Implement request. + (environment::environment, environment::copy): Updated. + (environment::distance_to_next_tab): Use `line_tabs'. + (init_env_requests): Register request. + * src/roff/troff/troff.man, man/groff.man, NEWS: Document it. Other + fixes. + +2001-01-24 Werner LEMBERG + + Introducing a new read-only register `.int' which is set to a + positive value if the last output line is interrupted (i.e., if it + contains `\c'). + + * src/roff/troff/env.cc (init_env_requests): Add it. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + +2001-01-23 Gaius Mulley + + * tmac/mwww.tmac: Call `www.tmac', not `arkup.tmac'. + * src/preproc/html/pre-html.cc (findPrefix): New function which + generates the troff executable name via the system prefix. + * src/preproc/eqn/main.cc: Modified warning message. + +2001-01-23 Werner LEMBERG + + troff's `box' and `boxa' requests didn't preserve temporary + indentation. + + * src/roff/troff/div.h (diversion): Add `saved_saved_indent' and + `saved_target_text_length' members. + * src/roff/troff/div.cc (do_divert): Use them. + + Tabs (but not yet leaders and fields) are now handled correctly by + `asciify' request. + + * node.h (hmotion_node): Add field `was_tab'. + * env.cc (environment::make_tab_node): Set it. + * node.cc (hmotion_node::copy, hmotion_node::asciify): Use it. + + Added new request `unformat' which will, contrary to `asciify', + preserve font information after unformatting (i.e., only nodes + dealing with horizontal space are converted back to input + characters). + + * input.cc (asciify_macro): Renamed to ... + (do_asciify_macro): this, having a new parameter `unformat_only'. + (asciify_macro, unformat_macro): New; using do_asciify_macro. + (init_input_requests): Added `unformat'. + * node.cc (*_node::asciify), asciify_reverse_node_list: Added + parameter to control asciification process. + * node.h (*_node::asciify): Ditto. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + +2001-01-20 Werner LEMBERG + + * doc/groff.texinfo: Minor improvement of `.in' documentation. + +2001-01-18 Werner LEMBERG + + * tmac/ps.tmac: Remove call of psold.tmac. + * tmac/psold.tmac: Comment updated. + * tmac/psnew.tmac: Removed since no longer needed. + * tmac/Makefile.sub, NEWS, src/devices/grops/grops.man: Updated. + + * font/devutf8/R.proto: Adding `shc' glyph. + * font/devutf8/NOTES: Updated. + + * test-groff: Updated. + +2001-01-15 Gaius Mulley + + First cut of the new html device driver. Changes to pre-html and + the new grohtml are too numerous to be documented here. + + Stuff related to `html' has been renamed to `html-old' and `html2' + stuff has been renamed to `html' (including directories). The new + html device driver is therefore invoked as `-Thtml'. + + Added new `\O' escape to suppress output (needed by html driver). + + Added functions and code to pass info about input-level commands + (`.in', `.fl', etc.) to html driver. + + Three new functions (.html-begin, .html-end, and .html-image) for + better html handling: `html-begin' will execute the remaining line + if at the outermost nesting level, increasing an internal counter. + `html-end' does the same but decreases the internal counter. + `html_image' puts its arguments into a special node (suppress_node) + to define an image region. + + The `output' request has been removed. + + * tmac/html-tags.tmac: Removed. + * tmac/arkup.tmac: Updated and renamed to ... + * tmac/www.tmac: New file. + * tmac/markup.tmac Updated and renamed to ... + * tmac/mwww.tmac: New file. + * tmac/Makefile.sub: Updated. + * tmac/an-old.tmac: Updated. + * tmac/eqnrc: Updated. + * tmac/groff_man.man + * tmac/groff_markup.man: Updated and renamed to ... + * tmac/groff_mwww.man: New file. + * tmac/groff_tmac.man: Updated. + * tmac/html-old.tmac: Updated and Renamed from html.tmac. + * tmac/html.tmac: Updated and renamed from html2.tmac. + * tmac/pspic.tmac: Updated html support. + * tmac/s.tmac: Added html output support. + * tmac/troffrc, tmac/troffrc-end: Updated. + + * Makefile.in, doc/Makefile: Updated. + * doc/groff.texinfo: Added info about new `\O' escape. + * doc/homepage.ms: Use `MAILTO' macro. + + * font/devhtml/DESC.proto: Add `C' font. + * font/devhtml/Makefile.sub: Updated. + * font/devhtml/R.proto: Minor fixes. + * font/devhtml-old/Makefile.sub: Updated. + + * src/devices/grohtml-old/Makefile.sub: Updated. + + * src/libs/libdriver/printer.cc (printer::get_font_from_index): New + method. + * src/libs/libgroff/htmlindicate.cc (html_begin_suppress, + graphic_start): Add `inline' parameter. Update. + (html_end_suppress, graphic_end): Update. + + * src/include/html-strings.h: New file. + * src/include/htmlindicate.h: Comments updated. + * src/include/printer.h: Updated. + + * src/preproc/eqn/main.cc (do_file, main): Updated. + * src/preproc/pic/troff.cc (troff_output::start_picture, + troff_output::finish_picture): Updated. + * src/preproc/tbl/main.cc (process_input_file): Updated. + + * src/roff/groff/groff.cc (main): Updated. + Pass device arguments to predrivers also. + Use `ps' device for `eqn' preprocessor if `-Thtml' is given. + * src/roff/troff/env.h (environment): Updated. + New elements `need_eol' and `ignore_next_eol' (for html output). + * src/roff/troff/env.cc (environment::environment): Add initializers + for `need_eol' and `ignore_next_eol'. + (environment::add_html_tag_eol, environment::add_html_tag_tabs): New + functions. + (point_size, fill, no_fill, center, right_justify, line_length, + indent, temporary_indent, break_request, handle_tab): Use + `add_html_tag()'. + (set_tabs): Use `add_html_tag_tabs()'. + (environment::add_html_tag): Updated. + (environment::do_break): Updated. + * src/roff/troff/div.cc (space_request, flush_output): Use + `environment::add_html_tag()'. + * src/roff/troff/input.cc: Updated. + New variable `html_level' to indicate nested `html-begin' requests. + (file_iterator::fill): Use `environment::add_html_tag_eol()'. + (non_interpreted_char_node, token_node, non_interpreted_node): Add + `force_tprint()' method. + (token::next): Handle `\O'. + (do_suppress): Implement it. + (html_begin, html_end, html_image): New functions. + (init_output_requests): Renamed to ... + (init_html_requests): this. + (main): Use it. + (macro::append_str, macro::append_unsigned, macro::append_int): New + methods. + New variable `output_low_mark_miny' to limit minimal value of y. + (reset_output_registers): Use it. + (output_request): Removed. + (get_output_registers): New function. + * src/roff/troff/node.h (node): Make `force_tprint()' virtual. + (*_node): Added `force_tprint()' if necessary. + (special_node): New elements `tf' and `get_tfont()'. + (suppress_node): New class. + * src/roff/troff/node.cc: + New global variables `image_no' and `suppress_start_page'. + (real_output_file): New method `is_on()'. + (troff_output_file): New method `start_special(tfont)'. + (troff_output_file::really_print_line): Use `tprint' conditionally. + (real_output_file::print_line): Updated. + (real_output_file::on): Updated. + (*_node): Added `force_tprint()'. + (special_node::special_node): Initializer updated. + (special_node::same, special_node::copy, special_node::tprint_start): + Updated. + (get_reg_int, get_reg_str): New functions. + (suppress_node::*): New methods. + New global variables last_position, last_image_filename; + (min): New inline function. + * src/roff/troff/reg.h, src/roff/troff/request.h, + src/roff/troff/troff.h: Updated. + +2001-01-13 Werner LEMBERG + + * NEWS, src/roff/troff/troff.man, doc/groff.texinfo: Fix + documentation of `asciify' request. + +2001-01-12 Werner LEMBERG + + * src/roff/troff/input.cc: Move definition of special characters + like `ESCAPE_TILDE' to ... + * src/roff/troff/input.h: New file. + * src/roff/troff/Makefile.sub (HDRS): Add it. + + Extending the .asciify request to `unformat' space characters also. + + * src/roff/troff/node.h (word_space_node): Add `num_spaces' element + to count input space characters. + Update constructors to take care of it. + * src/roff/troff/node.cc (space_char_hmotion_node::asciify): Use + `ESCAPE_SPACE' instead of normal space. + (word_space_node::asciify): New method. + (unbreakable_space_node::asciify): New method. + (word_space_node::merge_space): New method. + * src/roff/troff/env.cc (environment::space_newline, + environment::space): Add code to initialize `num_spaces' (using the + constructor of `word_space_node'). + * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: + Document it. + +2001-01-09 Werner LEMBERG + + * man/groff_char.man: Use table header traps only conditionally. + +2001-01-09 Bjarni Ingi Gíslason + + * man/groff_char.man: Add `ý' and `Ý' to the `acute' group. + +2001-01-08 Werner LEMBERG + + Introducing the `box' and `boxa' requests which are similar to + `di' resp. `da' but omitting a partially filled line (which is + restored after ending the diversion). + + * src/roff/troff/div.h (diversion): Add elements to save partially + filled line. + * src/roff/troff/div.cc (do_divert): Add parameter `boxing' to save + partially filled line. + (divert, divert_append): Updated. + (box, box_append): New functions. + (init_div_requests): Use them. + * src/roff/troff/env.h (environment): do_divert() is now a friend. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * doc/groff.texinfo: Fix documentation of `lf' request. + +2000-12-25 Werner LEMBERG + + * src/roff/troff/troff.man, NEWS: Document `writem' request. + +2000-12-21 Werner LEMBERG + + Ignore `ss' request if in compatibility mode. + + * src/roff/troff/input.cc: Make `compatible_flag' non-static. + * src/roff/troff/env.h: Added extern `compatible_flag' declaration. + * src/roff/troff/env.cc (space_size): Use it. + + * doc/groff.texinfo, src/roff/troff/troff.man: Fix documentation of + `ss' request in nroff mode. + + * tmac/an-old.tmac: Fixed some serious bugs introduced with latest + changes. + +2000-12-15 Ruslan Ermilov + + * tmac/troffrc, tmac/troffrc-end: Convert tmac.* to *.tmac. + +2000-12-13 Werner LEMBERG + + * src/preproc/eqn/Makefile.sub (MAN1): Added neqn.man. + * src/preproc/eqn/neqn.man: Small fixes and additions. + +2000-12-13 Ruslan Ermilov + + * src/utils/addftinfo/addftinfo.man, src/devices/grops/grops.man: + Fixing typo. + + * src/preproc/eqn/neqn.man: New file. + + * src/preproc/tbl/table.cc (table::print): Fix `indent cannot be + negative' warning. + + * tmac/e.tmac: Add `T&' macro. + Fix `indent cannot be negative' warning. + * tmac/s.tmac: Fix `indent cannot be negative' warning. + +2000-12-07 Werner LEMBERG + + * src/include/lib.h: Replaced __ALPHA with __alpha symbol. + +2000-12-06 Werner LEMBERG + + * PROBLEMS: Added info about adding -lPW on HP-UX to satisfy the + `alloca' symbol . + + * MORE.STUFF: Added info about deroff for djgpp. + + * tmac/an-old.tmac, tmac/groff_man.man, doc/groff.texinfo, NEWS: Fix + documentation of -rcR switch. + +2000-12-03 Werner LEMBERG + + * tmac/an-old.tmac: Implementing the -rcR switch (similar to mdoc); + if -rcR=1 (which is now the default in nroff mode), a single, very + long page is created instead of multiple pages: All `ne' and `wh' + requests are put into conditionals; a new macro `an-end' is added to + be called with `em'. + + Some other minor cleanups. + + * NEWS, tmac/groff_man.man, doc/groff.texinfo: Updated. + +2000-12-02 Werner LEMBERG + + Fixing a bug which prevented hyphenation in words followed + immediately by a TOKEN_NODE (e.g. `\ ', `\~', etc.). + + * src/roff/troff/input.cc (process_input_stack ): + Adding possibly_break_line(). + * src/roff/troff/env.h (environment): Make possibly_break_line() + public. + + Make `\~' usable in .tr request. + + * src/roff/troff/token.h (token_type): Add TOKEN_STRETCHABLE_SPACE. + (token): Add stretchable_space(). + * src/roff/troff/input.cc (token::next, token::delimiter, + token::description, process_input_stack, do_translate, + add_to_node_list, token::process): Use it. + * src/roff/troff/node.h (node): Add fourth parameter to add_char() + for adjusting the space. + * src/roff/troff/node.cc (node::add_char): Implement it. Add code + for stretchable space. + * src/roff/troff/input.cc (token::add_to_node_list): Use it. + (make_node): Add code for stretchable space. + * src/roff/troff/env.cc (environment::add_char): Use it. + * src/roff/troff/input.cc: Add ESCAPE_TILDE special character. + (get_copy, token::next, transparent_translate, asciify): Use it. + + * NEWS, src/roff/troff/troff.man, src/roff/troff/TODO, + doc/groff.texinfo: Updated. + * man/groff.man: Small reorderings. + +2000-11-23 Werner LEMBERG + + * NEWS: Fixes. + * src/preproc/eqn/main.cc (main): Use `config_macro_path' for -M + option. + * src/roff/troff/input.cc (main): Add `config_macro_path' and + `safer_macro_path' to -M option. + * src/roff/troff/troff.man: Fixes. + +2000-11-22 Werner LEMBERG + + Use safer path (except for config files) if -U isn't specified. Add + a special macro path (without home and current directory) for config + files. Add home directory to unsafe path for consistency. Don't + include the home directory in the font path. + + * src/libs/libgroff/macropath.cc: Add `config_macro_path', change + `macro_path'. + * src/include/macropath.h: Add `config_macrp_path'. + * src/libs/libgroff/fontfile.cc: Fix font path. + * src/roff/troff/input.cc (process_startup_file): Use + `config_macro_path'. + (main): Select unsafe path if -U is given. + + * src/preproc/eqn/main.cc (main): Fixing search path for + configuration file. + * src/preproc/eqn/eqn.man: Updated. + + * src/roff/troff/troff.man, man/roff.man, tmac/groff_tmac.man: + Updated. + + * src/preproc/grn/grn.man, src/devices/grodvi/grodvi.man, + src/devices/grohtml/grohtml.man, src/devices/grolbp/grplbp.man, + src/devices/grolj4/grolj4.man, src/devices/grops/grops.man, + src/devices/grotty/grotty.man: Updated. + + * Makefile.in: Fix comments. + +2000-11-17 Werner LEMBERG + + * tmac/safer.tmac: Empty file added (again) for compatibility + reasons. + * tmac/Makefile.sub: Updated. + +2000-11-16 Werner LEMBERG + + * src/devices/grodvi/dvi.cc (main), + src/devices/grohtml2/post-html.cc (main), + src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc + (main), src/preproc/eqn/main.cc (main), src/preproc/grn/main.cc + (main), src/preproc/html2/pre-html.cc (main), + src/preproc/pic/main.cc (main), src/preproc/refer/refer.cc (main), + src/preproc/soelim/soelim.cc (main), src/preproc/tbl/main.cc + (main), src/roff/groff/groff.cc (main), src/roff/troff/input.cc + (main), src/utils/hpftodit/hpftodit.cc (main), + src/utils/indxbib/indxbib.cc (main), src/utils/lkbib/lkbib.cc + (main), src/utils/lookbib/lookbib.cc (main), + src/utils/pfbtops/pfbtops.c (main), src/utils/tfmtodit/tfmtodit.cc + (main): Use stdout for -v. + * src/roff/groff/groff.cc (run_commands), + src/roff/groff/pipeline.c (run_pipeline): New parameter `no_pipe' + to make direct printing to stdout possible. + * src/roff/groff/pipeline.h: Updated. + + * src/utils/afmtodit/afmtodit.pl: Add -v switch. + * src/utils/afmtodit/Makefile.sub (afmtodit): Use @VERSION@. + * src/utils/afmtodit/afmtodit.man: Updated. + + * src/utils/addftinfo/addftinfo.cc (main): Add -v switch. + (version): New function. + (usage): Updated. + * src/utils/addftinfo/addftinfo.man: Updated. + + * src/devices/*/*, src/preproc/*/*, src/roff/*/*, src/utils/*/*: + Fixing copyright dates. + + * src/preproc/eqn/neqn.sh: Adding GROFF_BIN_PATH to path instead of + replacing it. + + * src/devices/grolbp/lbp.cc (main): Use Version_string instead of + version_string. + + * src/roff/nroff/Makefile.sub (nroff): Fix use of @VERSION@. + +2000-11-15 Werner LEMBERG + + In all programs, make -v return immediately with exit status 0 to + be compliant with the GNU standard. + + * src/devices/grodvi/dvi.cc (main), + src/devices/grohtml2/post-html.cc (main), + src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc + (main) src/preproc/eqn/main.cc (main), src/preproc/grn/main.cc + (main), src/preproc/html2/pre-html.cc (main), + src/preproc/pic/main.cc (main), src/preproc/refer/refer.cc (main), + src/preproc/soelim/soelim.cc (main), src/preproc/tbl/main.cc + (main), src/roff/groff/groff.cc (main), src/roff/troff/input.cc + (main): Implement it. + * NEWS: Updated. + + * src/roff/groff/groff.cc (main): Add copyright notice. Add refer + and postprocessors to the -v option. + + * src/roff/grog/grog.pl: Implement -v. + * src/roff/grog/Makefile.sub (grog): Use @VERSION@. + * src/roff/grog/grog.man, doc/groff.texinfo: Updated. + + * src/roff/nroff/nroff.sh: Implement -v. + * src/roff/nroff/Makefile.sub (nroff): Use @VERSION@. + * src/roff/nroff/nroff.man: Updated. + + * src/preproc/eqn/main.cc (main): Fix comment typo. + + * MORE.STUFF: Added info about djgpp port of grap. + +2000-11-14 Werner LEMBERG + + * src/roff/grog/grog.{pl,sh}: Implemented -C switch for compatibility + mode (or rather, implemented non-compatibility mode). + * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated. + + * src/roff/groff/groff.cc (main): Add BIN_PATH to PATH instead of + replacing it -- we don't find gxditview otherwise. + * NEWS, src/roff/groff/groff.man, doc/groff.texinfo: Updated. + + * src/preproc/pic/depend: Removed. Unnecessary. + + Implemented dummy keyword `solid' in pic for compatibility with + AT&T pic. + + * lex.cc (lookup_keyword): Added `solid'. + * pic.y: Added SOLID with dummy rule. + * pic.cc, pic_tab.h: Regenerated. + * doc/pic.ms: Updated. + +2000-11-13 Werner LEMBERG + + For security reasons, don't use the current directory but the home + directory while searching and scanning troffrc and troffrc-end. + Similarly, replace the current directory with the home directory + in the font path. + + * Makefile.in (fontpath, tmacpath): Remove current directory. + + * src/libs/libgroff/searchpath.cc (search_path::search_path): Add + two parameters `add_home' and `add_current'. + (search_path::~search_path, search_path::command_line_dir, + search_path::open_file): Remove tests for `dirs' being zero. + * src/include/searchpath.h: Adjust. + * src/libs/libgroff/macropath.cc, src/include/macropath.h: Add + `safer_macro_path'. + * src/libs/libgroff/fontfile.cc: Adjust `font_path'. + + * src/roff/troff/troff.h: Add `searchpath.h' and `mac_path'. + * src/roff/troff/input.cc: Use `mac_path', initialized with + `macro_path'. + (process_startup_file): Set `mac_path' to `safer_macro_path'. + * src/roff/troff/env.cc: Use `mac_path'. + + * src/preproc/eqn/main.cc (main): Use `safer_macro_path'. + + * NEWS, man/roff.man, src/roff/troff/troff.man, + src/roff/groff/groff.man, tmac/groff_tmac.man, arch/djgpp/README: + Updated. + +2000-11-12 Werner LEMBERG + + * src/include/lib.h: Don't include groff-getopt.h for OSF/1. + + * aclocal.m4 (GROFF_SYS_ERRLIST): Do test in C, not in C++. + * configure.in: Fix typo in comment. + * configure: Regenerated. + + * src/libs/libgroff/*, src/include/*, src/roff/troff/*: Fixing + copyright dates. + +2000-11-08 Werner LEMBERG + + Add system tmac directory (/usr/local/lib/groff/site-tmac). + + * Makefile.in: Add $(libdir), $(libprogramdir), and $(systemtmacdir). + (uninstall_dirs): Add $(libdir), $(libprogramdir), and + $(systemtmacdir). + Use @libdir@. + * Makefile.comm (.man.n): Add @SYSTEMMACRODIR@. + * tmac/Makefile.sub (install_data): Create + $(systemtmacdir) and $(localtmacdir). + (uninstall_sub): Use $(systemtmacdir) for wrapper macros. + * man/roff.man, src/roff/troff/troff.man, src/roff/groff/groff.man, + NEWS, doc/groff.texinfo: Updated and minor fixes. + + * Makefile.comm, Makefile.in: Added tmac_{s,an}_prefix stuff again. + * tmac/Makefile.sub: Added `wrap' stuff again, but installing into + $(systemtmacdir) since the wrapper files are platform-dependent. + +2000-11-01 Werner LEMBERG + + * doc/groff.texinfo: Fix typo. + +2000-10-26 Werner LEMBERG + + Convert macros `tmac.XXX' to `XXX.tmac'. Special cases: + tmac.doc.old -> doc-old.tmac + tmac.an.old -> an-old.tmac + + * tmac/tmac.*: Moved to ... + * tmac/*.tmac: this. + * tmac/man.local: Fix comment. + * tmac/groff_man.man, tmac/groff_markup.man, tmac/groff_mdoc.man, + tmac/groff_me.man, tmac/groff_ms.man, tmac/groff_tmac.man: Updated. + Added some `FILES' sections. More use of @...@ directives. Other + minor updates. + * arch/djgpp/README, font/devutf8/NOTES: Updated. + * doc/homepage.ms, doc/groff.texinfo: Updated. + * man/groff.man, man/roff.man: Updated. + * src/devices/grodvi/grodvi.man, src/devices/grolbp/grolbp.man, + src/devices/grolj4/grolj4.man, src/devices/grops/grops.man, + src/devices/grotty/grotty.man: Updated. + * src/preproc/pic/pic.man: Updated. + * src/roff/grog/grog.pl, src/roff/grog/grog.sh: Use -mdoc-old + instead of -mdoc.old. + * src/roff/grog/grog.man: Document -mdoc and -mdoc-old. + * src/roff/nroff/nroff.man: Updated. + * NEWS: Updated. + + * tmac/fixmacros.sed, tmac/strip.sed: Add explanatory comment. + + * tmac/mm.diff: Removed -- it has no use now since the mm package + is part of groff. + + * tmac/*: Removed trailing spaces. + + * arch/djgpp/t-groff.bat: Fix GROFF_TMAC_PATH (hyphen.us is now in + the tmac subdirectory also). + + * Makefile.comm, Makefile.in: Remove tmac_{s,an}_prefix stuff. + * tmac/Makefile.sub: Adapted to new macro names; removed `wrap' + stuff since it is no longer needed. + + * README, PROBLEMS: Updated. + +2000-10-25 Werner LEMBERG + + Invert current behaviour: Search first FOOBAR.tmac, then + tmac.FOOBAR. + + * src/roff/troff/input.cc: Introduce MACRO_POSTFIX. + (open_mac_file, macro_source): Implement it. + * src/roff/troff/troff.man, tmac/groff_tmac.man, man/roff.man, + doc/groff.texinfo, NEWS: Document it. + + * src/roff/nroff/nroff.man, src/roff/groff/groff.man, man/groff.man: + Small documentation improvements. + + * test-groff: Fix GROFF_TMAC_PATH (hyphen.us is now in the tmac + subdirectory also). + + * font/devps/Makefile.sub: Fix rules for dingbats.*map. + +2000-10-24 Werner LEMBERG + + Add local tmac directory (groff/site-tmac). + + * Makefile.in: Add $(localtmacdir). + (uninstall_dirs): Add $(localtmacdir). + * Makefile.comm (.man.n): Add @LOCALMACRODIR@. + * tmac/Makefile.sub (install_data, uninstall_sub): Handle man.local + in $(localtmacdir). Create $(localtmacdir). + * man/roff.man, src/roff/troff/troff.man, NEWS, doc/groff.texinfo: + Updated and minor fixes. + + Rename font/devps/generate/dingbats[r]map to dingbats.[r]map. + + * font/devps/generate/Makefile.sub, arch/djgpp/README: Adjust. + +2000-10-23 Werner LEMBERG + + Move hyphen.us to tmac directory. + + * src/roff/troff/hyphen.us: Removed. + * src/tmac/hyphen.us: Added. + * src/roff/troff/Makefile.sub, tmac/Makefile.sub: Updated. + + Change installation structure for data files from .../groff/... to + .../groff//... to be conform with other GNU + programs. + + * Makefile.in, Makefile.comm, src/utils/indxbib/Makefile.sub, + doc/Makefile: Implement it. + * aclocal.m4 (GROFF_PAGE): Add test for new directory structure. + * configure: Updated. + * arch/djgpp/README, font/devutf8/NOTES: Use it. + * NEWS: Document it. + * man/roff.man, tmac/groff_tmac.man: Use @FONTPATH@, @FONTDIR@, and + @MACRODIR@ instead of hard-coded directories. + +2000-10-22 Werner LEMBERG + + Implement $GROFF_BIN_PATH environment variable (which defaults to + $bindir) used for child programs of groff and similar wrappers. + + * gendefs.sh: Improve documentation. + * Makefile.comm (,man.n), src/include/Makefile.sub (defs.h), + src/preproc/eqn/Makefile.sub (neqn), + src/roff/nroff/Makefile.sub (nroff): Add $(bindir). + * src/preproc/eqn/neqn.sh, src/roff/nroff/nroff.sh: Implement + $GROFF_BIN_PATH. + * src/roff/groff/groff.cc (main): Implement $GROFF_BIN_PATH and + $GROFF_PATH__ (the latter for communication with troff). + * src/roff/troff/input.cc (main): Use $GROFF_PATH__ for $PATH if + set. + * NEWS, src/roff/nroff/nroff.man, src/roff/groff/groff.man, + doc/groff.texinfo: Document it. + + * doc/groff.texinfo: Improve documentation of troff's -a option. + +2000-10-17 Gaius Mulley + + * src/roff/troff/node.cc: Fixed calculation of opminx and fixed + non-intrusive eol marker. + (troff_output_file::determine_line_limits): New function. + (troff_output_file::draw): Use it. + * src/roff/troff/env.cc (environment::add_html_tag): Use output() + + output_pending_lines() instead of output_line(). + * src/preproc/eqn/main.cc (do_file): Fix graphic_end(). + * src/preproc/html2/pre-html.cc (char_buffer::write_file_troff, + createImage): Small fixes. + +2000-10-14 Werner LEMBERG + + Replace tmac.safer with a real secure solution. + + * src/roff/troff/input.cc (open_request, opena_request, pipe_source, + system_request, pipe_output): Disable requests if in safer mode. + * src/roff/groff/groff.cc (main): Remove reference to tmac.safer. + * tmac/tmac.safer, tmac/groff_msafer.man: Removed. + * tmac/Makefile.sub, NEWS, man/roff.man, tmac/groff_tmac.man, + doc/groff.texinfo, src/roff/groff/groff.man, + src/roff/troff/troff.man, arch/djgpp/README: Updated. + + * src/devices/grops/ps.cc (main), src/devices/grops/psrm.cc + (resource_manager::output_prolog): Replace setenv() with putenv(). + +2000-10-09 Werner LEMBERG + + * src/libs/libbib/map.c, src/libs/libgroff/getcwd.c, + src/libs/libgroff/strtol.c, src/preproc/html2/image.cc, + src/preproc/html2/pre-html.cc, src/preproc/html2/pushbackbuffer.cc, + src/roff/groff/pipeline.c: Removing `#ifndef errno' to avoid + compilation errors with some compilers. It seems that this code + is no longer necessary -- if yes, it is easy to add some #ifdef's + for that particular old-fashioned compiler. + + * MORE.STUFF: Added info about Meta-tbl. + + * doc/groff.texinfo: Added more info about `.if "..."..."'. + +2000-10-07 Werner LEMBERG + + Adding a new escape sequence \B'...': If the string between + the delimiters is a valid numeric expression, return the character + `1', and `0' otherwise. This is an analogon to \A. + + * src/roff/troff/input.cc (do_expr_test): Implement it. + (token::next): Use it. + * src/roff/troff/troff.man, NEWS, man/groff.man: Document it. + + * tmac/tmac.trace: Made independent from escape character. + +2000-10-06 Werner LEMBERG + + Adding a new request .dei: define indirect. The first and second + parameter of .dei are taken from string registers instead directly; + this very special request is needed to make tmac.trace independent + from the escape character (which might even be disabled). + + * src/roff/troff/input.cc (do_define_macro): Implement it. + (define_macro_indirect): New function. + (init_input_requests): Use it. + + Adding two requests .ecs and .ecr: Save and restore the escape + character. These two requests are needed to make tmac.trace + independent from the escape character (which might even be + disabled). + + * src/roff/troff/input.cc (save_escape_char, restore_escape_char): + Implement it. + (init_input_requests): Use it. + + * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. + +2000-09-22 Ricardo Soares Guimarães + + Adding a new option -P and new environment variable GROPS_PROLOGUE + to grops, selecting a different prologue file (minor modifications + by WL). + + * src/devices/grops/psrm.cc (resource_manager::output_prolog), + src/devices/grops/ps.cc (main): Implement it. + * src/devices/grops/grops.man, NEWS: Document it. + +2000-09-22 Werner LEMBERG + + * INSTALL: Add info about selecting paper format. + +2000-09-21 Werner LEMBERG + + * src/roff/troff/input.cc (main): Fixing compiler warning. + * src/include/{driver.h, lib.h}: Move inclusion of string.h and + strings.h from the former to the latter. + * src/devices/grolbp/lpb.cc, src/include/lib.h: Move strncasecmp() + stuff from the former to the latter. + +2000-09-11 Werner LEMBERG + + Implementing two new requests .tm1 and .tmc: The former is similar + to .tm but can output leading spaces; its syntax is similar to + defining a string, i.e., a `"' can be used to mark the beginning of + the string to be written to stderr: `.tm1 " test'. The latter is + similar to .tm1 but doesn't write out a final newline character. + + * src/roff/troff/input.cc (terminal1, terminal_continue, + do_terminal): New functions. + (init_input_requests): Use them. + * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. + +2000-09-09 Werner LEMBERG + + * tmac/groff_mdoc.samples.man: Small fixes. + +2000-09-08 Werner LEMBERG + + * tmac/groff_mdoc.man: Fixing typo. + +2000-09-02 Werner LEMBERG + + Implementing a .nop request which does nothing. + + * src/roff/troff/input.cc (nop_request): New function. + (init_input_requests): Use it. + * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. + +2000-09-01 Werner LEMBERG + + * doc/groff.texinfo: Added some comments. + +2000-08-30 Werner LEMBERG + + * src/roff/troff/TODO: Updated. + +2000-08-25 Werner LEMBERG + + * doc/groff.texinfo: Fix comment how to compile the DVI file. + +2000-08-25 Eli Zaretskii + + * font/devps/generate/Makefile (SHELL): Define explicitly to + "/bin/sh", for non-Unix platforms. + (extraclean): Use a more portable "" quoting instead of a + backslash (which doesn't work on DOS/Windows). + + * font/devlj4/generate/Makefile (extraclean): Ditto. + + * font/devdvi/generate/Makefile (extraclean): Ditto. + +2000-08-25 Werner LEMBERG + + * NEWS, doc/groff.texinfo, tmac/groff_tmac.man, man/roff.man, + src/roff/troff/troff.man: Document Eli's latest changes. + +2000-08-25 Eli Zaretskii + + * src/roff/troff/input.cc (open_mac_file, macro_source): Support + macro file names of the form NAME.tmac as well as tmac.NAME. + +2000-08-25 Werner LEMBERG + + * src/include/posix.h: Remove definition of FILENAME_MAX. + + * src/preproc/html2/pre-html.h, pre-html.cc: Add return type to + `sys_fatal' and `stop' function(). + + * test-groff: Updated. + +2000-08-24 Gaius Mulley + + Added the new troff command .output to suppress output (while + still obeying motion) and also the opminx, opminy, opmaxx, opmaxy + registers (for passing the output dimensions to the output device). + + * src/roff/troff/div.cc (top_level_diversion::output): Use `width' + parameter. + * src/roff/troff/node.h, src/roff/troff/node.cc + (troff_output_file::really_print_line, + ascii_output_file::really_print_line, + supress_output_file::really_print_line): Use `width' parameter. + (troff_output_file::really_on, troff_output_file::really_off, + output_file::on, output_file::off, real_output_file::on, + real_output_file::off, real_output_file::really_on, + real_output_file::really_off): New functions. + (real_output_file:public output_file): New variable `output_on'. + (real_output_file::begin_page, real_output_file::copy_file, + real_output_file::transparent_char, real_output_file::print_line): + Use it. + (real_output_file::print_line): Use check_output_limits. + * src/roff/troff/reg.h, src/roff/troff/request.h, + src/roff/troff/input.cc (assign_registers): New function to remove + two `goto's. + (do_ps_file): Use it. + (check_output_limits, reset_output_registers, output_request, + init_output_requests): New functions. + (init_input_requests): Updated. + + Added new grohtml2 device and html2 preprocessor (coding + not yet finished) which will eventually replace grohtml. + + * Makefile.in, tmac/Makefile.sub, tmac/eqnrc, tmac/troffrc-end: + Updated. + * src/include/htmlindicate.h, src/include/htmlindicate + (html_begin_suppress, html_end_suppress): New functions. + * src/preproc/tbl/main.cc: Use it. + * src/roff/groff/groff.cc: Add support for html2 device (which will + automatically invoke the html2 preprocessor). + * src/roff/troff/input.cc (is_html2): New variable. + * src/roff/troff/troff.h, src/roff/troff/env.h, + src/roff/troff/env.cc (environment::add_html_tag): New function + (uses `is_html2'). + (environment::do_break): Use it. + * font/devhtml2/*: New files. + * src/devices/grohtml2: New device. + * src/preproc/html2: New preprocessor. + * tmac/tmac.html-tags, tmac/tmac.html2: New files. + +2000-08-23 Werner LEMBERG + + * src/devices/grolbp/lbp.cc: Same workaround for sinix as for AIX. + +2000-08-22 Werner LEMBERG + + * src/include/lib.h: Provide a fix for IRIX to not include + groff-getopt.h. + +2000-08-18 Werner LEMBERG + + * configure.in: Don't provide an empty value for SH_SCRIPT_SED_CMD + since some non-GNU sed programs can't handle null regexps. + * configure, src/preproc/eqn/Makefile.sub, + src/roff/grog/Makefile.sub, src/roff/nroff/Makefile.sub: Updated. + + * src/devices/grolbp/lbp.cc: Add an AIX workaround for an autoconf + bug (string.h and strings.h are both needed according to latest + POSIX standard). + + * MORE.STUFF: Added info about unroff and troffcvt. + +2000-08-08 Werner LEMBERG + + * tmac/tmac.a4: Will now work with ms macros also; -ma4 should be + used before -ms. + + * tmac/tmac.man.old: Remove unused number register. + + * tmac.doc: Minor documentation fix. + +2000-08-07 Paul Eggert + + * src/roff/groff/pipeline.c (is_system_shell): + Fix typo: "monocased_shell" no longer exists. + +2000-08-07 Paul Eggert + + Remove FILENAME_MAX limits. + + * src/roff/groff/pipeline.c (is_system_shell): Do not assume + that the argument length is less than FILENAME_MAX. + * src/libs/libgroff/tmpfile.cc (add_tmp_file): Likewise. + Use struct hack to allocate and free file name. + (struct xtmpfile_list): fname is now part of the structure, + not a pointer to another string. + +2000-08-07 Tom Schmidt + + * src/include/posix.h: Add a default value for FILENAME_MAX. + +2000-08-06 Paul Eggert + + Add support for new BSD-style man pages (with ".Dd" instead of + ".TH"), so that "groff -man" understands both styles, even + when running "groff -man" on a host whose system man page + macros don't support ".Dd". + + * tmac/Makefile.sub (NORMALFILES): Add tmac.an.old. + (stamp-wrap): Source tmac.andoc first when wrapping man macros, + in case the system man macros don't define Dd or TH. + + * tmac/tmac.an.old: Renamed from tmac/tmac.an. + * tmac/tmac.an: New one-line file. + * tmac/tmac.andoc (TH): Adjust to the tmac.an.old file renaming. + +2000-08-06 Werner LEMBERG + + * src/roff/troff/troff.man: Fixing typos. + +Local Variables: +version-control: never +coding: latin-1 +End: diff --git a/ChangeLog.118 b/ChangeLog.118 new file mode 100644 index 0000000..5113de3 --- /dev/null +++ b/ChangeLog.118 @@ -0,0 +1,3794 @@ + +Version 1.18.1 released +======================= + +2002-10-08 Werner LEMBERG + + * doc/webpage.ms, NEWS: Updated. + +2002-10-07 Werner LEMBERG + + * tmac/doc-common (Ss): Add final `.ns' (similar to `.Sh') to + suppress additional whitespace after the header. + + * tmac/doc-ditroff, tmac/doc-nroff (Am): New string to be in sync + with NetBSD. + + * src/preproc/grn/grn.man, tmac/groff_mdoc.man, NEWS: Updated. + +2002-10-07 Ruslan Ermilov + + * tmac/doc-common(doc-volume-operating-system-ateol): New flag. + (Dt): Use it to improve language localization (especially Russian + and French). + +2002-10-07 Daniel Senderowicz + + * src/preproc/grn/gprint.h (BSPLINE, BEZIER): New macros. + * src/preproc/grn/hdb.cc (DBGetType): Parse spline and bezier + drawing commands. + * src/preproc/grn/hgraph.cc (drawwig): Add parameter to control + curve type. + Call `picurve' for BSPLINE. + (HGPrintElt): Handle BSPLINE. + * src/preproc/grn/README: Document it. + +2002-10-03 Werner LEMBERG + + * src/roff/troff/node.cc (break_char_node::col): New variable. + Updated constructor. + (space_node::tprint, word_space_node::tprint): Call `fill_color' + unconditionally. + (space_node::space_node): Remove assertion. + (break_char_node::add_self): Pass color argument to space node. + * src/roff/troff/input.cc (token::add_to_node_list, token::process): + Ditto. + * src/roff/troff/env.cc (environment::do_break, + environment::add_padding): Ditto. + +2002-10-02 Werner LEMBERG + + Redesigning color support in troff. Colors are no longer + represented as separate nodes but are now part of glyph nodes and + friends. This fixes the current formatting misbehaviour due to the + changes introduced on 2002-09-20. Some extra code is necessary for + proper grotty support: Without adding color variables to + space-related nodes, the background color would be changed too late. + + * src/roff/troff/node.h, src/roff/troff/node.cc: + s/current_pagecolor/current_fill_color/. + s/current_glyphcolor/current_glyph_color/. + (glyph_color_node, fill_color_node): Removed. + (node::get_glyph_color, node::get_fill_color): New virtual member + functions. + (space_node::col): New variable. + Updated constructors of space_node and derived classes accordingly. + (hmotion_node::col): New variable. + Updated constructors of hmotion_node and space_char_hmotion_node + accordingly. + (vmotion_node::col): New variable. + Updated constructor accordingly. + (draw_node::gcol, draw_node::fcol): New variables. + Updated constructor accordingly. + (special_node::gcol, special_node::fcol): New variables. + Updated constructors accordingly. + (troff_output_file::put_char, troff_output_file::put_charwidth, + troff_output_file::draw): Set glyph and fill color. + (troff_output_file::start_special): Set glyph and fill color. + Always set current font. + (troff_output_file::fill_color, troff_output_file::glyph_color): + Don't call `do_motion'. + (glyph_node::gcol, glyph_node::fcol): New variables. + Updated constructors of glyph_node and ligature_node accordingly. + (glyph_node::get_glyph_color, glyph_node::get_fill_color): New + member functions. + (glyph_node::merge_glyph_node, + kern_pair_node::add_discretionary_hyphen, + node::add_discretionary_hyphen): Updated. + (break_char_node::merge_self): Updated. + (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, + vmotion_node::tprint): Handle color. + (make_glyph_node, make_node, node::add_char): Updated. + + * src/roff/troff/env.cc (environment::space_newline, + environment::space, environment::output_line, environment::do_break, + environment::make_tab_node, environment::add_padding, title): + Updated. + (environment_switch, environment_copy): Don't add color nodes. + + * src/roff/troff/input.cc (do_glyph_color, do_fill_color): Return + nothing. + (token::next): Updated. + \m and \M now are as transparent as \s. + (process_input_stack, token::add_to_node_list, token::process, + read_draw_node): Updated. + (charinfo_to_node_list): Don't add color nodes. + + * doc/groff.texinfo: Updated. + +2002-09-27 Ruslan Ermilov + + * tmac/doc-common (ds-operating-system-FreeBSD-4.*): New version + strings. + +2002-09-27 Colin Watson + + * src/roff/troff/node.cc (bracket_node::copy): Check `list' != 0. + +2002-09-23 Werner LEMBERG + + * src/devices/grolbp/lbp.cc: Replace `300' with `font::res' where + appropriate. + (DEFAULT_LINEWIDTH_FACTOR): New macro. + (linewidth_factor): New global variable. + (lbp_printer::set_line_thickness): Fix case for size < 0, using + linewidth_factor. + (long_options): Add -w/--linewidth option. + (usage): Updated. + (main): Handle -w option to set linewidth_factor. + (lbp_printer::lbp_printer): Initialize req_linethickness, not + line_thickness. + + * src/devices/grolbp/grolbp.man, NEWS, doc/webpage.ms: Updated. + +2002-09-22 Paco Andrés Verdú + + Fixed a bug in the line thickness setting code. + + * src/devices/grolbp/lbp.cc (lbp_printer::req_linethickness): New + variable. + (lbp_printer::set_line_thickness): Pass environment as second + parameter. + Implement it actually. + (lpb_printer::set_char, lbp_printer::draw): Use `req_linethickness' + and `set_line_thickness, depending on the current font size. + +2002-09-21 Werner LEMBERG + + Some Debian patches. + + * src/roff/groff/pipeline.h (MAX_COMMANDS): Increase to 12. + * src/roff/troff/node.cc (bracket_node::copy): Initialize + `list->last'. + +2002-09-20 Werner LEMBERG + + * configure: Regenerated with autoconf 2.54. + +2002-09-20 Werner LEMBERG + + * src/roff/troff/env.h (environment): Rename cur_glyph_color to + glyph_color. + Rename cur_fill_color to fill_color. + * src/roff/troff/env.cc: Updated. + +2002-09-20 Werner LEMBERG + + * src/roff/troff/env.cc (title): Copy color status after processing + title. + * src/roff/troff/input.cc (charinfo_to_node_list): Emit glyph and + fill color nodes to reset colors properly. + + * tmac/www.tmac (DC): Fix color handling. + + * src/preproc/pic/pic.man, doc/pic.ms: Document some color issues. + * doc/groff.texinfo: Fixing documentation of `tl' request. + * doc/webpage.ms: Updated. + +2002-09-19 Werner LEMBERG + + * src/roff/troff/env.cc (environent_switch, environment_copy): + Emit glyph and fill color nodes to initialize colors properly. + +2002-09-17 Colin Watson + + * src/roff/troff/env.cc (environment::set_glyph_color, + environment::set_fill_color): Fix typo which prevented \m[] work + correctly. + +2002-09-17 Werner LEMBERG + + Add left and right italic correction to non-slanted PS fonts. This + is an experimental feature to improve image rendering of grohtml. + + * font/devps/generate/Makefile (RFLAG): New variable, set to `-i 0'. + ({T,H,C,P,N,BM,A,HN}{R,B}, ZD, S, ZDR): Use it. + * font/devps/*: All non-slanted fonts regenerated. + * NEWS: Updated. + +2002-09-16 Werner LEMBERG + + Add a site-specific font directory. + + * Makefile.in (localfontdir, legacyfontdir): New variables. + (fontpath): Use them. + (MDEFINES, uninstall_dirs): Updated. + * Makefile.comm (.man.n): Add `LOCALFONTDIR' and `LEGACYFONTDIR'. + Remove `FONTPATH' and `MACROPATH'. + + * src/roff/troff/troff.man, NEWS: Updated. + * doc/groff.texinfo (Font Directories): New section. + Other minor fixes. + + * src/devices/grodvi/grodvi.man, src/devices/grohtml/grohtml.man, + src/devices/grolbp/grolbp.man, src/devices/grolj4/grolj4.man, + src/preproc/grn/grn.man: Minor fixes. + + * src/devices/grohtml/post-html.cc (html_printer::do_tab_ts): + Remove unused variable. + +2002-09-11 Werner LEMBERG + + * doc/groff.texinfo, man/groff_font.man: Clarify argument of \N. + * man/groff_out.man: Fix documentation of 'N'. + +2002-09-09 Gaius Mulley + + * doc/Makefile.in (webpage.html): Depend on gnu.eps also. + * src/roff/troff/env.cc (indent): Emit html tag only if break_flag is + set. + * src/devices/grohtml/post-html.cc (text_glob::is_br_ni): Removed. + (text_glob::is_br, html_printer::lookahead_for_tables): Updated. + (html_printer::do_tab_ts): Call `emit_table_header' with `FALSE'. + * src/devices/grohtml/html-text.cc (html_text::start_tag) : Call `begin' with `FALSE'. + +2002-09-09 Ralph Corderoy + + * src/libs/libgroff/string.cc (string::extract): Fix position of + terminating null byte. + +2002-09-08 Werner LEMBERG + + Add global option `nospaces' to tbl so that leading and trailing + spaces in data items are ignored. + + * src/libs/libgroff/string.cc (string::remove_spaces): New member + function to remove leading and trailing spaces. + * src/include/stringclass.h: Updated. + + * src/preproc/tbl/table.h (table): Add flag `NOSPACES'. + + * src/preproc/tbl/main.cc (process_options): Handle `nospaces' + option. + Fix typo in error messages. + (process_data): Implement `nospaces' option. + * src/preproc/tbl/tbl.man, NEWS, doc/webpage.ms: Updated. + +2002-09-07 Werner LEMBERG + + * src/include/config.hin: Add `HAVE_ISATTY'. + * src/libs/libgroff/tmpfile.cc (xtmpfile_list): Drop `const' for + `fname' member. + * src/libs/libgroff/tmpname.cc: Include `time.h'. + * src/libs/libdriver/input.cc (Char): Add `operator==' and + `operator!=' for `char'. + * doc/groff.texinfo: Replace @ifnottex block for top node with + @ifhtml block. + +2002-09-06 Werner LEMBERG + + * doc/Makefile.in (.texinfo.html): Add -I switch. + * doc/groff.texinfo: Add @ifnottex block for top node to make + translation to HTML work. + +2002-09-05 Gaius Mulley + + * src/preproc/html/pre-html.cc (LETTER_LENGTH): Removed. + (get_papersize, determine_vertical_offset): Removed. + (char_buffer::do_image): Always specify letter size. + (main): Updated. + (imageList::createPage): Use -dDEVICEHEIGHTPOINTS instead of + -sPAPERSIZE. + +2002-09-05 Werner LEMBERG + + * doc/groff.texinfo, tmac/groff_man.man: Improve documentation of + default indentation. + +2002-09-04 Gaius Mulley + + * src/preproc/html/pre-html.cc (imageList::createPage): Use + -sPAPERSIZE for gs. + (generateImages): Clean up push-back buffer. + +2002-09-04 Ralph Corderoy + + * doc/groff.texinfo: Minor fixes. + +2002-08-21 Gaius Mulley + + * src/preproc/html/pre-html.cc (DEFAULT_LINE_LENGTH): New macro. + (MAX_WIDTH, A4_LENGTH, A4_OFFSET, LETTER_OFFSET): Removed. + (gsPaper): Removed. + (determine_vertical_offset): Use LETTER_LENGTH. + (createPage): Moved to ... + (imageList::createPage): This. + Call gs with -dDEVICEWIDTHPOINTS to avoid cropping. + (imageList::getMaxX): New function. + (createImage): Moved to ... + (imageList::createImage): This. + (imageList::createImages): New function. + (generateImages): Read `maxx' directly. + Updated. + (scanArguments): Don't specify `gsPaper' for `-o'. + (makeTempFiles): Call `xtmpfile' with the last argument set to + `TRUE'. + +2002-08-24 Werner LEMBERG + + * src/include/nonposix.h (mkdir, WAIT, creat) [_MSC_VER]: Define. + (WAIT, _WAIT_CHILD) [!_MSC_VER]: Define. + * src/preproc/html/pre-html.cc (waitForChild): Use WAIT. + * src/preproc/html/pushback.cc: Include nonposix.h. + * src/roff/groff/pipeline.c: Define strcasecmp and strncasecmp + conditionally. + +2002-08-23 Werner LEMBERG + + Use $(OBJEXT) for the object file extension. + + * Makefile.comm (.SUFFIXES): Add .obj. + (.cc.obj, .c.obj): New implicit rules. + * Makefile.in (OBJEXT): New variable, initialized from autoconf. + (MDEFINES): Add EXEEXT and OBJEXT. + * */Makefile.sub: s/.o/.$(OBJEXT)/. + +2002-08-22 Werner LEMBERG + + * INSTALL: Mention texinfo 4.2 as a prerequisite. + +2002-08-21 Gaius Mulley + + * src/devices/grohtml/post-html.cc (colType): Make enum global to + the file. + (html_printer::update_min_max, html_printer::add_table_end): New + methods. + (html_printer::lookahead_for_tables): Use them. + Reset page offset correctly. + (html_printer::~html_printer): Add creation of creator comment up. + +2002-08-20 Werner LEMBERG + + * tmac/an-old.tmac (T&): New dummy macro to avoid warning. + * man/groff_tmac.man: Fix typos. + * man/groff_font.man: Minor reordering. + * contrib/eqn2graph/eqn2graph.man (Tp): New macro. + +2002-08-18 Gaius Mulley + + Avoid endless loops while scanning for tables. + + * src/devices/grohtml/post-html.cc (list::insert): Set + ptr->right->left. + (html_printer::next_horiz_pos): Add `text_glob' argument; update + all callers. + Return immediately if that argument is NULL. + (html_printer::calc_nf): Don't test if `g' is NULL. + (html_printer::lookahead_for_tables): Use + `glyphs.move_right_get_data'. + Don't test if `g' is NULL. + +2002-08-18 Gaius Mulley + + A better fix, replacing fix 2002-08-15, for increasing SIZE. + + * src/devices/grohtml/post-html.cc (char_block): Make `buffer' + a pointer. + (char_block::char_block): Allocate `buffer'. + (char_buffer::add_string): Use it. + +2002-08-15 Werner LEMBERG + + * src/devices/grops/grops.man, src/devices/grolj4/grolj4.man, + src/devices/grodvi/grodvi.man: Document default line thickness. + +2002-08-15 Gaius Mulley + + * src/devices/grohtml/post-html.cc (char_block): Increase SIZE to + 8192. + +2002-08-14 Werner LEMBERG + + * doc/webpage.ms: Updated. + +2002-08-09 Werner LEMBERG + + * src/roff/troff/node.cc (node::add_char): Call `freeze_space' for + unbreakable space. + +2002-08-08 Aaron Campbell + + * src/preproc/pic/object.cc (object_spec::make_move): Fix typo + (&& -> &). + +2002-08-08 Werner LEMBERG + + * src/roff/troff/input.cc (read_rgb, read_cmy, read_cmyk): Call + tok.next(). + (read_gray): Ditto. + Don't push back a space but a newline onto the stack. + +2002-08-07 Gaius Mulley + + Add fonts `CI', `CB', and `CBI' to grohtml which have been omitted + inadvertently. + + * src/devices/grohtml/post-html.cc (html_printer::end_font, + html_printer::start_font): Handle them. + * src/devices/grohtml/html-text.cc (html_text::do_italic): Don't + reset bold and tt. + (html_text::do_bold): Don't reset italic and tt. + (html_text::do_tt, html_text::do_pre): Don't reset bold and italic. + * font/devhtml/DESC.proto: Add those fonts. + * font/devhtml/Makefile.sub (PROTOFONTS): Updated. + +2002-08-07 Werner LEMBERG + + * MORE.STUFF: Added gpresent. + + * tmac/trace.tmac: Show nesting level by a corresponding amount of + whitespace before printing the logging message. + +2002-07-31 Colin Watson + + * src/devices/grohtml/html-table.cc (html_table::finish_row): + Initialize `n' to zero. This fixes a segfault on ARM. + +2002-07-30 Werner LEMBERG + + * doc/grnexmpl.me: Remove calls to .st and .sc which are undefined. + +2002-07-29 Werner LEMBERG + + * src/preproc/pic/pic.y (print_arg, relative_path): Add missing + final semicolon. + +2002-07-28 Colin Watson + + * src/devices/grohtml/post-html (html_printer::troff_tag): Handle + `.ps'. + (html_printer::html_printer): Initialize `pointsize'. + +2002-07-26 Werner LEMBERG + + * doc/Makefile.sub (PROCESSEDEXAMPLEFILES): Remove gnu.eps and + gnu.png. + (CLEANNOTSRCDIRADD): Add gnu.eps and gnu.png. + (gnu.eps): Add -rle switch to pnmtops. + (distfiles): Add gnu.eps and gnu.png. + +2002-07-25 Petter Reinholdtsen + + * src/libs/libdriver/input.cc (Char): Add const to `operator=='. + Add `operator!='. + +2002-07-24 Werner LEMBERG + + * doc/Makefile.in, doc/Makefile.sub (groff_bin_path): Don't use + ' \+' but ' *' for sed. + (GROFF): Set GROFF_COMMAND_PREFIX to empty value. + +2002-07-23 Werner LEMBERG + + * doc/groff.texinfo: Document `papersize' keyword. + * NEWS, man/groff_font.man: Updated. + +2002-07-23 Colin Watson + + Extend papersize keyword to accept more than a single entry. The + first valid will be used. + + * src/libs/libgroff/font.cc (font::load_desc): Implement it. + (font::scan_papersize): Really skip final newline. + * src/preproc/html/pre-html.cc (get_papersize): Ditto. + +2002-07-23 Werner LEMBERG + + * configure.ac: Test for isatty. + * configure: Regenerated. + * src/include/posix.h: Check HAVE_ISATTY. + * src/roff/troff/input.cc [ISATTY_MISSING]: Removed. + * src/utils/lookbib/lookbib.cc: Include posix.h. + Don't declare isatty. + +2002-07-21 Werner LEMBERG + + * NEWS: Add `output' request. + + * REVISION: Increased to 1. + +Version 1.18.0 released +======================= + +2002-07-19 Gaius Mulley + + Allow internal glyph indices > 0xFF in grohtml for input characters. + + * src/devices/grohtml/post-html.cc (to_unicode): Use `unsigned int' + as parameter. + (html_printer::add_to_sbuf): Use `unsigned int' as first parameter. + Updated all callers. + (html_printer::sbuf_continuation, html_printer::overstrike): Ditto. + (html_printer): Updated. + +2002-07-19 Werner LEMBERG + + * font/devhtml/R.proto: Updated to HTML 4, adding many glyphs. + * font/devutf8/R.proto: Adding some missing glyphs. + * font/devutf8/NOTES: Updated. + + * tmac/dvi.tmac: Add more composite glyphs. + * tmac/html.tmac: Updated. + + * man/groff_char.man: Add `sum' and `product' entities. + + * NEWS: Updated. + +2002-07-18 Gaius Mulley + + Improved table, tab, and indenting support. + + * src/roff/troff/input.cc (file_iterator::suppress_newline_flag, + string_iterator::suppress_newline_flag): Removed. Updated all + function which have used it. + + * src/roff/troff/env.cc: Include `input.h'. + (environment::add_node): Accept 0 as parameter. + (environment::add_html_tag): Add `force' parameter. + Updated all callers. + (environment::add_html_tag_tabs): Ditto. + For the moment, support left-aligned tabs only. + (environment::make_html_tag): New function. + (fill, no_fill): Set .br html tag additionally. + (environment::newline): Emit `eol.ce' or `eol' tag for html. + (environment::add_html_tag_eol): Removed. + (tab_stops::distance_to_next_tab): Add variant for handling + nextpos'. + (environment::distance_to_next_tab): Ditto. + Updated all callers. + (environment::handle_tab): Handle tabs for html. + + * src/roff/troff/env.h: Updated. + + * src/roff/troff/div.cc: Updated all callers of + `environment::add_html_tag'. + + * src/devices/grohtml/html-table.cc, + src/devices/grohtml/html-table.h: New files. + + * src/devices/grohtml/html-text.cc (html_text): New members + `blank_para' and `start_space'. + (html_text::issue_tag): Don't emit TABLE_TAG. + Handle indentation for PRE_TAG and P_TAG. + (html_text::end_tag): Updated. + (html_text::table_is_void, html_text::issue_table_begin, + html_text::issue_table_end): Removed. + (html_text::do_push): Simplified. + [DEBUGGING]: Small fix. + (html_text::push_para): Add new parameter for indentation; updated + all callers. + Handle PRE_TAG. + (html_text::do_indent, html_text::do_table, html_text::done_table, + html_text::is_in_table): Removed. + (html_text::do_pre): Handle P_TAG also. + (html_text::shutdown): Handle p->indent. + (html_text::check_emit_text): Simplified. + (html_text::do_emittext): Reset `blank_para'. + (html_text::do_para): Add new parameter for indentation; updated + all callers. + (html_text::remove_indent): New function. + (html_text::do_space): Handle verbatim text properly. + (html_text::ever_emitted_text, html_text::starts_with_space, + html_text::remove_para_align): New functions. + (html_text::dump_stack_element, html_text::dump_stack): Updated. + + * src/devices/grohtml/html_text.h (HTML_TAG): Remove TABLE_TAG. + Updated. + + * src/devices/grohtml/post-html.cc: Include html-table.h. + (INDENTATION): Removed. + (text_glob): Added many `is_' functions. + Added table description `tab'. + Added `get_arg',`get_tab_args', `remember_table', and `get_table' + member functions. + (list): Add `insert' and `move_to' member functions. + (page): Add `insert_tag' member function. + (page::dump_page) [DEBUG_TABLES]: Improved. + (html_printer): Add `table' and `max_linelength' elements. + Add many `do_', `insert_', `next_horiz_pos', + `lookahead_for_tables', `shutdown_table', `calc_nf', `calc_po_in', + `remove_tabs', `remove_courier_tabs'. + (html_printer::emit_raw): Handle indentation. + (html_printer::do_center, html_printer::write_header): Updated. + (html_printer::is_courier_until_eol): Check for tag. + (html_printer::do_linelength): Handle max_linelength. + (html_printer::do_page_offset, html_printer::do_indentation): Handle + fill_on. + (html_printer::do_tempindent): Updated. + (html_printer::do_indentedparagraph): Removed. + (html_printer::do_indent): Simplified. + (html_printer::do_eol): Use `ever_emitted_text'. + (html_printer::do_flush, html_printer::do_links): Don't call + done_table. + (html_printer::do_break): Handle end_tempindent. + (html_printer::troff_tag): Get argument. + Don't handle `.ip'. + Handle `.tab-ts', `.tab-te', `.col', `tab', and `tab0' tags. + (html_printer::flush_page): Call `lookahead_for_tables'. + Don't call `done_table'. + (html_printer::add_to_sbuf): Always call do_indent. + + * src/devices/grohtml/Makefile.sub: Updated. + + * tmac/an-old.tmac (TP): Don't handle html device specially. + (an-do-tag-html): New function which will be used instead of + `an-do-tag' if html device is used. + + * tmac/html.tmac: Call .po to pass default page offset to grohtml. + + * tmac/s.tmac (@IP): Don't handle html device specially. + (@IP-html): New function which will be used instead of `@IP' if + html device is used. + + * tmac/www.tmac (HTML-NS, HTML-TAG-NS): New auxiliary macros -- this + is a hack which will eventually vanish again. + (PIMG): Handle `-C' option correctly if not html. + (HR): Use HTML-NS. + +2002-07-17 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Don't use `-P-' for invoking perl. + +2002-07-14 Eric S. Raymond + + * contrib/pic2graph/pic2graph.*: Use convert(1). + * contrib/eqn2graph/eqn2graph.*: Minor fixes. + +2002-07-14 Bernd Warken + + * tmac/groff_trace.man: New file. + * tmac/Makefile.sub: Updated. + * NEWS: Updated. + +2002-07-13 Werner LEMBERG + + * src/roff/groff/groff.man: Add some cross references. + +2002-07-12 Werner LEMBERG + + * src/roff/troff/input.cc (substring_request): Add warnings for + string indices out of range. + +2002-07-11 Werner LEMBERG + + * font/devdvi/generate/ec.map: Fix typo (`(l' -> `/l'). + * font/devdvi/*EC: Regenerated. + +2002-07-10 Bernd Warken + + * man/groff_char.man: Updated and extended. + +2002-07-10 Werner LEMBERG + + * src/roff/troff/input.cc (length_macro): Renamed to... + (length_request): This. + Move call of `tok.next()' to the very end, otherwise the register + value hasn't been updated yet. + (init_input_requests): Updated. + +2002-07-09 Werner LEMBERG + + * src/roff/troff/input.cc (substring_macro): Renamed to... + (substring_request): This. + (init_input_requests): Updated. + * src/roff/troff/request.h: Updated. + +2002-07-08 Robert D. Goulding + + * src/roff/grog/grog.sh: Fix typo. + +2002-07-08 Werner LEMBERG + + * win32-diffs: Updated. + + Handle `papersize' keyword properly in DESC. + + * src/libs/libgroff/font.cc (font::scan_papersize): Fix argument + type. + Updated all callers. + * src/libs/libgroff/paper.cc: Add four more paper formats used by + grolj4. + * src/include/paper.h: Updated. + + * src/devices/grolbp/lbp.cc: Remove unnecessary semicolons. + Other minor C syntax fixes. + (papersize, paperlength, paperwidth): Renamed to `user_*'. + (lbp_printer): Add `papersize', `paperlength', and `paperwidth' + members. + (lbp_printer::lbp_printer): Pass three arguments. + Set paper dimensions properly. + (make_printer, main): Updated. + (handle_unknown_desc_command): Fix error messages. + (main): Handle papersize keyword in DESC properly. + + * src/devices/grolj4/lj4.cc (paper_size): Renamed to + `user_paper_size'. + (lbp_printer::lbp_printer): Pass an argument. + Set paper_size properly. + (handle_unknown_desc_command): Removed. + (make_printer, main): Updated. + * src/devices/grolj4/grolj4.man: Minor documentation fix. + + * man/groff_font.man, NEWS: Updated. + +2002-07-07 Werner LEMBERG + + Integrated eqn2graph, contributed by Eric S. Raymond. + + * contrib/eqn2graph/{Makefile.sub, eqn2graph.sh, eqn2graph.man}: New + files. + * Makefile.in, NEWS: Updated. + +2002-06-04 Werner LEMBERG + + Changing the substring request to make it fit better with other + string manipulation functions in other programming languages: + Index 0 is now the first character in the string, and index -1 + indicates the last character. Since this request didn't work + properly anyway in the last release, it doesn't harm too much to + change the syntax. + + * src/roff/troff/input.cc (substring_macro): Use loops to get + the real string length (ignoring COMPATIBLE_SAVE and + COMPATIBLE_RESTORE) and offsets. + Implement change described above. + + * man/groff_char.man, tmac/doc-common (doc-header), tmac/doc.tmac + (doc-do-Bd-args, doc-do-Bl-args): Changed accordingly. + + * NEWS, doc/groff.texinfo, man/groff_diff.man: Updated. + +2002-06-03 Werner LEMBERG + + Make .chop work with .de1 and friends. COMPATIBLE_SAVE and + COMPATIBLE_RESTORE are completely ignored. + + * src/roff/troff/input.cc (char_list::set, char_list::get): New + functions. + (macro): `length' field renamed to `len'. + Added new field `empty_macro' (1 if macro is empty), to be used + instead of checking `len'. + Updated all callers. + (macro::empty): Updated. + (macro::length, macro::set, macro::get): New functions. + (macro::append): Ignore COMPATIBLE_SAVE and COMPATIBLE_RESTORE. + Set `empty_macro'. + (chop_macro): Check and remove trailing COMPATIBLE_SAVE/ + COMPATIBLE_RESTORE pairs. + (asciify): Ignore COMPATIBLE_SAVE and COMPATIBLE_RESTORE. + * src/roff/troff/request.h: Updated. + + * doc/groff.texinfo: Document .chop's behaviour better. + +2002-06-02 Werner LEMBERG + + * doc/pic.ms: Fix documentation for the addition of positions. + + * tmac/doc.tmac, tmac/an-old.tmac: Need groff version 1.18. + +2002-06-29 Werner LEMBERG + + Implementation of string arguments of the form \*[foo arg1 arg2 ...] + + * src/roff/troff/input.cc (have_string_arg): New global variable. + (read_mode): New enumeration. + (read_escape_name): Use it. Update all calls. + (read_long_escape_name): Use it. Update all calls. + Set have_string_arg if appropriate. + (get_char_for_escape_name): Add parameter for handling space + character. + (interpolate_string_with_args, decode_string_args): New functions. + (get_copy, token::next): Call it if necessary. + (interpolate_string): Fix error message. + + * NEWS, doc/groff.texinfo, man/groff.man, man/groff_diff.man: + Document it. + +2002-06-24 Bernd Warken + + * man/groff_tmac.man: Updated and extended. + +2002-06-24 Werner LEMBERG + + * doc/pic.ms, src/preproc/pic/pic.man: Fix description of `:='. + +2002-06-23 Werner LEMBERG + + * doc/pic.ms: Improve documentation of composite block objects. + +2002-06-22 Werner LEMBERG + + * src/roff/troff/input.cc (init_registers): Add three registers + `seconds', `minutes', and `hours' to hold the current time. + + * NEWS, doc/groff.texinfo, man/groff.man, man/groff_diff.man: + Updated. + +2002-06-20 Werner LEMBERG + + Make \X accept both `\ ' and `\~', converting them to single space + characters. + + * src/roff/troff/token.h (token): Add TOKEN_UNSTRETCHABLE_SPACE. + (token::unstretchable_space): New inline function. + * src/roff/troff/input.cc (token::next, token::delimiter, + token::description, token::add_to_node_list, token::process): Handle + TOKEN_UNSTRETCHABLE_NODE. + (encode_char): Handle tok.stretchable_space and + tok.unstretchable_space. + + * NEWS, doc/groff.texinfo: Document it.. + +2002-06-19 Werner LEMBERG + + * src/devices/grops/ps.cc (ps_printer::special): Fix error message. + + * src/devices/grotty/tty.cc (tty_printer::special): Add `sgr' + keyword to enable/disable SGR output. + (tty_printer::change_fill_color): New function. + * NEWS, src/devices/grotty/grotty.man: Document `sgr' special. + + * src/roff/troff/input.cc (output_request): Add missing `tok.next()' + call. + +2002-06-18 Werner LEMBERG + + Add a `color' request and a `.color' register to control usage of + colours. + + * src/roff/troff/input.cc (disable_color_flag): Replaced with... + (color_flag): This (which is the inverse). + (activate_color): New function. + (main, init_input_requests): Updated. + * src/roff/troff/troff.h, src/roff/troff/node.cc + (troff_output_file::fill_color, troff_output_file::glyph_color): + Updated. + + * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: + Document the changes. + +2002-06-17 Colin Watson + + Circumvent bug in autoconf 2.53 regarding top_builddir. + + * aclocal.m4 (GROFF_BUILDDIR): s/top_builddir/groff_top_builddir/. + * Makefile.in, doc/Makefile.in: + s/@top_builddir@/@groff_top_builddir@/. + * configure: Regenerated (with autoconf 2.53). + +2002-06-17 Werner LEMBERG + + * src/libs/libgroff/font.cc (font::load_desc): Fix computation of + `paperwidth' and `paperlength' for the `papersize' keyword. + +2002-06-16 P. Alejandro Lopez-Valencia + + * src/devices/grops/grops.man: Add info about Type 42 fonts. + +2002-06-15 Gaius Mulley + + * src/devices/grohtml/post-html.cc (html_printer::emit_raw, + html_printer::do_linelength, html_printer::do_pageoffset, + html_printer::do_indentation, html_printer::do_tempindent, + html_printer::do_break, html_printer::begin_page): Clear indented + text. + * tmac/html.tmac: Disable hyphenation. + +2002-06-15 Werner LEMBERG + + Don't produce HTML files if utility programs are missing. + + * Makefile.in (make_html, make_install_html): New variables. + (MDEFINES): Updated. + + * aclocal.m4 (GROFF_HTML_PROGRAMS): New function to test for HTML + utility programs. + * configure.ac: Use it. + * configure: Regenerated. + + * doc/Makefile.sub (PROCESSEDEXAMPLEFILES): Move webpage.html to... + (HTMLEXAMPLESFILES): This new variable. + (EXAMPLESIMAGEFILES): Renamed to... + (HTMLEXAMPLEIMAGEFILES): This. + (CLEANADD): Add HTMLEXAMPLEFILES. + (all): Use `make_html'. + (html): New target. + (install_data): Use `make_install_html'. + Move html stuff to... + (install_html): This new target. + (uninstall_sub): Updated. + +2002-06-14 Bernd Warken + + * src/roff/grog/Makefile.sub (grog): Renamed to... + (grog.old): This. + (grog): New rule to always install grog.sh as grog. + +2002-06-08 Bernd Warken + + * src/roff/grog/grog.pl: Fix typo. + +2002-06-07 Werner LEMBERG + + * doc/groff.texinfo: Add more info on .tr arguments. + +2002-06-05 Werner LEMBERG + + * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated. + + * aclocal.m4 (GROFF_MKSTEMP): Include unistd.h. + * configure: Regenerated. + +2002-06-05 Ralph Corderoy + + * src/roff/troff/symbol.cc (table_sizes): Add more values. + + * src/roff/grog/grog.pl, src/roff/grog/grog.sh: Recognize mom. + +2002-06-04 Werner LEMBERG + + * aclocal.m4 (GROFF_PAGE): Don't use `prefix' directly since it + is not initialized at the time we need it in case `--prefix' hasn't + been set. Check for `ac_default_prefix' also. + Test for `papersize' keyword also and generalize allowed whitespace. + * configure: Regenerated. + + * font/devps/Makefile.sub (DESC): Use `papersize' instead of + `paperlength'. + + * src/libs/libgroff/Makefile.sub (version, revision): Replaced + with... + (src_version, src_revision): New variables to avoid overwriting + from parent make process. + (version.cc): Updated. + + * src/preproc/html/pre-html.cc: Include paper.h and font.h. + (linebuf, linebufsize): New global variables. + (sys_fatal): Use `fatal' to abort properly. + (get_line): New function. + (get_resolution): Use it. + Improve error messages. + (get_papersize): Check `papersize' also. + Use `get_line'. + Improve error messages. + +2002-06-03 Werner LEMBERG + + * Makefile.comm (CLEANNOTSRCDIRADD): New target for files which + should be removed only if builddir is not srcdir. + (mostlyclean): Handle `CLEANNOTSRCDIRADD'. + (clean): Depend on `mostlyclean'. + (distclean): Depend on `clean'. + (realclean, extraclean): Depend on `distclean'. + (.y.cc, .y.o): Simplified. The output files are no longer written + to srcdir but to builddir. + * Makefile.in (MDEFINES): Add `version' and `revision'. + (uninstall_dirs): Fix order of directories. + * doc/Makefile.sub (version, revision): Removed. + (CLEANADD): Removed grnexmpl.g, groff, groff-*. + Added `HTMLDOCFILES'. + (CLEANNOTSRCDIRADD): New target for grnexmpl.h, groff, groff-*. + * src/preproc/eqn/Makefile.sub, src/preproc/pic/Makefile.sub, + src/preproc/refer/Makefile.sub (YTABC, YTABH): Don't use `srcdir' + as prefix. + + * doc/texinfo.tex (\authortt): New macro. + (\shortcontt): Define. + (\titlepage): Set \tt to \authortt while defining \authorfont. + (\appendixbox): New macro. + (\chapmacro, \appendixentry): Use \appendixbox to get even + indentation for letters. + (\summarycontents): Set \tt. + (\internalpagesize): Add two arguments for real paper width and + height as needed by pdfTeX. + (\letterpaper, \smallbook, \afourpaper, \afivepaper, \afourlatex): + Updated. + (\tempdima, \tempdimb): New temporary dimensions. + (\pagesizesyyy): Updated. + +2002-06-02 Werner LEMBERG + + Adding a new keyword `papersize' to the DESC file format (similar + but not completely identical to grolbp's extension). grops now has + a -p command line option to override `papersize'. Finally, grolbp + has been adapted to the new syntax. + + * src/libs/libgroff/paper.cc, src/include/paper.h: New files. It + defines and initializes the `papersizes[]' array with NUM_PAPERSIZES + elements. + * src/libs/libgroff/Makefile.sub (OBJS): Add `paper.o'. + (CCSRCS): Add `paper.cc'. + + * src/include/font.h (font): Add `papersize' element. + * src/libs/libgroff/font.cc (font::unit_scale): New helper function. + (font::scan_papersize): New function. + (font::load_desc): Use it for handling `papersize' keyword. + * src/libs/libgroff/fontfile.cc: Initialize `font::papersize'. + + * src/devices/grops/ps.cc: Include paper.h. + (user_paper_length): New global variable. + (ps_printer): Use paper length as initializer. + (make_printer): Updated. + (main): Handle new `-p' option. + * src/devices/grops/grops.man: Updated. + + * src/devices/grolbp/lbp.cc: Include paper.h. + s/papersizes/lbp_papersizes/. + (set_papersize): Use new `papersizes' array. + (handle_unknown_desc_command): Don't handle `papersize'. + (main): Use `font::scan_papersize' for handling `-p' option. + * src/devices/grolbp/grolbp.man: Updated. + + * man/groff_font.man: Document `papersize'. + * NEWS: Updated. + +2002-05-30 Werner LEMBERG + + * src/devices/grops/TODO: Updated. + * src/devices/grops/grops.man: More info on paper formats. + * man/groff_font.man: Document `paperheight' and `paperwidth'. + +2002-05-29 Werner LEMBERG + + * doc/Makefile.sub (CLEANADD): Add grnexmpl.g, groff, and groff-* + to list only if srcdir != currdir. + (distfiles): New target. + + * Makefile.in (EXTRADIRS): Add font/devlj4/generate. + (NOMAKEDIRS): New variable. + (DISTDIRS): Use it. + +2002-05-26 Werner LEMBERG + + Add .output request, similar to \! at top-level. + + * src/roff/troff/input.cc (transparent): Remove unused declaration. + (output_request): New function. + (init_input_requests): Add it. + Sorted. + * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: + Document it. + + * Makefile.in (MDEFINES): Add INSTALL_INFO. + (prepare_examples): Fix typo. + * doc/groff.texinfo (@direntry): Fix it. + +2002-05-25 Werner LEMBERG + + Including the doc subdir into groff's Makefile system. + + * aclocal.m4 (GROFF_INSTALL_INFO): New function. + * configure.ac: Use it. + Generate `doc/Makefile'. + * configure: Regenerated. + + * Makefile.in (infodir, INSTALL_INFO): New variables. + (MDEFINES, uninstall_dirs): Updated. + (OTHERDIRS): Add `doc'. + * Makefile.comm (CLEANDIRADD): New variable. + (mostlyclean): Use it. + + * doc/Makefile.sub, doc/Makefile.in: New files. + * doc/Makefile: Removed. + + * NEWS, INSTALL: Updated. + +2002-05-24 Werner LEMBERG + + * doc/homepage.ms: Renamed to ... + * doc/webpage.ms: This. + Use `.NHR'. + +2002-05-23 Werner LEMBERG + + Integrating the `mom' macro package, contributed by Peter Schaffter + . + + * contrib/mom/*: New subdirectory tree. + * Makefile.in (docdir, exampledir, htmldocdir): New variables to + be used for documentation files. + (MDEFINES, uninstall_dirs): Use them. + (OTHERDIRS): Add contrib/mom. + * Makefile.comm (.man.n): Add @DOCDIR@, @EXAMPLEDIR@, and + @HTMLDOCDIR@. + * MANIFEST, NEWS: Updated. + +2002-05-22 Gaius Mulley + + Change syntax of \O: \O[0] suppresses output, \O[1] enables output + if at outer level; at start-up we are at outer level. + + * src/roff/troff/input.cc (do_suppress): Implement it. + Simplify \O[3]. + + Add option -p to show progress information. + pre-grohtml will now render only one page at a time, reducing the + size of needed disk resources enormously. + + * src/preproc/html/pre-html.cc (imagePageStem): Replaced with... + (imagePageName): New global variable. + (psPageName, show_progress, currentPageNo): New global variables. + (html_system): Close saved stderr and stdout handles. + (write_end_image): Accept a parameter to control \O escape. + (write_start_image): Adapted to new \O meaning. + (char_buffer::write_upto_newline): Updated. + (createAllPages): Replaced with... + (createPage): This new function to create a single page for images. + It uses `psselect' from the psutils package. + (removeAllPages): Removed. + (createImage): Updated. + Handle progress display. + (char_buffer::do_html, char_buffer::do_image) [DEBUGGING]: Removed. + (scanArguments): Add option -p. + (makeTempFiles): Updated to create temp files for psPageName and + imagePageName. + (removeTempFiles): Removed. + (main): Updated. + + * src/devices/grohtml/post-html.cc (header_desc::write_headings, + html_printer::write_header): Append `\0' to `buffer'. + (html_printer::do_eol): Depend on `current_paragraph->emitted_text'. + (main): Handle -p. + * src/devices/grohtml/html-text.cc (html_text::dump_stack_element): + Handle `text_emitted'. + (html_text::table_is_void): Slightly rewritten. + (stop): New external symbol. + (html_text::do_push) [DEBUGGING]: Use it and simplify. + (html_text::shutdown): Call `dump_stack'. + (html_text::do_space): Rewritten. + * src/devices/grohtml/grohtml.man: Document -p and the need of + `psselect'. + + * tmac/www.tmac (DC, HTML-DO-IMAGE, HTML-IMAGE-END): Updated to + new \O syntax. + Call \O[0] if `ps4html' is active. + * tmac/s.tmac (@EQ, @EN): Handle html better. + (@TS, TE): Ditto. + * tmac/html.tmac: Don't use black for background colour. + + * src/roff/troff/node.cc: Include `div.h'. + (troff_output_file::really_print_line): Don't use `is_on'. + (troff_output_file::word_marker, troff_output_file::flush_tbuf + troff_output_file::check_charinfo, + troff_output_file::put_char_width, troff_output_file::put_char, + troff_output_file::determine_line_limits, troff_output_file::draw, + real_output_file::begin_page, glyph_color_node::tprintf, + fill_color_node::tprint, hline_node::tprint, vline_node::tprint): + Use `is_on'. + (troff_output_file::really_on): Call `do_motion'. + (suppress_node::tprint): Use `get_page_number' instead of `%' + register. + Call `reset_output_registers' conditionally on `is_on'. + + * doc/groff.texinfo: Document new syntax of \O. + * NEWS, man/groff_diff.man: Updated. + +2002-05-22 Werner LEMBERG + + * MORE.STUFF: Add info about David Frey's deroff implementation. + Mention troff.org. + +2002-05-16 Werner LEMBERG + + Pic's `with' attribute now accepts positions. + + * src/preproc/pic/pic.y: Make `.', BOX, CIRCLE, ELLIPSE, ARC, LINE, + ARROW, SPLINE, and `[' left-associative tokens to fix shift/reduce + conflicts. + (object_spec): Add rule for `WITH' and `position'. + (relative_path): Give `corner' the precedence of `CHOP'. + * src/preproc/pic/object.h (path): New members `pos' and + `is_position'. + * src/preproc/pic/object.cc: Updated initializers of `path'. + (path::follow): Handle `is_position'. + + * doc/pic.ms: Completely updated grammar description. + Many typographical improvements. + +2002-05-15 Werner LEMBERG + + * src/roff/troff/env.cc(hyphen_trie::hpf_getc): Accept ^^x (char + code of x in range 0-127) also. + * doc/groff.texinfo, man/groff_diff.man: Updated. + + Added keywords `north', `south', `east', and `west' for corners + in pic. + + * src/preproc/pic/lex.cc (lookup_keyword): Add NORTH, SOUTH, EAST, + and WEST. + (yylex): Handle them. + * src/preproc/pic/pic.y: Add tokens NORTH, SOUTH, EAST, and WEST. + (corner): Handle them. + +2002-05-14 Werner LEMBERG + + * src/devices/grops/grops.man: Clarify handling of `download' file. + +2002-05-11 Werner LEMBERG + + Adding `warnscale' and `spreadwarn' requests, based on a patch from + Jeffrey Friedl . + + * src/roff/troff/input.cc (spread_limit, warn_scale, + warn_scaling_indicator): New global variables. + (warnscale_request, spreadwarn_requests): New functions. + (main): Initialize `warn_scale' and `warn_scaling_indicator'. + (init_input_requests): Updated. + (error_type): Add `OUTPUT_WARNING'. + (do_error): Handle it. + (output_warning): New warning function which shows output location. + * src/roff/troff/env.h (spread_limit): New external variable. + * src/roff/troff/env.cc (environment::choose_breakpoint): Use + `output_warning'. + (distribute_space): Emit warning if added space is larger than + `spread_limit'. + (environment::possibly_break_line): Emit warning if a line can't + be adjusted on both sides. + + * doc/groff.texinfo, man/groff_diff.man, man/groff.man: Document it. + +2002-05-08 Werner LEMBERG + + * src/roff/troff/node.cc (special_node::special_node): Use + env_definite_font(curenv) instead of curenv->get_font(). Otherwise + \X''\% crashes, for example. + + * doc/groff.texinfo: Document \! and \? used at top-level. + +2002-05-06 Werner LEMBERG + + * src/preproc/pic/pic.man: Fix some keyword syntax. + Other minor typographical fixes. + + * src/roff/groff/groff.man: Fix typos. + +2002-05-04 Werner LEMBERG + + * src/roff/groff/groff.man ([ShortOpt]): Renamed to... + (ShortOpt[]): This to avoid problems with refer. + + * doc/pic.ms: Fix typo. + Fix pic grammar description. + + * tmac/an-old.tmac (ne): Use de1, not de. + +2002-05-03 Werner LEMBERG + + * doc/groff.texinfo: Finished separation of glyphs and characters. + Don't use the string `Appendix' for appendix headers (both in + the text and the table of contents). + * man/groff_tmac.man, src/roff/troff/troff.man: Fix order of tmac + directories. + + Use registers LL and LT (similar to -ms) for controlling the + length of title and line, respectively, in the -man and -mdoc + macro packages. + + * tmac/doc-ditroff (doc-setup-page-layout), tmac/doc-nroff + (doc-setup-page-layout): Use \n[LL] and \n[LT]. + * tmac/an-old.tmac: Set \n[LL] and \n[LT] if not defined. + (TH): Use \n[LL]. + (an-header, an-p-footer): Use \n[LT]. + * NEWS, tmac/groff_man.man, tmac/groff_mdoc.man, + doc/groff.texinfo: Document it. + +2002-05-02 Werner LEMBERG + + * doc/fdl.texi: New file. + * doc/groff.texinfo: Include it. + Define and use @copying. + Starting with separating glyph, symbol, and character. + +2002-04-27 Werner LEMBERG + + * Makefile.in (EXEEXT): Set it. + * src/*/Makefile.sub (PROG): Add $(EXEEXT) for all non-script + programs. + + * src/include/nonposix.h: Define GS_NAME. + * src/preproc/html/pre-html.cc (createAllPages): Use GS_NAME. + + Some preliminary changes for EMX support under OS/2. + + * src/preproc/pic/main.cc (main), src/roff/groff/pipeline.c: Add + __EMX__ similar to __MSDOS__. + * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Use `unlink'. + +2002-04-25 Werner LEMBERG + + * doc/groff.texinfo: Integrated groff_out.man. + Some macro fixes. + +2002-04-23 Werner LEMBERG + + * man/groff_out.man: Minor fixes. + +2002-04-23 Werner LEMBERG + + * doc/groff.texinfo: Moving @cindex entries after @Def* to get + correct page references. + Fixed many index entries. + +2002-04-23 Bernd Warken + + * man/roff.man: Enlarged. + +2002-04-22 Werner LEMBERG + + * doc/groff.texinfo: More examples, other fixes. + +2002-04-20 Werner LEMBERG + + * src/roff/troff/input.cc (pipe_output): Multiple calls to `pi' + will now form a chain, e.g. + + .pi foo + .pi bar + + is now the same as + + .pi foo | bar + + This is for compatibility with plan 9's troff. + + * tmac/tty.tmac: Set default tab values to 0.8i to be compatible + with UNIX troff. + * NEWS: Updated. + + * doc/groff.texinfo: Add documentation of remaining requests and + registers. + +2002-04-19 Werner LEMBERG + + * doc/groff.texinfo: Add documentation of remaining escapes. + + * font/devdvi/generate/tc.map: Remove entry for `sr'. + * font/devdvi/*TC: Regenerated. + +2002-04-18 Werner LEMBERG + + * src/roff/troff/input.cc (token::next): Make \H behave consistently + if not in compatibility mode, i.e., increment relative to the + previous height. + * doc/groff.texinfo: Updated accordingly. + +2002-04-17 Werner LEMBERG + + * doc/groff.texinfo: Document \\, \e, \E, \., and \c. + +2002-04-16 Bernd Warken + + * src/roff/groff/groff.man: Improve documentation of -P option. + Other minor fixes. + +2002-04-15 Werner LEMBERG + + Add new escape \F to switch font family. + + * src/roff/troff/input.cc (token::next): Handle \F. + * src/roff/troff/env.cc (environment::set_family): Handle + `interrupted' flag. + * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: + Document it. + +2002-04-14 Werner LEMBERG + + * tmac/doc.tmac (doc-tag-list): Use \Z to avoid stretching of + spaces in tags. + +2002-04-13 Werner LEMBERG + + Implement \f[] as an alternative to \fP. Change \mP and \MP to + \m[] and \M[], respectively. + + * src/roff/troff/symbol.cc (EMPTY_SYMBOL): New global variable. + (symbol::symbol): Handle NULL string and empty string differently. + * src/roff/troff/symbol.h (symbol::is_empty): New inline function. + * src/roff/troff/input.cc (read_escape_name, read_long_escape_name): + Add optional parameter. + Updated calling functions. + (get_copy, do_glyph_color, do_fill_color, token::next): Use + `symbol::is_empty'. + * src/roff/troff/env.cc (environment::set_font): Ditto. + + * src/preproc/pic/troff.cc (troff_output::set_fill, + troff_output::reset_color: Updated. + + * tmac/www.tmac: Updated. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo, + doc/homepage.ms, src/devices/grotty/grotty.man, tmac/groff_www.man: + Updated. + + * tmac/Xps.tmac: Remove some redundant code. + + * tmac/doc-common, tmac/doc-ditroff, tmac/doc-nroff, tmac/doc.tmac, + tmac/dvi.tmac, man/roff.man, man/groff_out.man, man/groff.man, + man/groff_diff.man, src/roff/groff/groff.man: Replace \f[P] with + \f[]. + +2002-04-13 Bernd Warken + + * src/include/printer.h, src/libs/libdriver/printer.cc + (printer::change_fill_color): New member function. + * src/libs/libdriver/input.cc (parse_D_command): Use it. + +2002-04-12 Werner LEMBERG + + * doc/groff.texinfo: Completed pass on gtroff reference. + +2002-04-11 Werner LEMBERG + + * doc/groff.texinfo: More fixes. + +2002-04-11 Bernd Warken + + * src/include/color.h: Decorate with `const'. + Use `size_t'. + Include `stddef.h'. + * src/libs/libgroff.color.cc: Decorate with `const'. + Use `size_t'. + (color::color): Initialize members. + * src/libs/libdriver/input.cc (parse_D_command): Handle `f' + command according to the documentation. + + * man/groff_out.man: Updated. + Minor fixes. + +2002-04-11 Gaius Mulley + + * src/preproc/html/pre-html.cc (write_start_image): Remove + redundant output. + * tmac/www.tmac (DC, HTML-DO-IMAGE): Ditto. + + * src/devices/grohtml/post-html.cc (page::add_and_encode): Using + \C'hy' caused an assertion failure. + + * src/roff/troff/env.cc (environment::environment): Initialize + `emitted_node'. + (environment::copy): Handle `ignore_next_eol' and `emitted_node'. + +2002-04-10 Werner LEMBERG + + * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: + Document pvs request and .pvs register. + +2002-04-09 Werner LEMBERG + + * doc/groff.texinfo: Improve and fix documentation of diversions + and environments. + +2002-04-08 Werner LEMBERG + + * doc/groff.texinfo: Fix documentation of drawing functions. + Other minor fixes. + +2002-04-07 Werner LEMBERG + + * doc/groff.texinfo: Better documentation of double quotes as + arguments. + Other minor fixes. + +2002-04-06 Werner LEMBERG + + * man/groff_font.man: Document names of special characters better. + * doc/groff.texinfo: Minor improvements. + + * tmac/lbp.tmac: Load latin1.tmac. + * tmac/X.tmac, tmac/Xps.tmac: Load latin1.tmac or cp1047.tmac. + + * font/devX*/*: Regenerated (all chars > 0x80 removed). + +2002-04-05 Werner LEMBERG + + * tmac/tty.tmac: Don't use shc request. + * tmac/latin1.tmac, tmac/cp1047.tmac: Translate soft hyphen to `\%'. + * NEWS: Updated. + + * man/groff_diff.man: Minor fixes. + + * font/devlbp/*: Remove all `charXXX' entities. + + * src/libs/libgroff/font.cc (font::~font): Deallocate + `special_device_coding'. + (font::load): Use `new' for allocating `special_device_coding'. + * src/libs/libgroff/nametoindex.cc (character_indexer::lookup_char): + Removed unused member. + +2002-04-05 Werner LEMBERG + + * src/drivers/grops/psrm.cc (skip_possible_newline): New function. + (resource_manager::do_begin_binary, + resource_manager::do_begin_data): Use it. + + * doc/texinfo.tex: Updated to version 4.2. + + * src/roff/troff/token.h: Add TOKEN_ZERO_WIDTH_BREAK for `\:'. + (token::zero_width_break): New inline function. + * src/roff/troff/input.cc (token::next): Use it. + (token::description): Updated. + (encode_char): Ignore `\%', `\&', `\)', and `\:'. + (token::add_to_node_list, token::process): Use it. + * NEWS, doc/groff.texinfo: Updated. + + * src/preproc/eqn/over.cc (over_box::output): Fix typo. + * tmac/tty.tmac: Add missing backslash. + +2002-04-04 Tadziu Hoffmann + + * src/preproc/eqn/box.cc (set_script_size, box::top_level): Use + `.ps' register instead of `.s' to handle fractional point sizes. + * src/preproc/eqn/limit.cc (limit_box::compute_metrics, + limit_box::output): Ditto. + * src/preproc/eqn/other.cc (size_box::compute_metrics, + size_box::output): Ditto. + * src/preproc/eqn/over.cc (over_box::compute_metrics, + over_box::output): Ditto. + * src/preproc/eqn/script.cc (script_box::compute_metrics, + script_box::output): Ditto. + * src/preproc/eqn/sqrt.cc (sqrt_box::compute_metrics, + sqrt_box::output): Ditto. + +2002-04-03 Michael Selway + + * src/drivers/grops/psrm.cc (resource_manager::do_begin_binary): + Fix typo. + +2002-04-03 Werner LEMBERG + + * doc/homepage.ms: Reduce title size. + * doc/groff.texinfo: Fix documentation of .t register. + Fix handling of colon. + Fix `\' vs. `\\'. + + * src/roff/troff/input.cc (exit_troff): Emit LAST_PAGE_EJECTOR + only if page length is positive to avoid a loop. + + * tmac/an-old.tmac (ne): Increase page length to avoid problems with + tbl. + +2002-04-02 P. Alejandro Lopez-Valencia + + * src/include/nonposix.h, src/roff/groff/pipeline.c: + s/__CYGWIN32__/__CYGWIN__/. + +2002-03-28 Gaius Mulley + + * doc/gnu.xpm: New image contributed by Emily Mulley. + * doc/Makefile (gnu.eps, gnu.png): Use pnmdepth. + (homepage.html): Be dependent on gnu.eps. + * doc/homepage.ms: Updated to new image. + + * src/devices/grohtml/post-html.cc (html_printer): New member + `sbuf_prev_hpos'. + (html_printer::flush_sbuf, html_printer::set_char): Set it. + (html_printer::sbuf_continuation): Use it. + +2002-03-28 Werner LEMBERG + + * src/libs/libgroff/getopt.c: Updated to latest version. + + * tmac/README: More on hyphen.tex license. + +2002-03-26 Larry Kollar + + * doc/groff.texinfo: Add documentation of most missing requests. + +2002-03-25 Werner LEMBERG + + Add three glyphs `t+-', `tmu', and `tdi' which are textual variants + of `+-', `mu', and `di', respectively. + + * font/devascii/R.proto, font/devutf8/R.proto, + font/devlatin1/R.proto, font/devhtml/R.proto, + font/devcp1047/R.proto, font/devlpb/*: Add them. + * font/devps/generate/textmap: Ditto. + * font/devps/*: Regenerated. + * font/devlj4/generate/text.map: Add them. + * font/devlj4/*: Regenerated. + * font/devdvi/generate/tc.map: Use them. + * font/devdvi/generate/texsy.map: Add them. + * font/devdvi/*: Regenerated. + * font/devX*/*: Regenerated. + + * tmac/latin1.tmac, tmac/cp1047.tmac, tmac/tty.tmac, + tmac/tty-char.tmac: Updated. + + * NEWS, man/groff_char.man: Updated. + +2002-03-24 Werner LEMBERG + + * tmac/dvi.tmac, tmac/X.tmac, tmac/ps.tmac, tmac/html.tmac, + tmac/lj4.tmac, tmac/tty.tmac: Replace most `.char' with `.fchar'. + * tmac/ec.tmac: Remove `.rchar' calls (no longer necessary since + we use `.fchar' in dvi.tmac. + * tmac/dvi.tmac: Improve definition of \[Fo] and \[Fc]. + * tmac/Xps.tmac: Simplify some char definitions. + Add definition for \[f/]. + * man/groff_char.man: Updated for new X.tmac. + + * tmac/README: New file. + +2002-03-23 Phil Lobbes + + * Makefile.comm (.y.o): New rule for make on Solaris 2.5.1 -- the + internal .y.o rule took precendence over the .y.cc rule, compiling + the yacc files with gcc instead of g++. + +2002-03-23 Werner LEMBERG + + * tmac/dvi.tmac: Add replacement font for `CB'. + + * tmac/doc.tmac: s/request/macro/ in messages. + (doc-generic-macro): Improve error message. + * tmac/groff_mdoc.man: Minor improvements. + +2002-03-22 Werner LEMBERG + + * doc/groff.texinfo: Document possible conflict between `tr' and + `char' requests. + +2002-03-21 Werner LEMBERG + + Improve handling of hyphenation patterns. It is now possible to + use most of TeX's pattern files unmodified. To make the process + more flexible, a new request `hpfcode' has been added which + provides a character code mapping for the `hpf' request. See + comment before hpf_getc() for more details. + + * src/roff/troff/env.cc (insert_hyphenation, hpf_getc): New + functions. + (read_patterns_file): Additional parameter for exception dictionary. + Extended to recognize \pattern, \hyphenation, and \endinput. + (do_hyphenation_patterns_file): Updated. + * src/roff/troff/env.h (hpf_code_table): New extern. + + * src/roff/troff/input.cc (hpf_code_table): New array. + (init_hpf_code_table, hyphenation_patterns_file_code): New + functions. + (hyphenation_code): Handle translation from `trin' correctly. + (main, init_input_requests): Updated. + (charinfo::set_translation): Handle hyphenation code also. + + * src/roff/troff/charinfo.h (charinfo::get_translation_input): New + inline function. + + * src/roff/troff/env.cc (WORD_MAX): Reduced to 256 since `unsigned + char' is used for offsets in hyphenation exceptions. + + * tmac/hyphen.us: Replace with contents of unmodified `hyphen.tex'. + + * NEWS, man/groff_diff.man, man/groff.man: Document it. + +2002-03-20 Larry Kollar + + * doc/groff.texinfo: Add documentation for `hpfa' and `trin' + requests. + +2002-03-18 Werner LEMBERG + + * tmac/html.tmac: Fix serious typo. + +2002-03-17 Larry Kollar + + * doc/groff.texinfo: Add documentation for `writec' request. + +2002-03-17 Werner LEMBERG + + Added request `hpfa' to append hyphenation patterns. + + * src/roff/troff/env.cc (hyphen_trie::read_patterns_file): Add + parameter `append'. + (hyphenation_patterns_file): Renamed to... + (do_hyphenation_patterns_file): This. + (hyphenation_patterns_file, hyphenation_patterns_file_append): New + functions. + (init_hyphen_requests): Updated. + * NEWS, man/groff.man, man/groff_diff.man: Document it. + +2002-03-16 Werner LEMBERG + + Added request `writec' in analogy to `tmc'. + + * src/roff/troff/input.cc (write_request): Renamed to... + (do_write_request): This. + Added one parameter. + (write_request, write_request_continue): New functions. + (init_input_requests): Updated. + * NEWS, man/groff.man, man/groff_diff.man: Document it. + + * font/devdvi/DESC.in (sizes): Allow all sizes in the range + 5-10000pt. + * NEWS: Document it. + +2002-03-15 Werner LEMBERG + + * man/groff.man: Add writem request. + + Add request `trin' (translate input) to make `.asciify' work + correctly. This is necessary since `charXXX' entity names are no + longer hardcoded in font definition files. + + * src/roff/troff/charinfo.h (charinfo): Add `asciify_code' and + `translate_input' members. + (charinfo::set_asciify_code, charinfo::get_asciify_code, + charinfo::set_translation_input): New methods. + (charinfo::set_translation): Add third argument. + * src/roff/troff/input.cc (charinfo:set_translation): Set + `asciify_code'. + (do_translate): Add second argument. + (translate_input): New function. + (init_input_requests): Updated. + * src/roff/troff/node.cc (glyph_node::asciify, + composite_node::asciify): Use `get_asciify_code'. + + * tmac/cp1047.tmac, tmac/latin1.tmac: Use `trin'. + + * NEWS, man/groff.man, man/groff_diff.man: Updated. + +2002-03-14 Larry Kollar + + * doc/groff.texinfo: Improve documentation of .RS and .RE. + +2002-03-14 Werner LEMBERG + + Add a new request `sizes' similar to the `sizes' command in DESC + files. + + * src/roff/troff/env.cc (override_sizes): New function. + (init_env_requests): Use it. + * src/roff/troff/token.h: Export `read_string'. + * NEWS, man/groff_diff.man, man/groff.man: Document it. + +2002-03-12 Werner LEMBERG + + * doc/groff.texinfo: More fixes for texinfo 4.1 and higher. + +2002-03-10 Werner LEMBERG + + * tmac/pspic.tmac: Add support for -Tdvi. + * tmac/dvi.tmac: Include pspic.tmac. + * src/devices/grodvi/grodvi.man: Document it. + * NEWS: Updated. + + * font/devlj4/generate/Makefile: Fix URL of metric files. + +2002-03-09 Werner LEMBERG + + * PROBLEMS: The static constructor bug has been fixed in z/OS V1R3. + +2002-03-09 Larry Kollar + + * tmac/groff_ms.man: Add documentation for RS and RE macros. + +2002-03-08 Werner LEMBERG + + * doc/groff.texinfo: Fixes for texinfo 4.1. + +2002-03-07 Werner LEMBERG + + * src/include/lib.h: Include getopt.h if groff-getopt.h can't be + included. + Handle CYGWIN properly. + +2002-03-07 Paco Andrés Verdú + + * font/devlbp/Makefile.sub (DEVFILES): Add some missing fonts. + * tmac/lbp.tmac: Add some font translations. + +2002-03-02 Werner LEMBERG + + * font/devcp1047/R.proto, font/devlatin1/R.proto, + font/devhtml/R.proto: Remove `charXXX' entries. + * tmac/tty.tmac, tmac/html.tmac: Load latin1.tmac or cp1047.tmac + where appropriate. + + * font/devlj4/generate/text.map: Remove `charXXX' entries. + * font/devlj4/*: Regenerated all font definition files. + * tmac/lj4.tmac: Load latin1.tmac. + + * src/utils/hpftodit/hpftodit.cc (do_file): Partially undo change + from 2000-06-17: LJ4 metric files are *not* text files. + + * tmac/troffrc, tmac/dvi.tmac, tmac/ps.tmac: Don't use .T string + register to test for EBCDIC. + +2002-03-01 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Skip comment lines in encoding + files (as grops already does). + * src/utils/afmtodit/afmtodit.man: Document comment lines in map + files. + * src/devices/grops/grops.man: Document comment lines in encoding + files. + + * tmac/cp1047.tmac: New file. + * tmac/dvi.tmac, tmac/tty-char.tmac: Use it. + * tmac/ps.tmac: Load latin1.tmac or cp1047.tmac. + * tmac/Makefile.sub (NORMALFILES): Updated. + + * tmac/ec.tmac: Don't load latin1.tmac again. + + * font/devps/generate/lgreekmap, font/devps/generate/symbolchars, + font/devps/generate/dingbats.map, + font/devps/generate/dingbats.rmap, font/devps/text.enc, + font/devps/generate/Makefile (symbolmap): Add header comment. + * font/devps/generate/textmap: Ditto. + Remove `charXXX' entries. + * font/devps/symbolmap: Regenerated. + * font/devps/*: Regenerated all font definition files. + +2002-02-28 Werner LEMBERG + + Add color support to grodvi (for drawing colors are currently + translated to gray values). + + * src/devices/grodvi/dvi.cc (FILL_MAX): Removed. + (dvi_printer): Add `cur_color' member. + (dvi_printer::set_color): New function. + (draw_dvi_printer): Remove `fill'. + (draw_dvi_printer::fill_next): Pass environment as parameter. + Update code for new color support translated to gray. + (dvi_printer::set_char): Updated. + (dvi_printer::begin_page, dvi_printer::end_page): Handle color + changes crossing the page border. + (dvi_printer::draw): Updated. + Remove cases `f' and `F'. + * tmac/dvi.tmac: Add color definitions. + * NEWS, src/devices/grodvi/grodvi.man: Updated. + + * tmac/an-old.tmac (R): Make this a macro to emit a warning if + used incorrectly. + + * aclocal.m4 (GROFF_NEED_DECLARATION): Use test similar to recent + versions of autoconf. + * configure: Updated. + + * doc/homepage.ms: Use `.blm'. + * tmac/www.tmac (www-depth): New auxiliary variable. + (www-pop-level): Don't issue HTML tag. + (ULS, ULE, LI): Use absolute indentation. + + * src/devices/grops/ps.cc (ps_printer::begin_page, + ps_printer::end_page): Switch forth and back to default color while + starting a new page. + +2002-02-27 Werner LEMBERG + + Add EC and TC fonts to devdvi. + + * src/utils/tfmtodit/tfmtodit.man: Document patching of exbase.mf. + * font/devdvi/generate/cork.map: Renamed to... + * font/devdvi/generate/ec.map: This. + Remove entry for `aq'. + * font/devdvi/generate/tc.map: New file. + * font/devdvi/generate/Makefile (*EC, *TC): New creation rules for + EC and TC fonts. + (FONTS): Updated. + * font/devdvi/*EC, font/devdvi/*TC: New font definition files. + * font/devdvi/Makefile.sub (DEVFILES): Updated. + * tmac/ec.tmac: New file. + * tmac/Makefile.sub (NORMALFILES): Updated. + * NEWS, src/devices/grodvi/grodvi.man: Updated. + * man/groff_char.man: Check `ECFONTS' register. + + * font/devdvi/{TR,TI,TB,TBI,HR}: Fix `name' field. + +2002-02-26 Werner LEMBERG + + * font/devdvi/generate/*.map: Remove all `charXXX' entries. + * font/devdvi/generate/cork.map: Add 'y and 'Y. + * font/devdvi/*: Updated. + * tmac/dvi.tmac: Formatting. + + Add font `HBI' for the dvi output. + Add support for font families `T' and `H'. + + * font/devdvi/HBI: New file. + * font/devdvi/B: Renamed to ... + * font/devdvi/TB: This. + * font/devdvi/BI: Renamed to ... + * font/devdvi/TBI: This. + * font/devdvi/I: Renamed to ... + * font/devdvi/TI: This. + * font/devdvi/R: Renamed to ... + * font/devdvi/TR: This. + * font/devdvi/H: Renamed to ... + * font/devdvi/HR: This. + * font/devdvi/Makefile.sub (DEVFILES): Updated. + * font/devdvi/generate/Makefile (HBI): New rule. + (FONTS): Updated. + (R, I, B, BI, H): Renamed to ... + (TR, TI, TB, TBI, HR): This, respectively. + (srcdir): Fixed. + * NEWS, src/devices/grodvi/grodvi.man: Updated. + * font/devdvi/DESC.in: Don't mount R, I, B, BI, and CWI. + Add `styles' and `family' keywords. + * tmac/dvi.tmac: Alias `H' to `HR'. + Add some fspecial requests for italic fonts. + Add TR and TI as special. + Add support for `_' with font CWI. + + * src/roff/troff/number.cc (parse_expr): Add missing `break' for + operator `:'. Until now, the expression `0:1' would return 2 + instead of 1. + +2002-02-25 Werner LEMBERG + + * man/groff_char.man: Added some missing PS glyph names (from the + Adobe Glyph List). + * font/devps/generate/textmap, font/devps/symbolmap: Add + `arrowupdn'. + + * doc/groff.texinfo: Minor additions and fixes. + * man/groff_diff.man: Remove documentation of fp request. This + is already covered in the original troff manual. + Updated to be consistent with other doc files. + * NEWS: Updated. + +2002-02-24 Werner LEMBERG + + * aclocal.m4 (GROFF_EBCDIC): Don't include `font/devutf8' in + TTYDEVDIRS. + Define new variable OTHERDEVDIRS (containing `font/devlj4 + font/devlbp' if not EBCDIC). + * Makefile.in (TTYDEVDIRS): Always include `font/devutf8'. + (OTHERDEVDIRS): New variable. + (MDEFINES, DEVDIRS, ALLDIRS, DISTDIRS): Updated. + * configure: Regenerated. + + * NEWS, src/devices/grotty/grotty.man: Updated. + +2002-02-23 Werner LEMBERG + + * src/roff/troff/input.cc (do_overstrike, do_bracket, + get_line_arg): Honour input level. + + Add new symbol `mc' corresponding to U+00B5 MICRO SIGN. + + * font/*/*: Implement it in all font files. + * font/devps/generate/textmap, font/devps/generate/symbolchars, + * font/devps/symbolmap: Updated. + * font/devlj4/generate/text.map: Updated. + * font/devdvi/generate/CompileFonts (sizes): Add LaTeX sizes. + * font/devdvi/generate/texmi.map: Updated. + + * font/devutf8/R.proto: Remove all `charXXX' entries. + * font/devutf8/NOTES: Updated. + + * font/devX*/*: Regenerated with xtotroff, using fonts from XFree86 + version 4.1.0. + + * tmac/latin1.tmac, tmac/psold.tmac, tmac/tty-char.tmac: Updated. + + * NEWS, man/groff_char.man: Updated. + +2002-02-21 Phil Lobbes + + * src/include/lib.h [HAVE_SNPRINTF]: Include stdarg.h. + +2002-02-20 Ralph Corderoy + + * src/roff/grog/grog.pl: Fix computation of $refer. + +2002-02-19 Werner LEMBERG + + * src/include/lib.h [!HAVE_SNPRINTF]: Add declarations for + `snprintf' and `vsnprintf'. + + * src/include/htmlindicate.h: Renamed to... + * src/include/htmlhint.h: This. + * src/include/Makefile.sub: Updated. + * src/preproc/eqn/main.cc: Updated. + +2002-02-18 Werner LEMBERG + + * man/roff.man, man/groff_out.man, man/groff.man, + man/groff_diff.man, man/ditroff.man, src/roff/groff/groff.man, + src/roff/troff/troff.man: Updated to latest changes in www.tmac. + + * win32-diffs: Updated. + +2002-02-17 Werner LEMBERG + + * doc/Makefile (clean): Add *.eps. + (MEMACROS): Removed. + (TFLAG): New variable. + (TROFF): Use it. + Add -ww. + (GROFF): Use TFLAG, FFLAG, -U, -p, -e, -t, and -ww. + (.me.dit): Fixed. + (.ms.html, .ms.ascii, .ms.ps, homepage.html): Simplify. + + * tmac/www.tmac: Use dummy diversion while resetting and disabling + `.tl'. + * tmac/e.tmac: Inserted some more `\"' to remove warnings if used + unstripped. + * src/roff/troff/troff.man: Fix order of parameter description. + + * NEWS: Updated. + +2002-02-16 Gaius Mulley + + Simplify image handling for grohtml. + Fix

bug. + + * src/devices/grohtml/html-text.cc (DEBUGGING): Don't undefine but + comment out. + (html_text::dump_stack): Don't emit newline while debugging. + (html_text::do_push) [DEBUGGING]: Print more info. + (html_text::check_emit_text): Fix handling of

. + * src/devices/grohtml/html.h: Updated. + * src/devices/grohtml/output.cc (FPUTC, FPUTS, PUTC): New macros, + replacing `fputc', `fputs', `putc'. If DEBUGGING is defined, they + send its data to stderr also. + Update all callers. + (simple_output::space_or_newline) [DEBUGGING]: Removed. + * src/devices/grohtml/post-html.cc (html_printer::do_links, + html_printer::html_printer): Remove `DEBUGGING' conditionals. + + * src/include/html-strings.h (HTML_IMAGE_{CENTERED,LEFT,RIGHT,END}): + Removed. + * src/libs/libgroff/htmlhint.cc (is_in_graphic_start, + is_inline_image): Removed. + (html_begin_suppress, html_end_suppress): Don't take a parameter. + (graphic_start, graphic_end): Removed. + * src/include/htmlindicate.h: Updated. + * src/preproc/html/pre-html.cc (DEBUG_HTML): Removed. + (macroset_template): New global variable. + (makeFileName): Use `macroset_template'. + (write_end_image): Don't take a parameter. + Don't emit newline. + (write_start_image: Don't emit newline. + (char_buffer::write_upto_newline): Updated. + (char_buffer::skip_to_newline): Renamed to ... + (char_buffer::skip_until_newline): This. + Fix code. + (char_buffer::write_file_troff, char_buffer::write_file_html): + Simplified. + (createAllPages, createImage) [DEBUGGING]: Handle `debug' flag. + (removeAllPages): Remove `DEBUGGING' conditionals. + (addRegDef, dump_args): New functions. + (char_buffer::do_html, char_buffer::do_image): Handle + `www-image-template' command line variable. + Add more debugging code. + (addps4html): Removed. + (removeTempFiles) [DEBUGGING]: Handle `debug' flag. + + * src/preproc/eqn/main.cc: Include `ctype.h'. + (suppress_html): Removed. + (do_file): Updated. + (inline_equation): Use `html_begin_suppress' and + `html_end_suppress'. + * src/preproc/pic/troff.cc: Don't include `htmlindicate.h'. + (troff_output::start_picture, troff_output::finish_picture): + Updated. + * src/preproc/tbl/main.cc: Don't include `htmlindicate.h'. + (process_input_file): Updated. + + * src/roff/troff/div.cc (page_number): Set page number only if the + `ps4html' register isn't defined. + * src/roff/troff/input.cc (image_no): New external variable. + (do_suppress): Use it. + * src/roff/troff/node.h (suppress_node::image_id): New member. + * src/roff/troff/node.cc (image_no): Remove `static' keyword. + (suppress_node::suppress_node): Initialize `image_id' member. + (suppress_node::same): Handle `image_id' also. + (suppress_node::copy): Updated. + (last_image_id): New global variable. + (suppress_node::tprint): Use it. + + * tmac/an-old.tmac (TS, TE, EQ, EN): Use HTML-IMAGE and + HTML-IMAGE-END. + * tmac/pspic.mac (PSPIC): Fix html support. + * tmac/s.tmac (@EQ, @EN, @TS, TE, PS, PE): Ditto. + * tmac/www.tmac (www-image-template): Set up. + (HTMLINDEX): Renamed to... + (HX): This. + (BODYCOLOR): Renamed to... + (BCL): This. + (BACKGROUND): Renamed to... + (BGIMG): This. + (URL): Change order of parameters for consistency. + (MAILTO): Renamed to... + (MTO): This. + (IMAGE, PNG-IMAGE, MARGIN-PNG-IMAGE): Renamed to... + (IMG, PIMG, MPIMG): This. + (HTML-H-BEGIN, HTML-H-END): Renamed to... + (HnS, HnE): This. + (LINKS): Renamed to... + (LK): This. + (LINE): Renamed to... + (HR): This. + (NO-AUTO-RULE): Renamed to... + (NHR): This. + (HTML-TL): Renamed to... + (HTL): This. + (UL-BEGIN, UL-END): Renamed to... + (ULS, ULE): This. + (DROPCAP): Renamed to... + (DC): This. + (TS, TE, EQ, EN): Provide default definitions. + (www-make-unique-name): Updated. + (HTML-IMAGE-INLINE): Fix typo. + * tmac/groff_www.man: Updated. + + * doc/Makefile (homepage.html): Add option -r to grohtml. + Use shortened image name. + * doc/groff.texinfo: Updated info on grohtml strings and macros. + * doc/homepage.ms: Updated and extended. + +2002-02-14 Werner LEMBERG + + Don't use `CSI 39 m' and `CSI 49 m' but `CSI 0 m'. + + * src/devices/grotty/tty.cc (SGR_DEFAULT_COLOR, + SGR_BACK_DEFAULT_COLOR): Replaced with ... + (tty_printer::put_color): Use it. + (ttr_printer::end_page): Simplify. + +2002-02-13 Werner LEMBERG + + * tmac/groff_tmac.man: Moved to... + * man/groff_tmac.man: This place. + * tmac/Makefile.sub, man/Makefile.sub: Updated. + +2002-02-12 Werner LEMBERG + + * src/libs/libgroff/Makefile.sub (snprintf.o): Don't use + $(COMPILE.c) to not include groff's assert.h. + + * src/drivers/grotty/tty.cc (main): Add GROFF_NO_SGR environment + variable. + * NEWS, src/drivers/grotty/grotty.man: Document it. + +2002-02-11 Werner LEMBERG + + * src/libs/snprintf/snprintf.c: Updated to latest version + (2002-02-11). + + * src/roff/grog/grog.pl (process): Fix handling of `.['. We now + test whether there is `.]' also. + Don't check for spaces after `.['. + * src/roff/grog/grog.sh: Do the same. + +2002-02-10 Werner LEMBERG + + Illegal -> Invalid. + + * src/libs/libgroff/illegal.cc: Renamed to ... + * src/libs/libgroff/invalid.cc: This. + (illegal_char_table): Renamed to ... + (invalid_char_table): This. + * src/libs/libgroff/Makefile.sub: Updated. + * win32-diffs: Updated. + + * doc/groff.texinfo, src/devices/grops/psrm.cc (ps_get_line), + src/libs/libdriver/input.cc (fatal_command, parse_color_command, + parse_x_command), src/libs/libgroff/font.cc (text_file::next, + font::load), src/preproc/eqn/main.cc (read_line, main), + src/preproc/eqn/lex.cc (file_input::read_line), + src/preproc/pic/lex.cc (file_input::read_line, + simple_file_input::get, simple_file_input::peek), + src/preproc/pic/main.cc (top_input::get, top_input::peek), + src/preproc/pic/pic.man, src/preproc/refer/main.cc + (input_stack::push_file), src/preproc/refer/refer.cc (do_file, + do_bib), src/preproc/tbl/main.cc (table_input::get), + src/preproc/grn/grn.man, src/preproc/grn/main.cc (interpret), + src/roff/troff/input.cc (file_iterator::fill, file_iterator::peek, + do_zero_width, read_request, encode_char, ps_get_line, + transparent_file, get_char_for_escape_name, transparent_translate, + asciify, input_char_description, read_string, set_string), + src/roff/troff/env.cc (environment::add_html_tag), + src/roff/troff/troff.man, tmac/e.tmac (`@(', `(f'): Do it. + + * src/include/lib.h: Updated. + + * src/preproc/eqn/eqn.cc: Removed. + + * NEWS: Updated. + + * src/preproc/grn/hdb.cc (DBRead): Fix fscanf() fields. + +2002-02-09 Werner LEMBERG + + * doc/gnu.xpm: New image. + * doc/Makefile (DOCS): Add homepage.ps. + Add rules for converting xpm->png and xpm->eps. + Use `gnu.{xpm,eps}' as image names. + * doc/homepage.ms: Updated. + +2002-02-09 Gaius Mulley + + * tmac/www.tmac (www-error): New macro, replacing calls to `@error'. + (IMAGE): Change image position parameters to `-L', `-R', and `-C'. + Remove calls to `B1' and `B2' + (PNG-IMAGE): New macro for inclusion of images in PNG format. + (www-left-ll-trap, www-left-po-trap, www-right-ll-trap): New + auxiliary variables for MARGIN-PNG-IMAGE. + (www-finish-left-po, www-finish-right-ll, www-finish-left-ll): New + auxiliary macros for MARGIN-PNG-IMAGE. + (MARGIN-PNG-IMAGE): New macro to put an image in PNG format into + the margin. + (www-heading-no): New auxiliary variable for HTML-H-{BEGIN,END}. + (HTML-H-BEGIN, HTML-H-END): New macros to begin and end a heading. + (DROPCAP): New macro to produce dropcap characters. + (www-do-image): Renamed back to... + (HTML-DO-IMAGE): This. + Updated all callers. + + * doc/Makefile (gnubw.eps): Updated. + * doc/homepage.ms: Updated. + +2002-02-08 Werner LEMBERG + + * doc/pic.ms: Fixed typos (\(*tx -> \*(tx). + Added `linethick' to table in section `Style Variables'. + +2002-02-08 Gaius Mulley + + * src/libs/libdriver/input.cc (get_extended_arg): Fix conditional. + +2002-02-07 Werner LEMBERG + + Adding options -C (compatibility mode) and -c (grotty's old output + scheme) to nroff. + + * src/roff/nroff/nroff.sh: Implement it. + Remove `-Wall'. + * NEWS, src/roff/nroff/nroff.man: Updated. + + * PROBLEMS: Document bison 1.32 bug. + + Some fixes to make groff compile on z/OS 1.2 UNIX (was OS/390). + + * src/roff/troff/node.cc (make_tfont): Define it earlier. + * src/roff/troff/div.h: Add prototype for `end_diversions'. + * src/roff/troff/input.cc: Add prototype for `process_input_stack'. + * src/roff/troff/env.h: Add prototype for `title'. + + Adding EBCDIC support to grotty. + + * src/devices/grotty/tty.cc (CSI): New macro. + (SGR_*, tty_printer::put_color): Use it. + +2002-02-06 Werner LEMBERG + + Implementing color support in grotty. The new switch -c activates + the old drawing scheme, disabling color at the same time. The new + switch `-i' selects italic instead of underlining (SGR only). + + * src/devices/grotty/tty.cc (putstring): New define instead of + `fputs'. Updated all callers. + (old_drawing_scheme): New global variable. + (COLOR_CHANGE): New enum value. + (SGR_*): New defines containing color handling escape sequences. + (TTY_MAX_COLORS, DEFAULT_COLOR_IDX): New defines. + (glyph): New members `back_color_idx' and `fore_color_idx'. + (glyph::order): Add COLOR_CHANGE. + (tty_printer): New members `cur_fore_idx', `curr_back_idx', + `is_underline', `is_bold', `cu_flag', `tty_colors'. + New methods `make_underline', `make_bold', `color_to_idx', + `change_color', `put_color'. + (cu_flag): Moved into `tty_printer' class. + (tty_printer::tty_printer): Initialize colors. + (tty_printer::add_char, tty_printer::set_char, tty_printer::special, + tty_printer::draw, tty_printer::end_page): Handle colors also. + (main): Add options `-c' and `-i'. + (usage): Updated. + * NEWS, src/devices/grotty/grotty.man: Updated. + + * src/include/errarg.h (errarg): Add support for `unsigned int'. + * src/libs/libgroff/errarg.c: Implement it. + + * src/include/printer.h (printer): Add `change_color' method + (currently used by grotty only). + * src/libs/libdriver/printer.cc: Implement it. + * src/libs/libdriver/input.cc (parse_D_command, do_file): Add + call to `pr->change_color'. + + * src/roff/troff/node.cc (troff_output_file::fill_color, + troff_output_file::glyph_color): Call `do_motion'. + + * tmac/tty.tmac: Add color definitions. + + * src/roff/groff/groff.man: Minor fixes. + +2002-02-05 Bernd Warken + + * src/libs/libdriver/input.cc: Introduce `EnvInt' typedef and use + it. This is a preparation for future changes. + +2002-02-05 Werner LEMBERG + + * src/roff/troff/input.cc (process_input_stack): Fix the case + where leading spaces are followed by \f or \s; previously, an + incorrect space width has been used. + + * doc/roff.man (quoted_char): Fix argument. + (comment): Define string. + +2002-02-04 Larry Kollar + + * doc/groff.texinfo: More fixes. + +2002-02-04 Werner LEMBERG + + * src/preproc/eqn/box.cc (output_string): Don't use \\*[...]. + * src/preproc/eqn/main.cc (do_file, inline_equation): Call + `restore_compatibility' before `output_string' -- the LINE_STRING + register now already contains proper switches from and to + compatibility mode. + + * man/groff_char.man: Add Euro symbol. + * man/groff_diff.man: Improve documentation of `.am1' and `.as1'. + * tmac/tty.tmac: Add `EUR' as replacement for `eu' and `Eu'. + * doc/groff.texinfo (Defstr*): Print strings with full syntax. + Other minor fixes. + + * doc/Makefile (.SUFFIXES, .texinfo.pdf, clean): Add support for + texinfo->pdf. + (.texinfo.html): Add support for texinfo->html. + +2002-02-03 Werner LEMBERG + + Added three new requests `ds1', `as1', and `ami'. The former two + are equivalent to `ds' and `as' with the difference that + compatibility mode is saved on entry, switched off during string + expansion, and restored on exit. The latter is the pendant to `dei' + for `am'. + + (do_define_string): Use `define_mode' and `calling mode'. + Insert COMPATIBLE_SAVE and COMPATIBLE_RESTORE at the beginning and + end of string, respectively. + (define_string, append_string): Use `calling_mode'. + (define_nocomp_string, append_nocomp_string, + define_string_indirect): New functions. + (init_input_requests): Updated. + * NEWS, man/groff_diff.man, man/groff.man: Document it. + + * src/preproc/eqn/box.cc (box::top_level, box::extra_space): Use + `as1' for assigning LINE_STRING (this is `10' usually). Sun's + mm macro package accesses this string register directly. + * src/preproc/eqn/main.cc (inline_equation): Use `as1'. + + * tmac/trace.tmac: Trace calls to `am' also. Make it work in + compatibility mode. + +2002-02-02 Larry Kollar + + * doc/groff.texinfo, tmac/groff_ms.man: More fixes. + +2002-01-31 Werner LEMBERG + + * tmac/an-old.tmac (I): Use \, and \/ to improve spacing. + +2002-01-31 Bernd Warken + + * src/devices/grolbp/lbp.cc (main): Delete `pr'. + * man/groff_out.man: Revised and updated. + +2002-01-30 Bernd Warken + + * src/libs/libdriver/input.cc [USE_ENV_STACK]: New macro to comment + out the unused `{' and `}' commands. Undefined by default. + (IntArray): Make `data' private. + (IntArray::operator[], IntArray::get_data, IntArray::len): Use these + new methods instead. + (skip_line_D, skip_to_end_of_line): New functions. + (get_D_fixed_args): Use `skip_line_D'. + Changed to handle dummy odd arguments by ... + (get_D_fixed_args_odd_dummy): This new function. + (get_D_variable_args): Split some code into ... + (get_possibly_integer_args): This new function. + (send_draw): Use more `const'. + (delete_current_env): New function. + (position_to_end_of_args): Use `size_t'. + Updated. + (send_draw): Updated. + (parse_D_command): Handle `c', `C', and `t' better. + Updated. + (do_file): Updated. + +2002-01-29 Werner LEMBERG + + * NEWS: Revised. + * doc/groff.texinfo: Introduce @Def...List, @Def...Item, and + @Def...ListEnd which replaces @Def...x. This is necessary to get + proper HTML output -- see the comment in the file for more + information. + Updated all calls. + +2002-01-29 Gaius Mulley + + Fixes to make color changes of 2002-01-21 work with grohtml. + + * src/devices/grohtml/post-html.cc (style): Updated. + (html_printer): Remove unused methods. + (html_printer::do_font, html_printer::draw, html_printer::set_char, + html_printer::special): Updated. + * src/devices/grohtml/html-text.cc (debugStack, turnDebug, + html_text::dump_stack_element, html_text::dump_stack) [DEBUGGING]: + Added some debugging code. + (html_text::start_tag): Updated. + (html_text::do_push): New method. + (html_text::push_para): Call it. + Add method for handling color. + (html_text::do_color): Updated. + (html_text::shutdown): Handle color. + * src/devices/grohtml/html-text.h (tag_definition): New member + `col'. + Updated. + +2002-01-28 Werner LEMBERG + + * tmac/ps.tmac, tmac/html.tmac: Fix compatibility mode issues. + +2002-01-27 Gaius Mulley + + Add two switches -a and -g to control the antialiasing bits for + text and graphics, respectively. + + * src/devices/grohtml/post-html.cc (main): Dummy code for `-a' and + `-g'. + * src/devices/grohtml/grohtml.man: Document them. + * src/preproc/html/pre-html.cc (MIN_ALPHA_BITS, MAX_ALPHA_BITS): + New macros. + (textAlphaBits, graphicAlphaBits, antiAlias): New global variables. + (setupAntiAlias): New function. + (createAllPages): Updated. + (scanArguments): Handle `-a' and `-g'. + (main): Call `setupAntiAlias'. + * NEWS: Updated. + +2002-01-27 Werner LEMBERG + + * doc/groff.texinfo (Def*): Call index function after deffn. + + * tmac/html.tmac: Call `nroff' request. + +2002-01-26 Larry Kollar + + * tmac/groff_ms.man: Add some omissions. + +2002-01-25 Larry Kollar + + * tmac/groff_ms.man: Typographical improvements. + +2002-01-25 Werner LEMBERG + + * doc/groff.texinfo: Updated version and copyright. + * src/devices/grops/grops.man: Updated. + + * tmac/groff_tmac.man: Fix `ig' macro. + + * tmac/an-old.tmac (ne): Redefine `ne' request to be a no-op in + nroff mode. + Use `.ne' unconditionally everywhere. + (TS): Only insert some vertical space. Doing a page break is no + longer necessary due to the redefinition of the `ne' request. + + * src/libs/libdriver/input.cc (parse_D_command): Don't emit a + warning for unknown subcommands but parse and pass them to the + device driver. + +2002-01-24 Werner LEMBERG + + * tmac/groff_www.man, NEWS: Fix typos. + +2002-01-21 Werner LEMBERG + + Complete revision of color support: + + Adapt programs to the new libdriver/input.cc. + + Color spaces are no longer converted to RGB but transferred as-is + in the troff intermediate output format. + + Handle default color gracefully. troff now supports a `default' + color (which can't be changed). + + grops will now use the proper color space functions if available. + + Update pic. + + Note that currently grohtml doesn't handle colors properly. This + has to be fixed. + + * src/libs/libgroff/itoa.c (UINT_DIGITS): New macro. + (ui_to_a): New function. + * src/include/lib.h: Updated. + + * src/include/color.h (color_scheme): Replace `NONE' with `DEFAULT'. + (color): Simplified; removed all `double' members and methods. + A new array `components' now holds the color parameters. + (color::is_default, color::get_components): New methods. + (color::operator==, color:operator!=): New. + (Red, Green, Blue, Cyan, Magenta, Yellow, Black, Gray): New macros + to make access to the `components' array more comprehensible. + * src/libs/libgroff/color.cc: Implement new color support. + (atoh): Small fixes. + (color::read_encoding): Simplified for new troff intermediate color + output format. + (default_color): New global variable. + + * src/roff/troff/input.cc (default_symbol): New global variable. + (lookup_color): Use it. + (default_black): Removed. + (do_glyph_color, do_fill_color): Simplified. + (define_color): Handle default color. + Improve warnings. + (do_if_request): Handle default color. + * src/roff/troff/env.cc (environment::environment): Initialize + colors with `default_color'. + * src/roff/troff/node.cc (troff_output_file::put): Add method + for `unsigned int'. + (troff_output_file::hex): Removed. + (troff_output_file::fill_color, troff_output_file::glyph_color): + Updated to include/color.h and libdriver/input.cc. + + * src/preproc/pic/object.cc (draw_arrow): New parameter to set + fill color properly (identically to the outline color). \D'f...' + doesn't work any more. + All function calls to it updated. + + * src/devices/grohtml/post-html.cc (html_printer::do_body, main): + Updated. + * src/devices/grohtml/html-text.cc (html_text::issue_color_begin): + Updated. + + * src/devices/grops/ps.cc (ps_output::put_color): New method. + (ps_printer::sbuf_color): Make a real member instead of pointer. + (ps_printer::fill_color, ps_printer::output_color): Removed. + (ps_printer::ps_printer): Updated. + (ps_printer::set_char): Ditto. + (ps_printer::set_color): Use various color schemes. + Use `put_color' method. + (ps_printer::flush_sbuf): Don't set color. + (ps_printer::fill_path): Take `environment' as parameter. + Simplify color handling. + (ps_printer::set_line_thickness): Renamed to ... + (ps_printer::set_line_thickness_and_color): This (and updated). + (ps_printer::set_color): Change second parameter from `complete' + to `fill' which better describes what it does. + (ps_printer::draw): Call `flush_sbuf' to output graphic commands + and text in the right order. + Updated. + Remove branches for `f' and `F'; this is handled by + libdriver/input.cc. + * src/devices/grops/ps.h: Updated. + * font/devps/prologue (FL): Redefined. + ({F,C}r,k,g: New color functions (with and without filling). + + * doc/pic.ms, src/preproc/pic/pic.man: Small fixes. + * man/groff_diff.man, man/groff.man, man/groff_out.man, + doc/groff.texinfo, NEWS: Updated. + +2002-01-20 Bernd Warken + + * src/libs/libdriver/input.cc: Completely rewritten. See comments + in this file for what has been changed. + +2002-01-19 Werner LEMBERG + + * test-groff: Fix GROFF_FONT_PATH. + * tmac/andoc.tmac: Add dummy macros for equation support -- eqnrc + is read before .TH or .Dd is parsed. + +2002-01-18 Gaius Mulley + + * src/libs/libgroff/geometry.cc (check_output_arc_limits): Fix + quadrant boundaries. + +2002-01-18 Werner LEMBERG + + * devices/grops/ps.cc: Aargh! Fix the fix of the incorrectly + applied last patch. + +2002-01-17 Ruslan Ermilov + + * tmac/doc.common: Initialize %I register for the %I macro to + avoid (harmless) warning. + * tmac/doc.tmac (Bd): There is no reason to enforce -compact + when in the SYNOPSIS section. + +2002-01-17 Bruno Haible + + * src/preproc/pic/lex.cc (get_token): Fix typo. + +2002-01-17 Werner LEMBERG + + * devices/grops/ps.cc: Fix incorrectly applied last patch. + +2002-01-17 Larry Kollar + + * tmac/groff_ms.man: Completely rewritten. + +2002-01-16 Werner LEMBERG + + * tmac/an-old.tmac (TS): Force break, inserting some vertical space. + +2002-01-15 Gaius Mulley + + * devices/grops/ps.cc (ps_printer::fill_path): Fix handling of + fill colors. + (ps_printer::draw): Ditto. + +2002-01-14 Ruslan Ermilov + + * tmac/groff_mdoc.man: Minor fixes. + +2002-01-13 Werner LEMBERG + + * man/groff_out.man: Some fixes. + +2002-01-13 Gaius Mulley + + * doc/pic.ms: Fix typos. + +2002-01-12 Werner LEMBERG + + * doc/groff.texinfo, doc/groff.man: More on a printable backslash. + +2002-01-10 Werner LEMBERG + + * font/devutf8/R.proto, font/devhtml/R.prot: Add `Eu' and `eu' + symbols. + * NEWS: Updated. + +2002-01-09 Bernd Warken + + * man/groff_out.man: Revised. + * man/roff.man: Minor fixes. + * src/roff/troff/troff.man: Some reordering. + +2002-01-09 Werner LEMBERG + + * tmac/an-old.tmac: Add dummy macros for equation support. + +2002-01-07 Werner LEMBERG + + doc/groff.texinfo: Fix documentation of glyph searching algorithm. + + * tmac/an-old.tmac: Revert change 2001-12-23. This breaks too many + man pages. + * tmac/groff_man.man: Small improvements. + +2002-01-07 Bernd Warken + + * man/groff_diff.man: Revised. + +2002-01-06 Werner LEMBERG + + * tmac/www.tmac: Remove extraneous backslash. + +2002-01-06 Bernd Warken + + * man/ditroff.man, src/roff/groff/groff.man, man/groff.man: Revised. + +2002-01-05 Werner LEMBERG + + Integrated groffer, contributed by Bernd Warken. + + * contrib/groffer/*: New. + * Makefile.in, NEWS: Updated. + +2002-01-04 Werner LEMBERG + + * doc/groff.texinfo: Added macros `@Defmpreg' and `@Defmpregx' for + registers defined in macro packages. + Revising the ms part. + +2002-01-04 Larry Kollar + + * doc/groff.texinfo: Add documentation for ms macros. + +2002-01-02 Werner LEMBERG + + First step in adding PS support for the Euro symbol. `eu' is the + official Euro logo, `Eu' is a font-specific glyph variant. + + * font/devps/text.enc: Add `Euro' at position 9. + * font/devps/generate/textmap: Add `Euro' as symbol `Eu'. + * font/devps/symbolmap: Regenerated. + + * NEWS: Updated. + +2002-01-02 Bernd Warken + + * man/roff.man: Revised. + +2002-01-01 Bernd Warken + + * src/roff/groff/groff.man: Completely rewritten. + +2001-12-31 Werner LEMBERG + + * doc/Makefile: Updated. + +2001-12-30 Werner LEMBERG + + * tmac/www.tmac: Make all names of internal macros/registers/strings + lowercase, and prepend `www-'. + Other minor changes. + * src/roff/troff/troff.man: Add preprocessor string at BOF. + +2001-12-30 Gaius Mulley + + Implement option `-b' in grohtml to set the HTML background colour. + + * src/devices/grohtml/post-html.cc (default_background): New global + variable. + (html_printer::html_printer): Initialize `background' to + `default_background'. + (main): Implement option `-b'. + (usage): Updated. + * src/preproc/html/pre-html.cc (scanArguments): Add dummy handling + of `-b' option. + * src/devices/grohtml/grohtml.man: Updated. + * doc/Makefile (.ms.html): Use `-b'. + * tmac/html.tmac: Don't set background color. + + Add new grohtml tag `.html-tl'. + + * src/devices/grohtml/post-html.cc (title_desc): Add `with_h1' + member variable. + (title_desc::title_desc): Updated. + (html_printer::troff_tag): Handle `.html-tl'. + (html_printer::write_title): Use `with_h1'. + * tmac/www.tmac (www-end-nowhere): New auxiliary macro. + (HTML-TL): New macro. + + Add support for unordered lists in HTML. + + * tmac/www.tmac (www-level): New auxiliary register. + (www-level1, www-level2, www-level3): New auxiliary strings. + (www-push-level, www-pop-level): New auxiliary macros + (UL-BEGIN, UL-END, LI): User macros for unordered lists. + + Miscellaneous. + + * src/preproc/html/pre-html.cc (DEFAULT_IMAGE_RES): Increase to 100. + (DEFAULT_VERTICAL_OFFSET): Removed. + (IMAGE_BOARDER_PIXELS): Set to 0. + (A4_LENGTH, A4_OFFSET, LETTER_LENGTH, LETTER_OFFSET): New macros. + (vertical_offset): Initialize with 0. + (gsPaper): New global variable. + (get_resolution): Scan for and return unsigned int. + (get_papersize): New function to get paper length from devps/DESC. + (determine_vertical_offset): New function. + (createAllPages): Produce gray-level images and use proper page + length. + (createImage): Use `-quiet' option of pnmcrop. + (addZ): Fix passing of `-Z'. + (scanArguments): Fix handling of `-o'. + (main): Call `determine_vertical_offset'. + * src/devices/grohtml/post-html.cc (html_printer::draw): Comment out + code for `l'. + + * src/libs/libgroff/tmpfile.cc (add_tmp_file): Fix buffer length. + * src/roff/troff/node.cc (troff_output_file::check_charinfo): Handle + glyph descenders properly. + + * doc/homepage.ms: Include `gnubw.eps'. + * doc/Makefile (gnubw.eps): New rule. + (homepage.html): Depend on `gnubw.eps'. + +2001-12-25 Werner LEMBERG + + * src/roff/troff/input.cc (default_black): Fix return value. + +2001-12-24 Ruslan Ermilov + + * tmac/doc-common (Dt): Change output of architecture strings. + Do some syntax cleanup. + * tmac/groff_mdoc.man: Updated. + +2001-12-23 Werner LEMBERG + + Adding an `itc' request (input line trap accepting \c). + + * src/roff/troff/env.h (environment): New member + `continued_input_trap'. + Make `do_input_trap' a friend function instead of `input_trap'. + * src/roff/troff/env.cc (environment::environment, + environment::copy): Updated. + (environment::newline): Implement it. + (do_input_trap): New function. + (input_trap): Call `do_input_trap'. + (input_trap_continued): New function. + (init_env_requests): Updated. + * src/roff/troff/TODO: Updated. + + * tmac/an-old.tmac (SH, SS, B, I, SM, SB, TP): Use `.itc' instead of + `.it'. + + * src/preproc/grn/hdb.cc (DBRead): Really chop after 127 characters. + +2001-12-22 Ruslan Ermilov + + * tmac/doc-common, tmac/doc-syms: Small updates. + +2001-12-22 Colin Watson + + * tmac/an-old.tmac (an-p-footer): Set title length in environment 1. + +2001-12-22 Bernd Warken + + * MANIFEST: New file. + +2001-12-22 Werner LEMBERG + + * src/preproc/grn/grn.man: Updated. + +2001-12-22 Solar Designer + + * src/preproc/grn/hdb.cc (MAXSTRING_S): New macro. + (DBRead): Use it. + +2001-12-19 Werner LEMBERG + + Implement a fallback character request `.fchar'. + + * src/roff/troff/charinfo.h (charinfo): New flag `fallback'. + (is_fallback): New inline function. + * src/roff/troff/input.cc (do_define_character): New function. + (define_character): Call `do_define_character'. + (define_fallback_character): New function. + (init_input_requests): Add `fchar'. + (charinfo::charinfo): Updated. + (charinfo::set_macro): New argument to set `fallback' flag. + * src/roff/troff/node.cc (make_glyph_node, make_node, + node::add_char): Check `fallback' flag. + * NEWS, man/groff_diff.man, man/groff_man: Updated. + +2001-12-16 Werner LEMBERG + + * groff.texinfo: Document exact search algorithm for glyphs. + +2001-12-15 Werner LEMBERG + + * Makefile.cpg, Makefile.ccpg, Makefile.man: Add dummy file to + the left side of $(MANPAGES) rule to make it always non-empty. + +2001-12-14 Werner LEMBERG + + * src/roff/troff/input.cc (default_black): Define default color + `black' if not yet defined. + +2001-12-13 Werner LEMBERG + + Implement new string-valued register `.fn' to return the current + real (internal) font name. + + * env.cc (environment::get_font_name_string): New function. + (init_env_requests): Add `.fn' register. + * env.h (environment): Updated. + * node.cc (font_info): Make `get_font_name' a friend. + (get_font_name): New function. + * node.h: Updated. + + * man/groff_diff.man, man/groff.man, NEWS: Updated. + +2001-12-12 Ralph Corderoy + + * src/preproc/eqn/main.cc (inline_equation): Fix typos. + +2001-12-12 Werner LEMBERG + + * tmac/groff_man.man, doc/groff.texinfo: There is no .R macro. + +2001-12-10 Gaius Mulley + + * man/groff_diff.man: Adding documentation for \O. + +2001-12-10 Werner LEMBERG + + * src/preproc/html/pre-html.cc (TROFF_COMMAND): Removed. + (scanArguments): Use PROG_PREFIX for the name of the troff binary. + +2001-12-09 Werner LEMBERG + + * man/roff.man: Revised. + * src/roff/groff/groff.man: Replace man page references with a + pointer to roff.man. + +2001-12-09 Bernd Warken + + * man/roff.man: Completely rewritten. + +2001-12-06 Ralph Corderoy + + * src/preproc/eqn/main.cc (inline_equation): Improve error message. + +2001-12-05 Werner LEMBERG + + * src/roff/troff/input.cc (get_delim_file_name): Removed since no + longer used. + * src/devices/grohtml/post-html.cc (html_printer::html_printer): Fix + order of initializers. + * NEWS: Updated. + +2001-12-05 Gaius Mulley + + * doc/groff.texinfo: Fix documentation of \O. + + * src/devices/grohtml/html-text.cc (html_text::do_indent, + html_text::do_table, html_text::do_emittext, html_text::do_para): + Use `const' for first argument. + (html_text::do_table): Use cast. + * src/devices/grohtml/html-text.h: Updated. + * src/devices/grohtml/output.cc (simple_output::put_string): Add + method for `const string &s'. + * src/devices/grohtml/html.h: Updated. + * src/devices/grohtml/post-html.cc (MAX_STRING_LENGTH): Removed. + (ANCHOR_TEMPLATE): Modified. + (manufacture_headings): New global variable to handle `-h' option. + (is_subsection): Removed. + (char_buffer::add_string): Add `const' to first argument. + Protect against invalid string argument. + Add method for `const string &s'. + (text_glob): Completely redesigned. + (page): Use `const' for strings and remove string length variable. + (page::add_html): Removed. + (page::add_end_encode): New member function. + (to_unicode): Moved upwards. + (title_desc, header_desc): Updated. + (header_desc::write_headings): Updated to new ANCHOR_TEMPLATE + definition. + (html_printer::is_bold, html_printer::make_bold): New member + functions. + (html_printer::end_of_line): Updated. + (generate_img_src, html_printer::do_auto_image, + html_printer::do_title, html_printer::write_header, + html_printer::determine_header_level, html_printer::do_heading, + html_printer::do_linelength, html_printer::do_pageoffset, + html_printer::do_indentation, html_printer::do_tempindent, + html_printer::do_indentedparagraph, html_printer::do_break, + html_printer::flush_sbuf, get_html_translation, + html_printer::begin_page, html_printer::special): Rewritten to get + rid of static string length limit. + (html_printer::troff_tag): Added `.no-auto-rule'. + (html_printer::flush_globs): Small fix. + (html_printer::determine_space): Don't compute `space_width'. + (html_printer::translate_to_html): Renamed to ... + (html_printer::emit_html): This (with updates). + (html_printer::write_header): Implement `-h' option. + (html_printer::draw): Remove commented-out code. Handle `F' + command. + (html_printer::add_char_to_sbuf): Removed. + (html_printer::add_to_sbuf): Rewritten. + (html_printer::sbuf_continuation): Fixed. + (html_printer::seen_backwards_escape, reverse, + html_printer::remove_last_char_from_sbuf): Removed. + (char_translate_to_html, str_translate_to_html): Removed. + (html_printer::overstrike): New function member. + (html_printer::set_char): Use it. + (html_printer::do_body): New function member. + (html_printer::~html_printer): Use it. + (main): Handle `-h' option. + (usage): Updated. + * src/devices/grohtml/grohtml.man: Document -h switch. + + * src/preproc/html/pre-html.cc: Include searchpath.h + Replace `POSTSCRIPTRES' macro with `postscriptRes' variable. + (get_resolution): New function. + (checkImageDir): Use `0777' permissions in mkdir() + (write_start_image): Rewritten to use `\O[5...]'. + (createImage, generateImages): Updated. + (main): Handle `F' and `h' options. + Use `get_resolution'. + + * src/roff/troff/input.cc (begin, end, image): Removed. + (do_suppress): Take parameter. + Handle modified syntax of `\O'. + (token::next): Updated. + (init_markup_requests): Removed. + (main): Updated. + + * src/roff/troff/div.h: Add declaration for begin_page(). + + * tmac/color-html.tmac: Removed. Contents moved to... + * tmac/html.tmac: Here. Set background color. + * tmac/color.tmac: Removed. Contents moved to... + * tmac/ps.tmac: Here. + * tmac/www.tmac: Remove the title command when generating images + for html. + (NO_AUTO_RULE): New macro. + (HTML_DO_IMAGE): Use revised `\O' escapes. + * tmac/Makefile.sub, tmac/groff_www.man, tmac/troffrc: Updated. + +2001-12-02 Werner LEMBERG + + * tmac/groff_mdoc.man: Fix typo. + +2001-12-01 Colin Watson + + * man/roff.man: Fix typo. + +2001-11-29 Werner LEMBERG + + * src/libs/libbib/map.c, src/utils/pfbtops/pfbtops.c: Include + stdlib.h. + + * src/roff/troff/input.cc (read_draw_node): Emit error message if + more than one argument to \D'f ...'. + + * tmac/Makefile.sub (NORMALFILES): Add lbp.tmac. + +2001-11-28 Werner LEMBERG + + * tmac/an-old.tmac, tmac/doc.tmac: Assure that the macro package is + loaded only once. + + * tmac/groff_man.man: Minor cosmetic fix. + +2001-11-27 Werner LEMBERG + + * src/roff/groff/groff.man, tmac/groff_tmac.man, + tmac/groff_www.man: s/mwww/www/. + +2001-11-26 Werner LEMBERG + + * aclocal.m4 (GROFF_MKSTEMP): Implement test using C++ linkage. + * configure: Regenerated. + * win32-diffs: Updated. + + * tmac/groff_mwww.tmac: Renamed to ... + * tmac/groff_www.tmac: This. + * tmac/mwww.tmac: Removed. + * NEWS, tmac/Makefile.sub: Updated. + +2001-11-21 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of the `\v' escape. + Fix explanation of `\D' and `rt'. + +2001-11-20 Werner LEMBERG + + * tmac/an-old.tmac (an-header): Set header length equal to page + width. + * doc/groff.texinfo: Improve documentation of `ne' request. Other + minor fixes. + * NEWS: Small fix. + +2001-11-19 Werner LEMBERG + + * NEWS, man/Makefile.sub: Updated. + +2001-11-19 Bernd Warken + + * man/ditroff.man: New file. + +2001-11-17 Werner LEMBERG + + * man/groff_differences.man: Renamed to ... + * man/groff_diff.man: This. Updated. + * man/Makefile.sub, src/roff/troff/troff.man, NEWS: Updated. + + * src/preproc/html/pushbackbuffer.cc: Renamed to ... + * src/preproc/html/pushback.cc: This. Updated. + * src/preproc/html/pushbackbuffer.h: Renamed to ... + * src/preproc/html/pushback.h: This. + * src/preproc/html/Makefile.sub, src/preproc/html/pre-html.cc: + Updated. + + * src/libs/libgroff/htmlindicate.cc: Renamed to ... + * src/libs/libgroff/htmlhint.cc: This. + * src/libs/libgroff/Makefile.sub: Updated. + + * tmac/an-old.tmac (an-end): Fix page length. + +2001-11-16 Werner LEMBERG + + * NEWS, man/groff_differences.man, doc/groff.texinfo: Updated. + * man/Makefile.sub: Include groff_differences.man. + * VERSION: Set to 1.18. + * REVISION: Set to 0. + +2001-11-16 Bernd Warken + + * src/roff/troff/input.cc (do_define_macro): Allow whitespace before + the second dot (or ending macro name) to end a macro. + * doc/groff.texinfo: Doc fix. + +2001-11-16 Ruslan Ermilov + + * tmac/doc-common (doc-header): Handle very long document titles + better. + +2001-11-16 Werner LEMBERG + + * tmac/doc.tmac (doc-do-Bl-args): Fix .substring requests. + +2001-11-15 Werner LEMBERG + + * src/roff/troff/troff.man: Revised and split into troff.man and... + * man/groff_differences.man: New file. + * NEWS: Updated. + +2001-11-13 Werner LEMBERG + + * tmac/an-old.tmac (TS, TE): New macros for table support. + +2001-11-12 Werner LEMBERG + + * src/include/lib.h: Provide a fix for emx to not include + groff-getopt.h. + +2001-10-27 Werner LEMBERG + + * src/roff/troff/input.cc (substring_macro): Fix computation of + boundary values. + +2001-10-20 Werner LEMBERG + + Undo change from 2001-08-28. + + * src/roff/troff/input.cc (have_input): New global variable. + (token::next): Set `have_input' for \f, \H, \R, \s, and \S if not + in compatibility mode. + (process_input_stack): Use it. + +2001-10-19 Ruslan Ermilov + + * tmac/doc.tmac (doc-flag-recursion): Protect arguments against + being handled as end-of-sentence characters, + +2001-10-10 Gaius Mulley + + * src/roff/troff/input.cc (file_iterator): New members + `suppress_newline_flag' and `seen_escape'. + (file_iterator::next_file): Updated. + (file_iterator::fill): Use it. + (string_iterator): New member `suppress_newline_flag'. + (string_iterator::fill): Set it. + (get_color_element): Use MAX_COLOR_VAL. + * src/roff/troff/env.cc (environment): Remove `need_eol'. + (no_fill): Don't set `env->ignore_next_eol'. + (environment::newline): Handle `eol' tag properly. + Emit `eol.ce'. + (environment::add_html_tag): Set `env->ignore_next_eol'. + Don't handle `.ce'. + * src/roff/troff/env.h (environment): Updated. + + * src/devices/grohtml/post-html.cc (text_glob::is_eol_ce): New + member function. + (html_printer::outstanding_eol): New member function. + (html_printer::do_title): Use new functions. + (html_printer::troff_tag): Test `id_eol_ce'. + +2001-10-10 Werner LEMBERG + + * tmac/color.tmac, tmac/color-html.tmac: Use `.do' to make those + files work with -C also. + +2001-10-05 Werner LEMBERG + + * doc/pic.ms: Minor fix. + * src/preproc/html/pre-html.cc (scanArguments): Don't handle `-?' + as a valid command line switch. + * src/devices/grohtml/post-html.cc (main): Ditto. + (usage): Updated. + * src/devices/grohtml/grohtml.man: Updated. + * src/roff/groff/groff.cc (main): Pass `-v' to predriver also. + +2001-10-04 Werner LEMBERG + + Implementing color support in troff, pic, grops, and grohtml. These + changes are based on a major patch provided by Gaius Mulley + . + + New request: `defcolor', supporting rgb, cmy, cmyk, and gray + definitions with both hex values and fractions. + + New escapes: \m and \M for drawing and background color, + respectively. This corresponds to the troff output commands `m' + and `DF'. + + groff and troff accept command line switch `-c' to disable color + output (which is automatically disabled in compatibility mode). + + New scaling indicator `f' for fractions (1f = 65536u). + + New conditional operator `m' to test for defined colors with `if' + and `ie'. + + New keywords `color' (or `colour', `colored', `coloured'), `outline' + (or `outlined'), and `shaded' added to pic. + + * src/include/color.h: New file. + * src/include/driver.h: Include it. + * src/include/printer.h: Include color.h. + (environment): New members `col' and `fill'. + (printer): Remove `adjust_arc_center' member function. + * src/include/Makefile.sub: Updated. + + * src/libs/libdriver/input.cc (do_file): Initialize `env.col' and + `env.fill'. + Handle `m' and `DF' troff commands. + * src/libs/libgroff/color.cc: New file. + * src/libs/libgroff/Makefile.sub: Updated. + + * src/preproc/html/pre-html.cc (IMAGE_BORDER_PIXELS): Set to 2. + (stop): Removed. + (createImage): Fix computation of `y2'. + Use `pnmcrop' also. + (buffer::write_file_html): Remove calls to `stop'. + + * src/preproc/pic/common.h (common_output): New abstract function + members `set_color', `reset_color', `get_last_filled', and + `get_outline_color'. + * src/preproc/pic/object.h: Add `IS_SHADED' and `IS_OUTLINED'. + (object_spec): Add members `shaded' and `outlined'. + * src/preproc/pic/output.h (output): `command' is now abstract. + New function members `set_color', `reset_color', `get_last_filled', + and `get_outline_color'. + * src/preproc/pic/lex.cc (lookup_keyword): Recognize `colo[u]r[ed]', + `outline[d]', and `shaded'. + * src/preproc/pic/object.cc (output::command): Removed. + (output::set_location): Moved to output.h. + (graphic_object): Add protected members `outline_color' and + `color_fill'. + Add member functions `set_outline_color', `get_outline_color', and + `set_fill_color'. + (closed_object): Add member function `set_fill_color'. + Add member `color_fill'. + (graphic_object::print_text): Use `out->set_color' and + `out->reset_color'. + (box_object::print, ellipse_object::print, circle_object::print, + line_object::print, spline_object::print, arc_object::print): Ditto. + (object_spec::make_object): Implement `IS_OUTLINED' and `IS_SHADED'. + * src/preproc/pic/pic.y: Add tokens `COLORED', `OUTLINED', and + `SHADED', making them `%left'. + Add rules `object_spec [SHADED|COLORED|OUTLINED] text'. + * src/preproc/pic/tex.cc (tex_output): New dummy function members + `set_color', `reset_color', `get_last_filled', and + `get_outline_color'. + * src/preproc/pic/troff.cc (simple_output): New abstract function + members `set_color', `reset_color', and `get_last_filled'. + (simple_output::polygon, simple_output::circle, + simple_output::ellipse): Use `get_last_filled'. + (troff_output): New members `last_filled' and `last_outlined'. + New function members `set_color', `reset_color', `get_last_filled', + and `get_outline_color'. + (troff_output::finish_picture): Use `reset_color'. + (troff_output::set_fill): Test `last_filled'. + * src/preproc/pic/pic.man: Updated. + + * src/roff/groff/groff.cc (main): Implement `-c' option. + (synopsis, help): Updated. + src/roff/groff/groff.man: Updated. + + * src/roff/troff/troff.h: Include color.h. + (warning_type): Add WARN_COLOR. + * src/roff/troff/env.h (environment): New members + `{cur,prev}_{glyph,fill}_color'. + New member functions `get_{prev_,}{glyph,fill}_color'. + * src/roff/troff/env.cc: Initialize and implement them. + * src/roff/troff/input.cc: New global variable `disable_color_flag'. + Replace `NULL' with `0' everywhere for consistency. + (lookup_color, default_black, do_glyph_color, do_fill_color, + get_color_element, read_rgb, read_cmy, read_cmyk, read_gray, + define_color): New functions. + (token::next): Implement \M and \m escapes. + (do_if_request): Implement `m' operator. + (usage): Updated. + (main): Implement `-c' option. + (init_markup_requests): Add `defcolor' request. + (warning_table): Add `color' warning. + * src/roff/troff/node.h (glyph_color_node, fill_color_node): New + classes. + * src/roff/troff/node.cc (troff_output_file): New members + `current_{page,glyph}color'. New member functions `put_hex', + `glyph_color', and `fill_color'. + (glyph_color_node::*, fill_color_node::*): Implement it. + * src/roff/troff/number.cc (SCALE_INDICATOR_CHARS): Add `f'. + (parse_term): Add support for `f'. + * src/roff/troff/troff.man: Updated. + + * src/devices/grodvi/dvi.cc (draw_dvi_printer::draw): Add dummy + entry for `F'. + * src/devices/grolbp/lbp.cc (lbp_printer::draw): Ditto. + * src/devices/grolj4/lj4.cc (lj4_printer::draw): Ditto. + + * src/devices/grohtml/html-text.h (HTML_TAG): Add COLOR_TAG. + (tag_definition): Use `void *' for arg1. + (html_text): New member functions `do_color' and `done_color'. + Use `void *' for second parameter of `push_para' member function. + New `push_para' member function with a single parameter. + Use `char *' for parameter of `issue_table_begin' member funtion. + New `issue_color_begin' member function. + * src/devices/grohtml/html-text.cc (html_text::end_tag): Handle + COLOR_TAG. + (html_text::issue_color_begin): New function. + (html_text::issue_table_begin): Use `char *' for parameter. + (html_text::start_tag, html_text::shutdown, + html_text::check_emit_text): Updated. + (html_text::push_para): Use `void *' for second parameter. + Add same function with only one parameter. + (html_text::do_*): Updated. + (html_text::do_color, html_text::done_color): New functions. + * src/devices/grohtml/post-html.cc (style): New member `col'. + Mew member `style' with 6 parameters. + (style::style, style::operator==): Updated. + (html_printer::do_font): Use it. + (html_printer::draw): Add dummy entry for `F'. + (html_printer::set_char): Updated. + * src/devices/grohtml/grohtml.man: Updated. + + * src/devices/grops/ps.cc (ps_output::put_float): Use `%g' to have + trailing zeroes removed. + (ps_printer): New members `sbuf_color', `fill_color', and + `output_color'. + Removed member `fill'. + New member function `set_color'. + (ps_printer::ps_printer, ps_printer::set_char): Updated. + (ps_printer::flush_sbuf, ps_printer::set_line_thickness, + ps_printer::fill_path, ps_printer::draw): Use `set_color'. + + * tmac/color-html.tmac, tmac/color.tmac: New files. + * tmac/troffrc: Include them. + * tmac/www.tmac (URL, FTP, MAILTO): Use blue color. + * tmac/Makefile.sub: Updated. + + * NEWS, doc/groff.texinfo, doc/pic.ms, man/groff_out.man, + man/groff.man: Updated. + * font/devps/prologue.ps: Define FC and CO functions. + +2001-10-04 Gaius Mulley + + Fix incorrect cropping of images and incorrect handling of special + characters. Fix handling of file names in \O. + + * src/include/geometry.h: New file. + * src/libs/libgroff/geometry.cc: New file. + * src/libs/libdriver/printer.cc (printer::adjust_arc_center): Moved + to `geometry.cc'. + * src/roff/troff/input.cc (get_delim_file_name): Fixed problem with + initial spaces. + (do_suppress): Updated. + * src/roff/troff/node.cc: Include geometry.h. + (troff_output_file::flush_tbuf): Fixed parameters to + `check_output_limits'. + (troff_output_file::check_charinfo): Ditto. + (troff_output_file::determine_line_limits): Add support for `Da' + and `Dl' commands. + + * src/devices/grohtml/post-html.cc (str_translate_to_html): + Add new parameter `is_special' to decode special characters from + escape sequences. + (html_printer::do_title, html_printer::do_heading, + html_printer::do_indentedparagraph, + html_printer::translate_to_html, html_printer::special): Updated. + +2001-10-03 Werner LEMBERG + + * Makefile.sub (DISTCLEANFILES): Add stamp-h. + Fix entry for config.h. + * test-groff (GROFF_BIN_PATH): Add $builddir/roff/groff. + * tmac/troffrc: Translate nonbreakable space character to `\~'. + * src/preproc/eqn/eqn.man: Document -d command line option. + +2001-09-27 Werner LEMBERG + + * man/groff.man: Use + + .ev xxx + .na + .nh + + .ev + + instead of the old code (`.ad .hy' after the table) to suppress + incorrect hyphenation for grohtml output. + +2001-09-22 Werner LEMBERG + + * man/groff_font.man, man/groff_out.man: Minor fixes. + +2001-09-20 Werner LEMBERG + + * PROBLEMS: Updated, reordered. Improved EPS section (thanks to + Arnold Robbins ). + +2001-09-09 Werner LEMBERG + + * configure: Regenerated with autoconf 2.52. + + * doc/groff.texinfo: Complete revision of indices. + +2001-09-07 Werner LEMBERG + + * doc/Makefile (clean): Updated to delete all indices. + +2001-09-05 Werner LEMBERG + + * src/roff/troff/troff.man: Remove superfluous line. + + * tmac/s.tmac: Enable all warnings only if no -W or -w option is + given on the command line (or rather, if only the default warnings + are set). + +2001-09-03 Werner LEMBERG + + * man/groff.man, src/preproc/eqn/eqn.man, tmac/groff_mdoc.man: Don't + use .ne for TTY devices. + +2001-08-31 Werner LEMBERG + + * src/roff/troff/token.h, src/roff/troff/input.cc: + s/TOKEN_TRANSPARENT_ESCAPE/TOKEN_OPAQUE_ESCAPE/. + +2001-08-28 Werner LEMBERG + + * src/roff/troff/token.h (token_type): Add TOKEN_TRANSPARENT_ESCAPE. + * src/roff/troff/input.cc (token::next): Return + TOKEN_TRANSPARENT_ESCAPE for \f, \H, \R, \s, and \S if not in + compatibility mode. + (token::description): Updated. + (process_input_stack): Reset `bol' for TOKEN_TRANSPARENT_ESCAPE. + (token::add_to_node_list, token::process): Ignore + TOKEN_TRANSPARENT_ESCAPE. + +2001-08-27 Werner LEMBERG + + * tmac/an-old.tmac: Fix `S' string. + +2001-08-26 Werner LEMBERG + + * src/roff/troff/troff.man: Don't use .ne for TTY devices. + +2001-08-25 Werner LEMBERG + + * doc/pic.ms: Replace `\\' with `\e' (and fixing some single + backslashes). + Many other minor fixes. + + * configure.ac: Add message at end to inform how to compile + xditview. + * configure: Regenerated. + +2001-08-24 Werner LEMBERG + + * src/include/getopt.h, src/libs/libgroff/{getopt.c, getopt1.c}: + Updated to latest version of libc. + +2001-08-23 Werner LEMBERG + + * configure.ac: Don't create subdirectories before AC_CONFIG_FILES. + Autoconf 2.50 and newer can handle this. + * configure: Regenerated. + +2001-08-21 Werner LEMBERG + + * doc/pic.ms: Fix typo. + * src/preproc/tbl/tbl.man: Document case of global options. + +2001-08-21 Gaius Mulley + + * src/devices/grohtml/post-html.cc (html_printer::end_font): Fix + handling of `CR' font. + +2001-08-20 Werner LEMBERG + + Use a config.h file. + + * src/include/lib.h: Include config.h. + * All C files: Ditto (if necessary). + * All C++ source and header files: Include lib.h first (if + necessary). + + * src/include/config.hin: New file (autogenerated by autoheader). + * stamp-h.in: New file. + * configure.ac: Updated. + * aclocal.m4: Add third parameters to AC_DEFINE macros. + (GROFF_ARRAY_DELETE): Simplified. + * Makefile.sub (DISTCLEANFILES): Updated. + Added targets for remaking config.status, config.hin, config.h, + stamp-h.in, and stamp-h. + * configure: Regenerated. + +2001-08-19 Werner LEMBERG + + * NEWS: Updated. + +2001-08-18 Sebastian Krahmer + + * src/preproc/pic/pic.y (format_number): Use do_sprintf(). + (do_sprintf): Use snprintf(). + +2001-08-18 Werner LEMBERG + + * src/libs/snprintf/*: Added an snprintf module written by Mark + Martinec. + * src/libs/libgroff/Makefile.sub: Updated. + * configure.ac: Add test for snprintf(). + * Makefile.in: Updated. + * configure: Regenerated. + + * src/preproc/html/pre-html.cc (make_message): Reactivate code which + uses snprintf(). + +2001-08-14 Ruslan Ermilov + + * tmac/doc.tmac (Ex): New implementation. + * tmac/doc-common, tmac/groff_tmac.man: Updated. + +2001-08-13 Ruslan Ermilov + + * tmac/doc.tmac (Rv): Implement support for 0 or more than 1 + argument. + * tmac/groff_tmac.man: Updated. + +2001-08-13 Werner LEMBERG + + * src/preproc/tbl/tbl.man: Minor documentation update. + +2001-08-13 John David Anglin + + * src/libs/libgroff/tmpname.cc: Add prototype for gettimeofday(). + * configure.ac: Add declaration test for gettimeofday(). + * Makefile.in: Document NEED_DECLARATION_GETTIMEOFDAY defines. + * aclocal.m4: Include sys/time.h for gettimeofday declaration test. + * configure: Regenerated. + +2001-08-11 Werner LEMBERG + + * aclocal.m4 (GROFF_MKSTEMP): Define HAVE_MKSTEMP. + * configure.ac: Add declaration test for strcasecmp(). + * Makefile.in: Updated. + * configure: Regenerated. + * src/include/lib.h [!HAVE_MKSTEMP]: Add prototype for mkstemp() -- + this is necessary because groff's mkstemp.cc is C++. + Add declaration conditionally for strcasecmp(). + +2001-08-10 Werner LEMBERG + + Integrated pic2graph, contributed by Eric S. Raymond. + + * contrib/pic2graph/{Makefile.sub, pic2graph.sh, pic2graph.man}: New + files. + * Makefile.in, NEWS: Updated. + + * src/preproc/tbl/tbl.man: Revised. + +2001-08-09 Eric S. Raymond + + * src/preproc/tbl/tbl.man: Extended to cover all tbl features. + +2001-08-09 Werner LEMBERG + + * src/preproc/tbl/main.cc (process_data): Fix recognition of .lf + requests. + +2001-08-08 Paul Eggert + + * Makefile.sub (configure): Depend on configure.ac, not + configure.in. + * INSTALL.gen: Upgrade to autoconf 2.52's INSTALL. + +2001-08-07 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.man, src/roff/groff/groff.man: Minor + fixes. + +2001-08-06 Werner LEMBERG + + * src/roff/troff/troff.man: Improve documentation of -E option. + +2001-07-28 Ralph Corderoy + + * src/preproc/html/pushbackbuffer.cc (pushBackBuffer::readNumber): + Simplified. + +2001-07-27 Werner LEMBERG + + * src/preproc/refer/refer.cc: Undo last change. + * src/devices/grohtml/post-html.cc: Ditto. + +2001-07-26 Werner LEMBERG + + * src/preproc/refer/refer.cc: Include `lib.h'. + * src/devices/grohtml/post-html.cc: Ditto. + +2001-07-25 Gaius Mulley + + * aclocal.m4 (GROFF_PAGE): Add `AC_DEFINE(PAGEA4)'. + * src/preproc/html/pre-html.cc: Use it for DEFAULT_VERTICAL_OFFSET. + * Makefile.in: Comment updated. + * configure: Regenerated. + +2001-07-25 Werner LEMBERG + + * src/preproc/pic/pic.cc: Removed. + * src/preproc/pic/pic_tab.h: Removed. + * src/preproc/refer/label.cc: Removed. + + * doc/Makefile (.ms.html): Don't use a file name extension in + argument to grohtml's -I option. + * Makefile.in (dist): Remove CVS directories. + Call `distfiles' target. + + * src/devices/grohtml/grohtml.man: Add information about valid + versions of pnmtopng. + * src/preproc/html/pre-html.cc (TRANSPARENT): Use `white' as colour + name instead of number. + +2001-07-24 Werner LEMBERG + + * doc/groff.texinfo: Minor fixes. + +2001-07-21 Gaius Mulley + + * doc/Makefile (.ms.html): Put image files into a subdirectory. + (clean): Updated. + +2001-07-20 Werner LEMBERG + + * src/libs/libgroff/tmpname.cc: New file, defining get_tempname(). + * src/libs/libgroff/mkstemp.cc: New file. + * src/libs/libgroff/mksdir.cc: New file. + * src/libs/libgroff/tmpfile.cc [HAVE_MKSTEMP_PROTO]: Removed. + (xtmpfile) [!HAVE_MKSTEMP]: Removed. + * src/libs/libgroff/Makefile.sub: Updated. + * src/include/lib.h: Add mksdir() prototype. + * src/include/posix.h: Define S_IXUSR if not yet defined. + + * src/preproc/html/pre-html.cc (MAX_RETRIES): Removed. + (createAllPages): Use mksdir() instead of current code. + * src/utils/indxbib/indxbib.cc [HAVE_MKSTEMP_PROTO]: Removed. + (main): [!HAVE_MKSTEMP]: Removed. + + * aclocal.m4 (GROFF_MKSTEMP): Updated to use new mkstemp.cc file. + (GROFF_INTTYPES_H, GROFF_UNSIGNED_LONG_LONG, GROFF_UINTMAX_T): New + macros. + * configure.ac: Add tests for stdint.h, sys/time.h, and + gettimeofday(). + Call new GROFF_xxx macros. + * configure: Regenerated. + * Makefile.in: Comments updated. + +2001-07-20 Gaius Mulley + + * src/preproc/html/pre-html.cc (scanArguments): Use getopt_long() + instead of current code. + * src/devices/grohtml/post-html.cc (main): Handle `-d' option. + * src/roff/groff/groff.cc (possible_command::insert_args): New + function. + (main): Use it for predriver handling instead of insert_arg(). + +2001-07-19 Werner LEMBERG + + * doc/Makefile: Added GROFF_BIN_PATH to make it work with uninstalled + groff also. + + * src/include/posix.h: Define S_IWUSR if not yet defined. + +2001-07-18 Werner LEMBERG + + * NEWS: Updated. + +2001-07-18 Ruslan Ermilov + + * tmac/groff_mdoc.man: Document new -width and -column syntax. + Some other minor fixes. + * tmac/an-old.tmac: Add `AT' and `UC' macros. + +2001-07-17 Gaius Mulley + + Replace call to `troff' with `groff -Z' to make it aware of + GROFF_BIN_PATH. + + * src/preproc/html/pre-html.cc (TROFF_COMMAND): New macro. + (troff_command, command_prefix): Removed. + (alterDeviceTo): Use groff. + (addZ): New function. + (char_buffer::do_html): Use it. + (scanArguments): Use TROFF_COMMAND. + (findPrefix): Removed. + (main): Updated. + * src/roff/groff/groff.cc (main): Handle zflag for preprocessors. + +2001-07-17 Eric S. Raymond + + * doc/pic.ms: Documentation fixes. + +2001-07-17 Werner LEMBERG + + Replace atexit() with global destructor. + + * src/libs/libgroff/tmpfile.cc (xtmpfile_list): Add constructor. + (xtmpfile_list_init): New global structure to deallocate + xtmpfile_list on exit. Its destructor inherits most code from + remove_tmp_files(). + (remove_tmp_files): Deleted. + (add_tmp_file): Simplified. + +2001-07-16 Werner LEMBERG + + Replace strdup() with strsave(). + + * src/devices/grolbp/lbp.cc [!HAVE_STRDUP]: Removed. + (set_papersize): Use strsave() and a_delete. + (main): Use strsave(). + * src/preproc/html/pre-html.cc (make_message, createAllPages, + removeAllPages): Use strsave() and a_delete. + + * configure.ac: Remove test for strdup. + * Makefile.in: Comment updated. + * configure: Regenerated. + +2001-07-15 Werner LEMBERG + + * win32-diffs: Updated. + +2001-07-14 Werner LEMBERG + + * src/preproc/html/pre-html.cc (makeTempFiles): Activate new code, + removing the old one. + * src/utils/indxbib/indxbib.cc (main): Remove compiler warning. + +2001-07-14 Ralph Corderoy + + * src/libs/libgroff/tmpfile.cc (xtmpfile): Fix guard for `namep'. + +2001-07-12 Ruslan Ermilov + + Merge -xwidth into -width. Add -xwidth functionality to -column + also. + + * tmac/doc.tmac (Bl): Add dummy doc-typeXXX and doc-spaceXXX to + avoid warning. + (doc-do-Bl-args): Merge -xwidth code with -width. Test whether + string immediately following a leading dot starts with a valid mdoc + argument. + Add similar code to the -column branch. + (doc-Bl-usage): Updated. + * groff_mdoc.man: s/-xwidth/-width/. + +2001-07-12 Gaius Mulley + + * src/devices/grohtml/post-html.cc (text_glob::is_br): Stop titles + running into centered or non-formatted text. + +2001-07-11 Werner LEMBERG + + Introduce short and long prefixes to have the selection at run-time + whether there is a 8+3 limit for names of temporary files. + + * src/libs/libgroff/tmpfile.cc (TMPFILE_PREFIX): Replaced with... + (TMPFILE_PREFIX_SHORT, TMPFILE_PREFIX_LONG): This. + (tmpfile_prefix, tmpfile_prefix_len, use_short_prefix): New + variables. + (temp_init): New global structure to initialize above three + variables. + (xtmptemplate): Use two parameters for long and short prefix. + Simplify code use above three variables. + (xtmpfile): Use long and short prefixes as parameters. + * src/include/lib.h: Updated. + + * src/preproc/html/pre-html.cc ({PAGE,PS,REGION}_TEMPLATE): Replace + with ... + ({PAGE,PS,REGION}_TEMPLATE_{SHORT,LONG}): This. + (createAllPages, makeTempFiles): Updated. + +2001-07-09 Werner LEMBERG + + * REVISION: Increased to 3. + +Local Variables: +version-control: never +coding: latin-1 +End: diff --git a/FDL b/FDL new file mode 100644 index 0000000..4a0fe1c --- /dev/null +++ b/FDL @@ -0,0 +1,397 @@ + GNU Free Documentation License + Version 1.2, November 2002 + + + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall subject +(or to related matters) and contains nothing that could fall directly +within that overall subject. (Thus, if the Document is in part a +textbook of mathematics, a Secondary Section may not explain any +mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document 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. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation 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. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..d540e5f --- /dev/null +++ b/INSTALL @@ -0,0 +1,50 @@ +To install groff, follow the instructions in the file INSTALL.gen. + +This file contains information that supplements those instructions. + +(For instructions how to build groff with DJGPP tools for MS-DOS and +MS-Windows, see the file arch/djgpp/README.) + +(For instructions how to build groff with the MinGW tools for +MS-Windows, see the file README.MinGW.) + +groff is written in C++, so you will need a C++ compiler. The C++ +source files use a suffix of `.cpp', so your C++ compiler must be able +to handle this. If you don't already have a C++ compiler, I suggest +gcc 2.7.1 or later (gcc version 2 includes GNU C++ as well as GNU C). +From gcc 2.5, it is no longer necessary to install libg++: the C++ +header files needed by groff are created by the gcc installation +process. To override configure's choice of C++ compiler, you can set +the CXX environment variable. + +If you have a library that provides a faster malloc than your system's +usual malloc, it is good idea to include it in LIBS. For example, +using the malloc that comes with GNU Emacs version 20 can give a +worthwhile (and sometimes spectacular) performance improvement. + +If you want A4 or letter paper format and the configure script produces +an incorrect guess, say + + PAGE=xxx ./configure + +where `xxx' should be either `A4' or `letter'. Note that this will only +affect the paper selection of some device drivers like grops (which can +be still overridden on the command line). For compatibility with +ditroff, the default page length in gtroff is always 11 inches. The +page length can be changed with the `pl' request. + +When you have built groff, you can use the test-groff script to try +groff out on one of the man pages. (Use the .n files not the .man +files.) The test-groff script sets up environment variables to allow +groff to run without being installed. For example, you could do + + ./test-groff -man -Tascii src/roff/groff/groff.n | less + +To get a DVI, PDF, or HTML version of the groff texinfo manual, say `make +groff.dvi', `make groff.pdf', or `make groff.html', respectively, in the +`doc' subdirectory (after configuring the groff package). Note that you +need texinfo version 4.6 as a prerequisite. Neither older versions nor +texinfo 4.7 (due to a bug) will work. + +If you have problems, read the PROBLEMS file. If this doesn't help +send a bug report using the form in the file BUG-REPORT. diff --git a/INSTALL.gen b/INSTALL.gen new file mode 100644 index 0000000..095b1eb --- /dev/null +++ b/INSTALL.gen @@ -0,0 +1,231 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PREFIX', the package will +use PREFIX as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0f67f42 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +LICENSE + +The groff program is a free software project. It is licensed under +the GNU General Public License (GNU GPL), version 2 or later. + +The file COPYING in the top directory of the groff source package +contains a copy of the GPL that was downloaded from the GNU web site +http://www.gnu.org/copyleft/gpl.txt at 1 dec 2003. + +All files of the groff source package are licensed under this version +of the GPL (or licenses which are compatible with the GPL). +You are free to choose version 2 or any subsequent version of the GPL. + +The GPL names an address where you can get the actual version by +normal post. Further information is found in the internet at +http://www.gnu.org/copyleft. + +The groff program is a GNU package, and the copyright of all files of +the groff source package which are under the GPL has been assigned to +the Free Sofware Foundation (FSF). Information on GNU and FSF is +found at http://www.fsf.org/. diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..f8d32d0 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,164 @@ +MANIFEST + +Last update: 26 May 2005 + +This file is part of groff, the GNU roff type-setting system. + +Copyright (C) 2001, 2003, 2004, 2005 Free Software Foundation, Inc. +written by Bernd Warken +maintained by Werner Lemberg + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.1 or +any later version published by the Free Software Foundation; with the +Invariant Sections being this .ig-section and AUTHORS, with no +Front-Cover Texts, and with no Back-Cover Texts. + +A copy of the Free Documentation License is included as a file called +FDL in the main directory of the groff source package. + +######################################################################## + +This file gives an overview of the directories and the main files of +the groff source distribution. + + +1) The top directory. + + BUG-REPORT A template for bug-reports. + ChangeLog Log of the changes in the different groff versions. + COPYING The GNU General Public License (GPL). + FDL The Free Documentation License (FDL). + INSTALL Information on compiling and installing groff. + INSTALL.gen Generic information on configuration and compiling. + LICENSE Licensing information. + MANIFEST The file you are reading. + MORE.STUFF Useful stuff in other packages. + NEWS Recent user-visible changes in groff. + PROBLEMS Tips to handle known critical situations. + PROJECTS Long-term additions to groff. + README Availability and contact information for groff. + README.MinGW Build information for MinGW. + TODO Things planned for future groff versions. + + All other files in the top directory are related to the configuration, + compilation, and install processes. + + +2) The directory structure + +./arch Data that is special for different architectures. + djgpp Data special for the 32-bit DOS compiler djgpp. + misc Data needed for various platforms. + +./contrib Part of groff, but maintained by other people. + eqn2graph Convert equations created with EQN into different + graphical formats. + gdiffmk An improved implementation of the diffmk command to mark + differences between groff/nroff/troff files. + grap2graph Convert grap diagraps into different graphical formats. + groffer A wrapper to conveniently view roff files. + mm The groff mm macro package. + mom The groff mom macro package. + pdfmark A package to add PDF marks to groff documents, together + with a shell script (pdfroff) for easy creation of PDF + documents. + pic2graph Convert PIC diagrams into different graphical formats. + +./doc Manuals and tutorials to groff aspects. + +./font Device information and fonts. + devX100 100dpi device for X Window System. + devX100-12 100dpi device with narrower font (for 12pt base font). + devX75 75dpi device for X Window System. + devX75-12 75dpi device with narrower font (for 12pt base font). + devascii Text device for ASCII output. + devcp1047 EBCDIC device. + devdvi TeX DVI device. + devhtml HTML device. + devlatin1 Text device for latin-1 (ISO 8859-1) output. + devlbp Device for Canon CAPSL laser printers. + devlj4 Device for HP Laserjet 4, PCL 5, and compatible printers. + devps PostScript device. + devutf8 Text device for Unicode output. + +./man Some groff manual pages of more general character. + +./src Everything written in programming languages. + +./src/devices The postprocessors. + grodvi TeX DVI output. + grohtml HTML output. + grolbp Canon printers. + grolj4 HP Laserjet 4, PCL 5, and compatible printers. + grops PostScript output. + grotty Text output. + xditview A groff (pre)viewer for the X Window system. + +./src/include The *.h C/C++ include files. + +./src/libs C++ code common to several parts of the groff sources. + libbib Library of bibliographic functions. + libdriver Parser for intermediate output and postprocessor code. + libgroff Library for general support functions used everywhere. + libxutil Utility functions for xditview and xtotroff. + snprintf An implementation of snprintf() and friends. + +./src/preproc Preprocessors. + eqn Mathematical formulae. + grn Gremlin pictures. + html The preprocessor part of grohtml. + pic Diagram drawer. + refer Bibliographic references. + soelim File inclusion using tmac path. + tbl Tables. + +./src/roff Front-end programs. + groff Wrapper around troff. This is the main user program. + grog Guess groff command line options. + nroff Emulate classical nroff text formatter. + troff Main roff formatter program. + +./src/utils Utility programs around groff. + addftinfo Add information to old troff font files for use with groff. + afmtodit Create font description files for the PostScript device. + hpftodit Create font description files for the LJ4 device. + indxbib Make inverted index for bibliographic databases. + lkbib Search bibliographic databases. + lookbib Interactively search bibliographic databases. + pfbtops Translate a PostScript font in PFB format to PFA. + tfmtodit Create font description files for TeX DVI device. + xtotroff Create font description files for xditview. + +./tmac Macro files. + + +3) Documentation + +The groff documentation is scattered upon several places. + +- The main directory contains documents related to the groff source. + The README file contains the information needed to get the groff + package, report bugs, and contact the developers. + +- The man-page of each program (section 1) is kept in the source + directory of the program. + +- The man-pages for the other sections are found in `src/man'. + +- Documentation in other formats are located in the `doc' directory, + including the groff info file, tutorials, and manuals. + + +4) The roff parser + +The parsing of the roff language is done by troff. The input is converted +to tokens in `src/roff/troff/input.cpp' and transformed into `nodes' by +`src/roff/troff/env.cpp' and `src/roff/troff/node.cpp'. From these, the +intermediate output is generated (also in `node.cpp'). + + +5) Postprocessing + +The parser for the intermediate output and the postprocessing is in +`src/libs/libdriver/input.cpp'. This is used by all postprocessors. diff --git a/MORE.STUFF b/MORE.STUFF new file mode 100644 index 0000000..b1c18f7 --- /dev/null +++ b/MORE.STUFF @@ -0,0 +1,198 @@ +More stuff for groff +==================== + +Windows 32 +---------- + +Here two ports using the gcc compiler and other GNU tools: + +. Cygwin: + + http://sources.redhat.com/cygwin/ + + Look for a convenient mirror site in + + http://sources.redhat.com/cygwin/mirrors.html + + At any of those mirrors, groff can be found in the directory + latest/groff. + +. Kees Zeelenberg : + + http://gnuwin32.sourceforge.net/packages/groffl.htm + + This port includes recent versions of grap and deroff. + +dos +--- + +Binaries for Eli Zaretskii's port using the djgpp compiler are available +from + + ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/gro*b.zip + +and its mirrors; for installation details please read `arch/djgpp/README'. +This port also runs on Windows 32 systems, except Windows 2000. + +grap +---- + +An implementation of Kernighan & Bentley's grap language for typesetting +graphs. Written by Ted Faber . The actual version +can be found at + + http://www.lunabase.org/~faber/Vault/software/grap/ + +A djgpp port which runs on dos and most Windows 32 systems (Windows 95, +Windows 98, Windows NT) done by Kees Zeelenberg +is available from + + ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/ + +It is intended to be used with the djgpp port of groff. + +A Windows 32 port is included in the groff package available from + + http://gnuwin32.sourceforge.net/ + +plot2dev +-------- + +This utility program can convert plot graphics to either pic or gremlin +files. It has been written by Richard Murphey +and Daniel Senderowicz (who has added the gremlin +driver). The actual version can be found as + + ftp://ftp.ffii.org/pub/groff/plot2dev-x.x.tar.gz + +troffcvt +-------- + +From the web page: + + troffcvt is a translator that turns troff input into a form that can be + more easily processed. The troffcvt distribution comes with + postprocessors that turn troffcvt into various destination formats such + as HTML (Hypertext Markup Language), RTF (Rich Text Format) or plain + text. + +Note that you need a lot of additional packages to compile troffcvt; +everything is available from + + http://www.primate.wisc.edu/software/troffcvt/ + +unroff +------ + +From the README file: + + Unroff is a Scheme-based, programmable, extensible troff translator with + a back-end for the Hypertext Markup Language. Unroff is free software + and is distributed both as source and as precompiled binaries. + + http://www.informatik.uni-bremen.de/~net/unroff/unroff.html + +You need als Elk, the Scheme based Extension Language Kit, which is +available from + + http://www.informatik.uni-bremen.de/~net/elk + +deroff +------ + +Deroff removes roff constructs from documents for the purpose of indexing, +spell checking etc. + +Michael Haardt's implementation is a little smarter +than traditional implementations, because it knows about certain -man and +-mm macros. It is able to generate a word list for spell checking tools +or omit headers for sentence analysis tools. It can further generate +cpp-style #line lines. + + http://www.moria.de/deroff/ + +Version 1.6 compiled with DJGPP (for MS-DOS and all Windows 32 systems, +i.e. Windows 95, Windows 98, Windows NT) is available from + + ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/ + +and its mirrors. + +A Windows 32 port of version 1.8 is available from + + http://gnuwin32.sourceforge.net/ + +David Frey has also written a deroff implementation +for Debian; it is available from + + ftp://ftp.debian.org/debian/pool/main/d/deroff/ + +miscellaneous +------------- + +. Ralph Corderoy's excellent page on troff: + + www.troff.org + + There are links for virtually everything related to troff. + +. Dr. Robert Hermann's groff gems are available from + + http://www.eas.slu.edu/People/RBHerrmann/GROFF/index.html + + At present there are examples for + + o creating business cards + o using groff to make large format posters for presentations + +. Robert Marks's collection of useful macros and scripts is available from + + http://www.agsm.edu.au/~bobm/odds+ends/scripts.html + + Description: + + o `polish': Is a sed (= the Unix stream editor) script that does many + things to ASCII text. Amongst other things, it breaks lines at new + sentences, reduces upper-case acronyms by one point size, adds + diacriticals, changes simple quotes into smart quotes, and makes a few + simple grammar checks. The best way to see what it does is to run it + as a sed script file (or files) on a text file and then compare the + output file with the original. + + o `DropCaps' is a troff script which replaces the initial letters of + paragraphs immediately after H1 and H2 headings with drop-capitals of + specified point size, and automatically flows the text around the new + drop cap. + + o `AJM Header' is a set of troff macros used in production of the + Australian Journal of Management. They use the Memorandum Macros (mm) + of AT&T, and so should be invoked with the UNIX troff -mm flag; they + should also work with the GNU troff -mm flag. + +. Thomas Baruchel has developed Meta-tbl, a tbl + postprocessor to manipulate table cells (like adding gray shades). The + latest version can be found at + + http://perso.libertysurf.fr/baruchel/ + +. gpresent, written by Bob Diertens . From the README + file: + + gpresent is a package for making presentation with groff and acroread. + It consist of a set of macros to be used with groff and a post-processor + for manipulating the PostScript output of groff. Without the use of the + PAUSE macro, it can also be used for making slides. + + It is available from + + www.science.uva.nl/~bobd/useful/gpresent/ + + +documentation +------------- + +Many documents related to the original versions of troff, ditroff, pic, +and others can be accessed from the following web pages: + + http://www.cs.bell-labs.com/cm/cs/cstr.html + http://www.cs.bell-labs.com/cm/cs/papers.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2a44c85 --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +# Copyright (C) 1989-2000 Free Software Foundation, Inc. +# Written by James Clark (jjc@jclark.com) +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +SHELL=/bin/sh + +.PHONY: all +all: + $(SHELL) configure + $(MAKE) all diff --git a/Makefile.ccpg b/Makefile.ccpg new file mode 100644 index 0000000..3110df2 --- /dev/null +++ b/Makefile.ccpg @@ -0,0 +1,33 @@ +# Makefile.ccpg +MAKEFILEPARTS=\ + $(top_srcdir)/Makefile.comm \ + $(top_builddir)/Makefile.cfg \ + $(srcdir)/Makefile.sub \ + $(top_srcdir)/Makefile.ccpg \ + Makefile.dep + +all: $(PROG) $(MANPAGES) + +$(PROG): $(OBJS) $(XLIBS) + $(LINK.cpp) -o $@ $(OBJS) $(XLIBS) $(EXTRA_LDFLAGS) $(LIBS) $(MLIB) + +install_bin: install_prog +install_prog: $(PROG) +install_data: install_man +install_man: $(MANPAGES) +uninstall_sub: uninstall_prog uninstall_man +depend: depend_src +depend.temp: $(GENSRCS) $(YTABC) +distfiles: $(YTABC) +TAGS: TAGS_src +TAGS_src: $(CCSRCS) $(CSRCS) $(GRAM) $(HDRS) +Makefile: $(MAKEFILEPARTS) +Makefile.dep: + touch Makefile.dep +$(top_builddir)/stamp-h $(MANPAGES): $(top_srcdir)/VERSION $(top_srcdir)/REVISION + +pure: $(PROG).pure + +$(PROG).pure: $(OBJS) $(XLIBS) + $(PURIFY) $(PURIFYCCFLAGS) \ + $(LINK.cpp) -o $@ $(OBJS) $(XLIBS) $(LIBS) $(MLIB) diff --git a/Makefile.comm b/Makefile.comm new file mode 100644 index 0000000..fc34a56 --- /dev/null +++ b/Makefile.comm @@ -0,0 +1,304 @@ +# Copyright (C) 1989-2000, 2002, 2003, 2004 Free Software Foundation, Inc. +# Written by James Clark (jjc@jclark.com) +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +# +# Makefile.comm +# +INCLUDES=-I. -I$(srcdir) \ + -I$(top_builddir)/src/include -I$(top_srcdir)/src/include +ALL_CCFLAGS=$(INCLUDES) $(CCDEFINES) $(CCFLAGS) $(CPPFLAGS) +COMPILE.cpp=$(CCC) $(ALL_CCFLAGS) -c +ALL_CFLAGS=$(INCLUDES) $(CDEFINES) $(CFLAGS) $(CPPFLAGS) +COMPILE.c=$(CC) $(ALL_CFLAGS) -c +LINK.cpp=$(CCC) $(CCFLAGS) $(LDFLAGS) +LINK.c=$(CC) $(CFLAGS) $(LDFLAGS) +LIBGROFF=$(top_builddir)/src/libs/libgroff/libgroff.$(LIBEXT) +LIBBIB=$(top_builddir)/src/libs/libbib/libbib.$(LIBEXT) +LIBDRIVER=$(top_builddir)/src/libs/libdriver/libdriver.$(LIBEXT) +LIBXUTIL=$(top_builddir)/src/libs/libxutil/libxutil.$(LIBEXT) +MLIB= +XLIBS= +YTABH= +YTABC= +GRAM= +LIBCLEAN= +CLEANADD= +CLEANDIRADD= +CLEANNOTSRCDIRADD= +MOSTLYCLEANFILES=$(MANCLEAN) $(PROG) $(OBJS) $(GENSRCS) $(GENHDRS) \ + depend.temp core y.output $(CLEANADD) +CLEANFILES=$(LIBCLEAN) +DISTCLEANFILES=TAGS Makefile Makefile.dep +REALCLEANFILES=$(YTABC) $(YTABH) +NAMEPREFIX= +HDRS= +MANPAGES=$(MAN1) $(MAN5) $(MAN7) +MANCLEAN=$(MANPAGES) +fontsubdir=$(fontdir)/dev$(DEV) + +all install install_bin install_data TAGS depend distfiles uninstall_sub: + +install: prefix_must_exist install_bin install_data +uninstall: uninstall_sub +pure: + +.PHONY: all clean distclean mostlyclean realclean extraclean depend distfiles +.PHONY: install install_bin install_data prefix_must_exist +.PHONY: uninstall uninstall_sub +.PHONY: pure + +prefix_must_exist: + @test -d $(prefix) \ + || (echo ; \ + echo The prefix directory \`$(prefix)\' doesn\'t exist; \ + echo ; \ + exit 1) + +mostlyclean: + -rm -f $(MOSTLYCLEANFILES) + -rm -rf $(CLEANDIRADD) + -@if test `cd $(srcdir); pwd` = `pwd`; then \ + :; \ + else \ + rm -f $(CLEANNOTSRCDIRADD); \ + fi + +clean: mostlyclean + -rm -f $(CLEANFILES) + +distclean: clean + -rm -f $(DISTCLEANFILES) + -@if test `cd $(srcdir); pwd` = `pwd`; then \ + :; \ + else \ + rm -f $(YTABC) $(YTABH); \ + fi + +realclean: distclean + -rm -f $(REALCLEANFILES) + +extraclean: distclean + -rm -f \#* *~ =* core junk grot old temp tmp tem *.new *.old *.orig + +.SUFFIXES: +.SUFFIXES: .o .obj .cpp .c .y .man .n + +.cpp.o: + $(COMPILE.cpp) $(EXTRA_CCFLAGS) $< + +.c.o: + $(COMPILE.c) $(EXTRA_CFLAGS) $< + +.cpp.obj: + $(COMPILE.cpp) $(EXTRA_CCFLAGS) $< + +.c.obj: + $(COMPILE.c) $(EXTRA_CFLAGS) $< + +.y.cpp: + if test -n "$(YTABH)"; then \ + $(YACC) $(YACCFLAGS) -d $<; \ + else \ + $(YACC) $(YACCFLAGS) $<; \ + fi + -test -f y.tab.h && mv y.tab.h y_tab.h + -test -f y.tab.c && mv y.tab.c y_tab.c + mv y_tab.c $(YTABC) + test -z "$(YTABH)" || mv y_tab.h $(YTABH) + +# The next rule is needed for make of Solaris 2.5.1 to override its +# built-in .y.o rule (which takes precedence over the .y.cpp rule above). +.y.o: + if test -n "$(YTABH)"; then \ + $(YACC) $(YACCFLAGS) -d $<; \ + else \ + $(YACC) $(YACCFLAGS) $<; \ + fi + -test -f y.tab.h && mv y.tab.h y_tab.h + -test -f y.tab.c && mv y.tab.c y_tab.c + mv y_tab.c $(YTABC) + test -z "$(YTABH)" || mv y_tab.h $(YTABH) + $(COMPILE.cpp) $(EXTRA_CCFLAGS) $(YTABC) + +.man.n: + @echo Making $@ from $< + @-rm -f $@ + @sed -e "s|@BINDIR@|$(bindir)|g" \ + -e "s|@FONTDIR@|$(fontdir)|g" \ + -e "s|@LOCALFONTDIR@|$(localfontdir)|g" \ + -e "s|@LEGACYFONTDIR@|$(legacyfontdir)|g" \ + -e "s|@MACRODIR@|$(tmacdir)|g" \ + -e "s|@SYSTEMMACRODIR@|$(systemtmacdir)|g" \ + -e "s|@LOCALMACRODIR@|$(localtmacdir)|g" \ + -e "s|@DOCDIR@|$(docdir)|g" \ + -e "s|@EXAMPLEDIR@|$(exampledir)|g" \ + -e "s|@HTMLDOCDIR@|$(htmldocdir)|g" \ + -e "s|@PDFDOCDIR@|$(pdfdocdir)|g" \ + -e "s|@DEVICE@|$(DEVICE)|g" \ + -e "s|@DEFAULT_INDEX@|$(indexdir)/$(indexname)|g" \ + -e "s|@DEFAULT_INDEX_NAME@|$(indexname)|g" \ + -e "s|@INDEX_SUFFIX@|$(indexext)|g" \ + -e "s|@COMMON_WORDS_FILE@|$(common_words_file)|g" \ + -e "s|@MAN1EXT@|$(man1ext)|g" \ + -e "s|@MAN5EXT@|$(man5ext)|g" \ + -e "s|@MAN7EXT@|$(man7ext)|g" \ + -e "s|@TMAC_S_PREFIX@|$(tmac_s_prefix)|g" \ + -e "s|@TMAC_M_PREFIX@|$(tmac_m_prefix)|g" \ + -e "s|@TMAC_AN_PREFIX@|$(tmac_an_prefix)|g" \ + -e "s|@TMAC_MDIR@|$(tmacdir)/mm|g" \ + -e "s|@BROKEN_SPOOLER_FLAGS@|$(BROKEN_SPOOLER_FLAGS)|g" \ + -e "s|@VERSION@|$(version)$(revision)|g" \ + -e "s|@MDATE@|`$(SHELL) $(top_srcdir)/mdate.sh $<`|g" \ + -e "s|@g@|$(g)|g" \ + -e "s!@G@!`echo $(g) | tr [a-z] [A-Z]`!g" \ + $< >$@ + +.PHONY: install_man +install_man: + -test -d $(manroot) || $(mkinstalldirs) $(manroot) + -test -d $(man1dir) || $(mkinstalldirs) $(man1dir) + @-pages="$(MAN1)"; \ + for p in $$pages; do \ + prog=`basename $$p .n`; \ + target=$(man1dir)/$(NAMEPREFIX)$$prog.$(man1ext); \ + rm -f $$target; \ + echo $(INSTALL_DATA) $$p $$target; \ + $(INSTALL_DATA) $$p $$target; \ + done + -test -d $(man5dir) || $(mkinstalldirs) $(man5dir) + @-pages="$(MAN5)"; \ + for p in $$pages; do \ + target=$(man5dir)/`basename $$p .n`.$(man5ext); \ + rm -f $$target; \ + echo $(INSTALL_DATA) $$p $$target; \ + $(INSTALL_DATA) $$p $$target; \ + done + -test -d $(man7dir) || $(mkinstalldirs) $(man7dir) + @-pages="$(MAN7)"; \ + for p in $$pages; do \ + target=$(man7dir)/`basename $$p .n`.$(man7ext); \ + rm -f $$target; \ + echo $(INSTALL_DATA) $$p $$target; \ + $(INSTALL_DATA) $$p $$target; \ + done + +.PHONY: uninstall_man +uninstall_man: + @-pages="$(MAN1)"; \ + for p in $$pages; do \ + target=$(man1dir)/$(NAMEPREFIX)`basename $$p .n`.$(man1ext); \ + echo rm -f $$target; \ + rm -f $$target; \ + done + @-pages="$(MAN5)"; \ + for p in $$pages; do \ + target=$(man5dir)/`basename $$p .n`.$(man5ext); \ + echo rm -f $$target; \ + rm -f $$target; \ + done + @-pages="$(MAN7)"; \ + for p in $$pages; do \ + target=$(man7dir)/`basename $$p .n`.$(man7ext); \ + echo rm -f $$target; \ + rm -f $$target; \ + done + +.PHONY: install_prog +install_prog: + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + rm -f $(bindir)/$(NAMEPREFIX)$(PROG) + $(INSTALL_PROGRAM) $(PROG) $(bindir)/$(NAMEPREFIX)$(PROG) + +.PHONY: uninstall_prog +uninstall_prog: + -rm -f $(bindir)/$(NAMEPREFIX)$(PROG) + +.PHONY: install_dev +install_dev: + -test -d $(datadir) || $(mkinstalldirs) $(datadir) + -test -d $(dataprogramdir) || $(mkinstalldirs) $(dataprogramdir) + -test -d $(datasubdir) || $(mkinstalldirs) $(datasubdir) + -test -d $(fontdir) || $(mkinstalldirs) $(fontdir) + -test -d $(fontsubdir) || $(mkinstalldirs) $(fontsubdir) + -if test -d $(srcdir)/generate; then \ + test -d $(fontsubdir)/generate \ + || $(mkinstalldirs) $(fontsubdir)/generate; \ + fi + -test -z "$(DEVFILES)" \ + || for f in ""$(DEVFILES); do \ + rm -f $(fontsubdir)/$$f; \ + if test -f $$f; then \ + $(INSTALL_DATA) $$f $(fontsubdir)/$$f; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$f $(fontsubdir)/$$f; \ + fi; \ + done + -test -z "$(DEVSCRIPTS)" \ + || for f in ""$(DEVSCRIPTS); do \ + rm -f $(fontsubdir)/$$f; \ + if test -f $$f; then \ + $(INSTALL_SCRIPT) $$f $(fontsubdir)/$$f; \ + else \ + $(INSTALL_SCRIPT) $(srcdir)/$$f $(fontsubdir)/$$f; \ + fi; \ + done + +.PHONY: uninstall_dev +uninstall_dev: + -test -z "$(DEVFILES)$(DEVSCRIPTS)" \ + || for f in ""$(DEVFILES) $(DEVSCRIPTS); do \ + rm -f $(fontsubdir)/$$f; \ + done + -test -d $(fontsubdir)/generate && rmdir $(fontsubdir)/generate + -rmdir $(fontsubdir) + +.PHONY: depend_src +depend_src: depend.temp + mv depend.temp Makefile.dep + +depend.temp: FORCE + > depend.temp; + if test -f "$(srcdir)/$(YTABC)"; then \ + ytabc="$(srcdir)/$(YTABC)"; \ + else \ + ytabc="$(YTABC)"; \ + fi; \ + test -z "$(CCSRCS)$(YTABC)" \ + || $(CCC) $(ALL_CCFLAGS) -MM $(CCSRCS) $$ytabc >>depend.temp + test -z "$(CSRCS)" \ + || $(CC) $(ALL_CFLAGS) -MM $(CSRCS) >>depend.temp + test -z "$(YTABH)" \ + || (sed -e 's|$(YTABH)|$(YTABC)|g' depend.temp >depend1.temp; \ + mv depend1.temp depend.temp) + +.PHONY: TAGS_src +TAGS_src: + $(ETAGS) $(ETAGSFLAGS) $(CCSRCS) $(CSRCS) + test -z "$(GRAM)$(HDRS)" \ + || $(ETAGS) $(ETAGSFLAGS) -a $(ETAGSCCFLAG) $(GRAM) $(HDRS) + +# This rule is only considered for the subdir_Makefile target. +Makefile: + -rm -f Makefile + echo srcdir=$(srcdir) >>Makefile + echo VPATH=$(VPATH) >>Makefile + cat $(MAKEFILEPARTS) /dev/null >>Makefile + +FORCE: + +.NOEXPORT: diff --git a/Makefile.cpg b/Makefile.cpg new file mode 100644 index 0000000..1a6974a --- /dev/null +++ b/Makefile.cpg @@ -0,0 +1,27 @@ +# Makefile.cpg +MAKEFILEPARTS=\ + $(top_srcdir)/Makefile.comm \ + $(top_builddir)/Makefile.cfg \ + $(srcdir)/Makefile.sub \ + $(top_srcdir)/Makefile.cpg \ + Makefile.dep + +all: $(PROG) $(MANPAGES) + +$(PROG): $(OBJS) $(XLIBS) + $(LINK.c) -o $@ $(OBJS) $(XLIBS) $(EXTRA_LDFLAGS) $(LIBS) $(MLIB) + +install_bin: install_prog +install_prog: $(PROG) +install_data: install_man +install_man: $(MANPAGES) +uninstall_sub: uninstall_prog uninstall_man +depend: depend_src +depend.temp: $(GENSRCS) $(YTABC) +distfiles: $(YTABC) +TAGS: TAGS_src +TAGS_src: $(CCSRCS) $(CSRCS) $(GRAM) $(HDRS) +Makefile: $(MAKEFILEPARTS) +Makefile.dep: + touch Makefile.dep +$(top_builddir)/stamp-h $(MANPAGES): $(top_srcdir)/VERSION $(top_srcdir)/REVISION diff --git a/Makefile.dev b/Makefile.dev new file mode 100644 index 0000000..6c70fff --- /dev/null +++ b/Makefile.dev @@ -0,0 +1,4 @@ +all: $(DEVFILES) $(DEVSCRIPTS) +install_data: install_dev +uninstall_sub: uninstall_dev +install_dev: $(DEVFILES) $(DEVSCRIPTS) diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..26d55de --- /dev/null +++ b/Makefile.in @@ -0,0 +1,776 @@ +# Copyright (C) 1989-2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Written by James Clark (jjc@jclark.com) +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +SHELL=@SHELL@ + +srcdir=@srcdir@ +top_srcdir=@abs_top_srcdir@ +VPATH=@srcdir@ +top_builddir=@abs_top_builddir@ + +# `RT_SEP' is the operating system's native PATH SEPARATOR CHAR, which +# is to be used in runtime PATHs compiled into groff executables. +RT_SEP=@GROFF_PATH_SEPARATOR@ + +# `SH_SEP' is a alternative PATH SEPARATOR CHAR, to be used in shell +# scripts and makefile rules; it may be the same as `RT_SEP', but, +# particularly in some Microsoft environments, it may differ. +SH_SEP=@PATH_SEPARATOR@ + +version=`cat $(top_srcdir)/VERSION` +# No additional number if revision is zero. +revision=`sed -e 's/^0$$//' -e 's/^[1-9].*$$/.&/' $(top_srcdir)/REVISION` + +# Define `page' to be letter if your PostScript printer uses 8.5x11 +# paper (USA) and define it to be A4, if it uses A4 paper (rest of the +# world). +PAGE=@PAGE@ + +# The name of the ghostscript program. Normally, gs, on GNU/Linux +# but it might be different on MS-DOS/MS-WIN32 systems. +GHOSTSCRIPT=@GHOSTSCRIPT@ + +# `ALT_GHOSTSCRIPT_PROGS' specifies a list alternative names, +# which can be tried if `GHOSTSCRIPT' cannot be found at run time. +ALT_GHOSTSCRIPT_PROGS=@ALT_GHOSTSCRIPT_PROGS@ + +# Similarly, `ALT_AWK_PROGS' specifies a list of alternative names, +# which can be tried at run time, to identify the awk program. +ALT_AWK_PROGS=@ALT_AWK_PROGS@ + +# Normally the Postscript driver, grops, produces output that conforms +# to version 3.0 of the Adobe Document Structuring Conventions. +# Unfortunately some spoolers and previewers can't handle such output. +# The BROKEN_SPOOLER_FLAGS variable tells grops what it should do to +# make its output acceptable to such programs. This variable controls +# only the default behaviour of grops; the behaviour can be changed at +# runtime by the grops -b option (and so by groff -P-b). +# Use a value of 0 if your spoolers and previewers are able to handle +# conforming PostScript correctly. +# Add 1 if no %%{Begin,End}DocumentSetup comments should be generated; +# this is needed for early versions of TranScript that get confused by +# anything between the %%EndProlog line and the first %%Page: comment. +# Add 2 if lines in included files beginning with %! should be +# stripped out; this is needed for the OpenWindows 2.0 pageview previewer. +# Add 4 if %%Page, %%Trailer and %%EndProlog comments should be +# stripped out of included files; this is needed for spoolers that +# don't understand the %%{Begin,End}Document comments. I suspect this +# includes early versions of TranScript. +# Add 8 if the first line of the PostScript output should be %!PS-Adobe-2.0 +# rather than %!PS-Adobe-3.0; this is needed when using Sun's Newsprint +# with a printer that requires page reversal. +BROKEN_SPOOLER_FLAGS=@BROKEN_SPOOLER_FLAGS@ + +# `DEVICE' is the default device. +DEVICE=ps + +# `XDEVDIRS' is either `font/devX{75,100}{,-12}' or empty. +XDEVDIRS=@XDEVDIRS@ + +# `XPROGDIRS' is either `src/devices/xditview src/utils/xtotroff' or empty. +XPROGDIRS=@XPROGDIRS@ + +# `XLIBDIRS' is either `src/libs/libxutil' or empty. +XLIBDIRS=@XLIBDIRS@ + +# `TTYDEVDIRS' is either `font/devascii font/devlatin1' (for +# ASCII) or `font/devcp1047' (for EBCDIC) plus font/devutf8. +TTYDEVDIRS=@TTYDEVDIRS@ font/devutf8 + +# `OTHERDEVDIRS' is either `font/devlj4 font/devlbp' (for ASCII) or +# empty (for EBCDIC). +OTHERDEVDIRS=@OTHERDEVDIRS@ + +# `PSPRINT' is the command to use for printing a PostScript file, +# for example `lpr'. +PSPRINT=@PSPRINT@ + +# `DVIPRINT' is the command to use for printing a TeX dvi file, +# for example `lpr -d'. +DVIPRINT=@DVIPRINT@ + +# Prefix for names of programs that have Unix counterparts. +# For example, if `g' is `g' then troff will be installed as +# gtroff. This doesn't affect programs like grops or groff that have +# no Unix counterparts. Note that the groff versions of eqn and tbl +# will not work with Unix troff. +g=@g@ + +# Common prefix for installation directories. +# Used in definitions of exec_prefix, datasubdir, fontpath, manroot. +# This must already exist when you do make install. +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +# `bindir' says where to install executables. +bindir=@bindir@ + +# `libdir' says where to install platform-dependent data. +libdir=@libdir@ +libprogramdir=$(libdir)/groff + +# `datasubdir' says where to install platform-independent data files. +datadir=@datadir@ +dataprogramdir=$(datadir)/groff +datasubdir=$(dataprogramdir)/$(version)$(revision) + +# `infodir' says where to install info files. +infodir=@infodir@ + +# `docdir' says where to install documentation files. +docdir=$(datadir)/doc/groff/$(version)$(revision) + +# `exampledir' says where to install example files. +exampledir=$(docdir)/examples + +# `htmldocdir' says where to install documentation in HTML format. +htmldocdir=$(docdir)/html + +# `pdfdocdir' says where to install documentation in PDF format. +pdfdocdir=$(docdir)/pdf + +# `fontdir' says where to install dev*/*. +fontdir=$(datasubdir)/font + +# `localfontdir' says where local fonts will be installed (as dev*/*). +localfontdir=$(dataprogramdir)/site-font + +# `legacyfontdir' is for compatibility with non-GNU troff. +legacyfontdir=/usr/lib/font + +# `fontpath' says where to look for dev*/*. +fontpath=$(localfontdir)$(RT_SEP)$(fontdir)$(RT_SEP)$(legacyfontdir) + +# `tmacdir' says where to install macros. +tmacdir=$(datasubdir)/tmac + +# `systemtmacdir' says where to install platform-dependent macros. +systemtmacdir=$(libprogramdir)/site-tmac + +# `localtmacdir' says where local files will be installed. +localtmacdir=$(dataprogramdir)/site-tmac + +# `appresdir' says where to install the application resource file for +# gxditview. +appresdir=@appresdir@ + +# `tmacpath' says where to look for macro files. +# The current directory will be prepended in unsafe mode only; the home +# directory will be always added. +# `troffrc' and `troffrc-end' (and `eqnrc') are searched neither in the +# current nor in the home directory. +tmacpath=$(systemtmacdir)$(RT_SEP)$(localtmacdir)$(RT_SEP)$(tmacdir) + +# `sys_tmac_prefix' is prefix (if any) for system macro packages. +sys_tmac_prefix=@sys_tmac_prefix@ + +# `pnmtops_nosetpage' is the command to be run to generate an eps +# file. Some versions of pnmtops provide the -nosetpage option. +# We detect this and use it if present. +pnmtops_nosetpage=@pnmtops_nosetpage@ + +# `tmac_wrap' is list of system macro packages that should be made +# available to groff by creating a corresponding macro package +# in the groff macro directory that references the system macro +# package. +tmac_wrap=@tmac_wrap@ + +# If there is a groff version of a macro package listed in $(tmac_wrap), +# then the groff version will be installed with a prefix of this. +# Don't make this empty. +tmac_prefix=g + +# The groff -mm macros will be available as -m$(tmac_m_prefix)m. +tmac_m_prefix=\ + `for i in $(tmac_wrap) ""; do case "$$i" in m) echo $(tmac_prefix);; esac; done` +# The groff -ms macros will be available as -m$(tmac_s_prefix)s. +tmac_s_prefix=\ + `for i in $(tmac_wrap) ""; do case "$$i" in s) echo $(tmac_prefix);; esac; done` +# The groff -man macros will be available as -m$(tmac_an_prefix)an. +tmac_an_prefix=\ + `for i in $(tmac_wrap) ""; do case "$$i" in an) echo $(tmac_prefix);; esac; done` + +# Extension to be used for refer index files. Index files are not +# sharable between different architectures, so you might want to use +# different suffixes for different architectures. Choose an extension +# that doesn't conflict with refer or any other indexing program. +indexext=.i + +# Directory containing the default index for refer. +indexdir=/usr/dict/papers + +# The filename (without suffix) of the default index for refer. +indexname=Ind + +# common_words_file is a file containing a list of common words. +# If your system provides /usr/lib/eign it will be copied onto this, +# otherwise the supplied eign file will be used. +common_words_file=$(datasubdir)/eign + +# `manroot' is the root of the man page directory tree. +mandir=@mandir@ +manroot=$(mandir) + +# `man1ext' is the man section for user commands. +man1ext=1 +man1dir=$(manroot)/man$(man1ext) + +# `man5ext' is the man section for file formats. +man5ext=5 +man5dir=$(manroot)/man$(man5ext) + +# `man7ext' is the man section for macros. +man7ext=7 +man7dir=$(manroot)/man$(man7ext) + +# The configure script checks whether all necessary utility programs for +# grohtml are available -- only then we can build the HTML documentation. +make_html=@make_html@ +make_install_html=@make_install_html@ + +# The configure script also checks whether all necessary utility programs +# for pdfroff are available -- only then we can build PDF documentation. +make_pdfdoc=@make_pdfdoc@ +make_install_pdfdoc=@make_install_pdfdoc@ + +# DEFINES should include the following: +# -DHAVE_MMAP if you have mmap() and +# -DARRAY_DELETE_NEEDS_SIZE if your C++ doesn't understand `delete []' +# -DSYS_SIGLIST_DECLARED if you have sys_siglist[] +# -DWCOREFLAG=0200 if the 0200 bit of the status returned by +# wait() indicates whether a core image was +# produced for a process that was terminated +# by a signal +# +# -DHAVE_DIRENT_H if you have +# -DHAVE_LIMITS_H if you have +# -DHAVE_CC_LIMITS_H if you have a C++ +# -DHAVE_MATH_H if you have +# -DHAVE_CC_OSFCN_H if you have a C++ +# -DHAVE_CC_INTTYPES_H if you have a C++ +# -DHAVE_STDLIB_H if you have +# -DHAVE_STRING_H if you have +# -DHAVE_STRINGS_H if you have +# -DHAVE_SYS_DIR_H if you have +# -DHAVE_SYS_TIME_H if you have +# -DHAVE_UNISTD_H if you have +# +# -DHAVE_FMOD if you have fmod() +# -DHAVE_GETCWD if you have getcwd() +# -DHAVE_GETTIMEOFDAY if you have gettimeofday() +# -DHAVE_ISATTY if you have isatty() +# -DHAVE_KILL if you have kill() +# -DHAVE_MKSTEMP if you have mkstemp() +# -DHAVE_MMAP if you have mmap() +# -DHAVE_PUTENV if you have putenv() +# -DHAVE_RENAME if you have rename() +# -DHAVE_SETLOCALE if you have setlocale() +# -DHAVE_SNPRINTF if you have snprintf() +# -DHAVE_STRCASECMP if you have strcasecmp() +# -DHAVE_STRNCASECMP if you have strncasecmp() +# -DHAVE_STRERROR if you have strerror() +# -DHAVE_STRSEP if you have strsep() +# -DHAVE_STRTOL if you have strtol() +# -DHAVE_VSNPRINTF if you have vsnprintf() +# +# -DNEED_DECLARATION_GETTIMEOFTODAY +# if your C++ doesn't declare +# gettimeofday() +# -DNEED_DECLARATION_HYPOT if your C++ doesn't declare hypot() +# -DNEED_DECLARATION_PCLOSE if your C++ doesn't declare pclose() +# -DNEED_DECLARATION_POPEN if your C++ doesn't declare popen() +# -DNEED_DECLARATION_PUTENV if your C++ doesn't declare +# putenv() +# -DNEED_DECLARATION_RAND if your C++ doesn't declare rand() +# -DNEED_DECLARATION_SNPRINTF if your C++ doesn't declare +# snprintf() +# -DNEED_DECLARATION_SRAND if your C++ doesn't declare srand() +# -DNEED_DECLARATION_STRCASECMP if your C++ doesn't declare +# strcasecmp() +# -DNEED_DECLARATION_STRNCASECMP +# if your C++ doesn't declare +# strncasecmp() +# -DNEED_DECLARATION_VFPRINTF if your C++ doesn't declare +# vfprintf() +# -DNEED_DECLARATION_VSNPRINTF if your C++ doesn't declare +# vsnprintf() +# +# -DRET_TYPE_SRAND_IS_VOID if srand() returns void not int +# -DHAVE_SYS_NERR if you have sysnerr in or +# -DHAVE_SYS_ERRLIST if you have sys_errlist in or +# +# -DTRADITIONAL_CPP if your C++ compiler uses a traditional +# (Reiser) preprocessor +# -DLONG_FOR_TIME_T if localtime() takes a long * not a time_t * +# -DHAVE_STRUCT_EXCEPTION if defines struct exception +# -DRETSIGTYPE=int if signal handlers return int not void +# -DIS_EBCDIC_HOST if the host's encoding is EBCDIC +# -DPAGE=A4 if the the printer's page size is A4 +# -DGHOSTSCRIPT=gs the name (and directory if required) of the +# ghostscript program +DEFINES=@DEFS@ + +# Include +# +# {fmod,getcwd,mkstemp,putenv,snprintf,strcasecmp, +# strerror,strncasecmp,strtol}.$(OBJEXT) +# +# in LIBOBJS if your C library is missing the corresponding function. +# vsnprintf is defined in the snprintf.$(OBJEXT) module. +LIBOBJS=@LIBOBJS@ + +# `CCC' is the compiler for C++ (.cpp) files. +CCC=@CXX@ +CC=@CC@ +# CCDEFINES are definitions for C++ compilations. +CCDEFINES=$(DEFINES) +# CDEFINES are definitions for C compilations. +CDEFINES=$(DEFINES) + +CCFLAGS=@CXXFLAGS@ +CFLAGS=@CFLAGS@ +CPPFLAGS=@CPPFLAGS@ +LDFLAGS=@LDFLAGS@ + +X_CFLAGS=@X_CFLAGS@ +X_LIBS=@X_LIBS@ +X_EXTRA_LIBS=@X_EXTRA_LIBS@ +X_PRE_LIBS=@X_PRE_LIBS@ + +YACC=@YACC@ +YACCFLAGS=-v + +EXEEXT=@EXEEXT@ +OBJEXT=@OBJEXT@ +# a simple heuristic assumption +LIBEXT=`case $(OBJEXT) in obj) echo lib;; *) echo a;; esac` +LIBS=@LIBS@ +LIBM=@LIBM@ +RANLIB=@RANLIB@ +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ +INSTALL_SCRIPT=@INSTALL_SCRIPT@ +INSTALL_DATA=@INSTALL_DATA@ +INSTALL_INFO=@INSTALL_INFO@ +LN_S=@LN_S@ +AR=ar +ETAGS=etags +ETAGSFLAGS= +# Flag that tells etags to assume C++. +ETAGSCCFLAG=-C +# Full path to perl. +PERLPATH=@PERLPATH@ +# Sed command with which to edit sh scripts. +SH_SCRIPT_SED_CMD=@SH_SCRIPT_SED_CMD@ +# Sed script to deal with OS dependencies in sh scripts. +SH_DEPS_SED_SCRIPT=$(top_builddir)/arch/misc/shdeps.sed + +# The program to create directory hierarchies. +mkinstalldirs= $(SHELL) $(top_srcdir)/mkinstalldirs + +PURIFY=purify +PURIFYCCFLAGS= +#PURIFYCCFLAGS=-g++=yes \ +# -collector=`dirname \`$(CCC) -print-libgcc-file-name\``/ld + +# Passing down MAKEOVERRIDES prevents $(MAKE) from containing a second +# copy of $(MDEFINES) when making individual directories; this could +# cause the argument list to become too long on some systems. +MDEFINES= \ + "ALT_AWK_PROGS=$(ALT_AWK_PROGS)" \ + "ALT_GHOSTSCRIPT_PROGS=$(ALT_GHOSTSCRIPT_PROGS)" \ + "AR=$(AR)" \ + "BROKEN_SPOOLER_FLAGS=$(BROKEN_SPOOLER_FLAGS)" \ + "CC=$(CC)" \ + "CCC=$(CCC)" \ + "CCDEFINES=$(CCDEFINES)" \ + "CCFLAGS=$(CCFLAGS)" \ + "CDEFINES=$(CDEFINES)" \ + "CFLAGS=$(CFLAGS)" \ + "CPPFLAGS=$(CPPFLAGS)" \ + "DEVICE=$(DEVICE)" \ + "DVIPRINT=$(DVIPRINT)" \ + "ETAGS=$(ETAGS)" \ + "ETAGSCCFLAG=$(ETAGSCCFLAG)" \ + "ETAGSFLAGS=$(ETAGSFLAGS)" \ + "EXEEXT=$(EXEEXT)" \ + "INSTALL_DATA=$(INSTALL_DATA)" \ + "INSTALL_INFO=$(INSTALL_INFO)" \ + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ + "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ + "LDFLAGS=$(LDFLAGS)" \ + "LIBEXT=$(LIBEXT)" \ + "LIBM=$(LIBM)" \ + "LIBOBJS=$(LIBOBJS)" \ + "LIBS=$(LIBS)" \ + "MAKEOVERRIDES=$(MAKEOVERRIDES)" \ + "OBJEXT=$(OBJEXT)" \ + "OTHERDEVDIRS=$(OTHERDEVDIRS)" \ + "PAGE=$(PAGE)" \ + "GHOSTSCRIPT=$(GHOSTSCRIPT)" \ + "PERLPATH=$(PERLPATH)" \ + "PSPRINT=$(PSPRINT)" \ + "PURIFY=$(PURIFY)" \ + "PURIFYCCFLAGS=$(PURIFYCCFLAGS)" \ + "RANLIB=$(RANLIB)" \ + "RT_SEP=$(RT_SEP)" \ + "SH_SEP=$(SH_SEP)" \ + "SHELL=$(SHELL)" \ + "SH_SCRIPT_SED_CMD=$(SH_SCRIPT_SED_CMD)" \ + "SH_DEPS_SED_SCRIPT=$(SH_DEPS_SED_SCRIPT)" \ + "TTYDEVDIRS=$(TTYDEVDIRS)" \ + "XDEVDIRS=$(XDEVDIRS)" \ + "XLIBDIRS=$(XLIBDIRS)" \ + "XPROGDIRS=$(XPROGDIRS)" \ + "X_CFLAGS=$(X_CFLAGS)" \ + "X_LIBS=$(X_LIBS)" \ + "X_EXTRA_LIBS=$(X_EXTRA_LIBS)" \ + "X_PRE_LIBS=$(X_PRE_LIBS)" \ + "YACC=$(YACC)" \ + "YACCFLAGS=$(YACCFLAGS)" \ + "appresdir=$(appresdir)" \ + "bindir=$(bindir)" \ + "common_words_file=$(common_words_file)" \ + "datadir=$(datadir)" \ + "dataprogramdir=$(dataprogramdir)" \ + "datasubdir=$(datasubdir)" \ + "docdir=$(docdir)" \ + "exampledir=$(exampledir)" \ + "exec_prefix=$(exec_prefix)" \ + "fontdir=$(fontdir)" \ + "fontpath=$(fontpath)" \ + "g=$(g)" \ + "htmldocdir=$(htmldocdir)" \ + "pdfdocdir=$(pdfdocdir)" \ + "indexdir=$(indexdir)" \ + "indexext=$(indexext)" \ + "indexname=$(indexname)" \ + "infodir=$(infodir)" \ + "legacyfontdir=$(legacyfontdir)" \ + "libdir=$(libdir)" \ + "libprogramdir=$(libprogramdir)" \ + "localfontdir=$(localfontdir)" \ + "localtmacdir=$(localtmacdir)" \ + "make_html=$(make_html)" \ + "make_install_html=$(make_install_html)" \ + "make_pdfdoc=$(make_pdfdoc)" \ + "make_install_pdfdoc=$(make_install_pdfdoc)" \ + "man1dir=$(man1dir)" \ + "man1ext=$(man1ext)" \ + "man5dir=$(man5dir)" \ + "man5ext=$(man5ext)" \ + "man7dir=$(man7dir)" \ + "man7ext=$(man7ext)" \ + "manroot=$(manroot)" \ + "mkinstalldirs=$(mkinstalldirs)" \ + "prefix=$(prefix)" \ + "revision=$(revision)" \ + "sys_tmac_prefix=$(sys_tmac_prefix)" \ + "pnmtops_nosetpage=$(pnmtops_nosetpage)" \ + "systemtmacdir=$(systemtmacdir)" \ + "tmac_an_prefix=$(tmac_an_prefix)" \ + "tmac_m_prefix=$(tmac_m_prefix)" \ + "tmac_s_prefix=$(tmac_s_prefix)" \ + "tmac_wrap=$(tmac_wrap)" \ + "tmacdir=$(tmacdir)" \ + "tmacpath=$(tmacpath)" \ + "top_builddir=$(top_builddir)" \ + "top_srcdir=$(top_srcdir)" \ + "version=$(version)" + +INCDIRS=src/include +LIBDIRS=\ + src/libs/libgroff \ + src/libs/libdriver \ + src/libs/libbib \ + $(XLIBDIRS) +CCPROGDIRS=\ + src/roff/groff \ + src/roff/troff \ + src/preproc/tbl \ + src/preproc/pic \ + src/preproc/eqn \ + src/preproc/grn \ + src/preproc/refer \ + src/preproc/soelim \ + src/preproc/html \ + src/devices/grops \ + src/devices/grotty \ + src/devices/grodvi \ + src/devices/grolj4 \ + src/devices/grohtml \ + src/devices/grolbp \ + src/utils/tfmtodit \ + src/utils/hpftodit \ + src/utils/lookbib \ + src/utils/indxbib \ + src/utils/lkbib \ + src/utils/addftinfo +CPROGDIRS=\ + src/utils/pfbtops \ + $(XPROGDIRS) +PROGDEPDIRS=arch/misc +PROGDIRS=$(PROGDEPDIRS) $(CCPROGDIRS) $(CPROGDIRS) +DEVDIRS=\ + font/devps \ + font/devdvi \ + font/devhtml +ALLTTYDEVDIRS=\ + font/devascii \ + font/devlatin1 \ + font/devutf8 \ + font/devcp1047 +# `doc' must be processed before `contrib/pdfmark'. +OTHERDIRS=\ + man \ + tmac \ + src/utils/afmtodit \ + src/roff/grog \ + src/roff/nroff \ + doc \ + contrib/mm \ + contrib/pic2graph \ + contrib/eqn2graph \ + contrib/grap2graph \ + contrib/groffer \ + contrib/mom \ + contrib/pdfmark \ + contrib/gdiffmk +ALLDIRS=$(INCDIRS) $(LIBDIRS) $(PROGDIRS) \ + $(DEVDIRS) $(XDEVDIRS) $(OTHERDEVDIRS) $(TTYDEVDIRS) $(OTHERDIRS) +EXTRADIRS=\ + font/devps/generate \ + font/devdvi/generate \ + font/devlj4/generate \ + doc +NOMAKEDIRS=\ + arch/djgpp \ + contrib/mm/examples \ + contrib/mm/mm \ + contrib/mom/examples \ + contrib/mom/momdoc \ + contrib/gdiffmk/tests \ + src/libs/snprintf +DISTDIRS=\ + $(INCDIRS) $(LIBDIRS) $(PROGDIRS) $(DEVDIRS) $(XDEVDIRS) $(OTHERDEVDIRS) \ + $(ALLTTYDEVDIRS) $(OTHERDIRS) $(EXTRADIRS) $(NOMAKEDIRS) +TARGETS=all install install_bin install_data clean distclean mostlyclean \ + realclean extraclean distfiles TAGS depend uninstall_sub + +# This ENVSETUP gork is required by the DJGPP build on Windows 9X, +# where Make needs to be case-sensitive to find files like BI and VERSION. +ENVSETUP=\ + if test -f $(srcdir)/makefile.ccpg* && \ + test -f $(srcdir)/Makefile.ccpg*; then \ + FNCASE=y; export FNCASE; \ + else :; \ + fi + +do=all +dodirs=$(ALLDIRS) dot +# Default target for subdir_Makefile +subdir=src/roff/troff + + +$(TARGETS): + @$(ENVSETUP); $(MAKE) $(MDEFINES) do=$@ $(dodirs) + +dot: FORCE + @$(ENVSETUP); \ + $(MAKE) $(MDEFINES) srcdir=$(srcdir) VPATH=$(srcdir) \ + -f $(top_srcdir)/Makefile.comm \ + -f $(top_srcdir)/Makefile.sub $(do) + +$(LIBDIRS): FORCE + @$(ENVSETUP); \ + if test $(srcdir) = .; then \ + srcdir=.; \ + else \ + srcdir=`cd $(srcdir); pwd`/$@; \ + fi; \ + test -d $@ || $(mkinstalldirs) $@; \ + cd $@; \ + test -f Makefile.dep || touch Makefile.dep; \ + $(MAKE) $(MDEFINES) srcdir=$$srcdir VPATH=$$srcdir \ + -f $(top_srcdir)/Makefile.comm \ + -f $$srcdir/Makefile.sub \ + -f $(top_srcdir)/Makefile.lib \ + -f Makefile.dep $(do) + +$(CPROGDIRS): FORCE + @$(ENVSETUP); \ + if test $(srcdir) = .; then \ + srcdir=.; \ + else \ + srcdir=`cd $(srcdir); pwd`/$@; \ + fi; \ + test -d $@ || $(mkinstalldirs) $@; \ + cd $@; \ + test -f Makefile.dep || touch Makefile.dep; \ + $(MAKE) $(MDEFINES) srcdir=$$srcdir VPATH=$$srcdir \ + -f $(top_srcdir)/Makefile.comm \ + -f $$srcdir/Makefile.sub \ + -f $(top_srcdir)/Makefile.cpg \ + -f Makefile.dep $(do) + +$(CCPROGDIRS): FORCE + @$(ENVSETUP); \ + if test $(srcdir) = .; then \ + srcdir=.; \ + else \ + srcdir=`cd $(srcdir); pwd`/$@; \ + fi; \ + test -d $@ || $(mkinstalldirs) $@; \ + cd $@; \ + test -f Makefile.dep || touch Makefile.dep; \ + $(MAKE) $(MDEFINES) srcdir=$$srcdir VPATH=$$srcdir \ + -f $(top_srcdir)/Makefile.comm \ + -f $$srcdir/Makefile.sub \ + -f $(top_srcdir)/Makefile.ccpg \ + -f Makefile.dep $(do) + +$(DEVDIRS) $(XDEVDIRS) $(OTHERDEVDIRS) $(TTYDEVDIRS): FORCE + @$(ENVSETUP); \ + if test $(srcdir) = .; then \ + srcdir=.; \ + else \ + srcdir=`cd $(srcdir); pwd`/$@; \ + fi; \ + test -d $@ || $(mkinstalldirs) $@; \ + cd $@; \ + $(MAKE) $(MDEFINES) srcdir=$$srcdir VPATH=$$srcdir \ + -f $(top_srcdir)/Makefile.comm \ + -f $$srcdir/Makefile.sub \ + -f $(top_srcdir)/Makefile.dev $(do) + +$(INCDIRS) $(PROGDEPDIRS) $(OTHERDIRS): FORCE + @$(ENVSETUP); \ + if test $(srcdir) = .; then \ + srcdir=.; \ + else \ + srcdir=`cd $(srcdir); pwd`/$@; \ + fi; \ + test -d $@ || $(mkinstalldirs) $@; \ + cd $@; \ + $(MAKE) $(MDEFINES) srcdir=$$srcdir VPATH=$$srcdir \ + -f $(top_srcdir)/Makefile.comm \ + -f $$srcdir/Makefile.sub \ + -f $(top_srcdir)/Makefile.man $(do) + +.PHONY: dist +dist: + -rm -fr tmp + rm -f groff-$(version)$(revision).tar.gz + mkdir tmp + for d in $(DISTDIRS); do \ + $(mkinstalldirs) tmp/$$d; \ + done + srcdir=`cd $(srcdir); pwd`; \ + cd tmp; \ + $(LN_S) ../Makefile .; \ + $(LN_S) $$srcdir/* . 2>/dev/null || true; \ + rm -rf CVS; \ + for d in $(DISTDIRS); do \ + (cd $$d; \ + $(LN_S) $$srcdir/$$d/* . 2>/dev/null; \ + rm -rf CVS || true); \ + done; \ + $(MAKE) srcdir=. VPATH=. distfiles; \ + $(MAKE) srcdir=. VPATH=. extraclean; \ + for d in $(EXTRADIRS); do \ + (cd $$d; \ + if test -f Makefile; then \ + $(MAKE) extraclean; \ + else \ + $(MAKE) -f $(top_builddir)/$$d/Makefile extraclean; \ + fi); \ + done; \ + rm -f Makefile; \ + $(LN_S) $$srcdir/Makefile.init Makefile + mv tmp groff-$(version)$(revision) + tar cfh - groff-$(version)$(revision) | \ + gzip -c >groff-$(version)$(revision).tar.gz + rm -fr groff-$(version)$(revision) + +# $(PROGDIRS): libgroff +# grops grotty grodvi: libdriver +# refer lookbib indxbib lkbib: libbib +# $(LIBDIRS) $(PROGDIRS): include + +.PHONY: $(ALLDIRS) dot $(TARGETS) FORCE + +# Create a Makefile in $(subdir). This is useful for development since it +# avoids running make recursively. +subdir_Makefile: Makefile.cfg + $(MAKE) do=Makefile $(subdir) + +Makefile.cfg: Makefile + >Makefile.cfg + for var in $(MDEFINES); do \ + echo "$$var" >>Makefile.cfg; \ + done + +Makefile: Makefile.in + $(SHELL) config.status + +.PHONY: uninstall +uninstall: uninstall_sub uninstall_dirs + +.PHONY: uninstall_dirs +uninstall_dirs: +# Use `rmdir' here so that the directories are only removed if they are empty. + -rmdir $(man1dir) $(man5dir) $(man7dir) $(manroot) \ + $(tmacdir) $(systemtmacdir) $(localtmacdir) \ + $(fontdir) $(localfontdir) $(bindir) \ + $(datasubdir) $(dataprogramdir) $(infodir) \ + $(exampledir) $(htmldocdir) $(pdfdocdir) $(docdir) \ + $(libprogramdir) $(libdir) \ + $(datadir)/doc/groff $(datadir)/doc $(datadir) 2>/dev/null || : + +.PHONY: check docheck +check: site.exp docheck + +docheck: + if $(SHELL) -c "runtest --version" > /dev/null 2>&1; then \ + runtest; \ + else \ + echo "WARNING: could not find \`runtest'" 1>&2; \ + fi + +# This snippet has been taken from the automake package. + +site.exp: + @echo "Making a new site.exp file..." + @echo "## these variables are automatically generated by make ##" >site.tmp + @echo "# Do not edit here. If you wish to override these values" >>site.tmp + @echo "# edit the last section" >>site.tmp + @echo "set tool groff" >>site.tmp + @echo "set srcdir $(srcdir)/testsuite" >>site.tmp + @echo "set objdir `pwd`" >> site.tmp + @echo "## All variables above are generated by configure. Do not edit! ##" >> site.tmp + @test ! -f site.exp \ + || sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp + @-rm -f site.bak + @test ! -f site.exp || mv site.exp site.bak + @mv site.tmp site.exp + +FORCE: + +.NOEXPORT: diff --git a/Makefile.init b/Makefile.init new file mode 100644 index 0000000..2a44c85 --- /dev/null +++ b/Makefile.init @@ -0,0 +1,25 @@ +# Copyright (C) 1989-2000 Free Software Foundation, Inc. +# Written by James Clark (jjc@jclark.com) +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +SHELL=/bin/sh + +.PHONY: all +all: + $(SHELL) configure + $(MAKE) all diff --git a/Makefile.lib b/Makefile.lib new file mode 100644 index 0000000..62a8222 --- /dev/null +++ b/Makefile.lib @@ -0,0 +1,20 @@ +LIBCLEAN=lib$(LIB).$(LIBEXT) +MAKEFILEPARTS=\ + $(top_srcdir)/Makefile.comm \ + $(top_builddir)/Makefile.cfg \ + $(srcdir)/Makefile.sub \ + $(top_srcdir)/Makefile.lib \ + Makefile.dep + +all: lib$(LIB).$(LIBEXT) + +lib$(LIB).$(LIBEXT): $(OBJS) + $(AR) r $@ $? + $(RANLIB) $@ + +depend: depend_src +depend.temp: $(GENSRCS) +TAGS: $(CCSRCS) $(CSRCS) +Makefile: $(MAKEFILEPARTS) +Makefile.dep: + touch Makefile.dep diff --git a/Makefile.man b/Makefile.man new file mode 100644 index 0000000..6eaf311 --- /dev/null +++ b/Makefile.man @@ -0,0 +1,5 @@ +all: $(MANPAGES) +install_data: install_man +install_man: $(MANPAGES) +uninstall_sub: uninstall_man +$(top_builddir)/stamp-h $(MANPAGES): $(top_srcdir)/VERSION $(top_srcdir)/REVISION diff --git a/Makefile.sub b/Makefile.sub new file mode 100644 index 0000000..2652363 --- /dev/null +++ b/Makefile.sub @@ -0,0 +1,35 @@ +DISTCLEANFILES=\ + config.status \ + config.log \ + config.cache \ + stamp-h \ + Makefile \ + test-groff \ + src/include/config.h \ + site.exp \ + site.bak \ + groff.sum \ + groff.log +CLEANADD=Makefile.cfg conftest* + +distfiles: configure + +$(scrdir)/configure: configure.ac aclocal.m4 + cd $(srcdir) && autoconf + +config.status: configure + $(SHELL) config.status --recheck + +# autoheader might not change config.hin, so touch a stamp file. +$(srcdir)/config.hin: stamp-h.in +$(srcdir)/stamp-h.in: configure.ac aclocal.m4 + cd $(srcdir) && autoheader + echo timestamp > $(srcdir)/stamp-h.in + +config.h: stamp-h +stamp-h: config.hin config.status + $(SHELL) config.status + +# Always create the site-font directory as a guide to the user. +install_data: + -test -d $(localfontdir) || $(mkinstalldirs) $(localfontdir) diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..778b404 --- /dev/null +++ b/NEWS @@ -0,0 +1,2307 @@ +This file describes recent user-visible changes in groff. Bug fixes are not +described. There are more details in the man and info pages. + +VERSION 1.19.2 +============== + +Troff +----- + +o Analogously to the .ft and \f pair, two new requests `gcolor' and + `fcolor' (which pair with \m and \M, respectively) have been added to + set the glyph and background colours. + +o A new read-only, string-valued register `.sty' returns the name of the + current style. + +o Two new conditional operators `F ' and `S ' have been added. + `F' is true if a font exists. `S' is true if a style has + been registered. + +o Cyrillic characters have been added to the `utf8' and `html' output + devices. + +Pic +--- + +o The `by' argument in a `for' loop can now be negative if it is additive. + For the multiplicative case, it must be greater than zero. + +Eqn +--- + +o The following keywords aren't new but haven't been documented previously: + + undef NAME (to undefine a macro) + copy "FILE" (a synonym for `include') + space n (to modify the vertical spacing before and after + an equation) + +o The following macros aren't new but haven't been documented previously: + + Alpha, ..., Omega (the same as `ALPHA', ..., `OMEGA') + ldots (three dots on the base line) + dollar (a dollar glyph) + +o The following keywords have been extended. Again, this isn't new but + hasn't been documented previously: + + col n { ... } + lcol n { ... } + rcol n { ... } + ccol n { ... } + pile n { ... } + lpile n { ... } + rpile n { ... } + cpile n { ... } (set vertical spacing between rows to N) + +Grohtml +------- + +o This device driver has been raised to beta stage; its set of tags should + be stable now. + +o New command line option `-s' to set the base point size. + +o New command line option `-S' to set the split level while generating + multiple files. + +Grotty +------ + +o Experimental support for zero-width and double-width characters. + +Gxditview +--------- + +o On platforms which have the X Window System this program is now built and + installed automatically. + +Xtotroff +-------- + +o This program to create font definition files for xditview isn't new but + hasn't been installed previously. + +Groffer +------- + +o A security problem (reported as CAN-2004-0969) has been fixed. + +Gdiffmk +------- + +o A new script contributed by Mike Bianchi. It compares two groff, nroff, + or troff documents and creates an output with added margin characters + (using `.mc') to indicate the differences. + +Pdfroff +------- + +o A new wrapper script contributed by Keith Marshall to easily create PDF + documents with groff. + +Macro packages +-------------- + +o ms.tmac + + . Support for fractional point sizes: A value for the `PS', `VS', `FPS', + and `VPS' register larger than or equal to 1000 is always divided by + 1000. For example, `.nr PS 10250' sets the document's font size to + 10.25 points. + + . The `Ds' and `De' macros provided in ms since groff version 1.19 have + been removed; the equivalent `DS' and `DE' macros should be used + instead. X11 documents which actually use `Ds' and `De' always load a + specific macro file from the X11 distribution (`macros.t') which + provides proper definitions for the two macros. + + . The following registers have been added for improving layout control: + + PORPHANS + Defines number of lines following `LP', `PP', `QP', `IP' or `XP' which + must be kept together, before any automatic page break. + + HORPHANS + Sets number of lines of following paragraph which must be kept with a + heading, defined by `NH' or `SH', before any automatic page break. + + GROWPS + Sets the first level of heading (set with `NH') which will keep the + same point size as body text. + + PSINCR + Sets the point size increment for each level of heading (set with + `NH'), below the threshold level set by `GROWPS'; e.g., if + \n[PS] = 10, \n[GROWPS] = 3 and \n[PSINCR] = 2.0p, then `.NH 1' will + produce 14pt headings, `.NH 2' will produce 12pt, and all other levels + will remain at 10pt (because \n[PS] = 10). + + . The `SH' macro now accepts a numeric argument, to make heading size + match that of `NH' with same argument value when the `GROWPS'/`PSINCR' + feature is enabled. + + Please refer to the documentation of the ms package for other, minor + improvements. + +o me.tmac + + The section type set with the `++' request is available in the `_M' + register. This isn't new but hasn't been documented before. + +o www.tmac + + The `HR' macro no longer causes an empty line for non-HTML devices. + + A new macro `HEAD' has been added to directly add data to the + ... block. + + New macros `OLS' and `OLE' to start and end an ordered list. + + New macros `DLS' and `DLE' to start and end a definition list. + +Pdfmark +------- + +o A new macro package contributed by Keith Marshall which implements PDF + marks. This is in alpha stage currently. + +Miscellaneous +------------- + +o Two new keywords to the DESC file have been added which are needed for + grohtml: `image_generator' and `unscaled_charwidths'. The former gives + the name of the program which creates PNG images, and the latter makes + troff always use unscaled character widths. + + +VERSION 1.19.1 +============== + +Groff +----- + +o The argument of the command line option `-I' is now also passed to troff + and grops, specifying a directory to search for files on the command line, + files named in `so' and `psbb' requests, and files named in \X'ps: file' + and \X'ps: import' escapes. + +o If option `-V' is used more than once, the commands will be both printed + on standard error and run. + +Troff +----- + +o Two new read-only, string-valued registers `.m' and `.M' return the + name of the current drawing and background color, respectively. + +o New read-only register `.U' which is set to 1 if in safer mode and set + to 0 if in unsafe mode. + +o An input encoding file for latin-5 (a.k.a. ISO 8859-9) has been added. + Example use: + + groff -Tdvi -mlatin5 my_file > my_file.dvi + + Note that some output devices don't support all glyphs of this encoding. + +o If the `return' request is called with an argument, it exits twice, + namely the current macro and the macro one level higher. This is + used to define a wrapper macro for `return' in trace.tmac. + +o For completeness, two new requests have been added: `dei1' and `ami1'. + They are equivalent to `dei' and `ami', respectively, but the macros + are executed with compatibility mode off (similar to `de1' and `am1'). + +o New command line option `-I' to specify a directory for files (both + those on the command line and those named in `psbb' requests). This is + also handled by the groff wrapper program. + +o Since version 1.19 you can say `.vs 0'. Older versions emit a warning + and convert this to `.vs \n[.V]'. + + This hasn't been documented properly. Note that `.vs 0' isn't saved in a + diversion since it doesn't result in vertical motion. + +Pic +___ + +o Dashed and dotted ellipses have been implemented. + +Tbl +--- + +o New key character `x' to make tbl call a user-defined macro on a table + cell. Patch by Heinz-Jürgen Oertel . + +Grap2graph +---------- + +o A new script contributed by Eric S. Raymond . It + converts a grap diagram into a cropped image. Since it uses gs and the + PNM library, virtually all graphics formats are available for output. + [Note that the grap program itself isn't part of the groff package; + see the file MORE.STUFF how to obtain grap.] + +Grohtml +------- + +o New option `-j' to emit output splitted into multiple files. + +Grops +----- + +o New command line option `-I' to specify a directory to search for files + on the command line and files named in \X'ps: import' and \X'ps: file' + escapes. This is also handled by the groff wrapper program. + +o The default value for the `broken' keyword in the DESC file is now 0. + +Grolj4 +------ + +o A new man page `lj4_font(5)' documents how fonts are accessed with + grolj4. + +o The built-in fonts for LJ4 and newer PCL 5 devices have been completely + revised, mainly to access as much glyphs as possible. The provided + metric files should be compatible with recent PCL 5 printers also. + Additionally, font description files have been added for the Arial and + Times New Roman family, the MS symbol, and Wingdings fonts. + +Afmtodit +-------- + +o New option `-x' to prevent use of built-in Adobe Glyph List. + +Hpftodit +-------- + +o Completely revised to handle HP TrueType metric files also. See the + hpftodit manual page for more details. + +Groffer +------- + +o This version is a rewrite of groffer in many parts, but it is kept in + the old single script style. + + New options: --text, --mode text, --tty-viewer, --X, --mode X, + --X-viewer, --html, --mode html, --html-view, --apropos-data, + --apropos-devel, --apropos-progs. + + New documentation file: README_SH. + + Enhancement of the configuration files and the `apropos' handling. + +Macro Packages +-------------- + +o www.tmac: New macro `JOBNAME' to split output into multiple files. + +o In mdoc, multiple calls to `.Lb' are now supported in the LIBRARY + section. + + +VERSION 1.19 +============ + +Troff +----- + +o Input encoding files for latin-9 (a.k.a. latin-0 and ISO 8859-15) and + latin-2 (ISO 8859-2) have been added. Example use: + + groff -Tdvi -mlatin9 my_file > my_file.dvi + + You still need proper fonts with the necessary glyphs. Out of the box, + the groff package supports latin-9 only for -Tps, -Tdvi, and -Tutf8, + and latin-2 only for -Tdvi and -Tutf8. + +o Composite glyphs are now supported. To do this, a subset of the Adobe + Glyph List (AGL) Algorithm as described in + + http://partners.adobe.com/asn/tech/type/unicodegn.jsp + + is used to construct glyph names based on Unicode character codes. The + existing groff glyph names are frozen; no glyph names which can't be + constructed algorithmically will be added in the future. + + The \[...] escape sequence has been extended to specify multiple glyph + components. Example: + + \[A ho] + + this accesses a glyph with the name `u0041_0328'. + + Some groff glyphs which are useful as composites map to `wrong' Unicode + code points. For example, `ho' maps to U+02DB which is a spacing + ogonek, whereas a non-spacing ogonek U+0328 is needed for composite + glyphs. The new request + + .composite from to + + will change the mapping while a composite glyph name is constructed. + To make \[A ho] yield the expected result, + + .composite ho u0328 + + is needed. [The new file `composite.tmac' loaded at start-up already + contains proper calls to `.composite'.] + + Please refer to the info pages of groff and to the groff_char man page + for more details. + +o A new request `fschar' has been added to define font-specific fallback + characters. They are searched after the list of fonts declared with the + `fspecial' request but before the list of fonts declared with `special'. + +o Fallback characters defined with `fschar' can be removed with the + new `rfschar' request. + +o A new request `schar' has been added to define global fallback + characters. They are searched after the list of fonts declared with the + `special' request but before the already mounted special fonts. + +o In groff versions 1.18 and 1.18.1, \D'f ...' didn't move the current + point horizontally. Despite of being silly, this change has been + reverted for backwards compatibility. Consequently, the intermediate + output command `Df' also moves the position horizontally again. + + \D'f ...' is deprecated since it depends on the horizontal resolution of + the output device (given with the `hor' parameter in the DESC file). + Use the new \D'Fg ...' escape instead. + +o For orthogonality, new \D subcommands to change the fill color are + available: + + \D'Fr ...' (rgb) + \D'Fc ...' (cmy) + \D'Fg ...' (gray) + \D'Fk ...' (cmyk) + \D'Fd' (default color) + + The arguments are the same as with the `defcolor' request. The current + position is *not* changed. + +o The values set with \H and \S are now available in number registers + \n[.height] and \n[.slant], respectively. + +o The `.pe' number register isn't new but hasn't been documented before. + It is set to 1 during a page ejection caused by the `bp' request. + +o The new glyph symbol `tno' is a textual variant of `no'. + +o The new glyph symbol `+e' represents U+03F5, GREEK LUNATE EPSILON SYMBOL. + (Well, it is not really new since it has been previously supported by + grolj4.) The mapping for both the dvi and lj4 symbol font has been + changed accordingly so that Greek small letter epsilon, `*e', has the + same glyph shape as with other devices. + +Grops +----- + +o The font `freeeuro.pfa' has been added to provide various default glyph + shapes for `eu' and `Eu'. + +o It is now possible to access all glyphs in a Type 1 font, not only 256 + (provided the font file created by afmtodit has proper entries). grops + constructs additional encoding vectors on the fly if necessary. + +o The paper size is now emitted via the %%DocumentMedia and PageSize + mechanisms so that it is no longer required to tell `gv' or `ps2pdf' + about the paper size. The `broken' flag value 16 omits this feature + (the used PostScript command `setpagedevice' is a LanguageLevel 2 + extension) -- if you intend to further process grops output to get an + encapsulated PS (EPS) file you must also use this option. + + Patch by Egil Kvaleberg . + +o Non-slanted PostScript metrics have been changed again; they no longer + contain negative left italic correction values. This assures correct + spacing with eqn. + +Grodvi +------ + +o The font cmtex10 has been added as the special font `SC' to the DVI fonts. + It is used as a font-specific special font for CW and CWI. + +o New options -l and -p to set landscape orientation and the paper size. + grodvi now emits a `papersize' special which is understood by DVI drivers + like dvips. + + Consequently, the DESC file should contain a `papersize' keyword. + +o The glyph shapes for \[*f] and \[*e] have been exchanged with \[+f] and + \[+e], respectively, to be in sync with all other devices. + +o Glyphs \[HE] and \[DI] have been replaced with \[u2662] and \[u2661], + respectively, since the former two glyphs have a black (filled) shape + which grodvi doesn't provide by default (it never has actually). + +Grolj4 +------ + +o The glyphs \[*e] and \[+e] have been exchanged to be in sync with + all other devices. + +o The glyph \[~=] is now called \[|=]. Similar to other devices, \[~=] + is now another name for glyph \[~~]. + +Grotty +------ + +o New option `-r'. It is similar to the -i option except it tells grotty to + use the `reverse video' attribute to render italic fonts. + +Pic +--- + +o New command `figname' to set the name of a picture's output box in TeX + mode. + +Refer +----- + +o The environment variable `REFER' to override the name of the default + database isn't new but hasn't been documented before. + +Soelim +------ + +o New option `-r' to avoid emission of `.lf' lines. + +o New option `-t' to emit TeX comment lines (giving current file and the + line number) instead of `.lf' lines. + +Afmtodit +-------- + +o Unencoded glyphs in an AFM file are output also (since grops can now emit + multiple encoding vectors for a single font). + +o New option `-m' to prevent negative left italic correction values. + +o The mapping and encoding file together with file `DESC' are now searched + in the default font directory also. Please refer to the man page of + afmtodit for more details. + +Macro Packages +-------------- + +o Larry Kollar and others made the man macros more + customizable. + + . New command line options -rFT, -rIN, and -rSN to set the vertical + location of the footer line, the body text indentation, and the + sub-subheading indentation. + + . New command line option -rHY (similar to the ms macros) to control + hyphenation. + + . New macros `.PT' and `.BT' to print the header and footer strings. + They can be replaced with a customized version in `man.local'. + + . The string `HF' now holds the typeface to print headings and + subheadings. + + . Similar to the ms macros, the LT register now defaults to LL if not + explicitly specified on the command line. + +o troff's start-up file `troffrc' now includes `papersize.tmac' to set + the paper size with the command line option `-dpaper='. + + Possible values for `' are the same as the predefined `papersize' + values in the DESC file (only lowercase; see the groff_font man page) + except a7-d7. An appended `l' (ell) character denotes landscape + orientation. Examples: `a4', `c3l', `letterl'. + + Most output drivers need additional command line switches `-p' and + `-l' to override the default paper length and orientation as set in + the driver specific DESC file. + + For example, use the following for PS output on A4 paper in landscape + orientation: + + groff -Tps -dpaper=a4l -P-pa4 -P-l -ms foo.ms > foo.ps + + +VERSION 1.18.1 +============== + +Troff +----- + +o The non-slanted PostScript font definition files have been regenerated to + include left and right italic correction values. Applying those to a + glyph (this is, prepending the glyph with `\,' and appending `\/' to the + glyph) sets the glyph width to the real value given by the horizontal + bounding box values. Without those escapes, the advance width for the + particular glyph is used (which can differ considerably). + + Most users will neither need this feature nor notice a difference in + existing documents (provided \, and \/ is used as advertised, namely for + italic fonts only); its main goal is to improve image generation with + grohtml. + + This is an experimental change, and feedback is welcome. + +Tbl +--- + +o Added global option `nospaces' to ignore leading and trailing spaces in + data items. + +Grolbp +------ + +o The option -w (--linewidth) has been added (similar to other device + drivers) to set the default line width. + +Grn +--- + +o Support for b-spline and Bezier curves has been added. + +Groffer +------- + +o New option `--shell' to select the shell under which groffer shall run. + +Macro Packages +-------------- + +o The string `Am' (producing an ampersand) has been added to mdoc for + compatibility with NetBSD. + +o `.IX' is now deprecated for mom; you should use `.IQ' (Indent Quit) + instead. + +o In mom, new inlines `FWD', `BCK', `UP', and `DOWN' deal with horizontal + and vertical movements; please refer to contrib/mom/NEWS for more + details. + +o New macro ENDNOTES_HDRFTR_CENTER for mom to better control headers. + +Miscellaneous +------------- + +o The `papersize' keyword in the DESC file now accepts multiple arguments. + It is scanned from left to the right, and the first valid argument is + used. This makes it possible to provide a fallback paper size. + + Example: + + papersize /etc/papersize a4 + +o A local font directory has been prepended to the default font path; it + defaults to /usr/local/share/groff/site-font. Similar to the normal + font searching process, files must be placed into a devXXX subdirectory, + e.g. + + /usr/local/share/groff/site-font/devps/FOO + + for a PostScript font definition file FOO. + + +VERSION 1.18 +============ + +*************************************************************************** +* * +* PLEASE READ THE CHANGES BELOW REGARDING GROTTY, GROFF'S TTY FRONTEND. * +* * +*************************************************************************** + +Troff +----- + +o Color support has been added to troff and pic (and to the device drivers + grops, grodvi, grotty, and grohtml -- other preprocessors and drivers will + follow). A new function `defcolor' defines colors; the escape sequence + `\m' sets the drawing color, the escape sequence `\M' specifies the + background color for closed objects created with \D'...' commands. + `\m[]' and `\M[]' switch back to the previous color. `\m' and `\M' + correspond to the new troff output command sets starting with `m' and + `DF'. The device-specific default color is called `default' and can't be + redefined. + + Use the `color' request to toggle the usage of colors (default is on); the + read-only register `.color' is 0 if colors are not active, and non-zero + otherwise. + + The old `Df' output command is mapped onto `DFg'; all color output + commands don't change the current font position (consequently, `Df' + doesn't either). + + Outputting color can be disabled in troff and groff with the option -c + (it is always disabled in compatibility mode). See the section on grotty + for the GROFF_NO_SGR environment variable also. + + For defining color components as fractions between 0 and 1, a new scaling + indicator `f' has been introduced: 1f = 65536u. For testing whether a + color is defined (with .if and .ie), a new conditional operator `m' is + available. + + More details can be found in the groff_diff.7 manual page and in + groff.texinfo. + +o Similar to \m and \M, \f[] switches back to the previous font. \fP + (and \f[P]) is still valid for backwards compatibility. + +o The new escape \F is the same as `.fam'; \F[] switches back to previous + family -- \F[P] selects family `P'. + +o Two new glyph symbols are available: `eu' is the official Euro symbol; + `Eu' is a font-specific glyph variant. + +o The new glyph symbols `t+-', `tdi', and `tmu' are textual variants of + `+-', `di', and `mu', respectively. + +o Latin-1 character 181 (PS name `mu', Unicode name U+00B5 MICRO SIGN) has + got the troff glyph name `mc'. + +o -Tutf8 is now available on EBCDIC hosts. + +o Strings can take arguments, using this syntax: \*[foo arg1 arg2 ...]. + Example: + + .ds xxx This is a \\$1 test. + \*[xxx nice] + +o It is now possible to have whitespace between the first and second dot (or + the name of the ending macro) to end a macro definition. Example: + + .de ! + .. + . + .de foo + . nop Hello, I'm `foo'. + . nop I will now define `bar'. + . de bar ! + . nop Hello, I'm `bar'. + . ! + .. + +o `.fn' is a new string-valued register which returns the (internal) real + font name; styles and families are properly concatenated. + +o Three new read/write registers `seconds', `minutes', and `hours' contain + the current time, set at start-up of troff. Use the `af' request to + control their output format. + +o The new request `fchar' can be used to provide fallback characters. It + has the same syntax as the `char' request; the only difference is that a + character defined with `.char' hides the glyph with the same name in the + current font, whereas a character defined with `.fchar' is checked only if + the particular glyph isn't found in the current font. This test happens + before checking special fonts. + +o In analogy to the `tmc' request, `.writec' is the same as `.write' but + doesn't emit a final newline. + +o The new request `itc' is a variant of `.it' for which a line interrupted + with \c counts as one input line. + +o Two new requests `ds1' and `as1' which are similar to `ds' and `as' but + with compatibility mode disabled during expansion of strings defined by + them. + +o The syntax of the `substring' request has been changed: The first + character in a string now has index 0, the last character has index -1. + Note that this is an incompatible change. + +o To emit strings directly to the intermediate output, a new `output' + request has been added; it is similar to `\!' used at the top level. + +o `.hpf' has been extended. It can now handle most TeX hyphenation + pattern files without modification. To do that, the commands \patterns, + \hyphenation, and \endinput are recognized. Please refer to groff_diff.7 + for more information. + +o `hpfcode' is a new request to provide an input encoding mapping for the + `hpf' request. + +o The new request `hpfa' appends hyphenation patterns (`hpf' replaces + already existing patterns). + +o A new request `ami' (append macro indirect) has been added. The first and + second parameter of `ami' are taken from string registers rather than + directly; this very special request is needed to make `trace.tmac' + independent from the escape character (which might even be disabled). + +o The new request `sizes' is similar to the `sizes' command in DESC files. + It expects the same syntax; the data must be on a single line, and the + final `0' can be omitted. + +o `trin' (translate input) is a new request which is similar to `tr' with + the exception that the `asciify' request will use the character code (if + any) before the character translation. Example: + + .trin ax + .di xxx + a + .br + .di + .xxx + .trin aa + .asciify xxx + .xxx + + The result is `x a'. Using `tr', the result would be `x x'. + +o The request `pvs' isn't new, but hasn't been documented before. It + adds vertical space after a line has been output. This makes it an + alternative to the `ls' request to produce double-spaced documents. + The read-only register `.pvs' holds the current amount of the + post-vertical line space. + +o For compatibility with plan 9's troff, multiple `pi' requests are + supported: + + .pi foo + .pi bar + + is now equivalent to + + .pi foo | bar + +o A new escape sequence `\O' is available to disable and enable glyph + output. Please see groff_diff.7 and groff.texinfo for more details. + +o The escapes `\%', `\&', `\)', and `\:' no longer cause an error in \X; + they are ignored now. Additionally `\ ' and `\~' are converted to + single space characters. + +o The default tab distance in nroff mode is now 0.8i to be compatible + with UNIX troff. + +o Using the latin-1 input character 0xAD (soft hyphen) for the `shc' + request was a bad idea. Instead, it is now translated to `\%', and + the default hyphenation character is again \[hy]. Note that the glyph + \[shc] is not useful for typographic purposes; it only exists to have + glyph names for all latin-1 characters. + +Macro Packages +-------------- + +o Peter Schaffter has contributed a new major macro package + called `mom', mainly for non-scientific writers, which takes care of + many typographic issues. It comes with a complete reference (in HTML + format) and some examples. `mom' has been designed to format documents + for PostScript output only. + +o Two macros `AT' (AT&T) and `UC' (Univ. of California) have been added to + the man macros for compatibility with older BSD releases. + +o Both the man and mdoc macro packages now use the LL and LT registers for + setting the line and title length, respectively (similar to those + registers in the ms macro package). If not set on the command line or + in a macro file loaded before the macro package itself, they default to + 78n in nroff mode and 6.5i in troff mode. + +o The `-xwidth' specifier in the mdoc macro package has been removed. Its + functionality is now integrated directly into `-width'. Similarly, + `-column' has been extended to provide this functionality also. + +o A new macro `Ex' has been added to the mdoc macro package to document an + exit status. + +o The PSPIC macro has been extended to work with DVI output (`pspic.tmac' is + now automatically loaded for -Tdvi), using a dvips special to load the EPS + file. + +o The trace.tmac package now traces calls to `am' also. Additionally, it + works in compatibility mode. + +o `troff.1' has been split. Differences to UNIX troff are now documented + in the new man page `groff_diff.7'. + +o `groff_mwww.7' has been renamed to `groff_www.7'. The file mwww.tmac + has been removed. + +o `groff_ms.7' has been completely rewritten. It now contains a complete + reference to the ms macros. + +o `groff_trace.7' documents the trace macro package. + +o Changes in www.tmac: + + Note that HTML support is still in alpha change, so it is rather likely + that both macro names and macro syntax will change. Some of the macros + mentioned below aren't really new but haven't been documented properly + before. + + The following macros have been renamed: + + MAILTO -> MTO + IMAGE -> IMG + LINE -> HR + + For consistency, the macros `URL', `FTL', and `MTO' now all have the + address as the first parameter followed by the description. + + By default, grohtml generates links to all section headings at the top + of the document. Use the new `LK' macro to specify a different place. + + For specifying the background color and a background image, use the + new macros `BCL' and `BGIMG', respectively. + + The macro `NHR' has been added; it suppresses the generation of top and + bottom rules which grohtml emits by default. + + The new macro `HX' determines the cut-off point for automatic link + generation to headings. + + The image position parameter names in `IMG' have been changed to `-L', + `-R', and `-C'. + + New macro `PIMG' for inclusion of a PNG image (it will automatically + convert it into an EPS file if not -Thtml is used). + + New macro `MPIMG' for putting a PNG image into the left or right margin + (it will automatically convert it into an EPS file if not + -Thtml is used). + + New macros `HnS', `HnE' to start and end a header line block. + + New macro `DC' to produce dropcap characters. + + New macro `HTL' to generate an HTML title line only but no H1 heading. + + New macros `ULS' and `ULE' to start and end an unordered list. The new + macro `LI' inserts a list item. + +Groff +----- + +o The new command line option `-c' disables color output (which is always + disabled in compatibility mode). + +Nroff +----- + +o Two new command line options `-c' and `-C'; the former passes `-c' to + grotty (switching to the old output scheme); the latter passes `-C' to + groff (enabling compatibility mode). + +Pic +--- + +o New keywords `color' (or `colour', `colored', `coloured'), `outline' (or + `outlined'), and `shaded' are available. `outline' sets the color of the + outline, `shaded' the fill color, and `color' sets both. Example: + + circle shaded "green" outline "black" ; + + Filled arrows always use the outline color for filling. + + Color support for TeX output is not implemented yet. + +Pic2graph +--------- + +o A new script contributed by Eric S. Raymond . It + converts a PIC diagram into a cropped image. Since it uses gs and the PNM + library, virtually all graphics formats are available for output. + +Eqn2graph +--------- + +o A new script contributed by Eric S. Raymond . It + converts an EQN diagram into a cropped image. Since it uses gs and the PNM + library, virtually all graphics formats are available for output. + +Groffer +------- + +o A new script contributed by Bernd Warken . It displays + groff files and man pages on X and tty, taking care of most parameters + automatically. + +Grog +---- + +o Documents using the mom macro package are recognized. + +Grops +----- + +o Color support has been added. + +o A new option `-p' is available to select the output paper size. It has + the same syntax as the new `papersize' keyword in the DESC file. + +Grodvi +------ + +o By default, font sizes are now available in the range 5-10000pt, similar + to PS fonts. If you want the old behaviour (i.e., font sizes at discrete + values only), insert the following at the start of your document: + + .if '\*[.T]'dvi' \ + . sizes 500 600 700 800 900 1000 1095 1200 1400 1440 1600 \ + 1728 1800 2000 2074 2200 2400 2488 2800 3600 + +o A new font file HBI (using cmssbxo10; this is slanted sans serif bold + extended) has been added. + +o Two font families are now available: `T' and `H'. + +o EC and TC fonts have been integrated. Use `-mec' (calling the file + ec.tmac) to switch to them. Those fonts give a much better coverage of + the symbols defined by groff than the CM fonts. + + Note that ec.tmac must be called before any language-specific files; it + doesn't take care of hcode values. + +o Color support has been added. For drawing commands, colors are translated + to gray values currently. + +Grotty +------ + +o Color support has been added, using the SGR (ISO 6429, sometimes called + ANSI color) escape sequences. + +o SGR escape sequences are now used by default for underlining and bold + printing also, no longer using the backspace character trick. To revert + to the old behaviour, use the `-c' switch. + + Note that you have to use the `-R' option of `less' to make SGR escapes + display correctly. On the other hand, terminal programs and consoles like + `xterm' which support SGR sequences natively can directly display the + output of grotty. Consequently, the options `-b', `-B', `-u', and `-U' + work only in combination with `-c' and are ignored silently otherwise. + + For the `man' program, it may be necessary to add the `-R' option of + `less' to the $PAGER environment variable; alternatively, you can use + `man's `-P' option (or adapt its configuration file accordingly). See + man(1) for more details. + +o If the environment variable GROFF_NO_SGR is set, SGR output is disabled, + reverting to the old behaviour. + +o A new special \X'tty: sgr n' has been added; if n is non-zero or missing, + enable SGR output (the default). + +o If the new option `-i' is used (only in SGR mode), grotty sends escape + sequences to set the italic font attribute instead of the underline + attribute for italic fonts. Note that many terminals don't have support + for this (including xterm). + +Grohtml +------- + +o Color support for glyphs has been added. + +o New option `-h' to select the style of headings in HTML output. + +o New option `-b' to set the background colour to white. + +o New options `-a' and `-g' to control the number of bits for anti-aliasing + used for text and graphics, respectively. Default value is 4; 0 means + no anti-aliasing. + +o groff character/glyph entities now map onto HTML 4 character entities. + +Grolbp +------ + +o Valid paper sizes are now specified as with the new `papersize' keyword + in the DESC file. Specifically, the old custom paper type format + `custAAAxBBB' is no longer supported. + +Miscellaneous +------------- + +o A new manual page `ditroff.7' is available. + +o The groff texinfo manual will now be installed, together with a bunch + of examples. + +o A new keyword `papersize' has been added to the DESC file format. Its + argument is either + + . a predefined paper format (e.g. `A4' or `letter') + + . a file name pointing to a file which must contain a paper size + specification in its first line (e.g. `/etc/papersize') + + . a custom paper size definition like `35c,4i' + + See groff_font(5) for more details. This keyword only affects the + physical dimensions of the output medium; grops, grolj4, and grolbp use it + currently. troff completely ignores it. + +VERSION 1.17.2 +============== + +This is major bug-fixing release which should replace 1.17.1. + +Troff +----- + +o The `IMAGE' macro in www.tmac has changed: Now the optional 2nd parameter + gives the horizontal image location (left, centered, or right), and the + optional 3rd and 4th parameter the image dimensions. + +VERSION 1.17.1 +============== + +This is mainly a bug-fixing release. + +Troff +----- + +o Two new requests `de1' and `am1' which are similar to `de' and `am' but + with compatibility mode disabled during expansion of macros defined by + them. + +o Added request `brp'. This is the same as `\p'. + +o Similar to other versions of troff, the `ns' request now works in all + diversions, not only in the top-level one. + +o New read-only number register `.ns'. Returns 1 if in no-space mode, + 0 otherwise. + +Nroff +----- + +o Options -p (pic) and -t (tbl) added. + +o The environment variable GROFF_BIN_PATH is now checked before PATH for + finding groff. + +Grohtml +------- + +o New option `-D dir' to specify a directory in which all images are placed. + +o New option `-I stem' to specify an image name stame. If not given, + `grohtml-XXX' is used (`XXX' is the process ID). + +VERSION 1.17 +============ + +Groff +----- + +o `-mFOO' now searches first for `FOO.tmac' and then for `tmac.FOO'. The + old behaviour has been changed to overcome problems with platforms which + have an 8+3 file name limit, and platforms which have other versions of + troff installed also. Additionally, all macro files have been renamed + using the latter scheme to avoid 8+3 name clashes. + +o The new environment variable GROFF_BIN_PATH is checked for programs groff + is calling (preprocessors, troff, and output devices) before PATH. If not + set, it defaults to the directory where the groff binary is located. + Previously, it was PATH only. The nroff script only uses GROFF_BIN_PATH + to find the groff binary but passes both the GROFF_BIN_PATH and PATH + environment variables to groff. + +Troff +----- + +o The mdoc package has been completely rewritten, using the full power of + GNU troff to remove limitations of Unix troff (which is no longer + supported). Most important changes are: + + . No argument limit + . Almost all macros are parsed and callable (if it makes sense) + . `.Lb': prints library names + . `.Nm ' now works as expected; `.Nm "" ' has + been withdrawn + . Updated `.St' command + . `.Fx': prints FreeBSD + . `.Ox': prints OpenBSD + . `.Bsx': prints BSD/OS + . `.Brq', `.Bro', `.Brc': brace enclosure macros + . `.Bd -centered': center lines + . `.Bl -xwidth ': interpret and use the resulting width + . Support for double-sided printing (-rD1 command line switch) + . Support for 11pt and 12pt document sizes (-rS11, -rS12 command line + switches) + + `groff_mdoc.7' replaces `groff_mdoc.samples.7'; it now completely + documents the mdoc package. + + Great care has been taken to assure backwards compatibility. If you + encounter any abnormal results, please report them to bug-groff@gnu.org. + +o A new command line option for the `man' macros (similar to the `mdoc' + package) has been implemented: `-rcR=1' (now the default in nroff mode) + produces one single, very long page instead of multiple pages. `-rcR=0' + deactivates it. + +o The `return' request has been added to return immediately from a macro. + +o A new request `nop' (no operation) has been added which is similar to + `if 1'. For example, + + .if t \{\ + Hallo! + .\} + + can now be written as + + .if t \{\ + . nop Hallo! + .\} + +o `box' and `boxa' are two new requests which behave similarly to `di' and + `da' but don't include a partially filled line (which is restored after + ending the diversion). + +o The `asciify' request has been extended to `unformat' space characters + and some other escape sequences also. + + `\ ' is no longer unformatted as a space but remains an unpaddable, + unbreakable space character. + +o The new `unformat' request is similar to `asciify' but only handles space + characters and tabs specially if the diversion is reread, retaining font + information. This makes it possible to reformat diversions; for example + the following + + .ll 3i + . + a01 a02 a03 a04 a05 a06 a07 a08 a09 a10. + . + .box box1 + .ev 1 + .nf + \f[B]b01 b02 b03 b04 b05 b06 b07 b08 b09 b10.\f[P] + .br + .ev + .box + . + c01 c02 c03 c04 c05 c06 c07 c08 c09 c10. + . + .unformat box1 + .box1 + + gives + + a01 a02 a03 a04 a05 a06 a07 + a08 a09 a10. c01 c02 c03 c04 + c05 c06 c07 c08 c09 c10. b01 + b02 b03 b04 b05 b06 b07 b08 + b09 b10. + + Without the `unformat' request, space characters are converted to word + space nodes which are no longer stretchable, and the result would be + + a01 a02 a03 a04 a05 a06 a07 + a08 a09 a10. c01 c02 c03 c04 + c05 c06 c07 c08 c09 c10. b01 + b02 b03 b04 b05 b06 b07 b08 + b09 b10. + +o The new request `linetabs' controls the `line-tabs' mode. In line-tabs + mode, tab distances are computed relative to the (current) output line. + Otherwise they are taken relative to the input line. For example, the + following + + .ds x a\t\c + .ds y b\t\c + .ds z c + .ta 1i 3i + \*x + \*y + \*z + + yields + + a b c + + In line-tabs mode, the same code gives + + a b c + + The new read-only number register `.linetabs' returns 1 if in line-tabs + mode, and 0 otherwise. + +o Two new requests `tm1' and `tmc' have been added to improve writing + messages to the terminal. `tm1' is similar to `tm' but allows leading + whitespace. `tmc' is similar to `tm1' but doesn't emit a final newline. + +o For compatibility with sqtroff, the request `output' has been added. + The behaviour is similar to `\!' at the top-level, that is, it directly + inserts its argument into the intermediate output format. The syntax + is similar to .tm1, allowing leading whitespace. + +o The new `spreadwarn' request will make troff warn if spaces in an output + line are widened by a given limit or more. + +o Use `warnscale' to change the scaling indicator troff will use for + warning messages. + +o A new request `dei' (define indirect) has been added. The first and + second parameter of `dei' are taken from string registers rather than + directly; this very special request is needed to make `trace.tmac' + independent from the escape character (which might even be disabled). + +o It is now possible to save and restore the escape character with two new + requests `ecs' and `ecr'. + +o The new escape sequence \B'...' is an analogon to `\A': If the string + within the delimiters is a valid numeric expression, return character `1', + and `0' otherwise. + +o The new escape sequence `\:' inserts a zero-width break point. This is + similar to `\%' but without a soft hyphen character. + +o The `tr' request can now map characters onto `\~'. + +o Calling the `fam' request without an argument switches back to the + previous font family. + +o The new read-only register `.int' is set to a positive value if the last + output line is interrupted (i.e., if the input line contains `\c'). + +o The `writem' request is not new, but hasn't been documented before. This + is similar to `write' but instead of a string the contents of a given + macro or string is written to a stream. + +o The read/write number register `hp' to get/set the current horizontal + position relative to the input line isn't new but hasn't been documented + properly before. + +o `\X' and `\Y' are now transparent for end-of-sentence recognition. + +o The `cu' request in nroff mode now works as documented (i.e., it + underlines spaces also). + +Grog +---- + +o The grog script now works in non-compatibility mode also (which is the + default). As usual, use the `-C' option to activate compatibility mode. + +Grops +----- + +o A new option `-P' resp. a new environment variable `GROPS_PROLOGUE' has + been added to select a different prologue file. + +o The effect of the former `-mpsnew' option to access more Type 1 characters + is now the default and no longer available. To get the old behaviour + (i.e., emulation of some glyphs by composition) use `-mpsold'. + +Miscellaneous +------------- + +o For security reasons the following changes have been done: + + . The tmac.safer file has been replaced with a built-in solution; .open, + .opena, .pso, .sy, and .pi are completely disabled in safer mode (which + is the default); to enable these requests the `-U' command line flag + must be used. + + . Files specified with the .mso request or given with the `-m' command + line option, and hyphenation patterns loaded with `.hpf' are no longer + searched in the current directory by default (besides the usual tmac + path). Instead, the home directory is used. To add the current + directory, either use the `-U' or `-M' command line option or set the + GROFF_TMAC_PATH environment variable to an appropriate value. + + . troffrc, troffrc-end, and eqnrc are neither searched in the current nor + in the home directory (even if -U is given). Use -M or GROFF_TMAC_PATH + to change that. + + . Similarly, the current directory is no longer part of the font path. + Use the `-F' command line option or the GROFF_FONT_PATH environment + variable if you really need the current directory. + +o groff now installs its data files into /usr/local/share/groff/ by + default, following the GNU standard. Additionally, a local tmac directory + (by default /usr/local/share/groff/site-tmac) is scanned before the + standard tmac directory. Wrapper files for system-specific macro packages + (if necessary) are put into /usr/local/lib/groff/site-tmac; this directory + is searched before the local tmac directory. + +o All programs now have option `-v' to show the version number; they exit + immediately afterwards, following the GNU standards. Additionally, + `--version' and `--help' have been added, doing the obvious actions. + +VERSION 1.16.1 +============== + +Bug fixes only; no user-visible changes. + +VERSION 1.16 +============ + +Groff +----- + +The anachronism of calling the man macro package with `-man' has been fixed; +now you can say `-m man' also. The same is true for `ms', `me', `markup', +`mandoc', and `mdoc'. + +A new switch `-g' for calling `grn' is available. + +A new switch `-G' for calling `grap' is available. + +EBCDIC support for tty devices has been added. On such hosts, IBM code page +1047 is available with -Tcp1047 instead of -Tascii and -Tlatin1 (and, for +the moment, -Tutf8). Note that non-tty devices are not yet supported (but +installed). + +Troff +----- + +A new command line option to the `man' macros is available: `-rSxx' (with +`xx' either 10, 11, or 12) to set the base document font size to `xx' +points. Additionally, `.SH' now produces larger headings than `.SS'. + +To solve a problem with the .PSPIC macro which needs the `-U' switch of +troff to access an external program (psbb), a new request .psbb is now +available to get the bounding box of a PostScript image file. The values +(in PostScript units) are returned in the new read-only number registers +`llx', `lly', `urx', and `ury'. Consequently, .PSPIC has been adapted to +use the new request, and the psbb program has been removed. + +A new predefined writable number register, `year', has been added. It +contains the current year. + +A new read-only register, `.Y', has been added. It contains the revision +number of the groff package. + +`\fP' now behaves as expected in situations like the following where the +font `foo' is undefined: + + .B bold text + normal text \f[foo]bar\fP normal text + +Previously, the text after \fP appeared as bold. + +The `substring' request is not new, but hasn't been documented before. + +The predefined `.T' string register (which holds the current output device) +is not new, but hasn't been documented before. + +A new request `length' computes the length of a string and returns it in +a number register. + +The macro files `tmac.a4' (for specifying A4 paper format) and `tmac.trace' +(a debugging aid) are now installed also. + +A new resource file, `troffrc-end', is now available. It is invoked after +all user-specified macros. Currently used by the html device to include +tmac.html; thus no need for users to specify -mhtml anymore. + +The soft hyphen character now has a glyph name: `shc'. + +The latin-1 character 173 (PS name `periodcentered') has got the troff glyph +name `pc' and is no longer intermixed with the symbol character `md' (PS +name `mathdot'). + +ASCII character 34 (PS name `quotedbl') has got the troff glyph name `dq' +(which is an alias to character `"'). + +ASCII character 39 (PS name `quoteright') has got the troff glyph name `cq' +(which is an alias to character "'"). + +Some additions to the font description files have been implemented for +better support of HTML output: + + The new format of lines in the `charset' subsection of font description + files is + + name metrics type code [entity_name] [-- comment] + + Currently, only the font description files in devhtml use the optional + entity_name string to define glyph entities in HTML. Everything after the + entity_name field is ignored; in case this field isn't used, two hyphen + characters are now necessary to start a comment. + + Two new requests are available in DESC files (currently used only with + grohtml): + + use_charnames_in_special + This command indicates that troff should encode named characters + inside special commands. + + pass_filenames + requests that troff tells the driver the source file name being + processed. This is achieved by another tcommand: `F filename'. + +Grotty +------ + +Bruno Haible contributed support for UTF8 output. + +Grohtml +------- + +Added .LINE macro to tmac.arkup. + +The obsolete `.LINK' macro has been removed. + +.URL, .FTP, and .MAILTO macros now accept an optional third argument which +will be immediately appended to the second argument (to be used with +punctuation, for example). + +Grodvi +------ + +The font size 11pt has been changed to 10.95pt (as used in LaTeX 2e). + +A new font file CWI (using cmitt10; this is typewriter italic) has been +added. + +Grolbp +------ + +A new driver for Canon CAPSL printers (LBP-4 and LBP-8 series laser +printers). This code has been contributed by Francisco Andres Verdu +. + +Grn +--- + +A new preprocessor to process gremlin pictures. It is based on the +original Berkeley implementation of grn, written by David Slattengren +and Barry Roitblat, and has been adapted to groff by Daniel Senderowicz + and Werner Lemberg . + +Pic +--- + +Added the `srand' command to set the seed for a new sequence of +pseudo-random numbers to be returned by `rand'. + +Gxditview +--------- + +Simplified installation: The Imakefile will now be configured (by groff's +configure script). + +Documentation +------------- + +Three new man pages are available: groff_tmac.5 (documenting how troff macros +are accessed and where they are found), groff.7 (a short reference of the GNU +roff language), and roff.7 (a general survey on GNU troff). + +Miscellaneous +------------- + +A partial port to win32 (for use with Microsoft Visual C++ 6.0) is now part +of the distribution. It has been contributed by Blake McBride +. + +More information about programs, macros, documentation, etc., which is +related to groff has been collected in the file `MORE.STUFF'. + +VERSION 1.13, 1.14, 1.15 +======================== + +Bug fixes only; no user-visible changes. + +VERSION 1.12 +============ + +Finally, there are new maintainers for groff. Mailing lists and a CVS +repository are available also. See the file README for details. Not all +reported bugs could be fixed, so please send mails again if something is +still not working. + +Most of the installation problems should have vanished now (most +notably the $(tmac_wrap) bug). + +There is now a man page called groff_man.7 which documents the basics of the +-man macros. It has been originally written by Susan G. Kleinmann +. + +A (still incomplete) groff reference manual in texinfo format originally +contributed by Trent A. Fisher . + +me.man and msafer.man have been renamed to groff_me.man +resp. groff_msafer.man for consistency. + +Default strings for macros in doc-common resp. tmac.an no longer contain the +word `UNIX'. + +groff should now be Y2k safe (fixes contributed by Paul Eggert +). + +Following the GNU standards, groff will now use the prefix `/usr/local/' as +the default instead of replacing an existent groff binary. + +groff, troff, nroff, and pic now support the -U flag to activate unsafe +behaviour (without -msafer); the -S flag for using the -msafer macros is now +the default. + +Grohtml +------- + +This is a new output device for producing HTML output contributed by Gaius +Mulley . It is still very alpha but has been included +into the distribution so that a lot of people have a chance to test it. Bug +reports are highly welcome. + +Grolj4 +------ + +Duplex printing support has been contributed by Jeffrey Copeland +. + +Soelim +------ + +Added -I option for defining include paths (patch contributed by Peter +Miller ). + +Gxditview +--------- + +Fallback resources added (patch contributed by Larry Jones +). + +Will now support 8 gray levels. + +mm +-- + +New version 1.32 (contributed by Joergen Haegg ). + +VERSION 1.11 +============ + +Complete documentation for pic is now in the file doc/pic.ms. It was +contributed by Eric S. Raymond, , who is emphatically +*not* volunteering to take over groff as he is way overworked with +half a dozen other projects. + +VERSION 1.10 +============ + +The directory where data files are installed has been changed from +/usr/local/lib/groff to /usr/local/share/groff to comply with the +latest GNU coding standards. + +By default groff programs with Unix equivalents are installed with a +"g" prefix unless there is an existing (non-groff) troff installation. + +A new approach is used to make system macro packages available to +groff. Instead of simply including /usr/lib/tmac in the list of +directories searched by groff, the installation process creates for +each system macro package a wrapper macro package in the groff macro +directory that references the system macro package. The groff macro +packages are now installed with a leading "g" prefix if there is a +system version of the same macro package, and otherwise without the +"g" prefix, with the exception that the groff version of -me which is +always installed as -me. + +There is a new device, lj4, for the HP LaserJet 4 (and PCL5 +compatibles). + +Groff +----- + +groff has a -S option that prevents the use of unsafe features in pic +and troff. This uses a new -S option of pic and the -msafer macros +for troff. + +Troff +----- + +The `blm' request specifies a macro to be invoked when a blank line is +encountered. + +Pic +--- + +A -S (safer) option disables the sh command. + +Grops +----- + +The -m option enables manual feed. + +VERSION 1.09 +============ + +\(rn will now produce a character that has the traditional metrics, +and will form corners with \(ul and \(br. This means that it will not +align properly with \(sr. Instead there's a new character +\[radicalex] which aligns with \(sr; this is used by eqn for doing +square roots. + +Troff +----- + +The `pso' request allows you to read from the standard output of a +command. + +Grops +----- + +The PSPIC macro has options to allow the horizontal alignment of the +graphic to be specified. + +VERSION 1.08 +============ + +Troff +----- + +The escape sequence \V[xxx] will interpolate the value of the +environment variable xxx. + +Tbl +--- + +The decimalpoint option can be used to specify the character to be +recognized as the decimal point character in place of the default +period. + +VERSION 1.07 +============ + +Groff +----- + +The environment variable GROFF_COMMAND_PREFIX can be used to control +whether groff looks for `gtroff' or `troff' (similarily for the +preprocessors.) + +Troff +----- + +Multilingual hyphenation is supported by new `hpf' and `hla' requests, +and by a `\n[.hla]' number register. The -H option has been removed. +Files of hyphenation patterns can have comments. + +When a font cannot be found, troff gives a warning (of type `font', +enabled by default) instead of an error. + +There's a new request `trnt' that's like `tr' except that it doesn't +apply to text transparently throughput into a diversion with \!. + +Tbl +--- + +There is a `nokeep' option which tells tbl not to use diversions to +try to keep the table on one page. + +Eqn +--- + +Setting the parameter `nroff' to a non-zero value causes `ndefine' to +behave like `define' and `tdefine' to be ignored. This is done by +eqnrc when the current device is ascii or latin1. There's a `neqn' +script that just does `eqn -Tascii'. + +Grotty +------ + +grotty uses whatever page length was specified using the `pl' request +rather than using the paperlength command in the DESC file. The +paperwidth command in the DESC file is also ignored. + +VERSION 1.06 +============ + +The programs in groff that have Unix counterparts can now be installed +without a leading `g' prefix. See the `g' variable in the Makefile. + +The g?nroff script simulates the nroff command using groff. + +New special characters \(+h, \(+f, \(+p, \(Fn, \(Bq, \(bq, \(aq, \(lz, +\(an. See groff_char(7). + +^L is now a legal input character. + +Groff +----- + +The Xps pseudo-device has disappeared. Instead there is a new -X +option that tells groff to use gxditview instead of the usual +postprocessor. (So instead of -TXps, use -XTps or just -X if your +default device is ps.) + +The postprocessor to be used for a particular device is now specified +by a `postpro' command in the DESC file rather than being compiled +into groff. Similarly the command to be used for printing (with the +-l option) is now specified by a `print' command in the DESC file. + +The groff command no longer specifies eqnchar as an input file for +eqn. Instead eqn automatically loads a file `eqnrc'. The groff +command no longer passes the -D option to eqn. Instead eqnrc sets the +draw_lines parameter. + +The groff command no longer tells troff to load a device-specific +macro file. This is handled instead by the `troffrc' file, which is +always loaded by troff. + +The shell script version of groff has been removed. + +Troff +----- + +The `rchar' request removes a character definition established with `char'. + +Compatibility mode is disabled and the escape character is set to `\' +while a character definition is being processed. + +The `\#' escape sequence is like `\"' except that the terminating +newline is ignored. + +The `shc' request tells troff which character to insert (instead of +the default \(hy) when a word is hyphenated at a line break. + +A font name of 0 (zero) in the DESC file will cause no font to be +mounted on the corresponding font position. This is useful for +arranging that special fonts are mounted on positions on which users +are not likely explicitly to mount fonts. All groff devices now avoid +initially mounting fonts on positions 5-9. + +The `do' request allows a single request or macro to be interpreted +with compatibility mode disabled. + +troff automatically loads a file `troffrc' before any other input file. +This can be prevented with the -R option. This file is responsible +for loading the device-specific macros. + +Pic +--- + +The -x option has been removed and a -n option has been added. By +default, pic now assumes that the postprocessor supports groff +extensions. The -n option tells pic to generate output that works +with ditroff drivers. The -z option now applies only to TeX mode. + +The -p option has been removed. Instead if the -n option is not +specified, pic generates output that uses \X'ps: ...' if the \n(0p +register is non-zero and tmac.ps sets this register to 1. + +In places where you could 1st or 5th you can now say `i'th or `i+1'th +(the quotes are required). + +Eqn +--- + +Eqn now automatically reads a file `eqnrc' from the macro directory. +This performs the same role that the eqnchar files used to. This can +be prevented by the -R option. + +Setting the draw_lines parameter to a non-zero value causes lines to +be drawn using \D rather than \l. The -D option is now obsolete. + +`uparrow', `downarrow' and `updownarrow' can be used with `left' and +`right'. + +The amount of extra space added before and after lines containing +equations can be controlled using the `body_height' and `body_depth' +parameters. + +Grops +----- + +Font description files have been regenerated from newer AFM files. +You can get access to the additional characters present in the text +fonts in newer PostScript printers by using -mpsnew. + +The default value of the -b option is specified by a `broken' command +in the DESC file. + +With the -g option, grops will generate PostScript code that guesses +the page height. This allows documents to be printed on both letter +(8.5x11) and A4 paper without change. + +Grodvi +------ + +ISO Latin-1 characters are available with -Tdvi. Format groff_char(7) +with groff -Tdvi for more information. + +Grotty +------ + +The -mtty-char macros contain additional character definitions for +use with grotty. + +Macros +------ + +In previous releases the groff -me macros treated the $r and $R number +registers in a way that was incompatible with the BSD -me macros. The +reason for this was that the approach used by the BSD -me macros does +not work with low resolution devices such as -TX75 and -TX100. +However, this caused problems with existing -me documents. In this +release, the vertical spacing is controlled by the $v and $V registers +which have the same meaning as $r and $R in earlier groff releases. +In addition, if the $r or $R register is set to a value that would be +correct for for the BSD -me macros and a low resolution device is not +being used, then an appropriate value for the $v or $V register will +be derived from the $r or $R register. + +The groff -me macros work with -C and (I think) with Unix troff. + +For backward compatibility with BSD -me, the \*{ and \*} strings are +also available as \*[ and \*]. Of course, \*[ will only be usable +with -C. + +The \*T string has been deleted. Use \*(Tm instead. + +Xditview +-------- + +The `n', Space and Return keys are bound to the Next Page action. The +`p', BackSpace and Delete keys are bound to the Previous Page action. +The `q' key is bound to the Quit action. + +The `r' key is bound to a rerasterize action that reruns groff, and +redisplays the current page. + +VERSION 1.05 +============ + +Pic +--- + +There is a alternative assignment operator `:=' which interacts +differently with blocks. + +There is a new command `command', which allows the values of variables +to be passed through to troff or TeX. + +The `print' command now accepts multiple arguments. + +String comparison expressions (using `==' or `!=') are allowed in more +contexts. + +Grotty +------ + +Horizontal and vertical lines drawn with \D'l ...' will be rendered +using -, | and + characters. This is intended to give reasonable +results with boxed tables. It won't work well with pic. + +Macros +------ + +The -mdoc macros have been upgraded to the version in the second +Berkeley networking release. This version is not completely +compatible with earlier versions; the old version is still available +as -mdoc.old. The grog script has been enhanced so that it can +usually determine whether a document requires the old or new versions. + +With -TX75, -TX100 and -TXps, the PSPIC macro will produce a box +around where the picture would appear with -Tps. + +VERSION 1.04 +============ + +An implementation of the -mm macros is included. + +The directory in which temporary files are created can be controlled +by setting the GROFF_TMPDIR or TMPDIR environment variables. + +Pic +--- + +Some MS-DOS support (see pic/make-dos-dist). + +Grops +----- + +There are two new \X commands (\X'ps: invis' and \X'ps: endinvis') +which make it possible to have substitute characters that are +displayed when previewing with -TXps but ignored when printing with +grops. + +Xditview +-------- + +Support for scalable fonts. + +VERSION 1.03 +============ + +No changes other than bug fixes. + +VERSION 1.02 +============ + +There is an implementation of refer and associated programs. groff -R +preprocesses with grefer; no mechanism is provided for passing +arguments to grefer because most grefer options have equivalent +commands which can be included in the file. grog also supports refer. + +There is an alternative perl implementation of the grog script. + +The code field in lines in the charset section of font description +files is now allowed to contain an arbitrary integer (previously it +was required to lie between 0 and 255). Currently grops and grodvi +use only the low order 8 bits of the value. Grodvi will use the +complete value; however, this is unlikely to be useful with +traditional TeX tools (.tfm files only allow 8 bit character codes.) + +Left and right double quotes can be obtained with \(lq and \(rq +respectively. + +There is a new program called pfbtops which translates PostScript +fonts in pfb format to ASCII. + +A slightly modified version of the Berkeley tmac.doc is included. + +Troff +----- + +In long escape names the closing ] is now required to be at the same +input level as the opening [. + +The \A'S' escape sequence returns 1 or 0 according as S is or is not +suitable for use as a name. + +\~ produces an unbreakable space that can be stretched when the line +is adjusted. + +The `mso' request is like the `so' request except that it searches for +the file in the same directories in which tmac.X is searched for when +the -mX option is given. + +The escape sequence `\R' is similar to the `nr' request. + +Eqn +--- + +A new `special' primitive allows you to add new types of unary +constructs by writing a troff macro. + +Pic +--- + +The implementation no longer uses gperf. + +Grops +----- + +The compile-time -DBROKEN_SPOOLER option has been replaced by a +BROKEN_SPOOLER_FLAGS option. This allows more precise control over +how grops should workaround broken spoolers and previewers. There is +a new -b option that can change this at run-time. + +Grops now generates PostScript that complies with version 3.0 of the +Document Structuring Convention. + +The resource management component of grops (the part that deals with +imported documents and downloadable fonts) has been rewritten and now +supports version 3.0 of the Document Structuring Conventions. The +%%DocumentFonts comment is no longer supported; you must use the +%%Document{Needed,Supplied}{Fonts,Resources} comments instead +(or as well.) + +tmac.psatk contains some macros that support the mechanism used by the +Andrew Toolkit for including PostScript graphics in troff documents. + +Xditview +-------- + +Parts of xditview have been rewritten so that it can be used with the +output of gtroff -Tps. groff -TXps will run gtroff -Tps with +gxditview. + +There is a new menu entry `Print' which brings up a dialog box for +specifying a command with which the file being previewed should be +printed. + +Xditview now uses imake. + +VERSION 1.01 +============ + +The groff command now understands the gtroff `-a' and `-i' options. + +With the `m' and `n' scale indicators, the scale factor is rounded +horizontally before being applied. This makes (almost) no difference +for devices with `hor' equal to 1, but it makes groff with -Tascii or +-Tlatin1 behave more like nroff in its treatment of these scale +indicators. Accordingly tmac.tty now calls the `nroff' request so +that the `n' condition will be true. + +The device-specific macros (tmac.ps, tmac.dvi, tmac.tty and tmac.X) +have been made to work at least somewhat with -C. In particular the +special characters defined by these macros now work with -C. + +groff -Tdvi -p will now pass pic the -x flag; this will enable filling +of arrowheads and boxes, provided that your dvi driver supports the +latest version of the tpic specials. + +Eqn +--- + +There is a new `-N' option that tells eqn not to allow newlines in +delimiters. This allows eqn to recover better from missing closing +delimiters. The groff command will pass on a `-N' option to eqn. + +Grops +----- + +You can now use psfig with grops. See the file ps/psfig.diff. I do +not recommend using psfig for new documents. + +The command \X'ps: file F' is similar to \X'ps: exec ...' except that +the PostScript code is read from the file F instead of being contained +within the \X command. This was added to support psfig. + +Grodvi +------ + +There are font files HB and HI corresponding to cmsssbx10 and cmssi10. + +Macros +------ + +The groff -me macros now work with the -C option. As a result, they +may also work with Unix nroff/troff. + +In -me, the $r and $R number registers now contain the line spacing as +a percentage of the pointsize expressed in units (normally about 120). +The previous definition was useless with low resolution devices such +as X75 and X100. + +VERSION 1.00 +============ + +A -ms-like macro-package is now included. + +The name for the Icelandic lowercase eth character has been changed +from \(-d to \(Sd. + +Troff +----- + +There is a new request `nroff', which makes the `n' built-in condition +true and the `t' built-in condition false; also a new request `troff' +which undoes the effect of the `nroff' request. This is intended only +for backward compatibility: it is usually better to test \n(.H or +\n(.V or to use the `c' built-in condition. + +The \R escape sequence has been deleted. Use \E instead. + +There are `break' and `continue' requests for use with the `while' +request. + +There is a request `hym' that can ensure that when the current +adjustment mode is not `b' a line will not be hyphenated if it is no +more than a given amount short, and a request `hys' that can ensure +that when the current adjustment mode is `b' a line will not be +hyphenated if it can be justified by adding no more than a given +amount of extra space to each word space. + +There is a request `rj' similar to `ce' that right justifies lines. + +A warning of type `space' will be given when a call is made to an +undefined request or macro with a name longer than two characters, and +the first two characters of the name make a name that is defined. +This is intended to find places where a space has been omitted been a +request or macro and its argument. This type of warning is enabled by +default. + +Pic +--- + +A comma is permitted between the arguments to the `reset' command. + +For use with TeX, there is a new `-c' option that makes gpic treat +lines beginning with `.' in a way that is more compatible with tpic +(but ugly). + +Eqn +--- + +It is no longer necessary to add `space 0' at the beginning of +complicated equations inside pictures. + +`prime' is now treated as an ordinary character, as in Unix eqn. The +previous behaviour of `prime' as an operator can now be obtained using +`opprime'. + +Xditview +-------- + +There are two new devices X75-12 and X100-12 which are the same as X75 +and X100 except that they are optimized for documents that use mostly +12 point text. + +VERSION 0.6 +=========== + +The installation process has been refined to make it easy for you to +share groff with someone who has the same type of machine as you but +does not have a C++ compiler. See the end of the INSTALL file for +details. + +There is a man page for the tfmtodit program which explains how to use +your own fonts with groff -Tdvi. + +There is a man page for afmtodit which explains how to use your own +PostScript fonts with groff -Tps. + +The \N escape sequence is now fully supported. It can now be used to +access any character in a font by its output code, even if it doesn't +have a groff name. This is made possible by a convention in the font +files that a character name of `---' refers to an unnamed character. +The drivers now all support the `N' command required for this. The font +description files have been updated to include unnamed characters. + +The `x' command in font description files has been removed: instead +any unknown commands are automatically made available to the drivers. +If you constructed your own font files with an earlier version of +tfmtodit or afmtodit, you must construct them again using the current +version. + +Characters between 0200 and 0237 octal are no longer legal input +characters. Note that these are not used in ISO 8859. + +A command called `grog' has been added, similar to the `doctype' +command described in Kernighan and Pike. + +Groff +----- + +The groff command has some new options: -V prints the pipeline +instead of executing it; -P passes an argument to the postprocessor, +-L passes an argument to the spooler. + +There is a C++ implementation of the groff command. This handles some +things slightly better than the shell script. In particular, it can +correctly handle arguments containing characters that have a special +meaning to the shell; it can give an error message when child +processes other than the last in the pipeline terminate abnormally; +its exit status can take account of the exit statuses of all its child +processes; it is a little more efficient; when geqn is used, it +searches for the eqnchar file in the same way that font metric files +are searched for, rather than expecting to find it in one particular +directory. + +Gtroff +------ + +There is font translation feature: For example, you can tell gtroff to +use font `HR' whenever font `H' is requested with the line + .ftr H HR +This would be useful for a document that uses `H' to refer to +Helvetica. + +There are some new number registers: `.kern' contains the current kern +mode, `.lg' the current ligature mode, `.x' the major version number, +`.y' the minor version number, `.ce' the number of lines to be +centered in the current environment, `.trunc' the amount of vertical +space truncated by the most recently sprung vertical position trap, +`.ne' the amount of vertical space needed in the last `ne' request +that caused a vertical position trap to be sprung. + +The `cf' request now behaves sensibly in a diversion. If used in a +diversion, it will now arrange for the file to be copied to the output +when the diversion is reread. + +There is a new request `trf' (transparent file) similar to `cf', but +more like `\!'. + +There is a new escape sequence `\Y[xxx]', roughly equivalent to +`\X'\*[xxx]'', except that the contents of string or macro xxx are not +interpreted, and xxx may contain newlines. This requires an output +format extension; the drivers have been modified to understand this. +Grops has also been modified to cope with newlines in the arguments to +\X commands; grops has a new \X command mdef, which is like def except +that it has a first argument giving the number of definitions. + +There is a new warning category `escape' which warns about unknown +escape sequences. + +The `fp' request now takes an optional third argument giving the external +name of the font. + +The `\_' character is now automatically translated to `\(ul' as in troff. + +The environment variable `GROFF_HYPHEN' gives the name of the file +containing the hyphenation patterns. + +There is a `\C'xxx'' escape sequence equivalent to `\[xxx]'. + +Characters ", ', ), ], *, \(dg are now initially transparent for the purposes +of end of sentence recognition. + +There is an anti-recursion feature in the `char' request, so you can +say `.char \(bu \s+2\(bu\s-2'. + +The limit on the number of font positions has been removed. +Accordingly `\n[.fp]' never returns 0. + +The restriction on the number of numbered environments has been removed. + +There is a new escape sequence `\E' that makes it possible to +guarantee that an escape sequence won't get interpreted in copy-mode. +The `\R' escape sequence is accordingly now deprecated. + +Gpic +---- + +Arguments of the form `X anything X' (in the `copy thru', `sh', `for', +`if' and `define' constructs) can now be of the form `{ anything }'. + +If the `linethick' variable is negative (as it now is initially), +lines will be drawn with a thickness proportional to the current point +size. + +The `rand' function now takes no arguments and returns a number between +0 and 1. The old syntax is still supported. + +`^' can be used in expressions to indicate exponentiation. + +In the `for' construct the argument to the by clause can be prefixed +by `*' to indicate that the increment is multiplicative. + +A bare expression may be used as an attribute. If the current +direction is `dir', then an attribute `expr' is equivalent to +`dir expr' + +There is a `sprintf' construct that allows numbers to be formatted and used +wherever a quoted string can be used. + +The height of a text object without an explicit height attribute is +the number of text strings associated with the object times the value +of the `textht' variable. + +The maximum height and width of a picture is controlled by the +`maxpswid' and `maxpsht' variables. + +Gtbl +---- + +Gtbl can now handle gracefully the situation where the `ce' request +has been applied to a table. + +Geqn +---- + +The `ifdef' primitive has been generalized. + +A tilde accent can be put underneath a box using `utilde'. This +defined using a general `uaccent' primitive. + +Grops +----- + +There is a new PostScript font downloading scheme which handles font +downloading for imported illustrations. Previously, the name of the +file containing the font was given in the `x download' line in the +groff font metric file. Now, there is a `download' file which says +for each PostScript font name which file contains that font. Grops +can also now handle inter-font dependencies, where one downloadable +font depends on some other (possibly downloadable) font. + +The `T' font has been removed. The characters it used to provide are +now provided by `char' definitions in tmac.ps. TSymbol.ps has also +been removed, and the tweaks it provided are now provided by `char' +definitions. diff --git a/PROBLEMS b/PROBLEMS new file mode 100644 index 0000000..ba43b3c --- /dev/null +++ b/PROBLEMS @@ -0,0 +1,916 @@ +This file describes various problems that have been encountered in +compiling, installing and running groff. Suggestions for additions or +other improvements to this file are welcome. + +---------------------------------------------------------------------- + + + +Generic Problems +================ + + + +* Displaying a man page on a terminal with/without my favourite pager + only gives garbage. + +groff by default now uses SGR escape sequences (`ANSI color') to +control the display attributes (bold, underlined, colour) on TTYs. +Some terminals (e.g. `kterm') don't understand SGR, and some pagers +(e.g. older versions of `less' or `less' without the -R option) don't +understand SGR either. There are three solutions to fix this, in order +of preference; please read the grotty man page for more details. + +The fourth and probably best option is to update your terminal program +and pager to versions which can handle SGR. + + 1. Set the GROFF_NO_SGR environment variable. + + 2. Pass option -c to grotty. + + 3. Append the following fragment to the `troffrc' file: + + +--- start --- +.if n \{\ +. nr _C \n(.C +. cp 0 +. +. \" The following code sets a top-of-page trap to disable grotty's TTY +. \" mode. Since neither \X nor .output can be used before the first +. \" page has started, we must use a trap. To make it work with troff's +. \" -o option, we wait until the first printed page. +. +. de sgr@dummy +. . +. +. rn wh wh@old +. +. \" The stand-alone version. If no other trap is set, we can safely +. \" insert the truncated vertical space caused by the trap (if any). +. \" Otherwise we assume that the document's main macro package takes +. \" care of that. As soon as the trap has been executed, it is removed. +. de1 no@sgr +. if \\n[.P] \{\ +. if (\\n[.t] == \\n[.p]) \{\ +. rn wh@old wh +. rm no@sgr +. wh 0 +. sp \\n[.trunc] +. nop \X'tty: sgr 0' +. sp -1 +. \}\} +. . +. +. wh@old 0 no@sgr +. +. \" The piggyback version to be appended to macros planted with the +. \" modified `wh' request. +. de1 no@sgr1 +. if \\n[.P] \{\ +. rn wh@old wh +. ds no@sgr1 +. nop \X'tty: sgr 0' +. sp -1 +. \} +. . +. +. \" We redefine the `wh' request so that `no@sgr1' is appended to +. \" the trap macro. +. de1 wh +. am1 \\$2 sgr@dummy +. no@sgr1 +. sgr@dummy +. wh@old \\$1 \\$2 +. . +. +. cp \n[_C] +.\} +--- end --- + +---------------------------------------------------------------------- + +* The UTF-8 output of grotty has strange characters for the minus, the + hyphen, and the right quote. Why? + +The used Unicode characters (U+2212 for the minus sign and U+2010 for +the hyphen) are the correct ones, but many programs can't search them +properly. The same is true for the right quote (U+201D). To map those +characters back to the ASCII characters, insert the following code +snippet into the `troffrc' configuration file: + +.if '\*[.T]'utf8' \{\ +. char \- \N'45' +. char - \N'45' +. char ' \N'39' +.\} + + +---------------------------------------------------------------------- + +* My document says that the current year is 19100, not 2000. + +In groff, as in traditional troff, the yr number register yields the +year minus 1900. Unfortunately, there is a longstanding bug in the +Troff User's Manual , +which incorrectly claims that yr is the last two digits of the year. +This claim was never true of either Unix troff or of groff. + +If your text looks like this: + + .\" Wrong: + This document was formatted in 19\n(yr. + +you can correct it as follows: + + This document was formatted in \n[year]. + +or, if you want to be portable to older troff versions, as follows: + + .nr y4 1900+\n(yr + This document was formatted in \n(y4. + +---------------------------------------------------------------------- + +* groff can't handle my troff document. It works fine with AT&T + troff. + +Read the section on incompatibilities in groff_diff(7). Try using +the -C option. Alternatively there's the sed script +`tmac/fixmacros.sed' which will attempt to edit a file of macros so +that it can be used with groff without the -C flag. + +---------------------------------------------------------------------- + +* gtroff doesn't understand lines like `.ce99' with no space between + the name of the request or macro and the arguments. + +gtroff requires a space between macro or request and its arguments +because it allows the use of long names for macros and requests. You +can use the -C option or the `cp' request to put gtroff into a +compatibility mode in which it is not possible to use long names for +macros but in which no space is required between macros and their +arguments. The use of compatibility mode is strongly discouraged. + +---------------------------------------------------------------------- + +* groff -Tdvi produces dvi files that use fonts at weird + magnifications. + +Yes, it does. You may need to compile fonts with Metafont at these +magnifications. The CompileFonts script in the devdvi/generate +directory may help you to do this. (It will take a *long* time on +slow computers.) + +---------------------------------------------------------------------- + +* Groff doesn't use the font names I'm used to. + +Use the `ftr' request. See groff_diff(7). + +---------------------------------------------------------------------- + +* pic output is not centered horizontally; pictures sometimes run off + the bottom of the page. + +The macro package you are using is not supplying appropriate +definitions of PS and PE. Give groff a -mpic option. + +---------------------------------------------------------------------- + +* gpic doesn't accept the syntax `chop N M' for chopping both ends of + a line. + +The correct syntax is `chop N chop M'. + +---------------------------------------------------------------------- + +* With gpic -t, when I print `line ->; box' using a dvi to ps program, + the arrow head sticks through into the inside of the box. + +The dvi to ps program should be modified to set the line cap and line +join parameters to 1 while printing tpic specials. + +---------------------------------------------------------------------- + +* gtroff gives warnings about lines like + .ev \" a comment + (with a tab after the .ev). + +A tab character cannot be used as a substitute for a space character +(except in one case: between a control character at the beginning of a +line and the name of a macro or request). For example, in Unix troff + + .ps \" restore the previous point size + +(with a tab after the .ps) will NOT restore the previous point-size; +instead it will be silently ignored. Since this is very likely to be +an error, gtroff can give a warning about it. If you want to align +comments, you can do it like this: + + .ev\" \" a comment + +---------------------------------------------------------------------- + +* I don't like the page headers and footers produced by groff -man. + +There seem to be many different styles of page header and footer +produced by different versions of the -man macros. You will need to +put modified macros from tmac/an-old.tmac into man.local. More +information is available in groff_man(7). + +---------------------------------------------------------------------- + +* Where can I get grap? + +Ted Faber has written a freely available grap: + + http://www.lunabase.org/~faber/Vault/software/grap/ + +---------------------------------------------------------------------- + +* The \n(st and \n(sb registers don't seem to work. I thought \w set + them to the height and depth of its argument, but the registers + always seem to be 0. + +\n(st and \n(sb aren't supposed to give the height and depth of the +string rather they give the minimum and maximum vertical displacement +of the baseline. For example for \v'2u'\v'-3u', \n(st will be 1 and +\n(sb will be -2. The height and depth of the string is available in +the \n[rst] and \n[rsb] registers: these are groff extensions. + +---------------------------------------------------------------------- + +* While formatting a manual page, groff complains about not being able + to break lines. The problem seems to be caused by a line like: + .TP \w'label'+2 + +The -man documentation says that the default scale indicator for TP +macro is `n'. The groff -man macros implement this correctly, so that +the argument will be evaluated as if it were + + \w'label'n+2n + +The Unix -man macros don't implement this correctly (probably because +it's hard to do in Unix troff); they just append `n' to the entire +argument, so that it will be evaluated as if it were + + \w'label'u+2n + +The solution is to fix the manual page: + + .TP \w'label'u+2 + +---------------------------------------------------------------------- + +* I'm having problems formatting man pages produced by the perl + wrapman script. + +Some versions of wrapman have a superfluous blank line before the .TH +line. This must be deleted. Then either use groff -C, or apply the +following patch: + +*** wrapman.~2~ Sun Jan 19 12:10:24 1992 +--- wrapman Tue Aug 10 02:06:41 1993 +*************** +*** 35,41 **** + $line1 .= if $line1 =~ /eval/; + $line1 .= if $line1 =~ /argv/; + $line2 = ; +! next if $line2 eq "'di';\n"; + + # Pull the old switcheroo. + +--- 35,41 ---- + $line1 .= if $line1 =~ /eval/; + $line1 .= if $line1 =~ /argv/; + $line2 = ; +! next if $line2 eq "'di ';\n" || $line2 eq "'di';\n"; + + # Pull the old switcheroo. + +*************** +*** 49,56 **** + + print OUT $line1; + print OUT < foo.ps + +See groff_tmac(5) for more information. + +---------------------------------------------------------------------- + +* When I print the output of groff -Tps, the output is always shifted + up by about 0.7 inches; I'm using 8.5x11 inch paper. + +Make sure that the paper size is `letter'. See groff_tmac(5). + +---------------------------------------------------------------------- + +* When I try to run gxditview, I get the error: + Error: Widget viewport has zero width and/or height + +This error means you haven't correctly installed the application +defaults file, GXditview.ad; `make install' does this for you +automatically, so either you didn't do `make install', or you haven't +passed a good `--appresdir=' argument to groff's configure script. + +See the X(7) man page for information how and where application resource +files have to be located. Look for the XAPPLRESDIR and XUSERFILESEARCHPATH +environment variables. + +---------------------------------------------------------------------- + +* When I preview documents using -TX75 or -TX100, the layout is not + the same as when I print the document with -Tps: the line and page + breaks come in different places. + +Use `groff -X -Tps'. + +---------------------------------------------------------------------- + +* When I try to print the output of groff -Tps, I get no output at all + from the printer, and the log file shows the error + %%[ error: undefined; offendingcommand: BP ]%% + I'm using TranScript spooling software. + +This is a bug in the page reversal filter in early versions of +TranScript. Change the `broken' parameter in +/usr/local/lib/groff/font/devps/DESC to 7. + +---------------------------------------------------------------------- + +* When I preview groff -Tps output using the Sun OpenWindows 2.0 + pageview program, all the pages are displayed on top of each other. + +This is a defect in pageview. Change the `broken' parameter in +/usr/local/lib/groff/font/devps/DESC to 2. + +---------------------------------------------------------------------- + +* With groff -TX75, -TX100 or -X, I can only view the first page. + +The left mouse button brings up a menu that allows you to view other +pages. + +---------------------------------------------------------------------- + +* When I print the output of groff -Tdvi, I just get a black dot in + upper left corner. + +Some dvi drivers (notably early versions of xtex) do not correctly +handle dvi files that use a resolution different from that used by dvi +files produced by TeX. Try getting a more up to date driver. + +---------------------------------------------------------------------- + +* How can I use groff with an old LaserJet printer that doesn't work + with groff -Tlj4? + +You have at least 3 options: + +- use groff -Tps with GNU Ghostscript; + +- use groff -Tdvi with a TeX .dvi to Laserjet driver; + +- use groff with the LaserJet driver in Chris Lewis' psroff package + (available for ftp from: + ftp.uunet.ca:/distrib/chris_lewis/psroff3.0pl17). + +---------------------------------------------------------------------- + +* Groff seems to generate level 3 Postscript, but my printer is only a + level 1 or 2 PostScript printer. + +In fact groff generates only level 2 PostScript (or rather level 1 +with some extensions; see grops(1) for more information how to disable +them). The `%!PS-Adobe-3.0' comment at the beginning of PostScript +output generated by groff indicates that the file conforms to +version 3.0 of the Adobe Document Structuring Conventions. The output +generated by groff should be printable on any PostScript printer. +Problems with groff output's not printing are most often caused by the +spooling system. + + + +Platform-Dependent Macro Problems +================================= + + + +* I get lots of errors when I use groff with the AT&T -mm macros. + +Use the groff -mm macros. + +---------------------------------------------------------------------- + +* groff produces wrapper macros for `ms' and friends which call the + system's original macros. Then, to get groff's ms macro package I + have to use `-mgs' instead `-ms'. Can I avoid this? + +Yes. Configure and compile groff as usual, but install it with + + make install tmac_wrap="" + +Then no wrapper files are produced, and `-ms' will use groff's `ms' +macros. + +---------------------------------------------------------------------- + +* I'm having problems formatting HP-UX 9.0 man pages with groff -man. + +Copy HP's tmac.an into /usr/local/share/groff/site-tmac/an.tmac, and +either put `.cp 1' at the beginning or filter it (and any files it +.so's) through tmac/fixmacros.sed. + +---------------------------------------------------------------------- + +* I get errors using the Unix -ms macros with groff -e -C. + +Apply this change: + +*** /usr/lib/ms/ms.eqn Tue Apr 25 02:14:28 1989 +--- ms.eqn Sun Nov 11 10:33:59 1990 +*************** +*** 22,29 **** + .. + . \" EN - end of a displayed equation + .de EN +! .if !\\*(10 .br + .di + .rm EZ + .nr ZN \\n(dn + .if \\n(ZN>0 .if \\n(YE=0 .LP +--- 22,30 ---- + .. + . \" EN - end of a displayed equation + .de EN +! .if \\n(.k>0 .br + .di ++ .ds 10 \\*(EZ\\ + .rm EZ + .nr ZN \\n(dn + .if \\n(ZN>0 .if \\n(YE=0 .LP + +---------------------------------------------------------------------- + +* I'm having problems formatting Ultrix man pages with groff -man. + +The Ultrix man pages use a number of non-standard extensions to the +Unix man macros. One solution is to use the Ultrix -man macros with +groff. Copy /usr/lib/tmac/tmac.an to +/usr/local/share/groff/site-tmac/an.tmac and apply the following patch +(from Frank Wortner): + +*** /usr/local/lib/groff/tmac/tmac.an Wed Sep 9 12:29:28 1992 +--- /usr/lib/tmac/tmac.an Fri Jul 24 19:58:19 1992 +*************** +*** 489,495 **** + . \" make special case of shift out of italic + .de }S + .ds ]F +! .if \\$12 .if !\\$5 .ds ]F \^ + .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" + .el \\$3 + .}f +--- 489,495 ---- + . \" make special case of shift out of italic + .de }S + .ds ]F +! .if \\$12 .if !\\$5 .ds ]F\^ + .ie !\\$4 .}S \\$2 \\$1 "\\$3\f\\$1\\$4\\*(]F" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9" + .el \\$3 + .}f + +Another possible solution is to install tmac/man.ultrix as +/usr/local/share/groff/site-tmac/man.local. + +---------------------------------------------------------------------- + +* On an SGI system, how can I make the man command use groff? + +From David Hinds (some of these steps +are unnecessary if you install with the `g' Makefile variable defined +as empty): + +Create a script called 'eqn': + + > #! /bin/sh + > if [ ${1:-""} = /usr/pub/eqnchar ] ; then shift ; fi + > geqn $* + +and a script called 'neqn': + + > #! /bin/sh + > if [ ${1:-""} = /usr/pub/eqnchar ] ; then shift ; fi + > geqn -Tascii $* + +and do: + + > ln -s gnroff nroff + +and edit the end of the gnroff script to be: + + > rest=`echo ${1+"$@"} | sed -e 's+/usr/lib/tmac+/usr/local/lib/groff/tmac+'` + > exec groff -Wall -mtty-char $T $opts $rest + +To get PostScript output from 'man -t', you also need to create a +'psroff' script similar to 'nroff'. Here are the context diffs: + +*** /usr/local/bin/nroff Sat Feb 13 15:51:09 1993 +--- /usr/local/bin/psroff Sat Feb 13 17:45:46 1993 +*************** +*** 1,8 **** + #! /bin/sh +! # Emulate nroff with groff. + + prog="$0" +! T=-Tascii + opts= + + for i +--- 1,8 ---- + #! /bin/sh +! # Emulate psroff with groff. + + prog="$0" +! T=-Tps + opts= + + for i +*************** +*** 25,30 **** +--- 25,33 ---- + -Tascii|-Tlatin1) + T=$1 + ;; ++ -t) ++ # ignore -- default is send to stdout ++ ;; + -T*) + # ignore other devices + ;; +*************** +*** 49,53 **** + rest=`echo ${1+"$@"} | sed -e 's+/usr/lib/tmac+/usr/local/lib/groff/tmac+'` + + # This shell script is intended for use with man, so warnings are + # probably not wanted. Also load nroff-style character definitions. +! exec groff -Wall -mtty-char $T $opts $rest +--- 52,56 ---- + rest=`echo ${1+"$@"} | sed -e 's+/usr/lib/tmac+/usr/local/lib/groff/tmac+'` + + # This shell script is intended for use with man, so warnings are +! # probably not wanted. +! exec groff -Wall $T $opts $rest + + + +Compilation Problems +==================== + + + +* Compilation dies with + + y.tab.c: In function `int yyparse()': + y.tab.c: `size_t' undeclared in namespace `std' + +* bison reports conflicts (either on stderr or in the `pic.output' + file) while processing `pic.y', and the produced pic binary doesn't + work at all. + +You need bison version 1.875b or greater. Alternatively, use yacc or +byacc. + +---------------------------------------------------------------------- + +* There are many empty `Makefile.dep' files. Is this a bug? + +No. Real dependency files are created with a `make depend' call. + +---------------------------------------------------------------------- + +* On HP-UX, the compiler complains about missing symbol `alloca'. + +Say + + export LDFLAGS=-lPW + +before starting the configure script. + +---------------------------------------------------------------------- + +* The configure script fails on OS/390 (z/OS) Unix. + +[This has been fixed in z/OS V1R3 (aka OS/390 R13).] + +There is a bug in the Language Environment (LE) whereby the test +program for static destructors fails. You will see the message +`configure: error: a working C++ compiler is required' + +Applying PTF UQ42006 is supposed to fix this, but the test program is +still returning the wrong value (1). To work around this problem, you +can comment out the following in the configure script (near line 2029). +This will effectively bypass the test (static constructors and +destructors do actually work properly): + +#if { (eval echo "$as_me:2029: \"$ac_link\"") >&5 +# (eval $ac_link) 2>&5 +# ac_status=$? +# echo "$as_me:2032: \$? = $ac_status" >&5 +# (exit $ac_status); } && { ac_try='./conftest$ac_exeext' +# { (eval echo "$as_me:2034: \"$ac_try\"") >&5 +# (eval $ac_try) 2>&5 +# ac_status=$? +# echo "$as_me:2037: \$? = $ac_status" >&5 +# (exit $ac_status); }; }; then +# echo "$as_me:2039: result: yes" >&5 +#echo "${ECHO_T}yes" >&6 +#else +# echo "$as_me: program exited with status $ac_status" >&5 +#echo "$as_me: failed program was:" >&5 +#cat conftest.$ac_ext >&5 +#echo "$as_me:2045: result: no" >&5 +#echo "${ECHO_T}no" >&6;{ { echo "$as_me:2046: error: a working C++ compiler is required" >&5 +#echo "$as_me: error: a working C++ compiler is required" >&2;} +# { (exit 1); exit 1; }; } +#fi + +---------------------------------------------------------------------- + +* I get errors when I try to compile groff with DEC C++. + +Fix the declaration of write() in so that the second +argument is a const char *. Fix the declaration of open() in + so that the first argument is a const char *. + +---------------------------------------------------------------------- + +* On a host using Unix make (e.g. Solaris), if you are compiling for + multiple architectures by building in a subdirectory, the make stops + with a message like this: + + make: Fatal error: Don't know how to make target `assert.o' + + or like this: + + make: Fatal error: Can't find /u/src/groff/src/include/Makefile.sub': No such file or directory + +This occurs because GNU make and Unix make handle VPATH differently, +and the groff build relies on GNU make's VPATH handling. + +Use GNU make to work around this. +In Solaris 8 and 9, GNU make is on the Software Companion CD in +package SFWgmake and is installed as /opt/sfw/bin/gmake. Prebuilt +versions of GNU make for Solaris are also available from +sunfreeware.com. + +---------------------------------------------------------------------- + +* On Ultrix, the make program stops with the message + + *** Error code 1 + + Stop. + + for no apparent reason. + +Use GNU make. + +---------------------------------------------------------------------- + +* I'm having problems compiling groff on 386BSD 0.1. + +If you're using ash as /bin/sh, you'll need the following patch. + +*** gendef.sh.org Sun Jun 30 13:30:36 1991 +--- gendef.sh Sun Feb 28 10:23:49 1993 +*************** +*** 3,9 **** + file=$1 + shift + +! defs="#define $1" + shift + for def + do +--- 3,10 ---- + file=$1 + shift + +! x=$1 +! defs="#define $x" + shift + for def + do + +You'll also need to change dirnamemax.c so that it doesn't use +pathconf(). + +---------------------------------------------------------------------- + +* While compiling on Xenix, ranlib libgroff.a fails. + +The system ranlib can't handle externals longer than 40 characters. +Use the ranlib included in demon.co.uk:/pub/xenix/g++-1.40.3a.v1 +instead. + +---------------------------------------------------------------------- + +* I get errors when I try to compile groff with Sun C++ version 3 or + earlier. + +Groff requires header files that are moderately compatible with AT&T +C++ and ANSI C. With some versions of Sun C++, the supplied header +files need some of the following changes to meet this requirement: + must declare the mem* functions, (just add `#include +' to ); the first argument to fopen and freopen +should be declared as `const char *'; the first argument to fread +should be declared as `void *'; the first argument to fwrite should be +declared as `const void *'; malloc should be declared to return +`void *'; in , the declaration `extern "C" { void +*__builtin_alloca(int); }' should be added; in the +return type and the second argument type of signal() should be changed +to be `void (*)(int)'. + +You can either change them in place, or copy them to some other +directory and include that directory with a -I option. + +---------------------------------------------------------------------- + +* I get errors when I try to compile groff with Forte Development 6 + or 6u1, or Sun C++ version 5.0 through 5.2. + +This is a known problem; see Sun bug #4301919. See Sun patches +109482, 109490, 109508, and 109509 for fixes. + +---------------------------------------------------------------------- + +* I get warnings from the Sun linker while using gcc 3.4.0: + + ld: warning: relocation error: R_SPARC_UA32: + file groff/src/libs/libgroff/libgroff.a(getopt.o): symbol optarg: + external symbolic relocation against non-allocatable + section .debug_info; cannot be processed at runtime: + relocation ignored + +This seems to be a known problem (Sun bugs #4910101 and #4910810, +filed in September 2003; gcc bug #15599, filed May 2004) without a +public fix as of this writing. A work-around is to use option +`-gstabs+' instead of `-g' (and a high probability that the output is +only debuggable with gdb but not with Sun's debuggers). + +---------------------------------------------------------------------- + +* I get lots of `numeric overflow' error messages whenever I run + groff; I compiled groff with AT&T C++ 2.0 with an ANSI C compiler. + +Make sure -DCFRONT_ANSI_BUG is included in DEFINES in the top-level +Makefile. If that doesn't solve the problem, define INT_MIN as +-INT_MAX in libgroff/lib.h. + +---------------------------------------------------------------------- + +* When compiling on MacOS X, groff compiles but does not run well, + especially `eqn', causing many `can't break line' messages. + +Use ./configure CXX=g++2 then make as usual. diff --git a/PROJECTS b/PROJECTS new file mode 100644 index 0000000..99b215f --- /dev/null +++ b/PROJECTS @@ -0,0 +1,14 @@ +Here are some things that would be useful additions to groff: + + ideal preprocessor + + -mv macros (for typesetting viewgraphs and slides) + + a deroff that understands long names + + a page-makeup postprocessor and associated macro package + (like pm and -mpm) + +If you want to work on one of these, you should probably post to +gnu.groff.bug (or send email to bug-groff@gnu.org) to see if anyone else +has gotten there first. diff --git a/README b/README new file mode 100644 index 0000000..5f80eaf --- /dev/null +++ b/README @@ -0,0 +1,134 @@ +This is the GNU `groff' document formatting system. The version +number is given in the file VERSION. + +Included in this release are implementations of `troff', `pic', `eqn', +`tbl', `grn', `refer', `-man', `-mdoc', `-mom', and `-ms' macros, and +drivers for `PostScript', `TeX dvi' format, `HP LaserJet 4' printers, +`Canon CAPSL' printers, `HTML' format (beta status), and +typewriter-like devices. Also included is a modified version of the +Berkeley `-me' macros, the enhanced version `gxditview' of the X11 +`xditview' previewer, and an implementation of the `-mm' macros +contributed by Joergen Haegg (jh@axis.se). + +See the file `INSTALL' for installation instructions. You will +require a C++ compiler. + +The file `NEWS' describes recent user-visible changes to `groff'. + +`groff' is free software. See the file `COPYING' for copying +permission. + +The file `PROBLEMS' describes various problems that have been +encountered in compiling, installing, and running `groff'. + +The most recent released version of `groff' is always available by +anonymous ftp from `ftp.gnu.org' in the directory `gnu/groff'. + +The current development version of `groff' is available from a `CVS' +repository. You can access it by first selecting a parent directory +in which to create a working copy (call it, say, `~/cvswork'), and +then executing the commands + + cd ~/cvswork + CVS_RSH=ssh; export CVS_RSH + cvs -d:ext:anoncvs@savannah.gnu.org/cvsroot/groff -z5 co groff + +(Note that you need an `ssh' client for security reasons.) + +This will create a subdirectory, `~/cvswork/groff', with a "checked +out" copy of the `CVS' repository. An update of this working copy may +be achieved, at any later time by invoking the commands + + cd ~/cvswork/groff + CVS_RSH=ssh cvs -z5 update -dP + +Please read the `CVS' info pages for further details. + +Finally, it is possible to access the `CVS' with a web browser by +pointing it to + + http://savannah.gnu.org/cvs/?group=groff + +Alternatively, you can download snapshots (which are updated twice a day). +The complete `groff' source as a single file is available at + + http://groff.ffii.org/groff/devel/groff-current.tar.gz + +A diff file relative to `groff-', the latest official `groff' +release is available at + + http://groff.ffii.org/groff/devel/groff--current.diff.gz + +Assuming that `groff-.tar.gz' and +`groff--current.diff.gz' are in the same directory, do the +following to apply the diff file: + + tar xzvf groff-.tar.gz + cd groff- + gunzip -c ../groff--current.diff.gz | patch -p1 + +Depending on your requirements, you may need at least some of the +following tools to build `groff' directly from its source: + + ghostscript + the psutils package + the netpbm package + texinfo 4.8 + bison >= 1.875b or byacc + +Note that `texinfo' and `bison' or `byacc' are required only for +building from `CVS' sources (either a checked out working copy, or a +daily snapshot). They are not required for building from a stable +release tarball. Also note that the version numbers stated are the +minimum supported. No version of `texinfo' < 4.8 will work, and the +original release of `bison' 1.875 is known not to work; you *may* find +that `bison' releases < 1.875 will work, but in case of difficulty, +please update to a later version *before* posting a bug report. + +For *all* sources, you need ghostscript for creation of either `PDF' or +`HTML' output; the `netpbm' and `psutils' packages are required only for +`HTML' output. If you don't intend to produce output in either of these +formats, then these packages are unnecessary. + +In Linux Debian, the installation of `texinfo' is dangerous. For it +creates a file `install-info' that will block the system installation. +So the created `/usr/local/bin/install-info' must be renamed. + +The `groff' configure script searches for the X11 headers and +libraries `Xaw' and `Xmu'. So the corresponding developer packages of +your system must be installed, otherwise `groff' does not install +`gxditview' and the `-TX*' devices. In Debian, the developer packages +are `libxaw7-dev' and `libxmu-dev'. + +Please report bugs using the form in the file `BUG-REPORT'; the idea of +this is to make sure that FSF has all the information it needs to fix +the bug. At the very least, read the `BUG-REPORT' form and make sure +that you supply all the information that it asks for. Even if you are +not sure that something is a bug, report it using `BUG-REPORT': this will +enable us to determine whether it really is a bug or not. + +Three mailing lists are available: + + bug-groff@gnu.org for reporting bugs + groff@gnu.org for general discussion of groff + groff-commit@gnu.org a read-only list showing commitments + to the CVS repository + +You can post mails directly to the `bug-groff' list, without subscribing; +to post mails to the `groff' list you must subscribe to it. + +To subscribe, send a mail to -request@ (example: +groff-request@gnu.org for the `groff' list) with the word `subscribe' +in either the subject or body of the email (don't include the quotes). +Alternatively, you may subscribe by visiting the web pages at + + http://lists.gnu.org/mailman/listinfo/bug-groff + http://lists.gnu.org/mailman/listinfo/groff + http://lists.gnu.org/mailman/listinfo/groff-commit + +Each of these web pages also provides a link to a browseable archive of +postings to the corresponding mailing list. + +GNU `groff' was written by James Clark . It is now +maintained by Ted Harding and Werner +Lemberg . diff --git a/README.MinGW b/README.MinGW new file mode 100644 index 0000000..342aac2 --- /dev/null +++ b/README.MinGW @@ -0,0 +1,277 @@ + README.MinGW + ============ + + Contributed by Keith Marshall (keith.d.marshall@ntlworld.com) + + + INTRODUCTION + ------------ + + This file provides recommendations for building a Win32 implementation of + GNU Groff, using the MinGW port of GCC for Microsoft (TM) Windows-32 + platforms. It is intended to supplement the standard installation + instructions (see file INSTALL); it does not replace them. + + You require both the MinGW implementation of GCC and its supporting MSYS + toolkit, which provides a Win-32 implementation of the GNU bash shell, and a + few other essential utilities; these may be obtained from + + http://sourceforge.net/projects/mingw + + by following the appropriate download links, where they are available as + self-extracting executable installation packages. If installing both from + scratch, it is recommended that MinGW is installed first, as the MSYS + installer can then automatically set up the proper environment for running + MinGW. + + Additionally, if you wish to compile groff with support for its HTML output + capability, some additional tools are required as decribed in the section + PREREQUISITES FOR HTML OUTPUT later in this file. + + + BUILDING GROFF WITH MINGW + ------------------------- + + Assuming that you have obtained the appropriate groff distribution, and that + you are already running an MSYS shell, then the configuration, compilation, + and installation of groff, using MinGW, is performed in much the same way as + it is described in the INSTALL file, which is provided with the groff + distribution. The installation steps are summarised below: + + 1. Change working directory to any suitable location where you may unpack + the groff distribution; you must be authorized for write access. + Approximately 30MB of free disk space are needed. + + 2. Unpack the groff distribution: + + tar xzf /groff-.tar.gz + + This creates a new sub-directory, groff-, containing an image of + the groff source tree. You should now change directory, to make this + ./groff- your working directory. + + 3. If you are intending to build groff with support for HTML output, then + you must now ensure that the prerequisites described in the later section + PREREQUISITES FOR HTML OUTPUT are satisfied, before proceeding to build + groff; in particular, please ensure that all required support programs + are installed in the current PATH. + + 4. You are now ready to configure, build, and install groff. This is + accomplished using the conventional procedure, as described in the file + INSTALL, i.e. + + ./configure --prefix= ... + make + make install + + Please observe the syntax for the configure command, indicated above; the + default value for --prefix is not suitable for use with MinGW, so the + --prefix= option must be specified, where + is the chosen MS-Windows directory in which the + groff application files are to be installed (see the later section + entitled CHOOSING AN INSTALLATION PATH). Any other desired configuration + options may also be specified, as described in the standard groff + installation instructions. + + 5. After completing the above, groff should be successfully installed; the + build directory is no longer required; it may be simply deleted in its + entirety. Alternatively, you may choose to keep it, but to remove all + files which can be reproduced later, by repeating the configure, make and + make install steps; this is readily accomplished by the command + + make distclean + + + This completes the installation of groff; please read the final sections of + this file, GROFF RUNTIME ENVIRONMENT and CAVEATS AND BUGS, for advice on + setting up the runtime environment, and avoiding known runtime problems, + before running groff. + + + CHOOSING AN INSTALLATION PATH + ----------------------------- + + It may be noted that the above instructions indicate that the ./configure + command must be invoked with an argument specifying a preference for + --prefix=, whereas the standard groff installation + instructions indicate that this may be omitted, in which case it defaults to + --prefix=/usr/local. + + In the case of building with MinGW, the default behaviour of configure is + not appropriate for the following reasons. + + o The MSYS environment creates a virtual UNIX-like file system, with its + root mapped to the actual MS-Windows directory where MSYS itself is + installed; /usr is also mapped to this MSYS installation directory. + + o All of the MSYS tools, and the MinGW implementation of GCC, refer to files + via this virtual file system representation; thus, if the + --prefix= is not specified when groff is configured, + `make install' causes groff to be installed in /local. + + o groff needs to know its own installation path, so that it can locate its + own installed components. This information is compiled in, using the + exact form specified with the --prefix= option to + configure. + + o Knowledge of the MSYS virtual file system is not imparted to groff; it + expects the compiled-in path to its components to be a fully qualified + MS-Windows path name (although UNIX-style slashes are permitted, and + preferred to the MS-Windows style backslashes, to demarcate the directory + hierarchy). Thus, when configuring groff, if + --prefix= is not correctly specified, then the + installed groff application looks for its components in /usr/local, and + most likely doesn't find them, because they are actually installed in + /local. + + It is actually convenient, but by no means a requirement, to have groff + installed in the /usr/local directory of the MSYS virtual file system; this + makes it easy to invoke groff from the MSYS shell, since the virtual + /usr/local/bin is normally added automatically to the PATH (the default + PATH, as set in MSYS's /etc/profile), when MSYS is started. + + In order to install groff into MSYS's /usr/local directory, it is necessary + to specify the fully qualified absolute MS-Windows path to this directory, + when configuring groff, i.e. + + ./configure --prefix=/local ... + + For example, on a system where MSYS is installed in the MS-Windows directory + D:\MSYS\1.0, the MSYS virtual path /usr/local resolves to the absolute + MS-Windows native path D:\MSYS\1.0\local (the /usr component of the MSYS + virtual path does not appear in the resolved absolute native path name since + MSYS maps this directly to the root of the MSYS virtual file system). Thus, + the --prefix option should be specified to configure as + + ./configure --prefix=D:/MSYS/1.0/local ... + + Note that the backslash characters, which appear in the native MS-Windows + form of the path name, are replaced by UNIX-style slashes in the argument to + configure; this is the preferred syntax. + + Also note that the MS-Windows device designator (D: in this instance) is + prepended to the specified path, in the normal MS-Windows format, and that, + since upper and lower case distinctions are ignored in MS-Windows path + names, any combination of upper and lower case is acceptable. + + + PREREQUISITES FOR HTML OUTPUT + ----------------------------- + + If you intend to use groff for production of HTML output, then there are a + few dependencies which must be satisfied. Ideally, these should be resolved + before attempting to configure and build groff, since the configuration + script does check them. + + In order to produce HTML output, you first require a working implementation + of Ghostscript; either the AFPL Ghostscript or the GNU Ghostscript + implementation for MS-Windows should be suitable, depending on your + licensing preference. It is highly recommended to use version 8.11 or + higher due to bugs in older versions. These may be obtained, in the form of + self-installing binary packages, by following the download links for the + chosen licensing option, from http://sourceforge.net/projects/ghostscript. + + Please note that these packages install the Ghostscript interpreter required + by groff in the ./bin subdirectory of the Ghostscript installation + directory, with the name gswin32c.exe. However, groff expects this + interpreter to be located in the system PATH, with the name gs.exe. Thus, + to ensure that groff can correctly locate the Ghostscript interpreter, it is + recommended that the file gswin32c.exe should be copied from the Ghostscript + installation directory to the MSYS /usr/local/bin directory, where it should + be renamed to gs.exe. + + In addition to a working Ghostscript interpreter, you also require several + image manipulation utilities, all of which may be scavenged from various + packages available from http://sourceforge.net/projects/gnuwin32, and which + should be installed in the MSYS /usr/local/bin directory, or any other + suitable directory which is specified in the PATH. These additional + prerequisites are + + 1. from the netpbm--bin.zip package: + + netpbm.dll + pnmcrop.exe + pnmcut.exe + pnmtopng.exe + pnmtops.exe + + 2. from the libpng--bin.zip package: + + libpng.dll + + 3. from the zlib--bin.zip package: + + zlib-1.dll, which must be renamed to zlib.dll + + 4. from the psutils--bin.zip package: + + psselect.exe + + Note that it is not necessary to install the above four packages in their + entirety; of course, you may do so if you wish. + + + GROFF RUNTIME ENVIRONMENT + ------------------------- + + The runtime environment, provided to groff by MSYS, is essentially the same + as would be provided under a UNIX or GNU/Linux operating system; thus, any + environment variables which may be used to customize the groff runtime + environment have similar effects under MSYS, as they would in UNIX or + GNU/Linux, with the exception that any variable specifying a path should + adopt the same syntax as a native MS-Windows PATH specification. + + There is, however, one known problem which is associated with the + implementation of the MS-Windows file system, and the manner in which the + Microsoft runtime library (which is used by the MinGW implementation of GCC) + generates names for temporary files. This known problem arises when groff + is invoked with a current working directory which refers to a network share, + for which the user does not have write access in the root directory, and + there is no environment variable set to define a writeable location for + creating temporary files. When these conditions arise, groff fails with a + `permission denied' error, as soon as it tries to create any temporary file. + + To specify the location for creating temporary files, the standard UNIX or + GNU/Linux implementation of groff provides the GROFF_TMPDIR or TMPDIR + environment variables, whereas MS-Windows applications generally use TMP or + TEMP; furthermore, the MS-Windows implementations of Ghostscript apparently + support the use of only TEMP or TMPDIR. + + To avoid problems with creation of temporary files, it is recommended that + you ensure that both TMP and TEMP are defined, with identical values, to + point to a suitable location for creating temporary files; many MS-Windows + boxes have them set already, and groff has been adapted to honour them, when + built in accordance with the preceding instructions, using MinGW. + + + CAVEATS AND BUGS + ---------------- + + There are two known issues, observed when running groff in the MinGW/MSYS + environment, which would not affect groff in its native UNIX environment: + + o Running groff with the working directory set to a subdirectory of a + network share, where the user does not have write permission in the root + directory of the share, causes groff to fail with a `permission denied' + exception, if the TMP environment variable is not appropriately defined; + it may also be necessary to define the TEMP environment variable, to avoid + a similar failure mode, when using the -Thtml output mode of groff. This + problem is more fully discussed in the preceding section, GROFF RUNTIME + ENVIRONMENT. + + o When running groff (or nroff) to process standard input, where the + standard input stream is obtained directly from the RXVT console provided + with MSYS, groff cannot detect the end-of-file condition for the standard + input stream, and hangs. This appears to be caused by a fault in the MSYS + implementation of RXVT; it may be worked around by either starting MSYS + without RXVT (see the comments in the MSYS.BAT startup script); in this + case standard input is terminated by typing followed by , + on a new input line. Alternatively, if you prefer to use MSYS with RXVT, + you can enter the interactive groff command in the form + + cat | groff ... + + in which case terminates the standard input stream, in just the + same way it does on a UNIX system; the cat executable provided with MSYS + does seem to trap the end-of-file condition, and properly signals groff + that the input stream has terminated. diff --git a/REVISION b/REVISION new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/REVISION @@ -0,0 +1 @@ +2 diff --git a/TODO b/TODO new file mode 100644 index 0000000..4e4c6f7 --- /dev/null +++ b/TODO @@ -0,0 +1,25 @@ +Unicode input: + Making groff 21bit input-clean. + +Make -Tlj4 work with -X. + +Guess man5ext and man7ext variables. + +Provide man.sun implementing .TX. + +Improve GROFF_PRINT macro in aclocal.m4. + +Provide a `check' target. + +Provide a `bindist' target. + +Implement tmac.bib in terms of tmac.s. + +Support long options using GNU getopt. + +Catch the following error in -me: +.(z +.(l C +.)z + +Arrows for next/previous page from R5 xditview. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..bc44934 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.19 diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..7e22633 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1152 @@ +# Autoconf macros for groff. +# Copyright (C) 1989-1995, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +AC_DEFUN([GROFF_PRINT], + [if test -z "$PSPRINT"; then + AC_CHECK_PROGS([LPR], [lpr]) + AC_CHECK_PROGS([LP], [lp]) + if test -n "$LPR" && test -n "$LP"; then + # HP-UX provides an lpr command that emulates lpr using lp, + # but it doesn't have lpq; in this case we want to use lp + # rather than lpr. + AC_CHECK_PROGS([LPQ], [lpq]) + test -n "$LPQ" || LPR= + fi + if test -n "$LPR"; then + PSPRINT="$LPR" + elif test -n "$LP"; then + PSPRINT="$LP" + fi + fi + AC_SUBST([PSPRINT]) + AC_MSG_CHECKING([for command to use for printing PostScript files]) + AC_MSG_RESULT([$PSPRINT]) + + # Figure out DVIPRINT from PSPRINT. + AC_MSG_CHECKING([for command to use for printing dvi files]) + if test -n "$PSPRINT" && test -z "$DVIPRINT"; then + if test "x$PSPRINT" = "xlpr"; then + DVIPRINT="lpr -d" + else + DVIPRINT="$PSPRINT" + fi + fi + AC_SUBST([DVIPRINT]) + AC_MSG_RESULT([$DVIPRINT])]) + +# Bison generated parsers have problems with C++ compilers other than g++. +# So byacc is preferred over bison. + +AC_DEFUN([GROFF_PROG_YACC], + [AC_CHECK_PROGS([YACC], [byacc 'bison -y'], [yacc])]) + +# The following programs are needed for grohtml. + +AC_DEFUN([GROFF_HTML_PROGRAMS], + [AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + make_html=html + make_install_html=install_html + + missing= + AC_FOREACH([groff_prog], + [pnmcut pnmcrop pnmtopng psselect pnmtops], + [AC_CHECK_PROG(groff_prog, groff_prog, [found], [missing]) + if test $[]groff_prog = missing; then + missing="$missing \`groff_prog'" + fi;]) + + test "$GHOSTSCRIPT" = "missing" && missing="$missing \`gs'" + + if test -n "$missing"; then + plural=`set $missing; test $[#] -gt 1 && echo s` + missing=`set $missing + missing="" + while test $[#] -gt 0 + do + case $[#] in + 1) missing="$missing$[1]" ;; + 2) missing="$missing$[1] and " ;; + *) missing="$missing$[1], " ;; + esac + shift + done + echo $missing` + + make_html= + make_install_html= + + AC_MSG_WARN([missing program$plural: + + The program$plural + $missing + cannot be found in the PATH. + Consequently, groff's HTML backend (grohtml) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in HTML format. + ]) + fi + + AC_SUBST([make_html]) + AC_SUBST([make_install_html])]) + +# To produce PDF docs, we need both awk and ghostscript. + +AC_DEFUN([GROFF_PDFDOC_PROGRAMS], + [AC_REQUIRE([GROFF_AWK_PATH]) + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + + make_pdfdoc=pdfdoc + make_install_pdfdoc=install_pdfdoc + + missing="" + test "$AWK" = missing && missing="\`awk'" + test "$GHOSTSCRIPT" = missing && missing="$missing \`gs'" + if test -n "$missing"; then + plural=`set $missing; test $[#] -eq 2 && echo s` + test x$plural = xs \ + && missing=`set $missing; echo "$[1] and $[2]"` \ + || missing=`echo $missing` + + make_pdfdoc= + make_install_pdfdoc= + + AC_MSG_WARN([missing program$plural: + + The program$plural $missing cannot be found in the PATH. + Consequently, groff's PDF formatter (pdfroff) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in PDF format. + ]) + fi + + AC_SUBST([make_pdfdoc]) + AC_SUBST([make_install_pdfdoc])]) + +# Check whether pnmtops can handle the -nosetpage option. + +AC_DEFUN([GROFF_PNMTOPS_NOSETPAGE], + [AC_MSG_CHECKING([whether pnmtops can handle the -nosetpage option]) + if echo P2 2 2 255 0 1 2 0 | pnmtops -nosetpage > /dev/null 2>&1 ; then + AC_MSG_RESULT([yes]) + pnmtops_nosetpage="pnmtops -nosetpage" + else + AC_MSG_RESULT([no]) + pnmtops_nosetpage="pnmtops" + fi + AC_SUBST([pnmtops_nosetpage])]) + +# Check location of `gs'; allow `--with-gs=PROG' option to override. + +AC_DEFUN([GROFF_GHOSTSCRIPT_PATH], + [AC_REQUIRE([GROFF_GHOSTSCRIPT_PREFS]) + AC_ARG_WITH([gs], + [AS_HELP_STRING([--with-gs=PROG], + [actual [/path/]name of ghostscript executable])], + [GHOSTSCRIPT=$withval], + [AC_CHECK_TOOLS(GHOSTSCRIPT, [$ALT_GHOSTSCRIPT_PROGS], [missing])]) + test "$GHOSTSCRIPT" = "no" && GHOSTSCRIPT=missing]) + +# Preferences for choice of `gs' program... +# (allow --with-alt-gs="LIST" to override). + +AC_DEFUN([GROFF_GHOSTSCRIPT_PREFS], + [AC_ARG_WITH([alt-gs], + [AS_HELP_STRING([--with-alt-gs=LIST], + [alternative names for ghostscript executable])], + [ALT_GHOSTSCRIPT_PROGS="$withval"], + [ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2"]) + AC_SUBST([ALT_GHOSTSCRIPT_PROGS])]) + +# Check location of `awk'; allow `--with-awk=PROG' option to override. + +AC_DEFUN([GROFF_AWK_PATH], + [AC_REQUIRE([GROFF_AWK_PREFS]) + AC_ARG_WITH([awk], + [AS_HELP_STRING([--with-awk=PROG], + [actual [/path/]name of awk executable])], + [AWK=$withval], + [AC_CHECK_TOOLS(AWK, [$ALT_AWK_PROGS], [missing])]) + test "$AWK" = "no" && AWK=missing]) + +# Preferences for choice of `awk' program; allow --with-alt-awk="LIST" +# to override. + +AC_DEFUN([GROFF_AWK_PREFS], + [AC_ARG_WITH([alt-awk], + [AS_HELP_STRING([--with-alt-awk=LIST], + [alternative names for awk executable])], + [ALT_AWK_PROGS="$withval"], + [ALT_AWK_PROGS="gawk mawk nawk awk"]) + AC_SUBST([ALT_AWK_PROGS])]) + +# GROFF_CSH_HACK(if hack present, if not present) + +AC_DEFUN([GROFF_CSH_HACK], + [AC_MSG_CHECKING([for csh hash hack]) + +cat <conftest.sh +#! /bin/sh +true || exit 0 +export PATH || exit 0 +exit 1 +EOF + + chmod +x conftest.sh + if echo ./conftest.sh | (csh >/dev/null 2>&1) >/dev/null 2>&1; then + AC_MSG_RESULT([yes]) + $1 + else + AC_MSG_RESULT([no]) + $2 + fi + rm -f conftest.sh]) + +# From udodo!hans@relay.NL.net (Hans Zuidam) + +AC_DEFUN([GROFF_ISC_SYSV3], + [AC_MSG_CHECKING([for ISC 3.x or 4.x]) + if grep ['[34]\.'] /usr/options/cb.name >/dev/null 2>&1 + then + AC_MSG_RESULT([yes]) + AC_DEFINE([_SYSV3], [1], [Define if you have ISC 3.x or 4.x.]) + else + AC_MSG_RESULT([no]) + fi]) + +AC_DEFUN([GROFF_POSIX], + [AC_MSG_CHECKING([whether -D_POSIX_SOURCE is necessary]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +extern "C" { void fileno(int); } + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([_POSIX_SOURCE], [1], + [Define if -D_POSIX_SOURCE is necessary.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +# srand() of SunOS 4.1.3 has return type int instead of void + +AC_DEFUN([GROFF_SRAND], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for return type of srand]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +extern "C" { void srand(unsigned int); } + + ]]) + ], + [AC_MSG_RESULT([void]) + AC_DEFINE([RET_TYPE_SRAND_IS_VOID], [1], + [Define if srand() returns void not int.])], + [AC_MSG_RESULT([int])]) + AC_LANG_POP([C++])]) + +# In April 2005, autoconf's AC_TYPE_SIGNAL is still broken. + +AC_DEFUN([GROFF_TYPE_SIGNAL], + [AC_MSG_CHECKING([for return type of signal handlers]) + for groff_declaration in \ + 'extern "C" void (*signal (int, void (*)(int)))(int);' \ + 'extern "C" void (*signal (int, void (*)(int)) throw ())(int);' \ + 'void (*signal ()) ();' + do + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include +#ifdef signal +# undef signal +#endif +$groff_declaration + + ]], + [[ + +int i; + + ]]) + ], + [break], + [continue]) + done + + if test -n "$groff_declaration"; then + AC_MSG_RESULT([void]) + AC_DEFINE([RETSIGTYPE], [void], + [Define as the return type of signal handlers + (`int' or `void').]) + else + AC_MSG_RESULT([int]) + AC_DEFINE([RETSIGTYPE], [int], + [Define as the return type of signal handlers + (`int' or `void').]) + fi]) + +AC_DEFUN([GROFF_SYS_NERR], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for sys_nerr in , , or ]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include +#include + + ]], + [[ + +int k; +k = sys_nerr; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SYS_NERR], [1], + [Define if you have sys_nerr in , , or .])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_SYS_ERRLIST], + [AC_MSG_CHECKING([for sys_errlist[] in , , or ]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include +#include + + ]], + [[ + +int k; +k = (int)sys_errlist[0]; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SYS_ERRLIST], [1], + [Define if you have sys_errlist in , , or .])], + [AC_MSG_RESULT([no])])]) + +AC_DEFUN([GROFF_OSFCN_H], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([C++ ]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include + + ]], + [[ + +read(0, 0, 0); +open(0, 0); + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CC_OSFCN_H], [1], + [Define if you have a C++ .])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_LIMITS_H], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([C++ ]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include + + ]], + [[ + +int x = INT_MIN; +int y = INT_MAX; +int z = UCHAR_MAX; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CC_LIMITS_H], [1], + [Define if you have a C++ .])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_TIME_T], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for declaration of time_t]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include + + ]], + [[ + +time_t t = time(0); +struct tm *p = localtime(&t); + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_DEFINE([LONG_FOR_TIME_T], [1], + [Define if localtime() takes a long * not a time_t *.])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_STRUCT_EXCEPTION], + [AC_MSG_CHECKING([struct exception]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include + + ]], + [[ + +struct exception e; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_STRUCT_EXCEPTION], [1], + [Define if defines struct exception.])], + [AC_MSG_RESULT([no])])]) + +AC_DEFUN([GROFF_ARRAY_DELETE], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([whether ANSI array delete syntax is supported]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM(, [[ + +char *p = new char[5]; +delete [] p; + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_DEFINE([ARRAY_DELETE_NEEDS_SIZE], [1], + [Define if your C++ doesn't understand `delete []'.])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_TRADITIONAL_CPP], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([traditional preprocessor]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#define name2(a, b) a/**/b + + ]], + [[ + +int name2(foo, bar); + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([TRADITIONAL_CPP], [1], + [Define if your C++ compiler uses a traditional (Reiser) preprocessor.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_WCOREFLAG], + [AC_MSG_CHECKING([w_coredump]) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include + + ]], + [[ + +main() +{ +#ifdef WCOREFLAG + exit(1); +#else + int i = 0; + ((union wait *)&i)->w_coredump = 1; + exit(i != 0200); +#endif +} + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE(WCOREFLAG, 0200, + [Define if the 0200 bit of the status returned by wait() indicates + whether a core image was produced for a process that was terminated + by a signal.])], + [AC_MSG_RESULT([no])], + [AC_MSG_RESULT([no])])]) + +AC_DEFUN([GROFF_BROKEN_SPOOLER_FLAGS], + [AC_MSG_CHECKING([default value for grops -b option]) + test -n "${BROKEN_SPOOLER_FLAGS}" || BROKEN_SPOOLER_FLAGS=0 + AC_MSG_RESULT([$BROKEN_SPOOLER_FLAGS]) + AC_SUBST([BROKEN_SPOOLER_FLAGS])]) + +AC_DEFUN([GROFF_PAGE], + [AC_MSG_CHECKING([default paper size]) + groff_prefix=$prefix + test "x$prefix" = "xNONE" && groff_prefix=$ac_default_prefix + if test -z "$PAGE"; then + descfile= + if test -r $groff_prefix/share/groff/font/devps/DESC; then + descfile=$groff_prefix/share/groff/font/devps/DESC + elif test -r $groff_prefix/lib/groff/font/devps/DESC; then + descfile=$groff_prefix/lib/groff/font/devps/DESC + else + for f in $groff_prefix/share/groff/*/font/devps/DESC; do + if test -r $f; then + descfile=$f + break + fi + done + fi + + if test -n "$descfile"; then + if grep ['^paperlength[ ]\+841890'] $descfile >/dev/null 2>&1; then + PAGE=A4 + elif grep ['^papersize[ ]\+[aA]4'] $descfile >/dev/null 2>&1; then + PAGE=A4 + fi + fi + fi + + if test -z "$PAGE"; then + dom=`awk '([$]1 == "dom" || [$]1 == "search") { print [$]2; exit}' \ + /etc/resolv.conf 2>/dev/null` + if test -z "$dom"; then + dom=`(domainname) 2>/dev/null | tr -d '+'` + if test -z "$dom" \ + || test "$dom" = '(none)'; then + dom=`(hostname) 2>/dev/null | grep '\.'` + fi + fi + # If the top-level domain is two letters and it's not `us' or `ca' + # then they probably use A4 paper. + case "$dom" in + [*.[Uu][Ss]|*.[Cc][Aa])] + ;; + [*.[A-Za-z][A-Za-z])] + PAGE=A4 ;; + esac + fi + + test -n "$PAGE" || PAGE=letter + if test "x$PAGE" = "xA4"; then + AC_DEFINE([PAGEA4], [1], + [Define if the printer's page size is A4.]) + fi + AC_MSG_RESULT([$PAGE]) + AC_SUBST([PAGE])]) + +AC_DEFUN([GROFF_CXX_CHECK], + [AC_REQUIRE([AC_PROG_CXX]) + AC_LANG_PUSH([C++]) + if test "$cross_compiling" = no; then + AC_MSG_CHECKING([that C++ compiler can compile simple program]) + fi + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ + +int main() { + return 0; +} + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([a working C++ compiler is required])], + [:]) + + if test "$cross_compiling" = no; then + AC_MSG_CHECKING([that C++ static constructors and destructors are called]) + fi + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ + +extern "C" { + void _exit(int); +} + +int i; +struct A { + char dummy; + A() { i = 1; } + ~A() { if (i == 1) _exit(0); } +}; + +A a; + +int main() +{ + return 1; +} + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([a working C++ compiler is required])], + [:]) + + AC_MSG_CHECKING([that header files support C++]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include + + ]], + [[ + +fopen(0, 0); + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([header files do not support C++ + (if you are using a version of gcc/g++ earlier than 2.5, + you should install libg++)])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_TMAC], + [AC_MSG_CHECKING([for prefix of system macro packages]) + sys_tmac_prefix= + sys_tmac_file_prefix= + for d in /usr/share/lib/tmac /usr/lib/tmac; do + for t in "" tmac.; do + for m in an s m; do + f=$d/$t$m + if test -z "$sys_tmac_prefix" \ + && test -f $f \ + && grep '^\.if' $f >/dev/null 2>&1; then + sys_tmac_prefix=$d/$t + sys_tmac_file_prefix=$t + fi + done + done + done + AC_MSG_RESULT([$sys_tmac_prefix]) + AC_SUBST([sys_tmac_prefix]) + + AC_MSG_CHECKING([which system macro packages should be made available]) + tmac_wrap= + if test "x$sys_tmac_file_prefix" = "xtmac."; then + for f in $sys_tmac_prefix*; do + suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` + case "$suff" in + e) + ;; + *) + grep "Copyright.*Free Software Foundation" $f >/dev/null \ + || tmac_wrap="$tmac_wrap $suff" ;; + esac + done + elif test -n "$sys_tmac_prefix"; then + files=`echo $sys_tmac_prefix*` + grep "\\.so" $files >conftest.sol + for f in $files; do + case "$f" in + ${sys_tmac_prefix}e) + ;; + *.me) + ;; + */ms.*) + ;; + *) + b=`basename $f` + if grep "\\.so.*/$b\$" conftest.sol >/dev/null \ + || grep -l "Copyright.*Free Software Foundation" $f >/dev/null; then + : + else + suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` + case "$suff" in + tmac.*) + ;; + *) + tmac_wrap="$tmac_wrap $suff" ;; + esac + fi + esac + done + rm -f conftest.sol + fi + AC_MSG_RESULT([$tmac_wrap]) + AC_SUBST([tmac_wrap])]) + +AC_DEFUN([GROFF_G], + [AC_MSG_CHECKING([for existing troff installation]) + if test "x`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) 2>/dev/null`" = x0; then + AC_MSG_RESULT([yes]) + g=g + else + AC_MSG_RESULT([no]) + g= + fi + AC_SUBST([g])]) + +# We need the path to install-sh to be absolute. + +AC_DEFUN([GROFF_INSTALL_SH], + [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) + ac_dir=`cd $ac_aux_dir; pwd` + ac_install_sh="$ac_dir/install-sh -c"]) + +# Test whether install-info is available. + +AC_DEFUN([GROFF_INSTALL_INFO], + [AC_CHECK_PROGS([INSTALL_INFO], [install-info], [:])]) + +# At least one UNIX system, Apple Macintosh Rhapsody 5.5, +# does not have -lm ... + +AC_DEFUN([GROFF_LIBM], + [AC_CHECK_LIB([m], [sin], [LIBM=-lm]) + AC_SUBST([LIBM])]) + +# ... while the MinGW implementation of GCC for Microsoft Win32 +# does not seem to have -lc. + +AC_DEFUN([GROFF_LIBC], + [AC_CHECK_LIB([c], [main], [LIBC=-lc]) + AC_SUBST([LIBC])]) + +# Check for EBCDIC -- stolen from the OS390 Unix LYNX port + +AC_DEFUN([GROFF_EBCDIC], + [AC_MSG_CHECKING([whether character set is EBCDIC]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +/* Treat any failure as ASCII for compatibility with existing art. + Use compile-time rather than run-time tests for cross-compiler + tolerance. */ +#if '0' != 240 +make an error "Character set is not EBCDIC" +#endif + + ]]) + ], + [groff_cv_ebcdic="yes" + TTYDEVDIRS="font/devcp1047" + AC_MSG_RESULT([yes]) + AC_DEFINE(IS_EBCDIC_HOST, 1, + [Define if the host's encoding is EBCDIC.])], + [groff_cv_ebcdic="no" + TTYDEVDIRS="font/devascii font/devlatin1" + OTHERDEVDIRS="font/devlj4 font/devlbp" + AC_MSG_RESULT([no])]) + AC_SUBST([TTYDEVDIRS]) + AC_SUBST([OTHERDEVDIRS])]) + +# Check for OS/390 Unix. We test for EBCDIC also -- the Linux port (with +# gcc) to OS/390 uses ASCII internally. + +AC_DEFUN([GROFF_OS390], + [if test "$groff_cv_ebcdic" = "yes"; then + AC_MSG_CHECKING([for OS/390 Unix]) + case `uname` in + OS/390) + CFLAGS="$CFLAGS -D_ALL_SOURCE" + AC_MSG_RESULT([yes]) ;; + *) + AC_MSG_RESULT([no]) ;; + esac + fi]) + +# Check whether we need a declaration for a function. +# +# Stolen from GNU bfd. + +AC_DEFUN([GROFF_NEED_DECLARATION], + [AC_MSG_CHECKING([whether $1 must be declared]) + AC_LANG_PUSH([C++]) + AC_CACHE_VAL([groff_cv_decl_needed_$1], + [AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + ]], + [[ + +#ifndef $1 + char *p = (char *) $1; +#endif + + ]]) + ], + [groff_cv_decl_needed_$1=no], + [groff_cv_decl_needed_$1=yes])]) + AC_MSG_RESULT([$groff_cv_decl_needed_$1]) + if test $groff_cv_decl_needed_$1 = yes; then + AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), [1], + [Define if your C++ doesn't declare ]$1[().]) + fi + AC_LANG_POP([C++])]) + +# If mkstemp() isn't available, use our own mkstemp.cpp file. + +AC_DEFUN([GROFF_MKSTEMP], + [AC_MSG_CHECKING([for mkstemp]) + AC_LANG_PUSH([C++]) + AC_LIBSOURCE([mkstemp.cpp]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include +int (*f) (char *); + + ]], + [[ + +f = mkstemp; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_MKSTEMP], [1], [Define if you have mkstemp().])], + [AC_MSG_RESULT([no]) + _AC_LIBOBJ([mkstemp])]) + AC_LANG_POP([C++])]) + +# Test whether exists, doesn't clash with , +# and declares uintmax_t. Taken from the fileutils package. + +AC_DEFUN([GROFF_INTTYPES_H], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([C++ ]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include + + ]], + [[ + +uintmax_t i = (uintmax_t)-1; + + ]]) + ], + [groff_cv_header_inttypes_h=yes + AC_DEFINE([HAVE_CC_INTTYPES_H], [1], + [Define if you have a C++ .])], + [groff_cv_header_inttypes_h=no]) + AC_MSG_RESULT([$groff_cv_header_inttypes_h]) + AC_LANG_POP([C++])]) + +# Test for working `unsigned long long'. Taken from the fileutils package. + +AC_DEFUN([GROFF_UNSIGNED_LONG_LONG], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for unsigned long long]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +unsigned long long ull = 1; +int i = 63; +unsigned long long ullmax = (unsigned long long)-1; + + ]], + [[ + +return ull << i | ull >> i | ullmax / ull | ullmax % ull; + + ]]) + ], + [groff_cv_type_unsigned_long_long=yes], + [groff_cv_type_unsigned_long_long=no]) + AC_MSG_RESULT([$groff_cv_type_unsigned_long_long]) + AC_LANG_POP([C++])]) + +# Define uintmax_t to `unsigned long' or `unsigned long long' +# if does not exist. Taken from the fileutils package. + +AC_DEFUN([GROFF_UINTMAX_T], + [AC_REQUIRE([GROFF_INTTYPES_H]) + if test $groff_cv_header_inttypes_h = no; then + AC_REQUIRE([GROFF_UNSIGNED_LONG_LONG]) + test $groff_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type], + [Define uintmax_t to `unsigned long' or `unsigned long long' if + does not exist.]) + fi]) + +# Identify PATH_SEPARATOR character to use in GROFF_FONT_PATH and +# GROFF_TMAC_PATH which is appropriate for the target system (POSIX=':', +# MS-DOS/Win32=';'). +# +# The logic to resolve this test is already encapsulated in +# `${srcdir}/src/include/nonposix.h'. + +AC_DEFUN([GROFF_TARGET_PATH_SEPARATOR], + [AC_MSG_CHECKING([separator character to use in groff search paths]) + cp ${srcdir}/src/include/nonposix.h conftest.h + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include "conftest.h" + + ]], + [[ + +#if PATH_SEP_CHAR == ';' +make an error "Path separator is ';'" +#endif + + ]]) + ], + [GROFF_PATH_SEPARATOR=":"], + [GROFF_PATH_SEPARATOR=";"]) + AC_MSG_RESULT([$GROFF_PATH_SEPARATOR]) + AC_SUBST(GROFF_PATH_SEPARATOR)]) + +# Check for X11. + +AC_DEFUN([GROFF_X11], + [AC_REQUIRE([AC_PATH_XTRA]) + groff_no_x=$no_x + if test -z "$groff_no_x"; then + OLDCFLAGS=$CFLAGS + OLDLDFLAGS=$LDFLAGS + OLDLIBS=$LIBS + CFLAGS="$CFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS $X_LIBS" + LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + + LIBS="$LIBS -lXaw" + AC_MSG_CHECKING([for Xaw library and header files]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include + + ]], + []) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + groff_no_x="yes"]) + + LIBS="$LIBS -lXmu" + AC_MSG_CHECKING([for Xmu library and header files]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include + + ]], + []) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + groff_no_x="yes"]) + + CFLAGS=$OLDCFLAGS + LDFLAGS=$OLDLDFLAGS + LIBS=$OLDLIBS + fi + + if test "x$groff_no_x" = "xyes"; then + AC_MSG_NOTICE([gxditview and xtotroff won't be built]) + else + XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" + XPROGDIRS="src/devices/xditview src/utils/xtotroff" + XLIBDIRS="src/libs/libxutil" + fi + + AC_SUBST([XDEVDIRS]) + AC_SUBST([XPROGDIRS]) + AC_SUBST([XLIBDIRS])]) + +# Set up the `--with-appresdir' command line option. + +AC_DEFUN([GROFF_APPRESDIR_OPTION], + [AC_ARG_WITH([appresdir], + dnl Don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-appresdir=DIR], + [X11 application resource files]))]) + +# Get a default value for the application resource directory. +# +# We ignore the `XAPPLRES' and `XUSERFILESEARCHPATH' environment variables. +# +# The goal is to find the `root' of X11. Under most systems this is +# `/usr/X11/lib'. Application default files are then in +# `/usr/X11/lib/X11/app-defaults'. +# +# Based on autoconf's AC_PATH_X macro. + +AC_DEFUN([GROFF_APPRESDIR_DEFAULT], + [if test -z "$groff_no_x"; then + # Create an Imakefile, run `xmkmf', then `make'. + rm -f -r conftest.dir + if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put `make' in the Imakefile rules, + # since we grep it out. + cat >Imakefile <<'EOF' + +xlibdirs: + @echo 'groff_x_usrlibdir="${USRLIBDIR}"; groff_x_libdir="${LIBDIR}"' +EOF + + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", + # which would confuse us. + eval `${MAKE-make} xlibdirs 2>/dev/null | grep -v make` + + # Open Windows `xmkmf' reportedly sets LIBDIR instead of USRLIBDIR. + for groff_extension in a so sl; do + if test ! -f $groff_x_usrlibdir/libX11.$groff_extension && + test -f $groff_x_libdir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_x_libdir + break + fi + done + fi + + cd .. + rm -f -r conftest.dir + fi + + # In case the test with `xmkmf' wasn't successful, try a suite of + # standard directories. Check `X11' before `X11Rn' because it is often + # a symlink to the current release. + groff_x_libdirs=' + /usr/X11/lib + /usr/X11R6/lib + /usr/X11R5/lib + /usr/X11R4/lib + + /usr/lib/X11 + /usr/lib/X11R6 + /usr/lib/X11R5 + /usr/lib/X11R4 + + /usr/local/X11/lib + /usr/local/X11R6/lib + /usr/local/X11R5/lib + /usr/local/X11R4/lib + + /usr/local/lib/X11 + /usr/local/lib/X11R6 + /usr/local/lib/X11R5 + /usr/local/lib/X11R4 + + /usr/X386/lib + /usr/x386/lib + /usr/XFree86/lib/X11 + + /usr/lib + /usr/local/lib + /usr/unsupported/lib + /usr/athena/lib + /usr/local/x11r5/lib + /usr/lpp/Xamples/lib + + /usr/openwin/lib + /usr/openwin/share/lib' + + if test -z "$groff_x_usrlibdir"; then + # We only test whether libX11 exists. + for groff_dir in $groff_x_libdirs; do + for groff_extension in a so sl; do + if test ! -r $groff_dir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_dir + break 2 + fi + done + done + fi + + if test "x$with_appresdir" = "x"; then + appresdir=$groff_x_usrlibdir/X11/app-defaults + else + appresdir=$with_appresdir + fi + fi + AC_SUBST([appresdir])]) + + +# Emit warning if --with-appresdir hasn't been used. + +AC_DEFUN([GROFF_APPRESDIR_CHECK], + [if test -z "$groff_no_x"; then + if test "x$with_appresdir" = "x"; then + AC_MSG_NOTICE([ + + The application resource file for gxditview will be installed as + + $appresdir/GXditview + + (an existing file will be saved as `GXditview.old'). + To install it into a different directory, say, `/etc/gxditview', + add `--with-appresdir=/etc/gxditview' to the configure script + command line options and rerun it. The environment variable + `APPLRESDIR' must then be set to `/etc/' (note the trailing slash), + omitting the `gxditview' part which is automatically appended by + the X11 searching routines for resource files. More details can be + found in the X(7) manual page. + ]) + fi + fi]) diff --git a/arch/djgpp/README b/arch/djgpp/README new file mode 100644 index 0000000..49b798e --- /dev/null +++ b/arch/djgpp/README @@ -0,0 +1,346 @@ +This is a port of GNU Groff to DJGPP v2.03 or later. +Groff is the GNU version of document formatting tools related to +`troff'. + +This README file describes how to build and install Groff on MS-DOS or +MS-Windows systems using the DJGPP port of GNU C/C++ compiler and +development tools. + + +I. Installing the pre-compiled binary package + ------------------------------------------ + + 1. Unzip the file groNNNb.zip (where NNN is the version number) + preserving the directory structure (-d switch to PKUNZIP) from + the main DJGPP installation directory. If you will use Groff + on Windows 9X or Windows2000, use an unzip program which + supports long filenames. + + 2. Groff binaries were configured so that they will look for their + standard directories under the directory pointed to by the + DJDIR environment variable, so it should work automatically if + you have DJGPP installed. If you don't have a standard DJGPP + installation, set the variable DJDIR to point to the directory + where you unzip Groff. In this latter case, you will need to + set additional environment variables: + + GROFF_TMAC_PATH=%DJDIR%/share/groff//tmac:%DJDIR%/share/groff/site-tmac + GROFF_TYPESETTER=ascii + GROFF_FONT_PATH=%DJDIR%/share/groff//font + + is something like `1.16.1' or `1.17'. + + In addition, you can set the variable GROFF_TMPDIR to point to + a directory where you want Groff to create temporary files it + needs for running its jobs (these files are automatically + deleted when Groff exits). + + All of those variables are automatically set in the file + DJGPP.ENV that is part of the standard DJGPP distribution + djdevNNN.zip (where NNN is the DJGPP version number), so you + only need to set them manually if you don't have DJGPP + installed. + + Note that the GROFF_TYPESETTER variable sets the default Groff + device to be `ascii', which is suitable for formatting man + pages to be viewed on the terminal. Use the -T switch to + generate output for other devices (e.g., -Tps for PostScript). + + 3. If your TMPDIR environment variable points to a RAM drive, you + might consider changing GROFF_TMPDIR to point to a directory on + a real disk drive, especially if you intend to generate + PostScript output, because RAM disks are typically small (2-3 + MBytes) which might be not enough for formatting large + documents. + + 4. Read the docs. It comes as formatted manual pages called *.1, + *.5 and *.7 which unzip into your man/ subdirectory. You + can read them with a pager such as GNU Less (recommended, as + Less will use colors for bold and underlined text) or with + Info (which will remove the bold/underline attributes). + Another alternative is to use Emacs built-in man page reader; + the DJGPP FAQ lists other possibilities. + + Beginning with version 1.15, Groff comes with an Info manual; + type "info -f groff" to read it. The Info manual is still + under construction, so some sections are empty. + + If you want to add a Groff entry to the main Info menu in the + file DIR, chdir to the `info' subdirectory of the main Groff + installation directory and run this command: + + install-info --dir-file=dir groff.info + + After you do that, "info groff" will also work. + + 5. For those who only need Groff to format man pages and don't + like reading the docs, here's a minimal cookbook: + + groff -man -s foo.1 > foo.man + + where `foo.1' is the troff source of the man page and `foo.man' + is the formatted page. If you need to view the man page, say + this: + + groff -man -s foo.1 | less + + You can also use the DJGPP clone of the Unix `man' command, in + which case `man' runs the above command for you automatically. + + Here's how you print man pages on a PostScript printer: + + groff -man -s -Tps foo.1 > prn + + And this is for a LaserJet4 printer: + + groff -man -s -Tlj4 foo.1 > prn + + Printing the documents produced by Groff is possible either by + redirecting Groff's standard output to the local printer + device, like shown above, or by using the `-l' switch to Groff. + The latter possibility causes Groff to pipe its output to a + program whose name and arguments appear in the files named + `DESC' in each of the `devFOO' subdirectories of the + %DJDIR%/share/groff//font directory; for example, the + file devps/DESC is used by "groff -Tps". The relevant line in + these files begins with the word "print". + + As configured, when invoked with the `-l' switch, Groff will + call `cat' (from GNU Textutils) to pipe its output to the + default printer device for -Tps, -Tlbp and -Tlj4 options, and + it will call `dvilj4' (from the dvljNNNb.zip package) for -Tdvi + option. If you don't have these programs installed, you can + edit the respective `DESC' files to replace these commands with + something else. The replacement program must be able to read + its standard input and send its output to whatever printer you + want. The "print" entry is assumed to be a shell command, so + it can use redirection, pipes, and other shell features. + + Beginning with version 1.15, Groff can create HTML output, like + this: + + groff -man -s -Thtml foo.1 > foo.html + + Producing HTML files sometimes requires Ghostscript to be + installed, and, for gif images, ppmquant and ppmtogif as well. + If you do not have these programs installed, Groff will print + an error message, and the produced file will have links which + will fail to resolve when you view it with a Web browser. + + 6. Some programs in the package are supplied as Unix shell + scripts. While it is relatively easy to write a DOS batch file + which will do the same, DOS doesn't allow to redirect input and + output of a batch file. Since Groff tools are meant to be + invoked in a pipe, the batch files are not very useful. The + batch files are included in the binary distribution + nonetheless. + + These scripts need the following utilities to run (in addition + to the Groff programs they invoke): + + - bash + - gawk + - egrep + - sed + + The `afmtodit' and `mmroff' utilities are Perl scripts, so you + will need a Perl port to run them. + + All of these ports should be available from the DJGPP sites. + + If you need to run these scripts and batch files, you have to + install the port of bash (or another Unix-like shell) and the + above-mentioned utilities called by the script. Alternatively, + just look inside the shell script and invoke the programs it + calls manually. + + To run the scripts with redirection, invoke them via the shell, + like this: "sh mmroff > foo". + + 7. Note that Groff programs use floating point, so you will need + an FP emulator if your machine doesn't have an FPU. The binary + distribution includes the emulator, in case you don't have the + DJGPP development environment installed. Please refer to the + DJGPP FAQ list in case you have any problems with the emulator. + + 8. The package does not include the directories under + share/groff//font whose names begin with "devX": these + are needed on X-Windows for running the gxditview program, which + is not supported by this port. + + 9. Due to 8+3 limitations of DOS filesystems, several files were + renamed: + + - groff_mdoc.samples.7 was renamed to groff-mdoc_samples.7 + and groff_mmse.7 to groff-mmse.7. The latter was also + converted from Latin-1 encoding to codepage 437. + + + +II. Building Groff from sources + --------------------------- + + 1. To build Groff, you will need the following tools (the file + name in parentheses is what you need to download from one of + the DJGPP sites): + + - Standard DJGPP development environment (djdev203.zip) + - GNU C compiler (gcc2721b.zip) + - GNU C++ compiler (gpp2721b.zip) + - GNU Make 3.79 (mak379b.zip) + - Bash v2.03 (bsh203b.zip) + - Fileutils 3.16 (fil316b.zip) + - Textutils 2.0 (txt20b.zip) + - Sh-utils 1.12 (shl112b.zip) + - Sed 3.02 (sed302b.zip) + - Gawk 3.04 (gwk304b.zip) + - Grep 2.4 (grep24b.zip) + - Bison (only if you change one of the *.y files) + + Note that you don't need to install libg++ (lgpNNNb.zip) since + Groff doesn't use any C++ classes except its own. + + Any versions of the utilities later than what's mentioned above + should also do; in particular, GCC 2.95.2 was tested and Groff + built okay with it. Versions older than in the above list + might also work, but I don't guarantee that; you are on your + own. + + Special considerations apply if you have GCC 2.8.1 installed, + and cannot upgrade to a later version. See paragraph 4 below. + + After you install these tools, make sure you have a ``symlink'' + to bash.exe called sh.exe and a ``symlink'' to gawk.exe called + awk.exe. If not, go to the DJGPP bin/ subdirectory and type + the following words of wisdom from the DOS prompt: + + ln -s bash.exe sh.exe + ln -s gawk.exe awk.exe + + (`ln' is part of GNU Fileutils, see above.) + + 2. Unzip the source distribution groXYZs.zip (where XYZ is the + version number) preserving the directory structure (-d switch + to PKUNZIP) from the main DJGPP installation directory. (If + you are building Groff on Windows 9X or Windows 2000, use an + unzip program which supports long filenames.) This creates + directory gnu/groff-X.YZ and unzips the sources there. + + If you are building from the official GNU distribution, unpack + the .tar.gz archive like this: + + djtar -x groff-X.YZ.tar.gz + + (DJTAR is part of the standard DJGPP development distribution.) + + 3. Groff sources on DJGPP sites are already configured for the + current version of DJGPP. If that is the version you have, + then you can just chdir to gnu/groff-X.YZ and say "make" to + build the entire package (if you have GCC 2.8.1, see the next + paragraph). + + If you have version of DJGPP other than the current one, or if + you build the official GNU distribution, or if you prefer to + configure the package so that it defaults to the directory + structure on your machine, or need to change some options + (e.g., compile with different optimization options), you will + have to reconfigure Groff. To this end, use the CONFIG.BAT + batch file in the DJGPP subdirectory: + + arch\djgpp\config + + You can configure and build Groff from outside its source + directory. In that case, you need to pass the full path to the + source directory as an argument to CONFIG.BAT, like this: + + d:\gnu\groff-1.16\arch\djgpp\config d:/gnu/groff-1.16 + + Note that you MUST use forward slashes in the path you pass to + CONFIG.BAT, or else it may fail. (For versions of Groff other + than 1.16, change the above command accordingly.) + + 4. If your version of GCC is 2.8.1, you cannot build the + preconfigured package without some tinkering. The DJGPP port + of GCC 2.8.1 had a bug in its C++ configuration, whereby the + file _G_config.h erroneously indicated that the header + is available, and also undefined the symbol + NULL. This causes several files in the Groff distribution to + fail to compile. + + The easiest way to solve this is to upgrade to a later version + of GCC; then you can simply say "make" to build the + preconfigured package. If this is not an option, you will have + to edit the file lang/cxx/_G_config.h and change this line: + + #define _G_HAVE_SYS_SOCKET 1 + + to say this instead: + + #define _G_HAVE_SYS_SOCKET 0 + + The problem with redefining NULL should not happen with DJGPP + v2.03 or later. But if you still see compilation errors which + say "`NULL' undeclared", comment out the line in _G_config.h + that says this: + + #undef NULL + + Alternatively, you can reconfigure the package as described in + the previous paragraph, before building it. + + 5. After the configure script exits, say "make" to build Groff. + Groff is a large package, and it might take a few minutes to + build, depending on your CPU, so you might as well go for a + coffee while it grinds away. + + 6. Test the package that you have built. A batch file T-GROFF.BAT + in the DJGPP subdirectory is supplied for that purpose. Most + of the commands there are commented out, since I cannot + possibly know what kind of printer do you have and which + additional programs, such as Less, do you have installed. The + only command that runs by default will format a large document + and print it to the screen. Read the comments in the batch + file, uncomment additional lines as you see fit and run the + batch file to see that you get the document printed as you'd + expect. (Btw, the document that the batch file prints is an + introduction to the entire Groff package, so you might as well + read it to make yourself familiar with the programs.) + + Note that the batch file sets a lot of environment variables; + if you get ``Out of environment space'' messages, launch a + subsidiary COMMAND.COM with plenty of environment space, like + so: + + command.com /e:3000 + + then invoke T-GROFF.BAT from that COMMAND.COM. + + 7. Install the package by typing "make install". This will copy + all the binaries, the auxiliary files (fonts, macros, etc.) and + the docs into their places. If you configured the package for + your system, these are precisely the directories where the + files should remain (with the exception of the man pages, see + below). If you use the default configuration, the files will + be installed under the top DJGPP installation directory. + + Alternatively, you could instruct Make explicitly where to + install the package by setting the `prefix' variable. For + example: + + make install prefix=c:/groff + + "make install" doesn't format the man pages, it just copies + them into subdirectories of the %DJDIR%\MAN directory. If you + need to keep formatted pages in your man/ subdirectory, you + will need to format them. Use the commands shown in chapter I, + section 5 above to do that, and redirect its output to the + appropriate catN subdirectory. Alternatively, you could format + the pages when you need to view them (the DJGPP clone of `man' + will automatically format them). + + Consult the installation instructions for pre-compiled binaries + above, for more info about installing and using Groff. + + 8. You can safely delete the directories under + share/groff//font whose names begin with "devX": these + are needed on X-Windows which is not supported by this port. diff --git a/arch/djgpp/config.bat b/arch/djgpp/config.bat new file mode 100644 index 0000000..699a868 --- /dev/null +++ b/arch/djgpp/config.bat @@ -0,0 +1,95 @@ +@echo off +echo Configuring GNU Groff for DJGPP v2.x... + +Rem The SmallEnv tests protect against fixed and too small size +Rem of the environment in stock DOS shell. + +Rem Find out where the sources are +set XSRC=. +if not "%XSRC%" == "." goto SmallEnv +if "%1" == "" goto InPlace +set XSRC=%1 +if not "%XSRC%" == "%1" goto SmallEnv +redir -e /dev/null update %XSRC%/configure.orig ./configure +if not exist configure update %XSRC%/configure ./configure + +:InPlace +Rem Update configuration files +echo Updating configuration scripts... +if not exist configure.orig update configure configure.orig +sed -f %XSRC%/arch/djgpp/config.sed configure.orig > configure +if errorlevel 1 goto SedError + +Rem Make sure they have a config.site file +set CONFIG_SITE=%XSRC%/arch/djgpp/config.site +if not "%CONFIG_SITE%" == "%XSRC%/arch/djgpp/config.site" goto SmallEnv + +Rem This is required because DOS/Windows are case-insensitive +Rem to file names, and "make install" will do nothing if Make +Rem finds a file called `install'. +if exist INSTALL ren INSTALL INSTALL.txt + +Rem Set HOSTNAME so it shows in config.status +if not "%HOSTNAME%" == "" goto hostdone +if "%windir%" == "" goto msdos +set OS=MS-Windows +if not "%OS%" == "MS-Windows" goto SmallEnv +goto haveos +:msdos +set OS=MS-DOS +if not "%OS%" == "MS-DOS" goto SmallEnv +:haveos +if not "%USERNAME%" == "" goto haveuname +if not "%USER%" == "" goto haveuser +echo No USERNAME and no USER found in the environment, using default values +set HOSTNAME=Unknown PC +if not "%HOSTNAME%" == "Unknown PC" goto SmallEnv +:haveuser +set HOSTNAME=%USER%'s PC +if not "%HOSTNAME%" == "%USER%'s PC" goto SmallEnv +goto userdone +:haveuname +set HOSTNAME=%USERNAME%'s PC +if not "%HOSTNAME%" == "%USERNAME%'s PC" goto SmallEnv +:userdone +set _HOSTNAME=%HOSTNAME%, %OS% +if not "%_HOSTNAME%" == "%HOSTNAME%, %OS%" goto SmallEnv +set HOSTNAME=%_HOSTNAME% +:hostdone +set _HOSTNAME= +set OS= + +Rem install-sh is required by the configure script but clashes with the +Rem various Makefile install-foo targets, so we MUST have it before the +Rem script runs and rename it afterwards +test -f install-sh +if not errorlevel 1 goto noren1 +test -f install-sh.sh +if not errorlevel 1 mv -f install-sh.sh install-sh +:noren1 +echo Running the ./configure script... +sh ./configure --src=%XSRC% --disable-nls --without-x +if errorlevel 1 goto CfgError +test -f install-sh.sh +if not errorlevel 1 goto noren2 +test -f install-sh +if not errorlevel 1 mv -f install-sh install-sh.sh +:noren2 +echo Done. +goto End + +:SedError +echo ./configure script editing failed! +goto End + +:CfgError +echo ./configure script exited abnormally! +goto End + +:SmallEnv +echo Your environment size is too small. Enlarge it and run me again. +echo Configuration NOT done! +:End +set XSRC= +set CONFIG_SITE= +set HOSTNAME= diff --git a/arch/djgpp/config.sed b/arch/djgpp/config.sed new file mode 100644 index 0000000..6127488 --- /dev/null +++ b/arch/djgpp/config.sed @@ -0,0 +1,16 @@ +# Additional editing of Makefiles and atconfig +/ac_given_INSTALL=/,/^CEOF/ { + /^s%@g@%/a\ + /path=/s,:,;,g +} + +# DOS-style absolute file names should be supported as well +/\*) srcdir=/s,/\*,[\\\\/]* | [A-z]:[\\\\/]*, +/\$]\*) INSTALL=/s,\[/\$\]\*,[\\\\/$]* | [A-z]:[\\\\/]*, + +# Who said each line has only \012 at its end? +/DEFS=`sed -f/s,'\\012','\\012\\015', + +# Switch the order of the two Sed commands, since DOS path names +# could include a colon +/ac_file_inputs=/s,\( -e "s%\^%\$ac_given_srcdir/%"\)\( -e "s%:% $ac_given_srcdir/%g"\),\2\1, diff --git a/arch/djgpp/config.site b/arch/djgpp/config.site new file mode 100644 index 0000000..e42b341 --- /dev/null +++ b/arch/djgpp/config.site @@ -0,0 +1,33 @@ +#! /bin/sh + +# This is the config.site file for configuring GNU packages +# which are to be built with DJGPP tools. + +# These two variables are required, otherwise looking for +# programs along the PATH will not work. +PATH_SEPARATOR=: +PATH_EXPAND=y + +# This is required in for "test -f foo" to find foo.exe +export TEST_FINDS_EXE=y + +# The root of the DJGPP tree serves as the default prefix +test "x$prefix" = xNONE && prefix='/dev/env/DJDIR' + +# This is required for config.status script to be run, since +# ./configure runs it by invoking ${CONFIG_SHELL-/bin/sh} +CONFIG_SHELL=${CONFIG_SHELL='sh'} + +# These are set here so the generated Makefile's will be good +# for every DJGPP installation, not only the one where the +# package was configured. +# $INSTALL must be an absolute path name, otherwise config.status +# will try to prepend ./ and ../ to it when it goes into subdirs. +INSTALL=${INSTALL='/dev/env/DJDIR/bin/ginstall -c'} +RANLIB=${RANLIB='ranlib'} +LPR=${LPR='cat >>PRN'} +DVIPRINT=${DVIPRINT='dvilj4 - >>PRN'} +PERLPATH=${PERLPATH='/usr/bin/perl'} + +# Force `cp' to be used instead of "ln -s". +ac_cv_prog_LN_S="cp -p" diff --git a/arch/djgpp/t-groff.bat b/arch/djgpp/t-groff.bat new file mode 100644 index 0000000..0aea5d0 --- /dev/null +++ b/arch/djgpp/t-groff.bat @@ -0,0 +1,64 @@ +@echo off +Rem This script runs groff without requiring that it be installed. +Rem The current directory must be the build directory. + +test -d ./src/roff/groff +if not errorlevel 1 goto dirOk +echo this batch file must be run with the build directory as the current directory +goto end +:dirOk +test -x ./src/roff/groff/groff +if not errorlevel 1 goto groffOk +echo this batch file must be run with the build directory as the current directory +goto end +:groffOk +Rem chdir to src, to avoid overflowing the DOS limits with a long PATH. +cd src +set GROFF_FONT_PATH=..;../font +set GROFF_TMAC_PATH=../tmac +set PATH1=%PATH% +set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refer;preproc\soelim;devices\grotty;%PATH1% +Rem +echo I will use this command to format a document and print it on the screen: +roff\groff\groff -V -e -s -t -p -R -m ttchar -me -Tascii ../doc/meintro.me +pause +Rem Make the following command pipe to Less if you have Less installed: +roff\groff\groff -e -s -t -p -R -m ttchar -me -Tascii ../doc/meintro.me +Rem +set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refer;preproc\soelim;devices\grops;%PATH1% +echo I will use this command to format a document and print it on PS printer: +roff\groff\groff -V -e -s -t -p -R -me -Tps ../doc/meintro.me +pause +Rem Uncomment the following command if you have a PostScript printer: +REM roff\groff\groff -e -s -t -p -R -me -Tps ../doc/meintro.me >>prn +Rem +set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refer;preproc\soelim;devices\grolj4;%PATH1% +echo I will use this command to format a document and print it on LJ4 printer: +roff\groff\groff -V -e -s -t -p -R -me -Tlj4 ../doc/meintro.me +pause +Rem Uncomment the following command if you have a LaserJet4 printer: +REM roff\groff\groff -e -s -t -p -R -me -Tlj4 ../doc/meintro.me >>prn +Rem +set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refer;preproc\soelim;devices\grodvi;%PATH1% +echo I will use this command to format a document into a DVI format: +roff\groff\groff -V -e -s -t -p -R -me -Tdvi ../doc/meintro.me +pause +roff\groff\groff -e -s -t -p -R -me -Tdvi ../doc/meintro.me > meintro.dvi +set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refer;preproc\soelim;devices\grohtml;%PATH1% +echo I will use this command to format a document into HTML format: +roff\groff\groff -V -e -s -t -p -R -me -Thtml ../doc/meintro.me +pause +roff\groff\groff -e -s -t -p -R -me -Thtml ../doc/meintro.me > meintro.html +set PATH=roff\troff;preproc\pic;preproc\eqn;preproc\tbl;preproc\grn;preproc\refer;preproc\soelim;devices\grolbp;%PATH1% +echo I will use this command to format a document and print it on an LBP printer: +roff\groff\groff -V -e -s -t -p -R -me -Tlbp ../doc/meintro.me +pause +Rem Uncomment the following if you have a Canon CAPSL LBP-4 or LBP-8 printer: +REM roff\groff\groff -e -s -t -p -R -me -Tlbp ../doc/meintro.me >>prn +Rem +set PATH=%PATH1% +set GROFF_FONT_PATH= +set GROFF_TMAC_PATH= +set PATH1= +cd .. +:exit diff --git a/arch/misc/Makefile.sub b/arch/misc/Makefile.sub new file mode 100644 index 0000000..496609d --- /dev/null +++ b/arch/misc/Makefile.sub @@ -0,0 +1,27 @@ +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Keith Marshall (keith.d.marshall@ntlworld.com) +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +CLEANADD=shdeps.sed + +all: shdeps.sed + +shdeps.sed: $(srcdir)/shdeps.sh + $(SHELL) $(srcdir)/shdeps.sh "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ + +# eof diff --git a/arch/misc/shdeps.sh b/arch/misc/shdeps.sh new file mode 100644 index 0000000..55e2015 --- /dev/null +++ b/arch/misc/shdeps.sh @@ -0,0 +1,118 @@ +#! /bin/sh +# shdeps.sh: Generate OS dependency fixups, for `groff' shell scripts +# +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Written by Keith Marshall (keith.d.marshall@ntlworld.com) +# +# Invoked only by `make', as: +# $(SHELL) shdeps.sh "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > shdeps.sed +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +cat << ETX +# shdeps.sed: Script generated automatically by \`make' -- do not modify! + +/^$/N +/@GROFF_BIN_PATH_SETUP@/c\\ +ETX + +if [ "$1$2" = "::" ] +then + # `PATH_SEPARATOR' is `:' both at `groff' run time, and in `make', + # implying an implementation which is completely POSIX compliant. + # Simply apply the `GROFF_BIN_PATH' and `PATH_SEPARATOR' values + # determined by `configure', in all cases. + + cat << ETX +\\ +GROFF_RUNTIME="\${GROFF_BIN_PATH=$3}:" +/@PATH_SEARCH_SETUP@/d +ETX + +else + # `PATH_SEPARATOR' is NOT always `:', + # which suggests an implementation for a Microsoft platform. + # We need to choose the `GROFF_BIN_PATH' format and `PATH_SEPARATOR' + # which will suit the user's choice of shell. + # + # Note that some Windows users may specify the `--prefix' path + # using backslash characters, instead of `/', preferred by POSIX, + # so we will also fix that up. + + POSIX_BINDIR=`echo $3 | tr '\\\\' /` + cat << ETX +# (The value required is dependent on the user's choice of shell,\\ +# and its associated POSIX emulation capabilities.)\\ +\\ +case "\$OSTYPE" in\\ + msys)\\ + GROFF_RUNTIME=\${GROFF_BIN_PATH="` + case "$POSIX_BINDIR" in + [a-zA-Z]:*) + IFS=':' + set -- $POSIX_BINDIR + case "$2" in + /*) POSIX_BINDIR="/$1$2" ;; + *) POSIX_BINDIR="/$1/$2" ;; + esac + shift 2 + for dir + do + POSIX_BINDIR="$POSIX_BINDIR:$dir" + done + ;; + esac + echo "$POSIX_BINDIR"`"}":" ;;\\ + cygwin)\\ + : \${GROFF_BIN_PATH="\`cygpath -w '$POSIX_BINDIR'\`"}\\ + GROFF_RUNTIME=\`cygpath "\$GROFF_BIN_PATH"\`":" ;;\\ + *)\\ + GROFF_RUNTIME=\${GROFF_BIN_PATH="$POSIX_BINDIR"}";" ;;\\ +esac +ETX + # On Microsoft platforms, we may also need to configure + # the PATH search function, used in the `pdfroff' script, + # to use ';', instead of ':', as the PATH_SEPARATOR. + + cat << ETX +/@PATH_SEARCH_SETUP@/c\\ +#\\ +# This implementation is configured for a Microsoft platform.\\ +# Thus, the default PATH_SEPARATOR is ';', although some shells may\\ +# use the POSIX standard ':' instead. Therefore, we need to examine\\ +# the OSTYPE environment variable, to identify which is appropriate\\ +# to make PATH searches work correctly.\\ +#\\ + case "\$OSTYPE" in\\ +#\\ + msys | cygwin)\\ + #\\ + # These emulate POSIX, and use ':'\\ + #\\ + PATH_SEPARATOR=\${PATH_SEPARATOR-':'} ;;\\ +#\\ + *)\\ + #\\ + # For anything else, default to ';'\\ + #\\ + PATH_SEPARATOR=\${PATH_SEPARATOR-';'} ;;\\ + esac +ETX + +fi + +# eof diff --git a/configure b/configure new file mode 100755 index 0000000..107aadc --- /dev/null +++ b/configure @@ -0,0 +1,11663 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59b. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Find who we are. Look in the path if we contain no path at all +# relative or not. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; }; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(func_return () { + (exit \$1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + as_lineno_3=\`(expr \$as_lineno_1 + 1) 2>/dev/null\` + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\$as_lineno_3\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done + esac +done + + + for as_shell in $as_candidate_shells $SHELL; do + if { $as_shell 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { $as_shell 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +(func_return () { + (exit $1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "func_return () { + (exit \$1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s,[$]LINENO.*,&-, + t lineno + b + : lineno + N + : loop + s,[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\),\2\1\2, + t loop + s,-\n.*,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="src/roff/groff/groff.cpp" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#endif +#if HAVE_STDINT_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX TTYDEVDIRS OTHERDEVDIRS CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS XDEVDIRS XPROGDIRS XLIBDIRS appresdir LPR LP LPQ PSPRINT DVIPRINT PERLPATH YACC RANLIB ac_ct_RANLIB INSTALL_INFO INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S SH_SCRIPT_SED_CMD GREP EGREP LIBC LIBM LIBOBJS BROKEN_SPOOLER_FLAGS PAGE g sys_tmac_prefix tmac_wrap GROFF_PATH_SEPARATOR ALT_GHOSTSCRIPT_PROGS GHOSTSCRIPT ac_ct_GHOSTSCRIPT pnmcut pnmcrop pnmtopng psselect pnmtops make_html make_install_html ALT_AWK_PROGS AWK ac_ct_AWK make_pdfdoc make_install_pdfdoc pnmtops_nosetpage LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute directory names. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute directory names. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-x use the X Window System + --with-appresdir=DIR X11 application resource files + --with-alt-gs=LIST alternative names for ghostscript executable + --with-gs=PROG actual [/path/]name of ghostscript executable + --with-alt-awk=LIST alternative names for awk executable + --with-awk=PROG actual [/path/]name of awk executable + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute names, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, +2003, 2004 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.59b. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +# NextStep 3.3 (patch 3) loses unless the first echo outputs at least 14 bytes. +ac_space=' ' +echo "$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space" >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + + ac_config_headers="$ac_config_headers src/include/config.h:src/include/config.hin" + + + +# checks for programs +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +for ac_file in $ac_files +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix, OSF/1, Tru64 -std +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CXX=$ac_ct_CXX + fi +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "$cross_compiling" = no; then + echo "$as_me:$LINENO: checking that C++ compiler can compile simple program" >&5 +echo $ECHO_N "checking that C++ compiler can compile simple program... $ECHO_C" >&6 + fi + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int main() { + return 0; +} + + + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: a working C++ compiler is required" >&5 +echo "$as_me: error: a working C++ compiler is required" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + if test "$cross_compiling" = no; then + echo "$as_me:$LINENO: checking that C++ static constructors and destructors are called" >&5 +echo $ECHO_N "checking that C++ static constructors and destructors are called... $ECHO_C" >&6 + fi + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +extern "C" { + void _exit(int); +} + +int i; +struct A { + char dummy; + A() { i = 1; } + ~A() { if (i == 1) _exit(0); } +}; + +A a; + +int main() +{ + return 1; +} + + + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: a working C++ compiler is required" >&5 +echo "$as_me: error: a working C++ compiler is required" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: checking that header files support C++" >&5 +echo $ECHO_N "checking that header files support C++... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include + + +int +main () +{ + + +fopen(0, 0); + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + { { echo "$as_me:$LINENO: error: header files do not support C++ + (if you are using a version of gcc/g++ earlier than 2.5, + you should install libg++)" >&5 +echo "$as_me: error: header files do not support C++ + (if you are using a version of gcc/g++ earlier than 2.5, + you should install libg++)" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking whether character set is EBCDIC" >&5 +echo $ECHO_N "checking whether character set is EBCDIC... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +/* Treat any failure as ASCII for compatibility with existing art. + Use compile-time rather than run-time tests for cross-compiler + tolerance. */ +#if '0' != 240 +make an error "Character set is not EBCDIC" +#endif + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_ebcdic="yes" + TTYDEVDIRS="font/devcp1047" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define IS_EBCDIC_HOST 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_ebcdic="no" + TTYDEVDIRS="font/devascii font/devlatin1" + OTHERDEVDIRS="font/devlj4 font/devlbp" + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + +if test "$groff_cv_ebcdic" = "yes"; then + echo "$as_me:$LINENO: checking for OS/390 Unix" >&5 +echo $ECHO_N "checking for OS/390 Unix... $ECHO_C" >&6 + case `uname` in + OS/390) + CFLAGS="$CFLAGS -D_ALL_SOURCE" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 ;; + esac + fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define gethostbyname to an innocuous variant, in case declares gethostbyname. + For example, HP-UX 11i declares gettimeofday. */ +#define gethostbyname innocuous_gethostbyname + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef gethostbyname + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define connect to an innocuous variant, in case declares connect. + For example, HP-UX 11i declares gettimeofday. */ +#define connect innocuous_connect + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef connect + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +choke me +#else +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main () +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define remove to an innocuous variant, in case declares remove. + For example, HP-UX 11i declares gettimeofday. */ +#define remove innocuous_remove + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef remove + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +choke me +#else +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main () +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shmat to an innocuous variant, in case declares shmat. + For example, HP-UX 11i declares gettimeofday. */ +#define shmat innocuous_shmat + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shmat + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +choke me +#else +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main () +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main () +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + + groff_no_x=$no_x + if test -z "$groff_no_x"; then + OLDCFLAGS=$CFLAGS + OLDLDFLAGS=$LDFLAGS + OLDLIBS=$LIBS + CFLAGS="$CFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS $X_LIBS" + LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + + LIBS="$LIBS -lXaw" + echo "$as_me:$LINENO: checking for Xaw library and header files" >&5 +echo $ECHO_N "checking for Xaw library and header files... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + groff_no_x="yes" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$LIBS -lXmu" + echo "$as_me:$LINENO: checking for Xmu library and header files" >&5 +echo $ECHO_N "checking for Xmu library and header files... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + groff_no_x="yes" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS=$OLDCFLAGS + LDFLAGS=$OLDLDFLAGS + LIBS=$OLDLIBS + fi + + if test "x$groff_no_x" = "xyes"; then + { echo "$as_me:$LINENO: gxditview and xtotroff won't be built" >&5 +echo "$as_me: gxditview and xtotroff won't be built" >&6;} + else + XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" + XPROGDIRS="src/devices/xditview src/utils/xtotroff" + XLIBDIRS="src/libs/libxutil" + fi + + + + + +# Check whether --with-appresdir or --without-appresdir was given. +if test "${with_appresdir+set}" = set; then + withval="$with_appresdir" + +fi; +if test -z "$groff_no_x"; then + # Create an Imakefile, run `xmkmf', then `make'. + rm -f -r conftest.dir + if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put `make' in the Imakefile rules, + # since we grep it out. + cat >Imakefile <<'EOF' + +xlibdirs: + @echo 'groff_x_usrlibdir="${USRLIBDIR}"; groff_x_libdir="${LIBDIR}"' +EOF + + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", + # which would confuse us. + eval `${MAKE-make} xlibdirs 2>/dev/null | grep -v make` + + # Open Windows `xmkmf' reportedly sets LIBDIR instead of USRLIBDIR. + for groff_extension in a so sl; do + if test ! -f $groff_x_usrlibdir/libX11.$groff_extension && + test -f $groff_x_libdir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_x_libdir + break + fi + done + fi + + cd .. + rm -f -r conftest.dir + fi + + # In case the test with `xmkmf' wasn't successful, try a suite of + # standard directories. Check `X11' before `X11Rn' because it is often + # a symlink to the current release. + groff_x_libdirs=' + /usr/X11/lib + /usr/X11R6/lib + /usr/X11R5/lib + /usr/X11R4/lib + + /usr/lib/X11 + /usr/lib/X11R6 + /usr/lib/X11R5 + /usr/lib/X11R4 + + /usr/local/X11/lib + /usr/local/X11R6/lib + /usr/local/X11R5/lib + /usr/local/X11R4/lib + + /usr/local/lib/X11 + /usr/local/lib/X11R6 + /usr/local/lib/X11R5 + /usr/local/lib/X11R4 + + /usr/X386/lib + /usr/x386/lib + /usr/XFree86/lib/X11 + + /usr/lib + /usr/local/lib + /usr/unsupported/lib + /usr/athena/lib + /usr/local/x11r5/lib + /usr/lpp/Xamples/lib + + /usr/openwin/lib + /usr/openwin/share/lib' + + if test -z "$groff_x_usrlibdir"; then + # We only test whether libX11 exists. + for groff_dir in $groff_x_libdirs; do + for groff_extension in a so sl; do + if test ! -r $groff_dir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_dir + break 2 + fi + done + done + fi + + if test "x$with_appresdir" = "x"; then + appresdir=$groff_x_usrlibdir/X11/app-defaults + else + appresdir=$with_appresdir + fi + fi + +if test -z "$PSPRINT"; then + for ac_prog in lpr +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LPR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LPR"; then + ac_cv_prog_LPR="$LPR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LPR="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LPR=$ac_cv_prog_LPR +if test -n "$LPR"; then + echo "$as_me:$LINENO: result: $LPR" >&5 +echo "${ECHO_T}$LPR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LPR" && break +done + + for ac_prog in lp +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LP"; then + ac_cv_prog_LP="$LP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LP="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LP=$ac_cv_prog_LP +if test -n "$LP"; then + echo "$as_me:$LINENO: result: $LP" >&5 +echo "${ECHO_T}$LP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LP" && break +done + + if test -n "$LPR" && test -n "$LP"; then + # HP-UX provides an lpr command that emulates lpr using lp, + # but it doesn't have lpq; in this case we want to use lp + # rather than lpr. + for ac_prog in lpq +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LPQ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LPQ"; then + ac_cv_prog_LPQ="$LPQ" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LPQ="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LPQ=$ac_cv_prog_LPQ +if test -n "$LPQ"; then + echo "$as_me:$LINENO: result: $LPQ" >&5 +echo "${ECHO_T}$LPQ" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LPQ" && break +done + + test -n "$LPQ" || LPR= + fi + if test -n "$LPR"; then + PSPRINT="$LPR" + elif test -n "$LP"; then + PSPRINT="$LP" + fi + fi + + echo "$as_me:$LINENO: checking for command to use for printing PostScript files" >&5 +echo $ECHO_N "checking for command to use for printing PostScript files... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $PSPRINT" >&5 +echo "${ECHO_T}$PSPRINT" >&6 + + # Figure out DVIPRINT from PSPRINT. + echo "$as_me:$LINENO: checking for command to use for printing dvi files" >&5 +echo $ECHO_N "checking for command to use for printing dvi files... $ECHO_C" >&6 + if test -n "$PSPRINT" && test -z "$DVIPRINT"; then + if test "x$PSPRINT" = "xlpr"; then + DVIPRINT="lpr -d" + else + DVIPRINT="$PSPRINT" + fi + fi + + echo "$as_me:$LINENO: result: $DVIPRINT" >&5 +echo "${ECHO_T}$DVIPRINT" >&6 +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PERLPATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PERLPATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERLPATH="$PERLPATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PERLPATH="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_PERLPATH" && ac_cv_path_PERLPATH="/usr/bin/perl" + ;; +esac +fi +PERLPATH=$ac_cv_path_PERLPATH + +if test -n "$PERLPATH"; then + echo "$as_me:$LINENO: result: $PERLPATH" >&5 +echo "${ECHO_T}$PERLPATH" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +for ac_prog in byacc 'bison -y' +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_YACC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + + + ac_dir=`cd $ac_aux_dir; pwd` + ac_install_sh="$ac_dir/install-sh -c" +for ac_prog in install-info +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_INSTALL_INFO+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$INSTALL_INFO"; then + ac_cv_prog_INSTALL_INFO="$INSTALL_INFO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_INSTALL_INFO="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +INSTALL_INFO=$ac_cv_prog_INSTALL_INFO +if test -n "$INSTALL_INFO"; then + echo "$as_me:$LINENO: result: $INSTALL_INFO" >&5 +echo "${ECHO_T}$INSTALL_INFO" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$INSTALL_INFO" && break +done +test -n "$INSTALL_INFO" || INSTALL_INFO=":" + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + + +# use a dummy substitution if no csh hack is necessary to avoid errors +# with non-GNU sed programs +echo "$as_me:$LINENO: checking for csh hash hack" >&5 +echo $ECHO_N "checking for csh hash hack... $ECHO_C" >&6 + +cat <conftest.sh +#! /bin/sh +true || exit 0 +export PATH || exit 0 +exit 1 +EOF + + chmod +x conftest.sh + if echo ./conftest.sh | (csh >/dev/null 2>&1) >/dev/null 2>&1; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SH_SCRIPT_SED_CMD='1s/.*/:/' + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SH_SCRIPT_SED_CMD='1s/a/a/' + fi + rm -f conftest.sh + + +# checks for headers +echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/GREPXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/GREP$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} +ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/xpg4/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + test -f "$ac_path_GREP" || continue + $ac_path_GREP_found || if $as_executable_p "$ac_path_GREP"; then + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +if "$ac_path_GREP" --version 2>&1 < /dev/null | grep 'GNU' >/dev/null; then + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=: +else + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/conftest.in" + while : + do + cat "$tmp/conftest.in" "$tmp/conftest.in" >"$tmp/conftest.tmp" + mv "$tmp/conftest.tmp" "$tmp/conftest.in" + cp "$tmp/conftest.in" "$tmp/conftest.nl" + echo 'GREP' >> "$tmp/conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "$tmp/conftest.nl" >"$tmp/conftest.out" 2>/dev/null || break + diff "$tmp/conftest.out" "$tmp/conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done +fi + +fi + + $ac_path_GREP_found && break 3 + done +done + +done + +rm -rf "$tmp" + +fi + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + +fi +echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6 + GREP="$ac_cv_path_GREP" + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | ($GREP -E '(a|b)') >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/EGREPXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/EGREP$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} +ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/xpg4/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + test -f "$ac_path_EGREP" || continue + $ac_path_EGREP_found || if $as_executable_p "$ac_path_EGREP"; then + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +if "$ac_path_EGREP" --version 2>&1 < /dev/null | grep 'GNU' >/dev/null; then + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=: +else + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/conftest.in" + while : + do + cat "$tmp/conftest.in" "$tmp/conftest.in" >"$tmp/conftest.tmp" + mv "$tmp/conftest.tmp" "$tmp/conftest.in" + cp "$tmp/conftest.in" "$tmp/conftest.nl" + echo 'EGREP' >> "$tmp/conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "$tmp/conftest.nl" >"$tmp/conftest.out" 2>/dev/null || break + diff "$tmp/conftest.out" "$tmp/conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done +fi + +fi + + $ac_path_EGREP_found && break 3 + done +done + +done + +rm -rf "$tmp" + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6 + EGREP="$ac_cv_path_EGREP" + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit (2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + + + + + + +for ac_header in stdlib.h unistd.h dirent.h limits.h sys/dir.h \ + string.h strings.h math.h sys/time.h direct.h process.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for ISC 3.x or 4.x" >&5 +echo $ECHO_N "checking for ISC 3.x or 4.x... $ECHO_C" >&6 + if grep '[34]\.' /usr/options/cb.name >/dev/null 2>&1 + then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define _SYSV3 1 +_ACEOF + + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi +echo "$as_me:$LINENO: checking whether -D_POSIX_SOURCE is necessary" >&5 +echo $ECHO_N "checking whether -D_POSIX_SOURCE is necessary... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +extern "C" { void fileno(int); } + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_SOURCE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# checks for header stuff +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking for return type of srand" >&5 +echo $ECHO_N "checking for return type of srand... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +extern "C" { void srand(unsigned int); } + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: void" >&5 +echo "${ECHO_T}void" >&6 + +cat >>confdefs.h <<\_ACEOF +#define RET_TYPE_SRAND_IS_VOID 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: int" >&5 +echo "${ECHO_T}int" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether gettimeofday must be declared" >&5 +echo $ECHO_N "checking whether gettimeofday must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef gettimeofday + char *p = (char *) gettimeofday; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_gettimeofday=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_gettimeofday=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_gettimeofday" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_gettimeofday" >&6 + if test $groff_cv_decl_needed_gettimeofday = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_GETTIMEOFDAY 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether hypot must be declared" >&5 +echo $ECHO_N "checking whether hypot must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_hypot+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef hypot + char *p = (char *) hypot; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_hypot=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_hypot=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_hypot" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_hypot" >&6 + if test $groff_cv_decl_needed_hypot = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_HYPOT 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether popen must be declared" >&5 +echo $ECHO_N "checking whether popen must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_popen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef popen + char *p = (char *) popen; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_popen=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_popen=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_popen" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_popen" >&6 + if test $groff_cv_decl_needed_popen = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_POPEN 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether pclose must be declared" >&5 +echo $ECHO_N "checking whether pclose must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_pclose+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef pclose + char *p = (char *) pclose; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_pclose=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_pclose=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_pclose" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_pclose" >&6 + if test $groff_cv_decl_needed_pclose = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_PCLOSE 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether putenv must be declared" >&5 +echo $ECHO_N "checking whether putenv must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_putenv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef putenv + char *p = (char *) putenv; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_putenv=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_putenv=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_putenv" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_putenv" >&6 + if test $groff_cv_decl_needed_putenv = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_PUTENV 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether rand must be declared" >&5 +echo $ECHO_N "checking whether rand must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_rand+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef rand + char *p = (char *) rand; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_rand=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_rand=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_rand" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_rand" >&6 + if test $groff_cv_decl_needed_rand = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_RAND 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether snprintf must be declared" >&5 +echo $ECHO_N "checking whether snprintf must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_snprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef snprintf + char *p = (char *) snprintf; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_snprintf=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_snprintf=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_snprintf" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_snprintf" >&6 + if test $groff_cv_decl_needed_snprintf = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_SNPRINTF 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether srand must be declared" >&5 +echo $ECHO_N "checking whether srand must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_srand+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef srand + char *p = (char *) srand; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_srand=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_srand=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_srand" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_srand" >&6 + if test $groff_cv_decl_needed_srand = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_SRAND 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether strcasecmp must be declared" >&5 +echo $ECHO_N "checking whether strcasecmp must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_strcasecmp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef strcasecmp + char *p = (char *) strcasecmp; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_strcasecmp=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_strcasecmp=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_strcasecmp" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_strcasecmp" >&6 + if test $groff_cv_decl_needed_strcasecmp = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_STRCASECMP 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether strncasecmp must be declared" >&5 +echo $ECHO_N "checking whether strncasecmp must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_strncasecmp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef strncasecmp + char *p = (char *) strncasecmp; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_strncasecmp=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_strncasecmp=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_strncasecmp" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_strncasecmp" >&6 + if test $groff_cv_decl_needed_strncasecmp = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_STRNCASECMP 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether vfprintf must be declared" >&5 +echo $ECHO_N "checking whether vfprintf must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_vfprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef vfprintf + char *p = (char *) vfprintf; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_vfprintf=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_vfprintf=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_vfprintf" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_vfprintf" >&6 + if test $groff_cv_decl_needed_vfprintf = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_VFPRINTF 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether vsnprintf must be declared" >&5 +echo $ECHO_N "checking whether vsnprintf must be declared... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "${groff_cv_decl_needed_vsnprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MATH_H +#include +#endif + + +int +main () +{ + + +#ifndef vsnprintf + char *p = (char *) vsnprintf; +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_decl_needed_vsnprintf=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_decl_needed_vsnprintf=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + echo "$as_me:$LINENO: result: $groff_cv_decl_needed_vsnprintf" >&5 +echo "${ECHO_T}$groff_cv_decl_needed_vsnprintf" >&6 + if test $groff_cv_decl_needed_vsnprintf = yes; then + +cat >>confdefs.h <<\_ACEOF +#define NEED_DECLARATION_VSNPRINTF 1 +_ACEOF + + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking for sys_nerr in , , or " >&5 +echo $ECHO_N "checking for sys_nerr in , , or ... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include +#include + + +int +main () +{ + + +int k; +k = sys_nerr; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_NERR 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking for sys_errlist in , , or " >&5 +echo $ECHO_N "checking for sys_errlist in , , or ... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include +#include + + +int +main () +{ + + +int k; +k = (int)sys_errlist[0]; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_ERRLIST 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking C++ " >&5 +echo $ECHO_N "checking C++ ... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include + + +int +main () +{ + + +read(0, 0, 0); +open(0, 0); + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_CC_OSFCN_H 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking C++ " >&5 +echo $ECHO_N "checking C++ ... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include + + +int +main () +{ + + +int x = INT_MIN; +int y = INT_MAX; +int z = UCHAR_MAX; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_CC_LIMITS_H 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking C++ " >&5 +echo $ECHO_N "checking C++ ... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include + + +int +main () +{ + + +uintmax_t i = (uintmax_t)-1; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_header_inttypes_h=yes + +cat >>confdefs.h <<\_ACEOF +#define HAVE_CC_INTTYPES_H 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_header_inttypes_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $groff_cv_header_inttypes_h" >&5 +echo "${ECHO_T}$groff_cv_header_inttypes_h" >&6 + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# checks for typedefs +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking for unsigned long long" >&5 +echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +unsigned long long ull = 1; +int i = 63; +unsigned long long ullmax = (unsigned long long)-1; + + +int +main () +{ + + +return ull << i | ull >> i | ullmax / ull | ullmax % ull; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + groff_cv_type_unsigned_long_long=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +groff_cv_type_unsigned_long_long=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: result: $groff_cv_type_unsigned_long_long" >&5 +echo "${ECHO_T}$groff_cv_type_unsigned_long_long" >&6 + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + if test $groff_cv_header_inttypes_h = no; then + + test $groff_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $ac_type +_ACEOF + + fi +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking for declaration of time_t" >&5 +echo $ECHO_N "checking for declaration of time_t... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include + + +int +main () +{ + + +time_t t = time(0); +struct tm *p = localtime(&t); + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cat >>confdefs.h <<\_ACEOF +#define LONG_FOR_TIME_T 1 +_ACEOF + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking for return type of signal handlers" >&5 +echo $ECHO_N "checking for return type of signal handlers... $ECHO_C" >&6 + for groff_declaration in \ + 'extern "C" void (*signal (int, void (*)(int)))(int);' \ + 'extern "C" void (*signal (int, void (*)(int)) throw ())(int);' \ + 'void (*signal ()) ();' + do + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include +#ifdef signal +# undef signal +#endif +$groff_declaration + + +int +main () +{ + + +int i; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + + if test -n "$groff_declaration"; then + echo "$as_me:$LINENO: result: void" >&5 +echo "${ECHO_T}void" >&6 + +cat >>confdefs.h <<\_ACEOF +#define RETSIGTYPE void +_ACEOF + + else + echo "$as_me:$LINENO: result: int" >&5 +echo "${ECHO_T}int" >&6 + +cat >>confdefs.h <<\_ACEOF +#define RETSIGTYPE int +_ACEOF + + fi +echo "$as_me:$LINENO: checking struct exception" >&5 +echo $ECHO_N "checking struct exception... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include + + +int +main () +{ + + +struct exception e; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_EXCEPTION 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +# checks for libraries +echo "$as_me:$LINENO: checking for main in -lc" >&5 +echo $ECHO_N "checking for main in -lc... $ECHO_C" >&6 +if test "${ac_cv_lib_c_main+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int +main () +{ +main (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_c_main=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_c_main=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_c_main" >&5 +echo "${ECHO_T}$ac_cv_lib_c_main" >&6 +if test $ac_cv_lib_c_main = yes; then + LIBC=-lc +fi + + +echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_sin+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char sin (); +int +main () +{ +sin (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_m_sin=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_sin=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +if test $ac_cv_lib_m_sin = yes; then + LIBM=-lm +fi + + + +# checks for functions + + +for ac_header in stdlib.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in getpagesize +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +echo "$as_me:$LINENO: checking for working mmap" >&5 +echo $ECHO_N "checking for working mmap... $ECHO_C" >&6 +if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_mmap_fixed_mapped=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !STDC_HEADERS && !HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#if !HAVE_GETPAGESIZE +/* Assume that all systems that can run configure have sys/param.h. */ +# if !HAVE_SYS_PARAM_H +# define HAVE_SYS_PARAM_H 1 +# endif + +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# if HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + int i, pagesize; + int fd; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + exit (1); + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + exit (1); + if (write (fd, data, pagesize) != pagesize) + exit (1); + close (fd); + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + exit (1); + data2 = (char *) malloc (2 * pagesize); + if (!data2) + exit (1); + data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + exit (1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + exit (1); + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + exit (1); + if (read (fd, data3, pagesize) != pagesize) + exit (1); + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + exit (1); + close (fd); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_mmap_fixed_mapped=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5 +echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6 +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +rm -f conftest.mmap + +saved_libs="$LIBS" +LIBS="$LIBS $LIBC $LIBM" + + + + + + + + +for ac_func in fmod getcwd putenv snprintf strcasecmp \ + strerror strncasecmp strtol +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case $LIBOBJS in + "$ac_func.$ac_objext" | \ + *" $ac_func.$ac_objext" | \ + "$ac_func.$ac_objext "* | \ + *" $ac_func.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; +esac + +fi +done + + +# vsnprintf is in the same source file as snprintf + +for ac_func in vsnprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case $LIBOBJS in + "snprintf.$ac_objext" | \ + *" snprintf.$ac_objext" | \ + "snprintf.$ac_objext "* | \ + *" snprintf.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS snprintf.$ac_objext" ;; +esac + +fi +done + +LIBS="$saved_libs" + + + + + + +for ac_func in gettimeofday isatty kill rename setlocale strsep +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +echo "$as_me:$LINENO: checking for mkstemp" >&5 +echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6 + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include +int (*f) (char *); + + +int +main () +{ + + +f = mkstemp; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MKSTEMP 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + case $LIBOBJS in + "mkstemp.$ac_objext" | \ + *" mkstemp.$ac_objext" | \ + "mkstemp.$ac_objext "* | \ + *" mkstemp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mkstemp.$ac_objext" ;; +esac + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +echo "$as_me:$LINENO: checking whether sys_siglist is declared" >&5 +echo $ECHO_N "checking whether sys_siglist is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_sys_siglist+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef sys_siglist + char *p = (char *) sys_siglist; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_sys_siglist=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_sys_siglist=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_sys_siglist" >&5 +echo "${ECHO_T}$ac_cv_have_decl_sys_siglist" >&6 +if test $ac_cv_have_decl_sys_siglist = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST 0 +_ACEOF + + +fi + + + +# checks for compiler characteristics +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking whether ANSI array delete syntax is supported" >&5 +echo $ECHO_N "checking whether ANSI array delete syntax is supported... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + +char *p = new char[5]; +delete [] p; + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cat >>confdefs.h <<\_ACEOF +#define ARRAY_DELETE_NEEDS_SIZE 1 +_ACEOF + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + echo "$as_me:$LINENO: checking traditional preprocessor" >&5 +echo $ECHO_N "checking traditional preprocessor... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#define name2(a, b) a/**/b + + +int +main () +{ + + +int name2(foo, bar); + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define TRADITIONAL_CPP 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# checks for operating system services +echo "$as_me:$LINENO: checking w_coredump" >&5 +echo $ECHO_N "checking w_coredump... $ECHO_C" >&6 + if test "$cross_compiling" = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include + + +int +main () +{ + + +main() +{ +#ifdef WCOREFLAG + exit(1); +#else + int i = 0; + ((union wait *)&i)->w_coredump = 1; + exit(i != 0200); +#endif +} + + + ; + return 0; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define WCOREFLAG 0200 +_ACEOF + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +# other random stuff +echo "$as_me:$LINENO: checking default value for grops -b option" >&5 +echo $ECHO_N "checking default value for grops -b option... $ECHO_C" >&6 + test -n "${BROKEN_SPOOLER_FLAGS}" || BROKEN_SPOOLER_FLAGS=0 + echo "$as_me:$LINENO: result: $BROKEN_SPOOLER_FLAGS" >&5 +echo "${ECHO_T}$BROKEN_SPOOLER_FLAGS" >&6 + +echo "$as_me:$LINENO: checking default paper size" >&5 +echo $ECHO_N "checking default paper size... $ECHO_C" >&6 + groff_prefix=$prefix + test "x$prefix" = "xNONE" && groff_prefix=$ac_default_prefix + if test -z "$PAGE"; then + descfile= + if test -r $groff_prefix/share/groff/font/devps/DESC; then + descfile=$groff_prefix/share/groff/font/devps/DESC + elif test -r $groff_prefix/lib/groff/font/devps/DESC; then + descfile=$groff_prefix/lib/groff/font/devps/DESC + else + for f in $groff_prefix/share/groff/*/font/devps/DESC; do + if test -r $f; then + descfile=$f + break + fi + done + fi + + if test -n "$descfile"; then + if grep '^paperlength[ ]\+841890' $descfile >/dev/null 2>&1; then + PAGE=A4 + elif grep '^papersize[ ]\+[aA]4' $descfile >/dev/null 2>&1; then + PAGE=A4 + fi + fi + fi + + if test -z "$PAGE"; then + dom=`awk '($1 == "dom" || $1 == "search") { print $2; exit}' \ + /etc/resolv.conf 2>/dev/null` + if test -z "$dom"; then + dom=`(domainname) 2>/dev/null | tr -d '+'` + if test -z "$dom" \ + || test "$dom" = '(none)'; then + dom=`(hostname) 2>/dev/null | grep '\.'` + fi + fi + # If the top-level domain is two letters and it's not `us' or `ca' + # then they probably use A4 paper. + case "$dom" in + *.[Uu][Ss]|*.[Cc][Aa]) + ;; + *.[A-Za-z][A-Za-z]) + PAGE=A4 ;; + esac + fi + + test -n "$PAGE" || PAGE=letter + if test "x$PAGE" = "xA4"; then + +cat >>confdefs.h <<\_ACEOF +#define PAGEA4 1 +_ACEOF + + fi + echo "$as_me:$LINENO: result: $PAGE" >&5 +echo "${ECHO_T}$PAGE" >&6 + +echo "$as_me:$LINENO: checking for existing troff installation" >&5 +echo $ECHO_N "checking for existing troff installation... $ECHO_C" >&6 + if test "x`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) 2>/dev/null`" = x0; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + g=g + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + g= + fi + +echo "$as_me:$LINENO: checking for prefix of system macro packages" >&5 +echo $ECHO_N "checking for prefix of system macro packages... $ECHO_C" >&6 + sys_tmac_prefix= + sys_tmac_file_prefix= + for d in /usr/share/lib/tmac /usr/lib/tmac; do + for t in "" tmac.; do + for m in an s m; do + f=$d/$t$m + if test -z "$sys_tmac_prefix" \ + && test -f $f \ + && grep '^\.if' $f >/dev/null 2>&1; then + sys_tmac_prefix=$d/$t + sys_tmac_file_prefix=$t + fi + done + done + done + echo "$as_me:$LINENO: result: $sys_tmac_prefix" >&5 +echo "${ECHO_T}$sys_tmac_prefix" >&6 + + + echo "$as_me:$LINENO: checking which system macro packages should be made available" >&5 +echo $ECHO_N "checking which system macro packages should be made available... $ECHO_C" >&6 + tmac_wrap= + if test "x$sys_tmac_file_prefix" = "xtmac."; then + for f in $sys_tmac_prefix*; do + suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` + case "$suff" in + e) + ;; + *) + grep "Copyright.*Free Software Foundation" $f >/dev/null \ + || tmac_wrap="$tmac_wrap $suff" ;; + esac + done + elif test -n "$sys_tmac_prefix"; then + files=`echo $sys_tmac_prefix*` + grep "\\.so" $files >conftest.sol + for f in $files; do + case "$f" in + ${sys_tmac_prefix}e) + ;; + *.me) + ;; + */ms.*) + ;; + *) + b=`basename $f` + if grep "\\.so.*/$b\$" conftest.sol >/dev/null \ + || grep -l "Copyright.*Free Software Foundation" $f >/dev/null; then + : + else + suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` + case "$suff" in + tmac.*) + ;; + *) + tmac_wrap="$tmac_wrap $suff" ;; + esac + fi + esac + done + rm -f conftest.sol + fi + echo "$as_me:$LINENO: result: $tmac_wrap" >&5 +echo "${ECHO_T}$tmac_wrap" >&6 + +echo "$as_me:$LINENO: checking separator character to use in groff search paths" >&5 +echo $ECHO_N "checking separator character to use in groff search paths... $ECHO_C" >&6 + cp ${srcdir}/src/include/nonposix.h conftest.h + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include "conftest.h" + + +int +main () +{ + + +#if PATH_SEP_CHAR == ';' +make an error "Path separator is ';'" +#endif + + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + GROFF_PATH_SEPARATOR=":" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +GROFF_PATH_SEPARATOR=";" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $GROFF_PATH_SEPARATOR" >&5 +echo "${ECHO_T}$GROFF_PATH_SEPARATOR" >&6 + + +# Check whether --with-alt-gs or --without-alt-gs was given. +if test "${with_alt_gs+set}" = set; then + withval="$with_alt_gs" + ALT_GHOSTSCRIPT_PROGS="$withval" +else + ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2" +fi; + + + +# Check whether --with-gs or --without-gs was given. +if test "${with_gs+set}" = set; then + withval="$with_gs" + GHOSTSCRIPT=$withval +else + if test -n "$ac_tool_prefix"; then + for ac_prog in $ALT_GHOSTSCRIPT_PROGS + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_GHOSTSCRIPT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$GHOSTSCRIPT"; then + ac_cv_prog_GHOSTSCRIPT="$GHOSTSCRIPT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GHOSTSCRIPT="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +GHOSTSCRIPT=$ac_cv_prog_GHOSTSCRIPT +if test -n "$GHOSTSCRIPT"; then + echo "$as_me:$LINENO: result: $GHOSTSCRIPT" >&5 +echo "${ECHO_T}$GHOSTSCRIPT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$GHOSTSCRIPT" && break + done +fi +if test -z "$GHOSTSCRIPT"; then + ac_ct_GHOSTSCRIPT=$GHOSTSCRIPT + for ac_prog in $ALT_GHOSTSCRIPT_PROGS +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_GHOSTSCRIPT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_GHOSTSCRIPT"; then + ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_ct_GHOSTSCRIPT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_GHOSTSCRIPT=$ac_cv_prog_ac_ct_GHOSTSCRIPT +if test -n "$ac_ct_GHOSTSCRIPT"; then + echo "$as_me:$LINENO: result: $ac_ct_GHOSTSCRIPT" >&5 +echo "${ECHO_T}$ac_ct_GHOSTSCRIPT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_GHOSTSCRIPT" && break +done + + if test "x$ac_ct_GHOSTSCRIPT" = x; then + GHOSTSCRIPT="missing" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + GHOSTSCRIPT=$ac_ct_GHOSTSCRIPT + fi +fi + +fi; + test "$GHOSTSCRIPT" = "no" && GHOSTSCRIPT=missing + + make_html=html + make_install_html=install_html + + missing= + # Extract the first word of "pnmcut", so it can be a program name with args. +set dummy pnmcut; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_pnmcut+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$pnmcut"; then + ac_cv_prog_pnmcut="$pnmcut" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmcut="found" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_pnmcut" && ac_cv_prog_pnmcut="missing" +fi +fi +pnmcut=$ac_cv_prog_pnmcut +if test -n "$pnmcut"; then + echo "$as_me:$LINENO: result: $pnmcut" >&5 +echo "${ECHO_T}$pnmcut" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test $pnmcut = missing; then + missing="$missing \`pnmcut'" + fi;# Extract the first word of "pnmcrop", so it can be a program name with args. +set dummy pnmcrop; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_pnmcrop+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$pnmcrop"; then + ac_cv_prog_pnmcrop="$pnmcrop" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmcrop="found" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_pnmcrop" && ac_cv_prog_pnmcrop="missing" +fi +fi +pnmcrop=$ac_cv_prog_pnmcrop +if test -n "$pnmcrop"; then + echo "$as_me:$LINENO: result: $pnmcrop" >&5 +echo "${ECHO_T}$pnmcrop" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test $pnmcrop = missing; then + missing="$missing \`pnmcrop'" + fi;# Extract the first word of "pnmtopng", so it can be a program name with args. +set dummy pnmtopng; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_pnmtopng+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$pnmtopng"; then + ac_cv_prog_pnmtopng="$pnmtopng" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmtopng="found" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_pnmtopng" && ac_cv_prog_pnmtopng="missing" +fi +fi +pnmtopng=$ac_cv_prog_pnmtopng +if test -n "$pnmtopng"; then + echo "$as_me:$LINENO: result: $pnmtopng" >&5 +echo "${ECHO_T}$pnmtopng" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test $pnmtopng = missing; then + missing="$missing \`pnmtopng'" + fi;# Extract the first word of "psselect", so it can be a program name with args. +set dummy psselect; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_psselect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$psselect"; then + ac_cv_prog_psselect="$psselect" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_psselect="found" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_psselect" && ac_cv_prog_psselect="missing" +fi +fi +psselect=$ac_cv_prog_psselect +if test -n "$psselect"; then + echo "$as_me:$LINENO: result: $psselect" >&5 +echo "${ECHO_T}$psselect" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test $psselect = missing; then + missing="$missing \`psselect'" + fi;# Extract the first word of "pnmtops", so it can be a program name with args. +set dummy pnmtops; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_pnmtops+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$pnmtops"; then + ac_cv_prog_pnmtops="$pnmtops" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_pnmtops="found" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_pnmtops" && ac_cv_prog_pnmtops="missing" +fi +fi +pnmtops=$ac_cv_prog_pnmtops +if test -n "$pnmtops"; then + echo "$as_me:$LINENO: result: $pnmtops" >&5 +echo "${ECHO_T}$pnmtops" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test $pnmtops = missing; then + missing="$missing \`pnmtops'" + fi; + + test "$GHOSTSCRIPT" = "missing" && missing="$missing \`gs'" + + if test -n "$missing"; then + plural=`set $missing; test $# -gt 1 && echo s` + missing=`set $missing + missing="" + while test $# -gt 0 + do + case $# in + 1) missing="$missing$1" ;; + 2) missing="$missing$1 and " ;; + *) missing="$missing$1, " ;; + esac + shift + done + echo $missing` + + make_html= + make_install_html= + + { echo "$as_me:$LINENO: WARNING: missing program$plural: + + The program$plural + $missing + cannot be found in the PATH. + Consequently, groff's HTML backend (grohtml) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in HTML format. + " >&5 +echo "$as_me: WARNING: missing program$plural: + + The program$plural + $missing + cannot be found in the PATH. + Consequently, groff's HTML backend (grohtml) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in HTML format. + " >&2;} + fi + + + + +# Check whether --with-alt-awk or --without-alt-awk was given. +if test "${with_alt_awk+set}" = set; then + withval="$with_alt_awk" + ALT_AWK_PROGS="$withval" +else + ALT_AWK_PROGS="gawk mawk nawk awk" +fi; + + + +# Check whether --with-awk or --without-awk was given. +if test "${with_awk+set}" = set; then + withval="$with_awk" + AWK=$withval +else + if test -n "$ac_tool_prefix"; then + for ac_prog in $ALT_AWK_PROGS + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break + done +fi +if test -z "$AWK"; then + ac_ct_AWK=$AWK + for ac_prog in $ALT_AWK_PROGS +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AWK"; then + ac_cv_prog_ac_ct_AWK="$ac_ct_AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_AWK=$ac_cv_prog_ac_ct_AWK +if test -n "$ac_ct_AWK"; then + echo "$as_me:$LINENO: result: $ac_ct_AWK" >&5 +echo "${ECHO_T}$ac_ct_AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_AWK" && break +done + + if test "x$ac_ct_AWK" = x; then + AWK="missing" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + AWK=$ac_ct_AWK + fi +fi + +fi; + test "$AWK" = "no" && AWK=missing + + + + make_pdfdoc=pdfdoc + make_install_pdfdoc=install_pdfdoc + + missing="" + test "$AWK" = missing && missing="\`awk'" + test "$GHOSTSCRIPT" = missing && missing="$missing \`gs'" + if test -n "$missing"; then + plural=`set $missing; test $# -eq 2 && echo s` + test x$plural = xs \ + && missing=`set $missing; echo "$1 and $2"` \ + || missing=`echo $missing` + + make_pdfdoc= + make_install_pdfdoc= + + { echo "$as_me:$LINENO: WARNING: missing program$plural: + + The program$plural $missing cannot be found in the PATH. + Consequently, groff's PDF formatter (pdfroff) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in PDF format. + " >&5 +echo "$as_me: WARNING: missing program$plural: + + The program$plural $missing cannot be found in the PATH. + Consequently, groff's PDF formatter (pdfroff) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in PDF format. + " >&2;} + fi + + + +echo "$as_me:$LINENO: checking whether pnmtops can handle the -nosetpage option" >&5 +echo $ECHO_N "checking whether pnmtops can handle the -nosetpage option... $ECHO_C" >&6 + if echo P2 2 2 255 0 1 2 0 | pnmtops -nosetpage > /dev/null 2>&1 ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + pnmtops_nosetpage="pnmtops -nosetpage" + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + pnmtops_nosetpage="pnmtops" + fi + + + ac_config_files="$ac_config_files stamp-h" + + ac_config_files="$ac_config_files Makefile doc/Makefile src/utils/xtotroff/Makefile" + + ac_config_files="$ac_config_files contrib/gdiffmk/tests/runtests" + + ac_config_files="$ac_config_files test-groff" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Find who we are. Look in the path if we contain no path at all +# relative or not. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute file name" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute file name" >&2;} + { (exit 1); exit 1; }; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s,[$]LINENO.*,&-, + t lineno + b + : lineno + N + : loop + s,[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\),\2\1\2, + t loop + s,-\n.*,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59b. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59b, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2004 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "stamp-h" ) CONFIG_FILES="$CONFIG_FILES stamp-h" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "src/utils/xtotroff/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/xtotroff/Makefile" ;; + "contrib/gdiffmk/tests/runtests" ) CONFIG_FILES="$CONFIG_FILES contrib/gdiffmk/tests/runtests" ;; + "test-groff" ) CONFIG_FILES="$CONFIG_FILES test-groff" ;; + "src/include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS src/include/config.h:src/include/config.hin" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@TTYDEVDIRS@,$TTYDEVDIRS,;t t +s,@OTHERDEVDIRS@,$OTHERDEVDIRS,;t t +s,@CPP@,$CPP,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@XDEVDIRS@,$XDEVDIRS,;t t +s,@XPROGDIRS@,$XPROGDIRS,;t t +s,@XLIBDIRS@,$XLIBDIRS,;t t +s,@appresdir@,$appresdir,;t t +s,@LPR@,$LPR,;t t +s,@LP@,$LP,;t t +s,@LPQ@,$LPQ,;t t +s,@PSPRINT@,$PSPRINT,;t t +s,@DVIPRINT@,$DVIPRINT,;t t +s,@PERLPATH@,$PERLPATH,;t t +s,@YACC@,$YACC,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@INSTALL_INFO@,$INSTALL_INFO,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@LN_S@,$LN_S,;t t +s,@SH_SCRIPT_SED_CMD@,$SH_SCRIPT_SED_CMD,;t t +s,@GREP@,$GREP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBC@,$LIBC,;t t +s,@LIBM@,$LIBM,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@BROKEN_SPOOLER_FLAGS@,$BROKEN_SPOOLER_FLAGS,;t t +s,@PAGE@,$PAGE,;t t +s,@g@,$g,;t t +s,@sys_tmac_prefix@,$sys_tmac_prefix,;t t +s,@tmac_wrap@,$tmac_wrap,;t t +s,@GROFF_PATH_SEPARATOR@,$GROFF_PATH_SEPARATOR,;t t +s,@ALT_GHOSTSCRIPT_PROGS@,$ALT_GHOSTSCRIPT_PROGS,;t t +s,@GHOSTSCRIPT@,$GHOSTSCRIPT,;t t +s,@ac_ct_GHOSTSCRIPT@,$ac_ct_GHOSTSCRIPT,;t t +s,@pnmcut@,$pnmcut,;t t +s,@pnmcrop@,$pnmcrop,;t t +s,@pnmtopng@,$pnmtopng,;t t +s,@psselect@,$psselect,;t t +s,@pnmtops@,$pnmtops,;t t +s,@make_html@,$make_html,;t t +s,@make_install_html@,$make_install_html,;t t +s,@ALT_AWK_PROGS@,$ALT_AWK_PROGS,;t t +s,@AWK@,$AWK,;t t +s,@ac_ct_AWK@,$ac_ct_AWK,;t t +s,@make_pdfdoc@,$make_pdfdoc,;t t +s,@make_install_pdfdoc@,$make_install_pdfdoc,;t t +s,@pnmtops_nosetpage@,$pnmtops_nosetpage,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + test -d "$ac_dir" || mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute names, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + + # Run the commands associated with the file. + case $ac_file in + stamp-h ) echo timestamp > stamp-h ;; + contrib/gdiffmk/tests/runtests ) chmod +x contrib/gdiffmk/tests/runtests ;; + test-groff ) chmod +x test-groff ;; + esac +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Quote $f, to prevent DOS file names from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + test -d "$ac_dir" || mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + + +if test -z "$groff_no_x"; then + if test "x$with_appresdir" = "x"; then + { echo "$as_me:$LINENO: + + The application resource file for gxditview will be installed as + + $appresdir/GXditview + + (an existing file will be saved as \`GXditview.old'). + To install it into a different directory, say, \`/etc/gxditview', + add \`--with-appresdir=/etc/gxditview' to the configure script + command line options and rerun it. The environment variable + \`APPLRESDIR' must then be set to \`/etc/' (note the trailing slash), + omitting the \`gxditview' part which is automatically appended by + the X11 searching routines for resource files. More details can be + found in the X(7) manual page. + " >&5 +echo "$as_me: + + The application resource file for gxditview will be installed as + + $appresdir/GXditview + + (an existing file will be saved as \`GXditview.old'). + To install it into a different directory, say, \`/etc/gxditview', + add \`--with-appresdir=/etc/gxditview' to the configure script + command line options and rerun it. The environment variable + \`APPLRESDIR' must then be set to \`/etc/' (note the trailing slash), + omitting the \`gxditview' part which is automatically appended by + the X11 searching routines for resource files. More details can be + found in the X(7) manual page. + " >&6;} + fi + fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..2fe8967 --- /dev/null +++ b/configure.ac @@ -0,0 +1,126 @@ +# Autoconf configuration file for groff. +# Copyright (C) 1989-1995, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +# +# Process this file with autoconf to produce a configure script. + +AC_INIT +AC_PREREQ(2.59) + +AC_CONFIG_HEADERS([src/include/config.h:src/include/config.hin]) +AC_CONFIG_SRCDIR([src/roff/groff/groff.cpp]) + +# checks for programs +AC_PROG_CC +AC_PROG_CXX +GROFF_CXX_CHECK +GROFF_EBCDIC +GROFF_OS390 +GROFF_X11 +GROFF_APPRESDIR_OPTION +GROFF_APPRESDIR_DEFAULT +GROFF_PRINT +AC_PATH_PROG([PERLPATH], [perl], [/usr/bin/perl]) +GROFF_PROG_YACC +AC_PROG_RANLIB +GROFF_INSTALL_SH +GROFF_INSTALL_INFO +AC_PROG_INSTALL +AC_PROG_LN_S + +# use a dummy substitution if no csh hack is necessary to avoid errors +# with non-GNU sed programs +GROFF_CSH_HACK([SH_SCRIPT_SED_CMD='1s/.*/:/'], [SH_SCRIPT_SED_CMD='1s/a/a/']) +AC_SUBST([SH_SCRIPT_SED_CMD]) + +# checks for headers +AC_CHECK_HEADERS([stdlib.h unistd.h dirent.h limits.h sys/dir.h \ + string.h strings.h math.h sys/time.h direct.h process.h]) +GROFF_ISC_SYSV3 +GROFF_POSIX + +# checks for header stuff +GROFF_SRAND +GROFF_NEED_DECLARATION([gettimeofday]) +GROFF_NEED_DECLARATION([hypot]) +GROFF_NEED_DECLARATION([popen]) +GROFF_NEED_DECLARATION([pclose]) +GROFF_NEED_DECLARATION([putenv]) +GROFF_NEED_DECLARATION([rand]) +GROFF_NEED_DECLARATION([snprintf]) +GROFF_NEED_DECLARATION([srand]) +GROFF_NEED_DECLARATION([strcasecmp]) +GROFF_NEED_DECLARATION([strncasecmp]) +GROFF_NEED_DECLARATION([vfprintf]) +GROFF_NEED_DECLARATION([vsnprintf]) +GROFF_SYS_NERR +GROFF_SYS_ERRLIST +GROFF_OSFCN_H +GROFF_LIMITS_H +GROFF_INTTYPES_H + +# checks for typedefs +GROFF_UNSIGNED_LONG_LONG +GROFF_UINTMAX_T +GROFF_TIME_T +GROFF_TYPE_SIGNAL +GROFF_STRUCT_EXCEPTION + +# checks for libraries +GROFF_LIBC +GROFF_LIBM + +# checks for functions +AC_FUNC_MMAP +saved_libs="$LIBS" +LIBS="$LIBS $LIBC $LIBM" +AC_REPLACE_FUNCS([fmod getcwd putenv snprintf strcasecmp \ + strerror strncasecmp strtol]) +# vsnprintf is in the same source file as snprintf +AC_CHECK_FUNCS([vsnprintf], [], [AC_LIBOBJ([snprintf])]) +LIBS="$saved_libs" +AC_CHECK_FUNCS([gettimeofday isatty kill rename setlocale strsep]) +GROFF_MKSTEMP +AC_CHECK_DECLS([sys_siglist]) + +# checks for compiler characteristics +GROFF_ARRAY_DELETE +GROFF_TRADITIONAL_CPP + +# checks for operating system services +GROFF_WCOREFLAG + +# other random stuff +GROFF_BROKEN_SPOOLER_FLAGS +GROFF_PAGE +GROFF_G +GROFF_TMAC +GROFF_TARGET_PATH_SEPARATOR +GROFF_HTML_PROGRAMS +GROFF_PDFDOC_PROGRAMS +GROFF_PNMTOPS_NOSETPAGE + +AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) +AC_CONFIG_FILES([Makefile doc/Makefile src/utils/xtotroff/Makefile]) +AC_CONFIG_FILES([contrib/gdiffmk/tests/runtests], + [chmod +x contrib/gdiffmk/tests/runtests]) +AC_CONFIG_FILES([test-groff], [chmod +x test-groff]) +AC_OUTPUT + +GROFF_APPRESDIR_CHECK diff --git a/contrib/eqn2graph/Makefile.sub b/contrib/eqn2graph/Makefile.sub new file mode 100644 index 0000000..6ccdd98 --- /dev/null +++ b/contrib/eqn2graph/Makefile.sub @@ -0,0 +1,19 @@ +MAN1=eqn2graph.n +CLEANADD=eqn2graph + +all: eqn2graph + +eqn2graph: eqn2graph.sh + rm -f $@; \ + sed -e "s|@g@|$(g)|g" \ + -e "s|@VERSION@|$(version)$(revision)|" \ + -e $(SH_SCRIPT_SED_CMD) $(srcdir)/eqn2graph.sh >$@; \ + chmod +x $@ + +install_data: eqn2graph + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -rm -f $(bindir)/eqn2graph + $(INSTALL_SCRIPT) eqn2graph $(bindir)/eqn2graph + +uninstall_sub: + -rm -f $(bindir)/eqn2graph diff --git a/contrib/eqn2graph/eqn2graph.man b/contrib/eqn2graph/eqn2graph.man new file mode 100644 index 0000000..3f34cc5 --- /dev/null +++ b/contrib/eqn2graph/eqn2graph.man @@ -0,0 +1,115 @@ +.\" $Id: eqn2graph.man,v 1.4 2003/10/28 07:46:23 wlemb Exp $ +.\" This documentation is released to the public domain. +. +. +.\" Like TP, but if specified indent is more than half +.\" the current line-length - indent, use the default indent. +.de Tp +.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP +.el .TP "\\$1" +.. +. +. +.TH EQN2GRAPH @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +.IX eqn2graph +.SH NAME +eqn2graph \- convert an EQN equation into a cropped image +. +. +.SH SYNOPSIS +.B eqn2graph +[ +.B \-unsafe +] +[ +.BI \-format\ fmt +] +. +. +.SH DESCRIPTION +Reads an EQN equation (one line) as input; produces an image +file (by default in Portable Network Graphics format) suitable for the +Web as output. +.P +Your input EQN code should \fInot\fR have the \&.EQ/.EN preamble that +that normally precedes it within +.BR groff (@MAN1EXT@) +macros; nor do you need to have dollar-sign or other delimiters +around the equation. +.P +The output image will be a black-on-white graphic clipped to the +smallest possible bounding box that contains all the black pixels. +By specifying command-line options to be passed to +.BR convert (1) +you can give it a border, set the background transparent, set the +image's pixel density, or perform other useful transformations. +.P +This program uses +.BR @g@eqn (@MAN1EXT@), +.BR groff (@MAN1EXT@), +and the ImageMagick +.BR convert (1) +program. +These programs must be installed on your system and accessible on your +$PATH for \fBeqn2graph\fR to work. +. +. +.SH OPTIONS +.TP +.B \-unsafe +Run +.BR groff (@MAN1EXT@) +in the `unsafe' mode enabling the PIC macro +.B sh +to execute arbitrary commands. +The default is to forbid this. +.TP +.BI \-format\ fmt +Specify an output format; the default is PNG (Portable Network Graphics). +Any format that +.BR convert (1) +can emit is supported. +.PP +Command-line switches and arguments not listed above are passed to +.BR convert (1). +. +. +.SH FILES +.Tp \w'\fB@MACRODIR@/eqnrc'u+2n +.B @MACRODIR@/eqnrc +The +.BR @g@eqn (@MAN1EXT@) +initialization file. +. +. +.SH ENVIRONMENT +.TP +.B GROFF_TMPDIR +The directory in which temporary files will be created. +If this is not set +.B eqn2graph +searches the environment variables +.BR \%TMPDIR , +.BR TMP , +and +.B TEMP +(in that order). +Otherwise, temporary files will be created in +.BR /tmp . +. +. +.SH "SEE ALSO" +.BR pic2graph (@MAN1EXT@), +.BR grap2graph (@MAN1EXT@), +.BR @g@eqn (@MAN1EXT@), +.BR groff (@MAN1EXT@), +.BR gs (1), +.BR convert (1). +. +. +.SH AUTHOR +Eric S. Raymond . +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/eqn2graph/eqn2graph.sh b/contrib/eqn2graph/eqn2graph.sh new file mode 100644 index 0000000..98713a8 --- /dev/null +++ b/contrib/eqn2graph/eqn2graph.sh @@ -0,0 +1,91 @@ +#! /bin/sh +# +# eqn2graph -- compile EQN equation descriptions to bitmap images +# +# by Eric S. Raymond , July 2002 +# +# In Unixland, the magic is in knowing what to string together... +# +# Take an eqn equation on stdin, emit cropped bitmap on stdout. +# The pic markup should *not* be wrapped in .EQ/.EN, this script will do that. +# A -U option on the command line enables gpic/groff "unsafe" mode. +# A -format FOO option changes the image output format to any format +# supported by convert(1). All other options are passed to convert(1). +# The default format is PNG. +# +# This is separate from pic2graph because pic processing has some weird +# clipping effect on the output, mangling equations that are very wide +# or deep. Besides, this tool can supply its own delimiters. +# + +# Requires the groff suite and the ImageMagick tools. Both are open source. +# This code is released to the public domain. +# +# Here are the assumptions behind the option processing: +# +# 1. None of the options of eqn(1) are relevant. +# +# 2. Only the -U option of groff(1) is relevant. +# +# 3. Many options of convert(1) are potentially relevant, (especially +# -density, -interlace, -transparency, -border, and -comment). +# +# Thus, we pass -U to groff(1), and everything else to convert(1). +# +# $Id: eqn2graph.sh,v 1.5 2005/05/18 07:03:06 wl Exp $ +# +groff_opts="" +convert_opts="" +format="png" + +while [ "$1" ] +do + case $1 in + -unsafe) + groff_opts="-U";; + -format) + format=$2 + shift;; + -v | --version) + echo "GNU eqn2graph (groff) version @VERSION@" + exit 0;; + --help) + echo "usage: eqn2graph [ option ...] < in > out" + exit 0;; + *) + convert_opts="$convert_opts $1";; + esac + shift +done + +# create temporary directory +tmp= +for d in "$GROFF_TMPDIR" "$TMPDIR" "$TMP" "$TEMP" /tmp; do + test -z "$d" && continue + + tmp=`(umask 077 && mktemp -d -q "$d/eqn2graph-XXXXXX") 2> /dev/null` \ + && test -n "$tmp" && test -d "$tmp" \ + && break + + tmp=$d/eqn2graph$$-$RANDOM + (umask 077 && mkdir $tmp) 2> /dev/null && break +done; +if test -z "$tmp"; then + echo "$0: cannot create temporary directory" >&2 + { (exit 1); exit 1; } +fi + +trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 2 15 + +# Here goes: +# 1. Add .EQ/.EN. +# 2. Process through eqn(1) to emit troff markup. +# 3. Process through groff(1) to emit Postscript. +# 4. Use convert(1) to crop the Postscript and turn it into a bitmap. +read equation +(echo ".EQ"; echo 'delim $$'; echo ".EN"; echo '$'"$equation"'$') | \ + groff -e $groff_opts -Tps -P-pletter > $tmp/eqn2graph.ps \ + && convert -trim -crop 0x0 $convert_opts $tmp/eqn2graph.ps $tmp/eqn2graph.$format \ + && cat $tmp/eqn2graph.$format + +# End diff --git a/contrib/gdiffmk/ChangeLog b/contrib/gdiffmk/ChangeLog new file mode 100644 index 0000000..f8e3f96 --- /dev/null +++ b/contrib/gdiffmk/ChangeLog @@ -0,0 +1,63 @@ +2005-01-16 Mike Bianchi + + * gdiffmk.sh (Usage): Fix typos. + : Allow `-M ' also. + + * gdiffmk.man: Updated. + +2005-01-13 Mike Bianchi + + * gdiffmk.sh: Add the -D, -M, and -B options, which provide actions + akin to nrchbar. + Thanks to Larry Kollar (http://home.alltel.net/kollar/groff/). + + * gdiffmk.man: Updated. + + * tests/runtests.in: Added tests for gdiffmk's -D, -M, and -B + options. + + * tests/baseline8, tests/baseline9, tests/baseline10: New files. + +2004-12-16 Mike Bianchi + + * tests/runtests.in: Fix typo (s/$(srcdir)/${srcdir}/). + +2004-12-15 Werner LEMBERG + + The configure script now generates tests/runtests. + + * tests/tests.sh: Renamed to... + * tests/runtests.in: This. + Add proper $srcdir prefixes to make it run from build directory. + * README, Makefile.sub (CLEANADD), tests/test_baseline7: Updated. + +2004-12-14 Werner LEMBERG + + * gdiffmk.sh: Make sed pattern work with alternate result of GNU + diff's -D option, using `!' instead of `not' in #endif comments. + (Exit): Use prefix for each emitted message line. + +2004-12-14 Mike Bianchi + + * tests/*: New files for testing gdiffmk. + + * README, gdiffmk.man, gdiffmk.sh: Updated. + Minor fixes. + +2004-12-13 Mike Bianchi + + Add `-x' command line option to select a diff program. + + * gdiffmk.sh: Add code to handle `-x'. + Move test for working `diff' down. + Fix sed pattern -- `.mc *' needs to be followed by `.mc .'. + (Usage): Updated. + * gdiffmk.man: Updated. + +2004-12-12 Mike Bianchi + + * README: New file. + +2004-12-11 Mike Bianchi + + First import of gdiffmk files. diff --git a/contrib/gdiffmk/Makefile.sub b/contrib/gdiffmk/Makefile.sub new file mode 100644 index 0000000..5e0cd14 --- /dev/null +++ b/contrib/gdiffmk/Makefile.sub @@ -0,0 +1,47 @@ +# Makefile.sub for `gdiffmk' (integration into the groff source tree) + +# File position: /contrib/gdiffmk/Makefile.sub + +# Last update: 12 December 2004 + +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Mike Bianchi > + +# This file is part of the gdiffmk utility, which is part of groff. + +# groff is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# groff 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 groff; see the files COPYING and LICENSE in the top +# directory of the groff source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +######################################################################## + +MAN1=gdiffmk.n +CLEANADD=gdiffmk tests/runtests + +all: gdiffmk + +gdiffmk: gdiffmk.sh + rm -f $@; \ + sed -e "s|@BINDIR@|$(bindir)|g" \ + -e "s|@VERSION@|$(version)$(revision)|g" \ + -e $(SH_SCRIPT_SED_CMD) $(srcdir)/gdiffmk.sh >$@; \ + chmod +x $@ + +install_data: gdiffmk + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -rm -f $(bindir)/gdiffmk + $(INSTALL_SCRIPT) gdiffmk $(bindir)/gdiffmk + +uninstall_sub: + -rm -f $(bindir)/gdiffmk diff --git a/contrib/gdiffmk/README b/contrib/gdiffmk/README new file mode 100644 index 0000000..9428717 --- /dev/null +++ b/contrib/gdiffmk/README @@ -0,0 +1,46 @@ +gdiffmk is approximately a recreation of the original Bell Labs/AT&T diffmk +command for troff/nroff documents, with enhancements. + +It should not be confused with `diffmk' commands that operate on XML. + +The inspiration for this code was a Perl 2 version written in 1989 by Randal +L. Schwartz. See + landfield.com/software/comp.sources.misc/archive-name/volume06/diffmk.p.gz + +The command also attempts to reproduce some of the functionality of the old +`nrchbar' command. See + open-systems.ufl.edu/mirrors/ftp.isc.org/usenet/comp.sources.unix/volume10/nrchbar.Z + +Thanks to Werner Lemberg for help in making the package more portable and +fit into the GNU groff source structure. + +Gnu diff(1) with the -Dname option does all of the work and sed(1) +translates the output into something groff/troff/nroff can handle. + +Note the BUGS on the man page. + +The `tests' directory contains simple tests. `runtests run' runs them and +compares the output against baseline files. Calling `runtests' without +argument gives the usage. + +---------------------------------------------------------------------------- + +Copyright (C) 2004, 2005 Free Software Foundation, Inc. +Written by Mike Bianchi > + +This file is part of the gdiffmk utility, which is part of groff. + +groff is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +groff 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 groff; see the files COPYING and LICENSE in the top +directory of the groff source. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/contrib/gdiffmk/gdiffmk.man b/contrib/gdiffmk/gdiffmk.man new file mode 100644 index 0000000..9c89182 --- /dev/null +++ b/contrib/gdiffmk/gdiffmk.man @@ -0,0 +1,281 @@ +.ig \"-*- nroff -*- +Copyright (C) 2004, 2005 Free Software Foundation, Inc. + +This file is part of the gdiffmk utility, which is part of groff. +Written by Mike Bianchi > + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be included in +translations approved by the Free Software Foundation instead of in +the original English. +.. +. +.do mso www.tmac +. +.TH GDIFFMK @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +.SH NAME +gdiffmk \- mark differences between groff/nroff/troff files +. +. +.SH SYNOPSIS +.nr a \n(.j +.ad l +.nr i \n(.i +.in +\w'\fBgdiffmk 'u +.ti \niu +.B gdiffmk +.de OP +. ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" +. el .RB "[\ " "\\$1" "\ ]" +.. +.OP \-a \%addmark +.OP \-c \%changemark +.OP \-d \%deletemark +[\ \c +.B \-D +.OP \-B +.OP \-M "mark1 mark2" +] +.OP \-x \%diffcmd +.OP \-\- +.OP \-\-help +.OP \%\-\-version +.I \%file1 +.I \%file2 +[\ \c +.IR \%output \ \c +] +.br +.ad \na +. +. +.SH DESCRIPTION +.B gdiffmk +compares two +.BR groff (1), +.BR nroff (1), +or +.BR troff (1) +documents, +.I file1 +and +.IR file2 , +and creates an output which is +.I file2 +with added `margin character' (.mc) commands that indicate the differences. +. +.LP +If the +.I output +filename is present, +the output is written there. +If it is +.B \- +or absent the output is written to the standard output. +. +.LP +If the +.I file1 +or +.I file2 +argument is +.B \- +the standard input is read for that input. +Clearly both cannot be +.BR \- . +. +.LP +Note that the output is not necessarily compatible with all macro packages +and all preprocessors. +See the +.B BUGS +section below. +. +. +.SH OPTIONS +.TP +.BI \-a addmark +Use the +.I addmark +for source lines not in +.I file1 +but present in +.IR file2 . +Default: +.BR + . +. +.TP +.B \-B +By default, the deleted texts marked by the +.B \-D +option end +with an added troff break command, +.BR .br , +to ensure that the deletions are marked properly. +This is the only way to guarantee that deletions and small +changes get flagged. +This option directs the program not to insert these breaks; it makes no +sense to use it without +.BR \-D . +. +.TP +.BI \-c changemark +Use the +.I changemark +for changed source lines. +Default: +.BR | . +. +.TP +.BI \-d deletemark +Use the +.I deletemark +for deleted source lines. +Default: +.BR * . +. +.TP +.B \-D +Show the deleted portions from changed and deleted text. +Default delimiting marks: +.BR "[[" " .\&.\&.\&. " "]]" . +. +.TP +.BI \-M "mark1 mark2" +Change the delimiting marks for the +.B \-D +option. +It makes no sense to use this option without +.BR \-D . +. +.TP +.BI \-x diffcmd +Use the +.I diffcmd +command to perform the comparison of +.I file1 +and +.IR file2 . +In particular, +.I diffcmd +should accept the GNU +.B diff +.BI \-D name +option. +Default: +.BR diff (1). +. +.TP +.B \-\- +All the following arguments are treated as file names, +even if they begin with +.BR \- . +. +.TP +.B \-\-help +Print a usage message on standard error output and exit. +. +.TP +.B \-\-version +Print version information on the standard output and exit. +. +. +.SH BUGS +The output is not necessarily compatible with all macro packages +and all preprocessors. +A workaround that is often successful against preprocessor problems +is to run +.B gdiffmk +on the output of all the preprocessors instead of the input source. +. +.LP +.B gdiffmk +relies on the +.BI \-D name +option of GNU +.BR diff (1) +to make a merged `#ifdef' output format. +It hasn't been tested whether other versions of +.BR diff (1) +do support this option. +See also the +.BI \-x diffcmd +option. +. +.LP +Report bugs to bug-groff@gnu.org. +Include a complete, self-contained example that will allow the bug to +be reproduced, and say which version of +.B gdiffmk +you are using. +. +. +.SH AUTHORS +This document was written and is maintained by +.MTO MBianchi@Foveal.com "Mike Bianchi" . +. +.LP +This document is distributed under the terms of the FDL (GNU Free +Documentation License) version 1.1 or later. +You should have received a copy of the FDL on your system, it is also +available on-line at the +.URL http://\:www.gnu.org/\:copyleft/\:fdl.html "GNU copyleft site" . +. +.LP +.B gdiffmk +is part of the +.I groff +GNU free software project. +All parts of the +.I groff package +are protected by GNU copyleft licenses. +The software files are distributed under the terms of the GNU General +Public License (GPL), while the documentation files mostly use the GNU +Free Documentation License (FDL). +. +. +.SH COPYRIGHT +Copyright \(co 2004, 2005 Free Software Foundation, Inc. +. +.LP +.B gdiffmk +is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. +. +.LP +.B gdiffmk +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. +. +.LP +You should have received a copy of the GNU General Public License along +with groff; see the file COPYING. +If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +. +. +.SH "SEE ALSO" +.BR groff (@MAN1EXT@), +.BR nroff (@MAN1EXT@), +.BR gtroff (@MAN1EXT@), +.BR diff (@MAN1EXT@) +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/gdiffmk/gdiffmk.sh b/contrib/gdiffmk/gdiffmk.sh new file mode 100644 index 0000000..e55eb69 --- /dev/null +++ b/contrib/gdiffmk/gdiffmk.sh @@ -0,0 +1,346 @@ +#! /bin/sh +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Written by Mike Bianchi > + +# This file is part of the gdiffmk utility, which is part of groff. + +# groff is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# groff 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 groff; see the files COPYING and LICENSE in the top +# directory of the groff source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +# This file is part of GNU gdiffmk. + + +cmd=$( basename $0 ) + +function Usage { + if test "$#" -gt 0 + then + echo >&2 "${cmd}: $@" + fi + echo >&2 "\ + +Usage: ${cmd} [ OPTIONS ] FILE1 FILE2 [ OUTPUT ] +Place difference marks into the new version of a groff/nroff/troff document. +FILE1 and FILE2 are compared, using \`diff', and FILE2 is output with +groff \`.mc' requests added to indicate how it is different from FILE1. + + FILE1 Previous version of the groff file. \`-' means standard input. + FILE2 Current version of the groff file. \`-' means standard input. + Either FILE1 or FILE2 can be standard input, but not both. + OUTPUT Copy of FILE2 with \`.mc' commands added. + \`-' means standard output (the default). + +OPTIONS: + -a ADDMARK Mark for added groff source lines. Default: \`+'. + -c CHANGEMARK Mark for changed groff source lines. Default: \`|'. + -d DELETEMARK Mark for deleted groff source lines. Default: \`*'. + + -D Show the deleted portions from changed and deleted text. + Default delimiting marks: \`[[' .... \`]]'. + -B By default, the deleted texts marked by the \`-D' option end + with an added troff \`.br' command. This option prevents + the added \`.br'. + -M MARK1 MARK2 Change the delimiting marks for the \`-D' option. + + -x DIFFCMD Use a different diff(1) command; + one that accepts the \`-Dname' option, such as GNU diff. + --version Print version information on the standard output and exit. + --help Print this message on the standard error. +" + exit 255 +} + + +function Exit { + exitcode=$1 + shift + for arg + do + echo >&2 "${cmd}: $1" + shift + done + exit ${exitcode} +} + +# Usage: FileRead exit_code filename +# +# Check for existence and readability of given file name. +# If not found or not readable, print message and exit with EXIT_CODE. +function FileRead { + case "$2" in + -) + return + ;; + esac + + if test ! -e "$2" + then + Exit $1 "File \`$2' not found." + fi + if test ! -r "$2" + then + Exit $1 "File \`$2' not readable." + fi +} + + +# Usage: FileCreate exit_code filename +# +# Create the given filename if it doesn't exist. +# If unable to create or write, print message and exit with EXIT_CODE. +function FileCreate { + case "$2" in + -) + return + ;; + esac + + if ! touch "$2" 2>/dev/null + then + if test ! -e "$2" + then + Exit $1 "File \`$2' not created; " \ + "Cannot write directory \`$( dirname "$2" )'." + fi + Exit $1 "File \`$2' not writeable." + fi +} + +function WouldClobber { + case "$2" in + -) + return + ;; + esac + + if test "$1" -ef "$3" + then + Exit 3 \ + "The $2 and OUTPUT arguments both point to the same file," \ + "\`$1', and it would be overwritten." + fi +} + +ADDMARK='+' +CHANGEMARK='|' +DELETEMARK='*' +MARK1='[[' +MARK2=']]' + +function RequiresArgument { + # Process flags that take either concatenated or + # separated values. + case "$1" in + -??*) + expr "$1" : '-.\(.*\)' + return 1 + ;; + esac + + if test "$#" -lt 2 + then + Exit 255 "Option \`$1' requires a value." + fi + + echo "$2" + return 0 +} + +badoption= +DIFFCMD=diff +D_option= +br=.br +for OPTION +do + case "${OPTION}" in + -a*) + ADDMARK=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + -c*) + CHANGEMARK=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + -d*) + DELETEMARK=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + -D ) + D_option=D_option + ;; + -M* ) + MARK1=$( RequiresArgument "${OPTION}" $2 ) && + shift + if [ $# -lt 2 ] + then + Usage "Option \`-M' is missing the MARK2 value." + fi + MARK2=$2 + shift + ;; + -B ) + br=. + ;; + -x* ) + DIFFCMD=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + --version) + echo "GNU ${cmd} (groff) version @VERSION@" + exit 0 + ;; + --help) + Usage + ;; + --) + # What follows -- are file arguments + shift + break + ;; + -) + break + ;; + -*) + badoption="${cmd}: invalid option \`$1'" + ;; + *) + break + ;; + esac + shift +done + +${DIFFCMD} -Dx /dev/null /dev/null >/dev/null 2>&1 || + Usage "The \`${DIFFCMD}' program does not accept" \ + "the required \`-Dname' option. +Use GNU diff instead. See the \`-x DIFFCMD' option." + +if test -n "${badoption}" +then + Usage "${badoption}" +fi + +if test "$#" -lt 2 -o "$#" -gt 3 +then + Usage "Incorrect number of arguments." +fi + +if test "1$1" = 1- -a "2$2" = 2- +then + Usage "Both FILE1 and FILE2 are \`-'." +fi + +FILE1=$1 +FILE2=$2 + +FileRead 1 "${FILE1}" +FileRead 2 "${FILE2}" + +if test "$#" = 3 +then + case "$3" in + -) + # output goes to standard output + ;; + *) + # output goes to a file + WouldClobber "${FILE1}" FILE1 "$3" + WouldClobber "${FILE2}" FILE2 "$3" + + FileCreate 3 "$3" + exec >$3 + ;; + esac +fi + +# To make a very unlikely label even more unlikely ... +label=__diffmk_$$__ + +sed_script=' + /^#ifdef '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#ifdef '"${label}"'/ s/.*/.mc '"${ADDMARK}"'/ + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#ifndef '"${label}"'/,/^#endif \/\* [!not ]*'"${label}"'/ { + /^#else \/\* '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#else \/\* '"${label}"'/ s/.*/.mc '"${CHANGEMARK}"'/ + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#endif \/\* \(not\|!\) '"${label}"'/ { + s/.*/.mc '"${DELETEMARK}"'/p + a\ +.mc + } + d + } + p + ' + +if [ ${D_option} ] +then + sed_script=' + /^#ifdef '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#ifdef '"${label}"'/ s/.*/.mc '"${ADDMARK}"'/ + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#ifndef '"${label}"'/,/^#endif \/\* [!not ]*'"${label}"'/ { + /^#ifndef '"${label}"'/ { + i\ +'"${MARK1}"' + d + } + /^#else \/\* '"${label}"'/ ! { + /^#endif \/\* [!not ]*'"${label}"'/ ! { + p + d + } + } + /^#else \/\* '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#else \/\* '"${label}"'/ { + i\ +'"${MARK2}"'\ +'"${br}"' + s/.*/.mc '"${CHANGEMARK}"'/ + a\ +.mc '"${CHANGEMARK}"' + d + } + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#endif \/\* \(not\|!\) '"${label}"'/ { + i\ +'"${MARK2}"'\ +'"${br}"' + s/.*/.mc '"${DELETEMARK}"'/p + a\ +.mc + } + d + } + p + ' +fi + +diff -D"${label}" -- ${FILE1} ${FILE2} | + sed -n "${sed_script}" + +# EOF diff --git a/contrib/gdiffmk/tests/file1 b/contrib/gdiffmk/tests/file1 new file mode 100644 index 0000000..ba6a4be --- /dev/null +++ b/contrib/gdiffmk/tests/file1 @@ -0,0 +1,11 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +file1 only +file1 and file2 #2 +file1 and file2 #3 +file1 only +file1 only +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/gdiffmk/tests/file2 b/contrib/gdiffmk/tests/file2 new file mode 100644 index 0000000..54e95ee --- /dev/null +++ b/contrib/gdiffmk/tests/file2 @@ -0,0 +1,11 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +file2 only +file2 only +file1 and file2 #2 +file2 only +file1 and file2 #3 +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/gdiffmk/tests/runtests.in b/contrib/gdiffmk/tests/runtests.in new file mode 100644 index 0000000..8295265 --- /dev/null +++ b/contrib/gdiffmk/tests/runtests.in @@ -0,0 +1,98 @@ +#! /bin/sh +# A very simple function test for gdiffmk.sh. + +srcdir=@srcdir@ + +command=../gdiffmk + +# Test the number of arguments and the first argument. +case $#-$1 in +1-clean ) + rm -fv test_result* tmp_file* + exit 0 + ;; +1-run ) + ;; +* ) + echo >&2 "$0 [ clean | run ] +Run a few simple tests on \`${command}'."' + +clean Remove the test_result? and tmp_file? files. +run Run the tests. +' + exit 255 + ;; +esac + +function TestResult { + if cmp -s $1 $2 + then + echo $2 PASSED + else + echo '' + echo $2 TEST FAILED + diff $1 $2 + echo '' + fi +} + +tmpfile=/tmp/$$ +trap 'rm -f ${tmpfile}' 0 1 2 3 15 + +# Run tests. + +# 3 file arguments +ResultFile=test_result1 +${command} ${srcdir}/file1 ${srcdir}/file2 ${ResultFile} 2>${tmpfile} +cat ${tmpfile} >>${ResultFile} +TestResult ${srcdir}/test_baseline ${ResultFile} + +# OUTPUT to stdout by default +ResultFile=test_result2 +${command} ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# OUTPUT to stdout via - argument +ResultFile=test_result3 +${command} ${srcdir}/file1 ${srcdir}/file2 - >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# FILE1 from standard input via - argument +ResultFile=test_result4 +${command} - ${srcdir}/file2 <${srcdir}/file1 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# FILE2 from standard input via - argument +ResultFile=test_result5 +${command} ${srcdir}/file1 - <${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# Different values for addmark, changemark, deletemark +ResultFile=test_result6 +${command} -aA -cC -dD ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline6 ${ResultFile} + +# Test for accidental file overwrite. +ResultFile=test_result7 +cp ${srcdir}/file2 tmp_file7 +${command} -aA -dD -cC ${srcdir}/file1 tmp_file7 tmp_file7 \ + >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline7 ${ResultFile} + +# Test -D option +ResultFile=test_result8 +${command} -D ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline8 ${ResultFile} + +# Test -D and -M options +ResultFile=test_result9 +${command} -D -M '<<<<' '>>>>' \ + ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline9 ${ResultFile} + +# Test -D and -B options +ResultFile=test_result10 +${command} -D -B ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline10 ${ResultFile} + +# EOF diff --git a/contrib/gdiffmk/tests/test_baseline b/contrib/gdiffmk/tests/test_baseline new file mode 100644 index 0000000..6b32992 --- /dev/null +++ b/contrib/gdiffmk/tests/test_baseline @@ -0,0 +1,17 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/gdiffmk/tests/test_baseline10 b/contrib/gdiffmk/tests/test_baseline10 new file mode 100644 index 0000000..b523f45 --- /dev/null +++ b/contrib/gdiffmk/tests/test_baseline10 @@ -0,0 +1,26 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +[[ +file1 only +]] +. +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +[[ +file1 only +file1 only +]] +. +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/gdiffmk/tests/test_baseline6 b/contrib/gdiffmk/tests/test_baseline6 new file mode 100644 index 0000000..3156961 --- /dev/null +++ b/contrib/gdiffmk/tests/test_baseline6 @@ -0,0 +1,17 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +.mc C +file2 only +file2 only +.mc +file1 and file2 #2 +.mc A +file2 only +.mc +file1 and file2 #3 +.mc D +.mc +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/gdiffmk/tests/test_baseline7 b/contrib/gdiffmk/tests/test_baseline7 new file mode 100644 index 0000000..b65e832 --- /dev/null +++ b/contrib/gdiffmk/tests/test_baseline7 @@ -0,0 +1,2 @@ +gdiffmk: The FILE2 and OUTPUT arguments both point to the same file, +gdiffmk: `tmp_file7', and it would be overwritten. diff --git a/contrib/gdiffmk/tests/test_baseline8 b/contrib/gdiffmk/tests/test_baseline8 new file mode 100644 index 0000000..9846dd5 --- /dev/null +++ b/contrib/gdiffmk/tests/test_baseline8 @@ -0,0 +1,26 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +[[ +file1 only +]] +.br +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +[[ +file1 only +file1 only +]] +.br +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/gdiffmk/tests/test_baseline9 b/contrib/gdiffmk/tests/test_baseline9 new file mode 100644 index 0000000..50fe57d --- /dev/null +++ b/contrib/gdiffmk/tests/test_baseline9 @@ -0,0 +1,26 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +<<<< +file1 only +>>>> +.br +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +<<<< +file1 only +file1 only +>>>> +.br +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff --git a/contrib/grap2graph/Makefile.sub b/contrib/grap2graph/Makefile.sub new file mode 100644 index 0000000..5527618 --- /dev/null +++ b/contrib/grap2graph/Makefile.sub @@ -0,0 +1,19 @@ +MAN1=grap2graph.n +CLEANADD=grap2graph + +all: grap2graph + +grap2graph: grap2graph.sh + rm -f $@; \ + sed -e "s|@g@|$(g)|g" \ + -e "s|@VERSION@|$(version)$(revision)|" \ + -e $(SH_SCRIPT_SED_CMD) $(srcdir)/grap2graph.sh >$@; \ + chmod +x $@ + +install_data: grap2graph + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -rm -f $(bindir)/grap2graph + $(INSTALL_SCRIPT) grap2graph $(bindir)/grap2graph + +uninstall_sub: + -rm -f $(bindir)/grap2graph diff --git a/contrib/grap2graph/grap2graph.man b/contrib/grap2graph/grap2graph.man new file mode 100644 index 0000000..0c6d456 --- /dev/null +++ b/contrib/grap2graph/grap2graph.man @@ -0,0 +1,105 @@ +.\" $Id: grap2graph.man,v 1.3 2003/10/28 07:46:23 wlemb Exp $ +.\" This documentation is released to the public domain. +. +. +.TH GRAP2GRAPH @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +.IX grap2graph +.SH NAME +grap2graph \- convert a grap diagram into a cropped bitmap image +. +. +.SH SYNOPSIS +.B grap2graph +[ +.B \-unsafe +] +[ +.BI \-resolution\ M\fR|\fPMxN +] +[ +.BI \-format\ fmt +] +. +. +.SH DESCRIPTION +Reads a grap program as input; produces an image file (by default in +Portable Network Graphics format) suitable for the Web as output. +For a description of the grap language, see +.BR grap (1). +.P +Your graph specification should \fInot\fR be wrapped with the \&.G1 and +\&.G2 macros that normally guard it within +.BR groff (@MAN1EXT@) +macros. +.P +The output image will be a black-on-white graphic clipped to the +smallest possible bounding box that contains all the black pixels. +By specifying command-line options to be passed to +.BR convert (1) +you can give it a border, set the background transparent, set the +image's pixel density, or perform other useful transformations. +.P +This program uses +.BR grap (1), +.BR @g@pic (@MAN1EXT@), +.BR groff (@MAN1EXT@), +and the ImageMagick +.BR convert (1) +program. +These programs must be installed on your system and accessible on your +$PATH for \fBgrap2graph\fR to work. +. +. +.SH OPTIONS +.TP +.B \-unsafe +Run +.BR @g@pic (@MAN1EXT@) +and +.BR groff (@MAN1EXT@) +in the `unsafe' mode enabling the PIC macro +.B sh +to execute arbitrary commands. +The default is to forbid this. +.TP +.BI \-format\ fmt +Specify an output format; the default is PNG (Portable Network Graphics). +Any format that +.BR convert (1) +can emit is supported. +.PP +Command-line switches and arguments not listed above are passed to +.BR convert (1). +. +. +.SH ENVIRONMENT +.TP +.B GROFF_TMPDIR +The directory in which temporary files will be created. +If this is not set +.B grap2graph +searches the environment variables +.BR \%TMPDIR , +.BR TMP , +and +.B TEMP +(in that order). +Otherwise, temporary files will be created in +.BR /tmp . +. +. +.SH "SEE ALSO" +.BR pic2graph (@MAN1EXT@), +.BR eqn2graph (@MAN1EXT@), +.BR @g@pic (@MAN1EXT@), +.BR groff (@MAN1EXT@), +.BR gs (1), +.BR convert (1). +. +. +.SH AUTHOR +Eric S. Raymond +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/grap2graph/grap2graph.sh b/contrib/grap2graph/grap2graph.sh new file mode 100644 index 0000000..7c830c1 --- /dev/null +++ b/contrib/grap2graph/grap2graph.sh @@ -0,0 +1,85 @@ +#! /bin/sh +# +# grap2graph -- compile graph description descriptions to bitmap images +# +# by Eric S. Raymond , May 2003 +# +# In Unixland, the magic is in knowing what to string together... +# +# Take grap description on stdin, emit cropped bitmap on stdout. +# The pic markup should *not* be wrapped in .G1/.G2, this script will do that. +# A -U option on the command line enables gpic/groff "unsafe" mode. +# A -format FOO option changes the image output format to any format +# supported by convert(1). All other options are passed to convert(1). +# The default format is PNG. +# + +# Requires the groff suite and the ImageMagick tools. Both are open source. +# This code is released to the public domain. +# +# Here are the assumptions behind the option processing: +# +# 1. None of the options of grap(1) are relevant. +# +# 2. Only the -U option of groff(1) is relevant. +# +# 3. Many options of convert(1) are potentially relevant, (especially +# -density, -interlace, -transparency, -border, and -comment). +# +# Thus, we pass -U to groff(1), and everything else to convert(1). +# +# $Id: grap2graph.sh,v 1.4 2005/05/18 07:03:06 wl Exp $ +# +groff_opts="" +convert_opts="" +format="png" + +while [ "$1" ] +do + case $1 in + -unsafe) + groff_opts="-U";; + -format) + format=$2 + shift;; + -v | --version) + echo "GNU grap2graph (groff) version @VERSION@" + exit 0;; + --help) + echo "usage: grap2graph [ option ...] < in > out" + exit 0;; + *) + convert_opts="$convert_opts $1";; + esac + shift +done + +# create temporary directory +tmp= +for d in "$GROFF_TMPDIR" "$TMPDIR" "$TMP" "$TEMP" /tmp; do + test -z "$d" && continue + + tmp=`(umask 077 && mktemp -d -q "$d/grap2graph-XXXXXX") 2> /dev/null` \ + && test -n "$tmp" && test -d "$tmp" \ + && break + + tmp=$d/grap2graph$$-$RANDOM + (umask 077 && mkdir $tmp) 2> /dev/null && break +done; +if test -z "$tmp"; then + echo "$0: cannot create temporary directory" >&2 + { (exit 1); exit 1; } +fi + +trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 2 15 + +# Here goes: +# 1. Add .G1/.G2. +# 2. Process through grap(1) to emit pic markup. +# 3. Process through groff(1) with pic preprocessing to emit Postscript. +# 4. Use convert(1) to crop the Postscript and turn it into a bitmap. +(echo ".G1"; cat; echo ".G2") | grap | groff -p $groff_opts -Tps -P-pletter | \ + convert -trim -crop 0x0 $convert_opts - $tmp/grap2graph.$format \ + && cat $tmp/grap2graph.$format + +# End diff --git a/contrib/groffer/ChangeLog b/contrib/groffer/ChangeLog new file mode 100644 index 0000000..c436f8c --- /dev/null +++ b/contrib/groffer/ChangeLog @@ -0,0 +1,1546 @@ + ________________________________________________________________ + * release of groffer 0.9.22 + +2005-22-04 Bernd Warken + + ### `--whatis' + + Produce a `groff' output and allow wild cards on filespec + parameters for `--whatis'. + + * groffer2.sh: + - $_FILESPEC_ARG: New variable for storing the actual filespec + parameter. + - main_do_fileargs(): Set $_FILESPEC_ARG and add + what_is_filespec(). + - main_parse_args(): Add --all to --whatis. + - to_tmp_line(): New function to write the arguments to the + temorary cat file. + - whatis_filename(): Rename of what_is(). Construct a better + printout using $_FILESPEC_ARG. Repair the sed sequneces. + - whatis_filespec(): New function to print the filespec once + during the `whatis' process. + - whatis_header(): New funtion for printing the header of the + `whatis' output. + + * groffer.man: Revise the documentation of --whatis. + + ### `--apropos*' + + Produce `groff' for `--apropos*'. Allow `--sections' for + `--apropos', ignore it with `--apropos-*'. + + * groffer2.sh: + - --apropos*: Make these options without argument. + - $_APROPOS_PROG: New variable for the program that is is used for + `apropos'. + - $_APROPOS_SECTIONS: New variable to determine the sections that + are filtered out of `apropos' output depending on `--apropos-*'. + - apropos_filespec(): Handling of apropos at the filespec level. + - apropos_run(): Remove it. + - apropos_setup(): New function. + - main_set_mode(): Remove handling of $_OPT_APROPOS*. + + * groffer.man: + - Revise the documentation of `--apropos*'. + - Split section 'options for GNU man' into two sections `options + for man pages' and `long options taken over from GNU man'. + - Move `--apropos*', `--whatis', `--man', and `--no-man' to + section `options for man pages'. + + ### special display (apropos and whatis) + + * groffer2.sh: + - special_setup(): New function that chooses the setup between + apropos and whatis. + - special_filespec(): New function that does the output at the + filespec level for apropos or whatis. + + ### handle `--sections' for man page searching + + * groffer2.sh: + - man_do_filespec(): Use $_OPT_SECTIONS of --sections instead of + $_MAN_AUTO_SEC if non-empty. If a section was given on the + filespec parameter $_OPT_SECTIONS is ignored. This differs from + `man' which always uses the restricted sections of --sections. + This function works for both normal man page search and whatis. + - apropos_filespec(): Use --sections for --apropos, but not for + --apropos-* because these provide already their own sections. + + ### wildcards in filespec arguments + + * groffer2.sh: Wildcards are now accepted. In `--apropos*' and + `--whatis' they are interpreted as wildcard search elements; but + in normal display they are only handled as their own character. + + ### development; new option + + * groffer2.sh: + - --print: New option that prints just its argument for parameter + check. + - usage(): Add new option. + - $_OPT_DO_NOTHING: New variable for do_nothing(). Handle it at + the end of main_parse_Args(). + + * groffer.man: Add information on --print. + + ### safe exit + + * groffer2.sh: + - error(): Always exit with $_ERROR. + - exit_test(): New function to exit when first exit was hidden by + (). Call it after each $(). + + ### automatic shell determination + + * groffer.sh: + - If no option --shell is given perform a test of several shells + to automatically start some shell for groffer2.sh. `ksh' is used + first because it can be safely terminated by Ctrl-C. + - This can be cancelled by providing --shell=''. + - Add test on `sed' program. + + * groffer.man: Revise information on --shell. + + ### trap + + * groffer2.sh: + - trap_set(): Remove argument. Instead of $_ALL_EXIT use only + signal 0. + - trap_unset(): Rename trap_clean(). Instead of $_ALL_EXIT use + only signal 0. + - $_ALL_EXIT: Remove this variable. + - Replace all direct `trap' calls by trap_set(). + + * README_SH: New section `Bugs' on `trap'.. + + ### user errors, error output without function stack + + * groffer2.sh: + - error_user(): New function for user errors. + - error(): Remove call of clean_up() because the trap will do it + with the exit. Remove the `kill' commands. Create a temporary + file `.error' that can be tested by exit_test() for a better exit + test (especially for shell `ksh'). + - $_DEBUG_USER_WITH_STACK: New variable to enable function stack + output in error_user(). + - list_from_cmdline(), list_single_from_abbrev(), main_set_mode(): + Use error_user(). + + ### test modes on X and tty + + * groffer2,sh: + - is_X(), is_not_X(): New functions for checking on X Window. + - $_VIEWER_HTML_TTY, $_VIEWER_HTML_X: New variables that split + $_VIEWER_HTML. Add `galeon'. + - main_parse_args(): Allow mode change for graphical modes only + when in X Window. + - _do_display() of main_display(): Create a special run for + viewers that run on the terminal; `lynx' is the only one so far. + + ### add $GROFFER_MODE to command line + + * groffer.sh: + - After the handling of the configuration files integrate + $GROFFER_OPT to the command line. + - This makes a `set' in the shell determination unnecessary. + + * groffer2.sh: + - The debug test gets simpler because quotes are vanished without + $GROFFER_OPT. + - main_parse_MANOPT(): Prepend $mpm_list to the command line. + - main_parse_args(): `set' is unnecessary. + + ### debug; new options + + * groffer2.sh: + - --debug-all, --debug-lm, --debug-params, --debug-shell, + --debug-stacks, --debug-tmpdir, --debug-user: New options. + - --debug: Enable all debug variables except $_DEBUG_STACKS and + $_DEBUG_LM. By the new options the smallest abbreviation is now + `--debug'. + - $_DEBUG_STACKS: Rename $_DEBUG. + - $_DEBUG_PRINT_TMPDIR: New debug variable for printing the name + of the temporary directory in main_init(). + - $_OPT_DEBUG: Remove this variable because debug is handled at + the early part of the script. + - clean_up(): Enlarge $_DEBUG_KEEP_FILES to not deleting the + temporary directory. + - usage(): Move all development options on a section of its own. + - Move the test of rudimentary shell functionality at the + beginning of the script. Add test on `sed'. + - Follow this by the debug section. The determination of all + --debug* options can be done without a function. + + * groffer.man: Revise information on --debug and add new options. + + ### variables + + * groffer.sh: + - $_ERROR: Move the definition of this variable here. + - $_GROFF_VERSION: New variable, is set over @...@ construct. + - $_OUTPUT_FILE_NAME: Move this variable to groffer2.sh. + + * groffer2.sh: + - $_MAN_AUTO_SEC_LIST: Rename $_MAN_AUTO_SEC because it represents + a list. + - $_MAN_AUTO_SEC_CHARS: New read-only variable for storing + $_MAN_AUTO_SEC_LIST in [] construct. Use it in man_do_filespec() + and whatis_filename(). + - $_SPACE_CASE: New read-only variable with [] on space characters + with \ for `case' patterns. Use it in several functions. + - $_SPACE_SED: New read-only variable with [] on space characters + for `sed'. Use it in several functions. + + ### options and display + + * groffer2.sh: + - list_from_cmdline(): Add test whether the same abbreviation is + part of long options with and without arguments. Give handling of + `=' a `case' pattern of its own. + - main_display(): Remove unnecessary calls of `clean_up' in order + to use `mozilla' without problems. In _do_display(): Fix -X by + providing a different process when $_DISPLAY_PROG is empty. + - main_set_mode(): Accept options for viewers as is, without check + for program. Add test whether no program is given for a mode. + This avoids unnecessary empty $_DISPLAY_PROG in main_display(). + + ### viewer programs that run on the terminal (tty); new options + + * groffer2.sh: + - $_VIEWER_TERMINAL: New variable that stores whether a viewer was + supposed to run on tty. + - --dvi-viewer-tty, --html-viewer-tty, --pdf-viewer-tty, + --ps-viewer-tty, --tty-viewer-tty, --X-viewer-tty, --x-viewer-tty, + --www-viewer-tty: New options for viewers that run on a terminal. + - main_parse_args(), _do_display() of main_display(): Use the new + options and the new variable. + - usage(): Add the new options. + + * groffer.man: Add information on options --*-viewer-tty. + + ### other fixes + + * groffer2.sh: + - _do_display() of main_display(): Bear errors of `groff' run. + - is_not_file: Fix to have exactly one argument. + - is_not_prog(): Handle no arguments. + - list_has_not(): Fix. + - main_do_fileargs(): Remove $mdfa_exitcode. + - register_title(): Limit title to 4 elements. + - version(): Print the version information to standard output just + like `groff' does. + - --no-special: New option to disable former calls of `--all', + `--apropos*', and `whatis. + - --title: Make it an option with argument. + +2005-08-07 Keith Marshall + + * contrib/groffer/Makefile.sub (install): Reference groffer2.sh + as $(srcdir)/groffer2.sh, so it will install when building in a + different directory from the source. + + ________________________________________________________________ + * release of groffer 0.9.21 + +2005-08-02 Bernd Warken + + ### @...@ constructs + + * groffer.sh: + - $_AT: New variable for `@'. + - @...@: Replace the @...@ constructs by variables _AT_..._AT. + These constructs are transformed by `make' to useful information. + Keep all of these constructs in the first part of groffer.sh. For + a run before a `make' call, the script sets these variables to + special values for testing purpose. + - $_GROFFER_LIBDIR: Variable pointing to the groffer library + directory @libdir@/groff/groffer. + + ### Configuration files + + * groffer.sh: + - Add test for `$()' construct. + - Read and transform the configuration files and execute the + emerging commands. The `sed' script was heavily enlarged to + handle line with spaces and quotes. The emerging script is now + called by `eval', so no temporary file is needed. + - $_CONF_FILE_ETC, $_CONF_FILE_HOME: New variables for the config + files. + - $_SQ, $_SP: Move variables for characters before the handling of + the configuration files. Rename $_SQUOTE to $_SQ and $_SPACE to + $_SP. + - $GROFFER_OPT: Remove cleaning of this variable before the + reading of the configuration files. + + * groffer2.sh: + - main_init(): Remove the getting of the configuration files. + + ### Rewrite the shell determination + + * groffer.sh: + - Get rid of all functions in `groffer.sh'. Rewrite the shell + determination with `` and $(). + - --shell: Shortest abbreviation is `--sh'. Allow arguments for + the shell name. + - Allow an empty argument for --shell as shell name to overwrite a + specified shell; an empty shell name gets back to the default + shell. + - The shell determination now inludes the full handling of the + config files. The `--shell' option needs no longer a line + starting with `-'. + + ### Test of unset + + * groffer.sh: + - Remove test of `unset'. + - Remove all calls of `unset'. + - Use one character names for all variables that are meant to be + local in this script. + + * groffer2.sh: + - Move the test of `unset' to the testing of rudimentary shell + functionality without change. + + ### Allow abbreviations for long options + + * groffer2.sh: + - list_has_abbrev(): New function for checking a list having an + element with a given abbreviation. + - list_get_single_from_abbrev(): New function to retrieve the + element having a given abbreviation. + - list_from_cmd_line(): For an option abbreviation determine the + corresponding long option. + - From the man option lists remove the elements that are also in + a groffer list. + - Allow abbreviation for the early test of --debug. + + * groffer.sh: Allow abbreviation for the early test on --shell. + - get_opt_shell(): Rewrite _get_opt_shell() and the shell test + around it. + - test_on_shell(): Rename function _test_on_shell(). + - $_SHELL: global variable for the shell to run groffer2.sh. + + ### Get rid of `sh -c' + + * groffer2.sh: + - main_display(), _do_display(): Remove the `sh -c' calls. Make + the cleanup working without it. + - _do_display(): Extend _do_display() such that it can be used for + the pdf mode as well. + - _make_pdf(): New subfunction of main_display() for running the + additional parts of pdf mode in _do_display(). + - rm_file(), rm_file_with_debug(), rm_tree(): New functions for + removing files and directories. + + ### Change directory + + * groffer2.sh: + - $_START_DIR: New variable to store the directory at the starting + time of the script. + - main_display(): Go to the groffer temporary directory to be able + to process internal `groff' data like pictures. + - clean_up(): Get back to the starting directory. + + ### Compatibility with strange shells + + * groffer2.sh: + - clean_up(): `zsh' and `posh' had difficulties with `eval'. + - is_*(): Add test on empty argument. Some shells return true on + `test -d' etc. with empty argument, while most shells return + false. + - echo1(); New function to print single line `cat <file' for generating an empty file. + - rmdir: Replace `rmdir' by `rm -f -r'. + - eval: Add `eval' to many commands with variable arguments. + + * groffer.sh: repair `debug' + - Print all debug output to stderr. + - $_FUNC_STACK: Built function call stack even when $_DEBUG is not + set. Now the arguments are not added. + - $_DEBUG: If set to `yes' print 3 call stack events: the function + that is added with its arguments is printed with `+++ ' + (func_push()); the call stack after the addition is printed with + `>>> ' (func_push()); the call stack after the removing is printed + with `<<< ' (func_pop()). + - error(): Always print the function call stack on errors. + + * groffer.sh: Corrections + - $_groffer_run: Rename to $_GROFFER_RUN. + - $unset: Rename to $_UNSET. + - Repair test of `unset'. + - Repair test for `--shell'. The script is now rerun under the + shell specified in the option argument. This can increase the + speed. + + * README_SH: `zsh' now works. + + * groffer.man: + - Reformulate the information for the `groffer' specific details + of option `-V'. + - Add information on the debug process. + - Add information on the default devices in `x mode'. + - Minor corrections. + + ________________________________________________________________ + * release of groffer 0.9.18 + +2005-07-01 Bernd Warken + + * groffer.sh: further shell compatibility + - `echo': Remove options and possible options of `echo' by + preceding the argument with a character `x' that is removed by + `sed' or replace `echo' by `cat </README_SH + + + ******* Extension of the `apropos' handling + + The output of man's `apropos' has grown immensely meanwhile, so it + has become inefficient. Now `groffer' provides new options to get + the a selected information from this output. + + * groffer.sh: + `--apropos-progs': new option for displaying only information + on programs (man page sections 1, 6, and 8) + `--apropos-data': new option for displaying only information + on documented data (man page sections 4, 5 and 7) + `--apropos-devel': new option for displaying only information + on development documentation (man page sections 2, 3 and 9) + `--apropos': still displays just the output of man's `apropos' + program. + - Specify all of these options as a single argument option; that + makes groffer's `--apropos' option slightly different because + the corresponding `man' option does not have arguments, but takes + all file arguments as apropos targets. So just ignore the `man' + options `-k' and `--apropos' in the parsing of $MANOPT. + - Exit after processing one `apropos' call. + + + ******* Quasi object oriented function arguments + + An object is the name of an environment variable. The value of + this variable contains the object's content. This allows to + specify function arguments and the calling syntax in a simpler way + by letting the first argument be a variable name, usable for input + or output. + + Such an object type is `list', the string value of a shell + variable arranged in space-separated single-quoted elements, such + as $GROFFER_OPT internally. + + * groffer.sh: + - Remove list_from_args(), list_element_from_arg() + list_from_lists(), list_length(), and list_prepend(). + They can be replaced by list_append(). + - All list*() functions are rearranged such that the first + argument is a list object, the name of a variable. + + + ******* Simplification of configuration files + + The new syntax of the groffer configuration files is + - all lines starting with a `-' character are interpreted as + command line options for all calls of groffer; they are collected + and prepended to the actual value of $GROFFER_OPT; optional + spaces at the beginning.of the line are omitted. + - all other lines are interpreted as a shell command and executed + in the current shell of the groffer call. + + Precedence: + - The command line and the external environment variables such as + $GROFFER_OPT of the groffer call have the highest precedence. + - This is overwritten by the configuration file in the user's home + directory. + - The system configuration file in /etc has the lowest + precedence. + + * groffer.sh: + The configuration files are now called after the determination of + the temporary files in main_init(). + + + ******* Script file name + + The file name of the script is needed for the several calls during + the search for the optimal shell. + + * groffer.sh: + - $_GROFFER_SH: replace $_this by $_GROFFER_SH and use $0 for + determining the file name of the script for the following calls, + instead of the cumbersome @BINDIR@ construction. + - Force the script to be called as an executable file, so $0 must + contain the program name. + + + ******* Improved temporary file names + + Just like groff, groffer mixes all file parameters into a single + output file. Its name is now constructed as a comma-separated + list built from the file name arguments without a leading comma. + So a leading comma can be used for the internal temporary file + names. + + * groffer.sh: + - $_OUTPUT_FILE_NAME: new global variable as basis for the output + file name; it is set in main_set_resources(). + - tmp_create(): use `,name' for temporary files different from + output file because the output file name does not start with a + comma. `$$' is not needed anymore. + - main_display(): simplification of $_modefile in _do_display() + and single display modes. + - Add extension `.html' to output file name in html mode. + - base_name(): correction for strange positions of `/'. + + + ******* Mode fixes + + * groffer.sh: + - Set the main default mode to `x' with groff's X Window viewer + `gxditview'. + - Allow 'x' and 'X' in `--mode' for the X Window mode; the same + for `--x' and `X', `--x-viewer' and `--X-viewer'. + - Make groff's `-X' equivalent to `mode X'. + - Fix `--auto', `--mode auto', and `--default-modes'. + - `html' mode: new mode equivalent to `www', add `konqueror' and + `lynx' as viewers. + - `pdf' mode: fix zoom options for pdf-viewer `xpdf' in + main_set_resources(); in main_display() fix the display structure. + - Set default X Window resolution to 75dpi. This is not optimal, + but with a higher value the options and resources for some viewers + must be optimized. + `--text' and `--mode text': new option for text output without a + pager. + - `--tty-viewer': new option equivalent to `--pager'. + - Correct the pagers for `tty' mode. + - Fix `groff' mode in main_set_resources() and main_display(). + - Harmonize `--mode arg' with the equivalent options `--arg'. + + + ******* Fixes for command line options + + * groffer.sh: + - list_from_cmdline(): fix the parsing of options with arguments. + - Rename $_OPT_TTY_DEVICE to $_OPT_TEXT_DEVICE. + - $_OPTS_X_*: new variables for the inhereted X Window variables. + - Improve the distribution of the command line options into + $_OPTS_GROFFER_*, $_OPTS_GROFF_*, $_OPTS_X_*, and $_OPTS_MAN_*. + - $_OPTS_MANOPT_*: new variables for the parsing of $MANOPT. + - Correct $_OPTS_CMDLINE_*. + - Remove some unused $_OPTS_*. + - `--iconic': new option from `-iconic' of the X Window toolkit. + - Correct `--rv' to an option without argument. + - Minor fixes of other X Window toolkit options. + + + ******* Other fixes + + * groffer.sh: + - is_prog(): allow 0 arguments. + - is_not_writable(): new function. + - is_*(): fix trailing return codes. + - Replace most `test' calls by is_*() functions. + - man_setup(): due to bugs in `manpath', prefer + manpath_set_from_path() for the determination of the man page path. + - man_search_section(): correction of some `for' loops. + - Remove export of external non-groffer variables. + + + ******* Documentation + + * groffer.man: + - Reorder the option details according to the option origin as + groffer, groff, X, and man options. + - Add the programming changes information mentioned above. + - Support man pages with a dot in their name + + * README_SH: new file + Move large parts of the documentation in `groffer.sh' into this + file. + + * groffer.sh: usage(): + - Change the output for `--help' to standard output. + - Restructure the information for this help output. + + + ******* Removement of the author's email address + + Because of the extreme spam attacks, the author removed all + occurencies of his email address in every file of the groffer + source. + +2003-01-22 Bernd Warken + ________________________________________________________________ + * release of groffer 0.9.4 + + * groffer.sh: corrections for some restrictive shells + - Possible exit codes in actual `ash' are between 0 and 63. To + handle even deeper restrictions, use 7 as maximal code instead + of 255 as replacement for error -1. + - Remove variables $_BAD2 and $_BAD3. + - Replace `trap' argument `EXIT' by 0 and write new fuctions + `trap_clean' and `trap_set' to handle the restrictions of `trap' + for some shells. + - Correct wrong $MANPATH to $_MAN_PATH in function + `man_do_filespec'. + - Test existence of directory before deleting it in the + `clean_up' definitions. + - Correct help output in `usage' (called by `--help'). + + * TODO: + Remove mention of `shoop' and `apropos'. + +2002-10-21 Bernd Warken + ________________________________________________________________ + * release of groffer 0.9.3 + + * groffer.sh: new temporary subdirectory + - Generate temporary subdirectory for storing temporary files + with better names in future groffer versions (name: + "groffer$$" in usual temporary directory). + - Use `umask 000' for temporary files to allow cleaning up + for everyone after a system break. + - Change both clean_up() functions (for normal shell and + for main_display() subshell) to handle the new subdirectory. + - clean_up_secondary() and $_TMP_PREFIX are unnecessary now, so + they were removed. + + * Makefile.sub: `sed' commands for "groffer:" + - Remove "@g@" entry (not used in "groffer.sh"). + - Add global replace for "@BINDIR@" and "@VERSION@" for future + usage. + + * TODO: think about... + - writing part of groffer in C/C++. + - handling several files with different macro packages. + +2002-10-17 Bernd Warken + ________________________________________________________________ + * fixes of groffer 0.9.2 + + * groffer.sh: + Terminate main_parse_MANOPT() if $MANOPT is empty or consists + of space characters only. + + * groffer.man: some fixes in "GROFFER OPTIONS" + - New macro ".Header_CB" for CB font in .TP headers; used for + definition of variables in option --mode. + - Fix some option references to refer to long options. + + * README: + New file for general information on the groffer source; it is + not installed. + +2002-10-14 Bernd Warken + + * Makefile.sub: + add replacement "@BINDIR@" to "$(bindir)" for "groffer:" + + * groffer.sh: + Define $_this as "@BINDIR@/${_PROGRAM_NAME}" to save the right + installation position of groffer for the special shell calling. + + * groffer.man: + Remove double definition of filespec parameters. + +2002-10-13 Bernd Warken + ________________________________________________________________ + * release of groffer 0.9.2 + + * groffer.sh: fixes + - Fix some 'sed' functions: two in func_stack_dump(), one in + base_name(), add 'sed' command in list_from_cmdline(). + - Finish main_parse_MANOPT() if $MANOPT is empty. + - Sort $_OPTS_GROFF_SHORT_NA like groff short options (but + unchanged). + - Fix some comments. + + * groffer.man: make it more readable (but no additions) + - A shortened section "SYNOPSIS" is followed by a simplified + section "DESCRIPTION". + - The options from "SYNOPSIS" go to new section "OPTION + OVERVIEW" with all groffer options in a single subsection. + - The details of all groffer options are described in section + "GROFFER OPTIONS". + - New macro for file names ".File_name". + - "Option Parsing" is moved to section "COMPATIBILITY". + - Fix some "EXAMPLES". + +2002-09-30 Bernd Warken + ________________________________________________________________ + * release of groffer 0.9.1 + + * TODO: remove done entries + - Remove request for different shells. + - Remove the 'sed' complaints. + +2002-07-15 Bernd Warken + + * groffer.sh: replace `sed' interface by direct `sed' + - This improves the performance of the shell programming parts + and shortens the groffer script by about 5%. + - Remove functions: string_del_append(), string_del_leading(), + string_del_trailing(), string_flatten(), string_get_before(), + string_get_leading(), string_replace_all(), string_sed_s(), + and their auxiliary functions. + - Replace all calls of these functions by direct `sed' commands. + - Define variables for special characters to ease `sed' calls. + - Remove `$APPEND'. + - Restrict list_from_string() to single character separators. + - Correct list_check() and base_name(). + - Add comments to all calls of `sed'. + + * groffer.sh: add run-time support for several shells + - New option `--shell': stop execution and rerun groffer under + the shell specified in the argument of `--shell'. + - If no shell was specified at run-time, `ash' is tried first; + if `ash' is not available continue with the shell with which + groffer was called from the command line, or with the shell + name in the first line of the script, actually `/bin/sh'. + +2002-07-12 Bernd Warken + ________________________________________________________________ + * fixes for groffer 0.9.0 + + * groffer.sh: enhance version information + `groffer -v|--version' now print: + - groffer's version number and date + - the string `is part of ' + - groff's version information (version number and copyright), + but not groff's `called subprograms' information. + + * groffer.sh: minor fixes + - Fix the argument parser to process argument `-' correctly. + - Some display programs have trouble with empty input; feed a + line consisting of a single space character in this case for + all display modes (not for source or groff modes). + + * TODO: + fix entry `shoop' (not 'shopt'). + +2002-06-28 Bernd Warken + ________________________________________________________________ + * release of groffer 0.9.0 + + * groffer.sh: new mode `pdf' + - PDF (Portable Document Format): + -> Transform groff `ps' output into pdf using `gs'. + -> Pro: PDF viewers provide text searching (!). + -> Con: the transformation is quite slow. + -> Not suitable as an auto mode. + - New options `--pdf', `--pdf-viewer', `--mode pdf'. + - Standard pdf viewers `xpdf' and `acroread'. + - For `xpdf', choose zoom `z 3' for 100 dpi, `z 2' for 75 dpi. + + * groffer.sh: support bzip2 decompression + - add test for `bzip2' with necessary options + - extend functions `catz()' and `save_stdin()'. + + * TODO + remove entry on `bzip' decompression (done). + + * groffer.man: + - Document new `pdf' features. + - Document new `bzip2' decompression. + - Fix documentation for `--auto-modes'. + + * groffer.sh: minor fixes + - Improve device tests in `tty' and `dvi' modes. + - Internally, map mode `auto' to '' to facilitate tests. + - Fix auto mode sequence to: `ps,x,tty' as was intended. + +2002-06-25 Bernd Warken + + * groffer.sh: + Fix `source' mode. + + * groffer.man: + Fix some indentations. + +2002-06-23 Bernd Warken + ________________________________________________________________ + * release of groffer 0.8 + + * Makefile.sub: add copyright section + + * groffer.man: + - Document the new options. + - Revise the documentation of the modes. + - Document the configuration files in new section `FILES'. + - Redesign section `EXAMPLES'. + - Remove documentation for `-W'. + + * groffer.sh: new debugging features + - Disabled by default; enabled by environment variables. + - Add landmark() to catch typos with quotes. + - Add a function call stack for suitable functions; implemented + as within the argument checker func_check(). + - This implies the need to provide `return' with some clean-up + facility; implemented as `eval "$_return_..."'. + - Add option `--debug' to enable debugging at run-time. + - Actually, the groffer script uses only shell builtins found + in `ash' (a subset of POSIX) and POSIX `sed' as the only + external shell utility. + + * groffer.sh: customization of viewers + - In `groff' mode, the groffer viewing facilities are disabled. + - The postprocessor option `-P' costumizes the viewer only in + some situations in the `groff' mode, so a new infrastructure + for viewer customization is necessary. + - Allow to specify arguments to the viewer programs specified + in `--*-viewer()'. + - Implement some of the essential X Toolkit resource options in + groffer, but with use a leading double minus. + -> `--bd': set border color. + -> `--bg', `--background': set background color. + -> `--bw': set border width. + -> `--display': set X display. + -> `--geometry': set size and position of viewer window. + -> `--fg', `--foreground': set foreground color. + -> `--ft', `--font': set font. + -> `--resolution': set X resolution in dpi. + -> `--title': set viewer window title. + -> `--xrm': set X resource. + - Remove misnamed option `--xrdb'. + + * groffer.sh: new mode structure + - New Postcript mode `ps' (`--ps'): + -> default viewers: gv,ghostview,gs_x11,gs; + -> `--ps-viewer' sets the Postscript viewer. + - New mode `www' (`--www') for displaying in a web browser: + -> default browsers: mozilla,netscape,opera,amaya,arena; + -> `--www-viewer' sets the web browser. + - New dvi mode (`--dvi'); default viewer `xdvi': + -> default viewers: xdvi,dvilx; + -> `--dvi-viewer' sets the dvi viewer. + - New mode `auto': + -> active if no other mode is given or by new option `--auto'; + -> selects from a sequence of modes that are tested until one + of them succeeds. + -> the default mode sequence is actually `ps', `x', `tty'. + -> `--default-modes' sets this mode sequence as a comma + separated string of program names, optionally each one + with arguments). + - New mode `groff': + -> process input like groff, ignore viewing options. + -> activated by new option `--groff'. + -> automatically active with one of `-V', `-X', `-Z'. + - Revise `tty' mode: + -> allow several text devices. + -> + - Reorganize the mode management: + -> new mode setting option `--mode'. + -> logically separate source, groff, and display modes. + -> intermediate output mode is now part of mode groff; remove + any special features around `-Z'. + - Update usage() to reflect the new option structure. + + * groffer.sh: add configuration files + - `/etc/groff/groffer.conf' system-wide configuration. + - `${HOME}/.groff/groffer.conf' user configuration. + - The configuration file are shell scripts for now; later + implementations can identify this from the `#! /bin/sh' line. + + * groffer.sh: new data structure `list': + - Implement a `list' data structure as a string consisting of + single-quoted elements, separated by a space character; + embedded single-quotes are escaped. + + * groffer.sh: new option parser based on `list': + - Write new option parser based on `list', compatible to both + POSIX getopts() and GNU getopt(). + - Long options are now available on GNU and non-GNU systems. + - Get rid of POSIX getopts() and GNU getopt(). + - the `-W--longopt' construct is now obsolete; remove it. + - add test/function for `unset'. + - Option strings are now implemented as `list's in order to + allow unusual characters in options. + - Parse $MANOPT first; translate essential arguments into + groffer options. + + * groffer.man: + - determine prompt length for `.Shell_cmd'* dynamically. + - naming scheme for static strings and registers changed to + `namespace:macro.variable'. + + +2002-06-16 Werner Lemberg + + * groffer.sh: + Implement man option `--ascii' by `-mtty-char'. + + +2002-05-31 Werner LEMBERG + + * groffer.man (@.Shell_cmd_width): + Increase to 4m (we use `sh#' as the prompt). + + +2002-05-31 Bernd Warken + ________________________________________________________________ + * release of groffer 0.7 + + * groffer.sh: remove incompatibilities with the `ash' shell: + - do not use `!command': + -> use `else' + -> write `_not_' equivalents for some functions + - do not use `[^]' in `case': + -> restructure some functions. + - only single-character names for loop variables: + -> spoils the paradigm of leading `_' for local variables. + - spurious trouble with `for i in ${var}': + -> use `eval set -- ${var}' and `for i in "$@"' + - do not change or use $IFS: + -> define new functions string_split() and `path_split()'. + -> result must be processed by `eval set --'. + -> solve conflicts with existing positional parameters. + - trouble with exporting external `$GROFF_*' variables: + -> hope that they were exported in the calling shell. + - not smart about additional blanks: + -> remove unnecessary white space. + + * groffer.sh: improve run-time speed: + - `ash' more than doubles the speed of `bash'. + - speed-up `man_setup()'. + + +2002-05-30 Werner Lemberg + + * groffer.man: + - remove some wrong `\:'. + - rename macro names that start with a `[' (clashes with refer). + - fix TP_header. + + +2002-05-28 Bernd Warken + ________________________________________________________________ + * release of groffer 0.6 + + This is almost a complete rewrite since groffer 0.5 . + ________________________________________________________________ + * Documentation + + * groffer.man: + - Apply the changes done in www.tmac (.URL and .MTO) + - Replace \fP by \f[]. + - Redesign and rewrite most macros. + - Include the documentation for the new features. + - Greatly enlarge section ENVIRONMENT + - Add examples. + + * TODO: + - Start a TODO file with several sections. + + * ChangeLog: + Due to the many changes, shorten and rearrange the entries + since groffer 0.5 . + ________________________________________________________________ + * Shell compatibility + + * groffer.sh: + - Due to possible conflicts in old BSD versions, `[]' was + replaced by `test'; the `test' options `-a' and `-o' were + replaced by multiple calls of `test'. + - Write interface to the `sed' command `s' to become + independent of the delimiter character. Rewrite all text + manipulating function to use this new scheme. The new + functions are named `string_*'. + - `tr' is not needed any longer, replaced by `sed'. + - `grep' is not needed any longer, mostly replaced by `case'. + - Revision of test for `getopt'. + - Remove `set -a'; explicitly export variables. + - The only external programs used are POSIX `sed' and the + fallback to `apropos'. All other program calls were + replaced by shell builtins and functions. + + ________________________________________________________________ + * Cosmetics + + * groffer.sh: + - Implement a prefix based naming scheme for local variables + and functions (OOP-like). + - Introduce variables for white space (better readability with + $IFS). + - Store the names of the processed filespecs into a variable + instead of a temporary file. + - Error-prone shell constructions were replaced by functions + with a simple interface. + - To avoid too long pipes, replace supercat() by do_fileargs(); + every input file is handled independently. + + ________________________________________________________________ + * New features: + - Add support for more X devices (e.g. X75-12 and X100-12). + - Add long option `--intermediate_output' to `-Z'. + - Make the options for mode selection clobber each other. + - Add option `--mode' with an argument having the following + values: + `X': force displaying in X, same as options `-X'; + `tty': display with a pager on text terminal; same as `--tty'; + `source', `default', `auto', etc. + - Make the handling of the X mode like in groff (e.g. -X -Tps). + - Make resolution for gxditview behave like groff (default + 75 dpi). + - Add environment variable $GROFFER_OPT to preset groffer + options. + + ________________________________________________________________ + * implement most of the functionality of GNU `man'. + + - Add all `man' long options to groffer. + - Add all `man' environment variables. + - Parse and use content of `$MANOPT'. + - The precedence of the options and environment variables + is regulated like in GNU `man'. + - Force the option `--manpath' to have a colon-separated + argument like GNU `man'. + - Support `man section name' calling convention. + - Remove all dependencies on `man -w'. + + * groffer.sh: + - Add the new features above. + - Rewrite the search algorithm for man pages. + - Remove searching with `man -w' (problems with space + characters in file names). + - Fix and complement usage(). + - The filespec parsers gets a function of its own do_manpage(). + + +2002-01-08 Bernd Warken + + * groffer 0.5 (beta) released + + * groffer.man: + - Fix hyphenation problems with macros describing options. + - Fix the handling of some `-' characters. + - Examples of shell commands now print in font CR instead of CB. + - Remove documentation for option `-X'. + - Add documentation for option `--dpi'. + + * groffer.sh: + - New method for creating temporary files, based on process + IDs. This is reliable enough and suitable for GNU and POSIX. + - Run gxditview in a new shell instantiation for having a clean + handling of the temporary files when running in the + background. + - Revision of the retrieving method for the window title. + - Empty input is now tolerated. + - Export the variables that are set before the call of `set -a'. + - Function usage() corrected and updated. + - Unnecessary stuff removed. + - Comments adjusted. + - Pass option `-X' to groff, i.e. force X output with 75 dpi. + - Implement option `--dpi' for setting the resolution for the X + viewer, which had already been documented in earlier versions. + +2002-01-07 Bernd Warken + + * groffer 0.4 (beta) released (as groff `contrib') + + * groffer.man: + - New features documented. + - Macros stream-lined. + - Section EXAMPLES added. + + * groffer.sh: + - System tests added/optimized. + - Speed/memory optimizations by defining some shell functions + alternatively depending on the text results. + - Use `gzip' for decompression instead of `zcat'. + - Signal handling added for clean exiting by `trap'. + - Temporary files exist only as long as necessary. + - Setup of path for man-pages moved after the option parsing. + - Fixed a bug in determining the path for man-pages. + - Fixed a bug in the handling of non-groffer options. + + * New features: + - New option --tty for forcing paging on text terminal. + - New option --no-man for disabling the man-page feature. + - Implement reserved POSIX -W feature to simulate long options. + - gxditview is now run as a background process. + +2002-01-05 Werner LEMBERG + + * Integrate groffer into groff's `contrib' tree. + + * Makefile: Replaced by... + Makefile.sub: New file. + + * groffer: Replaced by... + groffer.sh: New file. + + * groffer.man (OptDef): Add missing backslashes. + Update copyright. + +2001-12-15 Bernd Warken + + * groffer 0.3 (alpha) released (still stand-alone package). + + * GNU and POSIX are supported (POSIX without long options). + + * New options : --man, --mandb, --title, --xrdb + + * Support for command line arguments with embedded single space + characters (GNU only) . + + * Several search methods for man-pages when no `man -w' is + available ($MANPATH, mandb, a default path). + + * Language support for man-pages. + + * Recognize the following filespecs as man-page parameters: + man:name(section), man:name, name.section, name. + +2001-12-03 Bernd Warken + + * Stand-alone package for groffer 0.2 (alpha) created + Files: groffer, groffer.man, Makefile, TODO, ChangeLog + +2001-12-02 Bernd Warken + + * groffer 0.2 (alpha) program released. + + * Name changed from `groffview' to `groffer'. + + * Comments added. + + * Name changed from `groffview' to `groffer'. + + * Options harmonized with groff. + New options : -Q --source, -T --device, -X . + Other options known from groff are passed unchanged. + + * 100 dpi as default, 75 dpi only in emergency situations. + + * Bugs with temporary files fixed. + + * Code restructured and comments added. + +2001-11-28 Bernd Warken + + ***** groffview 0.1 (experimental) and groffview.man released + (predecessor of groffer, shell script) + + * Options : -h --help, -v --version + + * Search for man-pages based on $MANPATH + + * development of `groffview' shell script started + +2001-11-28 Bernd Warken + + ________________________________________________________________ + License + + Copyright (C) 2001,2002,2003,2004,2005 + Free Software Foundation, Inc. + Written by Bernd Warken + + Copying and distribution of this file, with or without + modification, are permitted provided the copyright notice and this + notice are preserved. + + This file is part of `groffer', which is part of the `groff' + project. diff --git a/contrib/groffer/Makefile.sub b/contrib/groffer/Makefile.sub new file mode 100644 index 0000000..54dfce4 --- /dev/null +++ b/contrib/groffer/Makefile.sub @@ -0,0 +1,60 @@ +# Makefile.sub for `groffer' (integration into the `groff' source tree) + +# File position: /contrib/groffer/Makefile.sub + +# Copyright (C) 2001,2002,2005 Free Software Foundation, Inc. +# Written by Werner Lemberg and Bernd Warken. + +# Last update: 15 August 2005 + +# This file is part of `groffer' which is part of `groff'. + +# `groff' is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# `groff' 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 `groff'; see the files COPYING and LICENSE in the top +# directory of the `groff' source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +######################################################################## + +MAN1=groffer.n +CLEANADD=groffer + +# not all make programs have $(RM) predefined. +RM=rm -f + +all: groffer + +groffer: groffer.sh groffer2.sh $(SH_DEPS_SED_SCRIPT) + $(RM) $@; + sed -f $(SH_DEPS_SED_SCRIPT) \ + -e "s|@g@|$(g)|g" \ + -e "s|@BINDIR@|$(bindir)|g" \ + -e "s|@libdir@|$(libdir)|g" \ + -e "s|@VERSION@|$(version)$(revision)|g" \ + -e $(SH_SCRIPT_SED_CMD) $(srcdir)/groffer.sh >$@; + chmod +x $@ + +install_data: groffer + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -$(RM) $(bindir)/groffer + $(INSTALL_SCRIPT) groffer $(bindir)/groffer + -test -d $(libdir)/groff/groffer || \ + $(mkinstalldirs) $(libdir)/groff/groffer + -$(RM) $(libdir)/groff/groffer/groffer2.sh + $(INSTALL_SCRIPT) $(srcdir)/groffer2.sh \ + $(libdir)/groff/groffer/groffer2.sh + +uninstall_sub: + -$(RM) $(bindir)/groffer + -$(RM) $(libdir)/groff/groffer/groffer2.sh + -rmdir $(libdir)/groff/groffer diff --git a/contrib/groffer/README b/contrib/groffer/README new file mode 100644 index 0000000..66d3612 --- /dev/null +++ b/contrib/groffer/README @@ -0,0 +1,104 @@ +README + +The `groffer' program is the easiest way to read documents written in +some `roff' language, such as the `man pages', the manual pages in +many operating systems. + + +Input + +Input comes from either standard input or command line parameters that +represent names of exisiting roff files or standardized specifications +for searching man pages. All of these can be compressed in a format +that is decompressible by `gzip', including `.gz', `bz2', and `.Z'. + +`groffer' has many built-in `man' functionalities to find and read the +manual pages on UNIX and similar operating systems. It accepts the +information from an installed `man' program, but tries to find a man +path by itself. + +`groffer' bundles all filespec parameters into a single output file in +the same way as `groff'. The disadvantage of this is that all file +name arguments must use the same groff language. To change this, the +option parsing must be revised for large parts. It seems that this +would create incompatibilities, so the actual option strategy is kept. + + +Output + +All input is first sent to `grog' to determine the necessary `groff' +options and then to `groff'. So no special `groff' arguments must be +given. But all `groff' options can be specified when this seems to be +appropriate. + +The following displaying modes for the output are available: +- Display formatted input with +-- the X `roff' viewer `gxditview', +-- a Postcript viewer, +-- a PDF viewer, +-- a DVI viewer, +-- a web browser, +-- a pager in a text terminal (tty). +- Generate `groff' output on stdout without a viewer. +- Generate the `groff intermediate output' on standard output without + postprocessing. +- Output the source code without any `groff' processing. +- There are some information outputs without `groff' processing, such + as by option `-V' and the `man' like `whatis' and `apropos' + outputs. + +By default, the program tries to display with `gxditview' as graphical +device in X; on non-X text terminals, the `tty' text mode with a pager +is tried by default. + + +Compatibility + +`groffer' consists of two shell scripts. It should run on any POSIX +or Bourne style shell that supports shell functions. See file +`README_SH' for more information. + + +Mailing lists + +For reporting bugs of `groffer', groff's free mailing list + can be used. + +For a general discussion, the mailing list is more +useful, but one has to subscribe to this list at +http://lists.gnu.org/mailman/listinfo/groff. + +See the `README' file in the top directory of the `groff' source +package for more details on these mailing lists. + + +####### License + +Last update: 2 August 2005 + +Copyright (C) 2003,2004,2005 Free Software Foundation, Inc. +Written by Bernd Warken + +This file is part of `groffer', which is part of `groff'. + +`groff' is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +`groff' 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 `groff'; see the files COPYING and LICENSE in the top +directory of the `groff' source. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + + +####### Emacs settings + +Local Variables: +mode: text +End: diff --git a/contrib/groffer/README_SH b/contrib/groffer/README_SH new file mode 100644 index 0000000..05d085e --- /dev/null +++ b/contrib/groffer/README_SH @@ -0,0 +1,268 @@ +Additional description for the shell version of `groffer' + + +Scripts + +The shell version of `groffer' contains two files, `groffer.sh' and +`groffer2.sh'. + +`groffer.sh' is a short introductory script without any functions. I +can be run with a very poor Bourne shell. It just contains some basic +variables, the reading of the configuration files, and the +determination of the shell for `groffer2.sh'. This script is +transformed by `make' into `groffer' which will be installed into +@bindir@, which is usually /usr/local/bin. + +`groffer2.sh' is a long main script with all functions; it is called +by `groffer.sh' (`groffer' after installation). It is installed +unchanged into @libdir@/groff/groffer, which is usually +/usr/local/lib/groff/groffer. This script can be called with a +different shell, using the `groffer' option `--shell'. + + +Options + +The `groffer' script provides its own option parser. It is compatible +to the usual GNU style command line This includes long option names +with two signs such as `--option', clusters of short options, the +mixing of options and non-option file names, the option `--' to close +the option handling, and it is possible to abbreviate the long option +names. + +The flexible mixing of options and file names in GNU style is always +possible, even if the environment variable `$POSIXLY_CORRECT' is set +to a non-empty value. This disables the rather wicked POSIX behavior +to terminate option parsing when the first non-option command line +argument is found. + + +Error Handling + +Error handling and exit behavior is complicated by the fact that +`exit' can only escape from the current shell; trouble occurs in +subshells. This was solved by sending kill signals, see $_PROCESS_ID +and error(). + + +Function Definitions in `groffer2.sh' + +Each funtion in groffer2.sh has a description that starts with the +function name and symbols for its arguments in paranthesis `()'. Each +`<>' construction gives an argument name that just gives a hint on +what the argument is meant to be; these argument names are otherwise +irrelevant. The `>' sign can be followed by another character that +shows how many of these arguments are possible. + + exactly 1 of this argument +? 0 or 1 of these arguments +* arbitrarily many such arguments, incl. none ++ one or more such arguments +... one or more such arguments +[...] optional arguments + +A function that starts with an underscore `_' is an internal function +for some other function. The internal functions are defined just +after their corresponding function. + + +External Environment Variables + +The groffer.sh script uses the following external system variables. +It is supposed that these variables are already exported outside of +groffer.sh; otherwise they do not have a value within the script. + +external system environment variables that are explicitly used +$DISPLAY: Presets the X display. +$LANG: For language specific man pages. +$LC_ALL: For language specific man pages. +$LC_MESSAGES: For language specific man pages. +$PAGER: Paging program for tty mode. +$PATH: Path for the programs called (`:' separated list). + +groffer native environment variables +$GROFFER_OPT preset options for groffer. + +all groff environment variables are used, see groff(1) +$GROFF_BIN_PATH: Path for all groff programs. +$GROFF_COMMAND_PREFIX: '' (normally) or 'g' (several troffs). +$GROFF_FONT_PATH: Path to non-default groff fonts. +$GROFF_TMAC_PATH: Path to non-default groff macro files. +$GROFF_TMPDIR: Directory for groff temporary files. +$GROFF_TYPESETTER: Preset default device. + +all GNU man environment variables are used, see man(1). +$MANOPT: Preset options for man pages. +$MANPATH: Search path for man pages (: list). +$MANROFFSEQ: Ignored because of grog guessing. +$MANSECT: Search man pages only in sections (:). +$SYSTEM: Man pages for different OS's (, list). + + +Object-oriented Functions + +The groffer script provides an object-oriented construction (OOP). In +object-oriented terminology, a type of object is called a `class'; a +function that handles objects from a class is named `method'. + +In the groffer script, the object is a variable name whose content is +the object's data. Methods are functions that have an object as first +argument. + +The basic functions for object handling are obj_*(). + +The class `list' represents an array structure, see list_*(). + + +Shell Compatibility + +The `groffer' shell scripts are compatible to both the GNU and the +POSIX shell and utilities. Care was taken to restrict the programming +technics used here in order to achieve POSIX compatibility as far back +as POSIX P1003.2 Draft 11.2 of September 1991. This draft is +available at http://www.funet.fi/pub/doc/posix/p1003.2/d11.2 in the +internet. + +The POSIX draft does not include `local' variables for functions. So +this concept was replaced by global variables with a prefix that +differs for each function. The prefix is chosen from the function +name. These quasi-local variables are unset before each return of the +function. + +The `groffer' scripts were tested under the shells `ash', `bash', +`bash-minimal', `dash', 'ksh', `mksh', `pdksh', 'posh', and `zsh' +without problems in Linux Debian. A shell can be tested by the +`groffer' option `--shell', but that will run only with groffer2.sh. +To start it directly from the beginning under this shell the following +command can be used. + + groffer.sh --shell= ... + + +Some shells are not fully POSIX compatible. For them the following +restrictions were done. For more information look at the +documentation `Portable shells' in the `info' page of `autoconf' +(look-up in Emacs-Help-Manuals_Info). + +- The command parts `then', `else', and `do' must be written each on a + line of their own. + +- Replace `for i in "$@"' by `for i' and remove internal `;' (kah). + +- Replace `set -- ...' by `set x ...; shift'. After the first + non-option argument, all arguments including those starting with `-' + are accepted as non-option. For variables or `$()' constructs with + line-breaks, use `eval set' without quotes. That transforms a + line-break within a variable to a space. + +- The name of the variable in `for' is chosen as a single character + (old ash). The content of such variables is not safe because it can + also occur in other functions. So it is often stored in an + additional quasi-local variable. + +- `echo' is not portable on options; some `echo' commands have many + options, others have none. So `echo -n' cannot be used, such that + the output of each function has complete lines. There are two + methods to avoid having `-' as the first character of any argument. + Either a character such as `x' can be prepended to the argument; + this must later on be removed by `sed'. Otherwise, `echo' can be + replaced by `cat </contrib/groffer/TODO + + +####### TODO + +Revision: + +Optimization: +- Optimize `man' path determination in manpath_add_lang_sys() for speed + by building-up the `man' path only by and by as far as necessary + (not trivial). +- To increase the running speed write part of the `groffer' shell + script in C/C++. + +Features of external programs: +- Revise option handling of `grog'. + +Documentation: +- Improve the documentation of the search algorithm for `man' pages in + both the `groffer' scripts and the `man' page `groffer.man'. +- In `groffer.man', add more documentation for parts that were taken + over from GNU `man'. +- The documentation in the headers for some function definitions in + `groffer2.sh' needs to be updated. + + +####### License + +Last update: 16 August 2005 + +Copyright (C) 2003,2004,2005 Free Software Foundation, Inc. +Written by Bernd Warken + +This file is part of `groffer', which is part of `groff'. + +`groff' is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +`groff' 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 `groff'; see the files COPYING and LICENSE in the top +directory of the `groff' source. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + + +####### Emacs settings + +Local Variables: +mode: text +End: diff --git a/contrib/groffer/groffer.man b/contrib/groffer/groffer.man new file mode 100644 index 0000000..80177d6 --- /dev/null +++ b/contrib/groffer/groffer.man @@ -0,0 +1,4018 @@ +.TH GROFFER @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +.SH NAME +groffer \- display groff files and man\~pages on X and tty +. +.SH "SYNOPSIS" +.\" The .SH was moved to this place in order to appease `apropos'. +. +.\" -------------------------------------------------------------------- +.\" Legalize +.\" -------------------------------------------------------------------- +. +.ig +groffer.1 - man page for groffer (section 1). + +Source file position: /contrib/groffer/groffer.man +Installed position: $prefix/share/man/man1/groffer.1 + +Last update: 22 August 2005 + +Source file position: /contrib/groffer/groffer.man +.. +.de author +This file was written by +.MTO "" "Bernd Warken" . +.. +.de copyleft +Copyright (C) 2001,2002,2004,2005 Free Software Foundation, Inc. +. +.P +This file is part of +.IR \%groffer , +which is part of +.IR \%groff , +a free software project. +. +You can redistribute it and/or modify it under the terms of the +.nh +.B GNU General Public License +.hy +as published by the +.nh +.BR "Free Software Foundation" , +.hy +either version 2, or (at your option) any later version. +. +.P +You should have received a copy of the \f[CR]GNU General Public +License\f[] along with +.IR groff , +see the files \%\f[CB]COPYING\f[] and \%\f[CB]LICENSE\f[] in the top +directory of the +.I groff +source package. +. +Or read the +.I man\~page +.BR gpl (1). +You can also write to the +.nh +.B Free Software Foundation, 51 Franklin St - Fifth Floor, Boston, +.BR "MA 02110-1301, USA" . +.hy +.. +. +.\" -------------------------------------------------------------------- +.\" Setup +.\" -------------------------------------------------------------------- +. +.mso www.tmac +. +.if n \{\ +. mso tty-char.tmac +. ftr CR R +. ftr CI I +. ftr CB B +.\} +. +.if '\*[.T]'dvi' \{\ +. ftr CB CW +.\} +. +.ds Ellipsis ".\|.\|.\"" +. +.\" -------------------------------------------------------------------- +.\" setup for the macro definitions below +.\" +.\" naming: namespace:cathegory_macro.variable_name (experimental) +. +.\" -------------------------------------------------------------------- +.\" configuration of prompt for `.Shell_cmd'* macros +.ds groffer:Shell_cmd.prompt_text sh#\" prompt for shell commands +.ds groffer:Shell_cmd+.prompt_text >\" prompt on continuation lines +.ds groffer:Shell_cmd_base.prompt_font I\" font for prompts +. +.\" automatically determine setup from the configuration above +.als @f groffer:Shell_cmd_base.prompt_font\" +.als @t groffer:Shell_cmd.prompt_text\" +.als @t+ groffer:Shell_cmd+.prompt_text\" +.ds groffer:Shell_cmd.prompt \f[\*[@f]]\*[@t]\f[]\" needed +.ds groffer:Shell_cmd+.prompt \f[\*[@f]]\*[@t+]\f[]\" needed +.nr @w \w'\*[groffer:Shell_cmd.prompt]'\" +.nr @w+ \w'\*[groffer:Shell_cmd+.prompt]'\" +.ft \*[@f] +.\" Full prompt width is maximum of texts plus 1m +.nr groffer:Shell_cmd_base.prompt_width (\n[@w]>?\n[@w+]+1m)\" needed +.ft +.rm @f +.rm @f+ +.rm @t +.rm @t+ +.rr @w +.rr @w+ +. +.\" -------------------------------------------------------------------- +.\" static register for inter-macro communication in `.Synopsis'* +.nr groffer:Synopsis.level 0 +. +.\" -------------------------------------------------------------------- +.\" static registers for inter-macro communication in `.TP'* +.nr groffer:TP.level 0 +.rr groffer:TP_header.flag +.rr groffer:TP_body.flag +.rr groffer:TP.indent +. +. +.\" -------------------------------------------------------------------- +.\" Macro definitions +. +.\" Ignore all arguments like a comment, even after a .eo call. +.de c +.. +.c -------------------------------------------------------------------- +.c .CB (...) +.c +.c Print in constant-width bold font. +.c +.de CB +. ft CB +. Text \\$* +. ft +.. +.c -------------------------------------------------------------------- +.c .CI (...) +.c +.c Print in constant-width italic font. +.c +.de CI +. ft CI +. Text \\$* +. ft +.. +.c -------------------------------------------------------------------- +.c .CR (...) +.c +.c Print in constant-width roman font. +.c +.de CR +. ft CR +. Text \\$* +. ft +.. +.c -------------------------------------------------------------------- +.c .Error (...) +.c +.c Print error message to terminal and abort. +.c +.de Error +. tm \\$* +. ab +.. +.c -------------------------------------------------------------------- +.c .Env_var ( []) +.c +.c Display an environment variable, with optional punctuation. +.c +.de Env_var +. nh +. SM +. Text \f[CB]\\$1\f[]\\$2 +. hy +.. +.c -------------------------------------------------------------------- +.c .File_name () +.c +.c Display a file or directory name in CB font. +.c +.de File_name +. Header_CB \\$@ +.. +.c -------------------------------------------------------------------- +.c .Header_CB () +.c +.c Display a line in CB font, for example after .TP +.c +.de Header_CB +. nh +. Text \f[CB]\\$1\f[]\\$2 +. hy +.. +.c -------------------------------------------------------------------- +.c .Opt_- ([]) +.c +.c Print `-' (minus sign); optional punctuation. +.c +.de Opt_- +. ie (\\n[.$] == 0) \ +. Opt_alt - "" +. el \ +. Opt_alt - "" "\\$1" +.. +.c -------------------------------------------------------------------- +.c .Opt_[-] ([]) +.c +.c Print `Opt_[-]' (minus sign in brackets); optional punctuation. +.c +.de Opt_[-] +. ie (\\n[.$] == 0) \ +. Opt_[alt] - "" +. el \ +. Opt_[alt] - "" "\\$1" +.. +.c -------------------------------------------------------------------- +.c .Opt_-- ([]) +.c +.c Print `--' (double minus); optional punctuation. +.c +.de Opt_-- +. ie (\\n[.$] == 0) \ +. Opt_alt -- "" +. el \ +. Opt_alt -- "" "\\$1" +.. +.c -------------------------------------------------------------------- +.c .Opt_[--] ([]) +.c +.c Print `Opt_[--]' (double minus in brackets); optional punctuation. +.c +.de Opt_[--] +. ie (\\n[.$] == 0) \ +. Opt_[alt] -- "" +. el \ +. Opt_[alt] -- "" "\\$1" +.. +.c -------------------------------------------------------------------- +.c .Opt_alt ([ ]... [ []]) +.c +.c Alternate options separated by a vertical bar. +.c +.c Arguments: +.c minus: either `-' or `--' (font CB). +.c opt: a name for an option, empty allowed (font CB). +.c arg: optionally, the argument to the option (font I). +.c punct: optional punctuation (in the starting font). +.c Result: +.c The minus/opt argument pairs, each +.c separated by a vertical bar `|', optionally add 'arg', separated +.c a space character ` '. +.c +.c Example: +.c .Opt_alt - T -- device -- device-troff device . +.c results in +.c -T|--device|--device-troff device. +.c +.de Opt_alt +. Opt_alt_base "" | "" \\$@ +.. +.c -------------------------------------------------------------------- +.c .Opt_[alt] ([ ]... [ []]) +.c +.c Alternate options in brackets for section SYNOPSIS. +.c +.c Arguments: +.c minus: either `-' or `--' (font CB). +.c opt: a name for an option, empty allowed (font CB). +.c arg: optionally, the argument to the option (font I). +.c punct: optional punctuation (in the starting font). +.c Global strings written to: +.c `@oa_prefix': left enclosing character (`[') +.c `@oa_sep': separator (`|') +.c `@oa_postfix': right enclosing character (`]') +.c Result: +.c The minus/opt argument pairs, each separated by a vertical +.c bar `|', optionally add 'arg', separated by a space character ` '. +.c +.c Example: +.c .Opt_[alt] - T -- device -- device-troff device . +.c results in +.c [-T|--device|--device-troff device]. +.c +.de Opt_[alt] +. Opt_alt_base [ | ] \\$@ +.. +.c -------------------------------------------------------------------- +.c .Opt_alt_base (
   [ ]... [arg [punct]])
+.c
+.c Alternating options; base macro for many others; do not use directly.
+.c
+.c Arguments:
+.c   
: prefix, result is preceded by this.
+.c   : separator between minus/opt pairs.
+.c   : postfix, is appended to the result.
+.c   : either `-' or `--' (font CB).
+.c   : a name for an option, empty allowed (font CB).
+.c   : optionally, the argument to the option (font I).
+.c   : optional punctuation (in the starting font).
+.c Result:
+.c   String `
' followed by the / argument pairs, each
+.c   separated by string `', optionally add '', separated by
+.c   a single space ` ', followed by the string `'.  Terminated
+.c   by the optional punctuation .
+.c
+.de Opt_alt_base
+.  nr @font \\n[.f]\"
+.  if (\\n[.$] < 3) \
+.    Error .\\0: not enough arguments.
+.  ds @pre \)\\$1\)\"                   prefix
+.  ds @sep \)\\$2\)\"                   separator
+.  ds @post \)\\$3\)\"                  postfix
+.  shift 3
+.  nr @count 0
+.  ds @res \f[CR]\\*[@pre]\"
+.  while (\\n[.$] >= 2) \{\
+.    c                                  do the pairs, break on no `-'
+.    if !'\\$1'-' \{\
+.      if !'\\$1'--' \
+.        break
+.    \}
+.    c                                  separator
+.    if (\\n[@count] > 0) \
+.      as @res \f[CR]\\*[@sep]\:\"
+.    nr @count +1
+.    c                                  combine minus with option name
+.    as @res \f[CB]\\-\"
+.    if '\\$1'--' \
+.      as @res \\-\"
+.    as @res \\$2\"
+.    shift 2
+.  \}
+.  if (\\n[.$] >= 3) \
+.    Error .\\0: wrong arguments: \\$@
+.  c                                    all pairs are done
+.  ie (\\n[.$] == 0) \
+.    as @res \f[CR]\\*[@post]\"
+.  el \{\
+.    c                                  optional option argument
+.    if !'\\$1'' \
+.      as @res \f[CR] \,\f[I]\\$1\"
+.    shift
+.    c                                  postfix
+.    as @res \\f[CR]\\*[@post]\"
+.    if (\\n[.$] >= 1) \{\
+.      c                                add punctuation
+.      as @res \f[\\n[@font]]\\$1\"
+.    \}
+.  \}
+.  nh
+.  Text \\*[@res]
+.  hy
+.  ft \\n[@font]
+.  rr @count
+.  rr @font
+.  rm @pre
+.  rm @post
+.  rm @sep
+.  rm @res
+..
+.c --------------------------------------------------------------------
+.c .Opt_def  ([ ]... [ []])
+.c
+.c Definitions of options in section OPTIONS.
+.c
+.c Arguments:
+.c   minus: either `-' or `--' (font CB).
+.c   opt: a name for an option, empty allowed (font CB).
+.c   arg: optionally, the argument to the option (font I).
+.c   punct: optional punctuation (in the starting font).
+.c Result:
+.c   The header for an indented paragraph, consisting of
+.c   minus/opt argument pairs, each, separated by a space
+.c   character ` ', optionally add 'arg', separated a space
+.c   character ` '.
+.c
+.c Example:
+.c  .Opt_def - T -- device -- device-troff device .
+.c  results in
+.c  -T --device --device-troff device.
+.c  as the header of for indented paragraph.
+.c
+.de Opt_def
+.  TP
+.    Opt_alt_base "" "\~|\~" "" \\$@
+..
+.c --------------------------------------------------------------------
+.c .Opt_element  ([ ]... [ []])
+.c
+.c Definitions of options in section OPTIONS.
+.c
+.c Arguments:
+.c   minus: either `-' or `--' (font CB).
+.c   opt: a name for an option, empty allowed (font CB).
+.c   arg: optionally, the argument to the option (font I).
+.c   punct: optional punctuation (in the starting font).
+.c Result:
+.c   The minus/opt argument pairs, each, separated by a space
+.c   character ` ', optionally add 'arg', separated a space
+.c   character ` '.
+.c
+.c Example:
+.c  .Opt_element - T -- device -- device-troff device .
+.c  results in
+.c  -T --device --device-troff device.
+.c
+.de Opt_element
+.  Opt_alt_base "" "\~" "" \\$@
+..
+.c --------------------------------------------------------------------
+.als Opt_list Opt_element
+.
+.c --------------------------------------------------------------------
+.c .Opt_long  ([ []])
+.c
+.c Print `--name' somewhere in the text; optional punctuation.
+.c
+.de Opt_long
+.  Opt_alt -- "\\$1" "" "\\$2"
+..
+.c --------------------------------------------------------------------
+.c .Opt_long_arg  ([  []])
+.c
+.c Print `--name=arg' somewhere in the text; optional punctuation.
+.c
+.de Opt_long_arg
+.  Opt_alt -- "\\$1=\\$2" "" "\\$3"
+..
+.c --------------------------------------------------------------------
+.c .Opt_[long]  ([ []])
+.c
+.c Print `--name' somewhere in the text; optional punctuation.
+.c
+.de Opt_[long]
+.  Opt_[alt] -- "\\$1" "" "\\$2"
+..
+.c --------------------------------------------------------------------
+.c .Opt_short  ([ []])
+.c
+.c Print `-name' somewhere in the Text; optional punctuation.
+.c
+.de Opt_short
+.  Opt_alt - "\\$1" "" "\\$2"
+..
+.c --------------------------------------------------------------------
+.c .Opt_[short]  ([name [punct]])
+.c
+.c Print `[-name]' somewhere in the Text; optional punctuation.
+.c
+.de Opt_[short]
+.  Opt_[alt] - "\\$1" "" "\\$2"
+..
+.c --------------------------------------------------------------------
+.c .Shell_cmd  ( [] ...)
+.c
+.c A shell command line; display args alternating in fonts CR and CI.
+.c
+.c Examples:
+.c   .Shell_cmd "groffer --dpi 100 file"
+.c     result: `sh#  groffer --dpi 100 file'
+.c             with 'sh#' in font I, the rest in CR
+.c
+.c   .Shell_cmd groffer\~--dpi\~100\~file
+.c     result: the same as above
+.c
+.c   .Shell_cmd "groffer --dpi=" value " file"
+.c     result: sh#  groffer --dpi=value file
+.c             with `groffer --dpi=' and `file' in CR; `value' in CI
+.c
+.c   .Shell_cmd groffer\~--dpi= value \~file
+.c     result: the same as the previous example
+.c
+.de Shell_cmd
+.  groffer:Shell_cmd_base "\*[groffer:Shell_cmd.prompt]" \\$@
+..
+.c --------------------------------------------------------------------
+.c .Shell_cmd+  ( [] ...)
+.c
+.c A continuation line for .Shell_cmd.
+.c
+.de Shell_cmd+
+.  groffer:Shell_cmd_base "\*[groffer:Shell_cmd+.prompt]" \\$@
+..
+.c --------------------------------------------------------------------
+.c .Shell_cmd_base  ( [ [] ...])
+.c
+.c A shell command line; display args alternating in fonts CR and CI.
+.c Internal, do not use directly.
+.c
+.c Globals: read-only register @.Shell_cmd_width
+.c
+.de groffer:Shell_cmd_base
+.  if (\\n[.$] <= 0) \
+.    return
+.  nr @+font \\n[.f]\"
+.  ds @prompt \\$1\"
+.  ft CR
+.  c gap between prompt and command
+.  nr @+gap \\n[groffer:Shell_cmd_base.prompt_width]-\\w'\\*[@prompt]'\"
+.  ds @res \\*[@prompt]\h'\\n[@+gap]u'\"
+.  shift
+.  ds @cf CR\"
+.  while (\\n[.$] > 0) \{\
+.    as @res \\f[\\*[@cf]]\\$1\"
+.    shift
+.    ie '\\*[@cf]'CR' \
+.      ds @cf I\"
+.    el \
+.      ds @cf CR\"
+.  \}
+.  br
+.  ad l
+.  nh
+.  nf
+.  Text \\*[@res]\"
+.  fi
+.  hy
+.  ad
+.  br
+.  ft \\n[@+font]
+.  rr @+font
+.  rr @+gap
+.  rm @cf
+.  rm @res
+..
+.c --------------------------------------------------------------------
+.c .Synopsis  ()
+.c
+.c Begin a synopsis section, to be ended by a ./Synopsis macro.
+.c
+.de Synopsis
+.  if (\\n[groffer:Synopsis.level] > 0) \
+.    Error .\\$0: previous .Synopsis was not closed by ./Synopsis.
+.  nh
+.  ds @1 \\$1\"
+.  nr @old_indent \\n(.i
+.  ad l
+.  in +\w'\fB\\*[@1]\0'u
+.  ti \\n[@old_indent]u
+.  B \\*[@1]\0\c
+.  rr @old_indent
+.  rm @1
+.  nr groffer:Synopsis.level +1\"        marker for ./Synopsis
+..
+.c  --------------------------------------------------------------------
+.c ./Synopsis  ()
+.c
+.c Close a synopsis section opened by the previous .Synopsis macro.
+.c
+.de /Synopsis
+.  if (\\n[groffer:Synopsis.level] <= 0) \
+.    Error .\\$0: no previous call of .Synopsis
+.  br
+.  ad
+.  in
+.  hy
+.  nr groffer:Synopsis.level -1
+..
+.c  --------------------------------------------------------------------
+.c .Text  (...)
+.c
+.c Treat the arguments as text, no matter how they look.
+.c
+.de Text
+.  if (\\n[.$] == 0) \
+.    return
+.  nh
+.  nop \)\\$*\)
+.  hy
+..
+.c --------------------------------------------------------------------
+.c .Topic  ([])
+.c
+.c A bulleted paragraph
+.c
+.de Topic
+.  ie (\\n[.$] = 0) \
+.    ds @indent 2m\"
+.  el \
+.    ds @indent \\$1\"
+.  TP \\*[@indent]
+.  Text \[bu]
+.  rm @indent
+..
+.c --------------------------------------------------------------------
+.c .TP+  ()
+.c
+.c Continuation line for .TP header.
+.c
+.de TP+
+.  br
+.  ns
+.  TP \\$1
+..
+.c --------------------------------------------------------------------
+.c .TP_header  ([])
+.c
+.c Start a multi-line header for a .TP-like paragraph
+.c
+.de TP_header
+.  if (\\n[groffer:TP.level] < 0) \
+.    Error .\\$0: wrong level.
+.  nr groffer:TP.level +1
+.  P
+.  ie (\\n[.$] == 0) \
+.    rr groffer:TP.indent
+.  el \
+.    nr groffer:TP.indent \\$1
+.  nr groffer:TP_header.flag 1
+..
+.c --------------------------------------------------------------------
+.c .TP_body  ([])
+.c
+.c End a previous .TP-header and beging the body of the paragraph.
+.c
+.de TP_body
+.  if !rgroffer:TP_header.flag \
+.    Error .\\$0: no previous call of .TP_header
+.  if (\\n[groffer:TP.level] <= 0) \
+.    Error .\\$0: wrong level.
+.  br
+.  ie (\\n[.$] == 0) \{\
+.    ie rgroffer:TP.indent \{\
+.      RS \\n[groffer:TP.indent]u
+.    \}
+.    el \
+.      RS
+.  \}
+.  el \
+.    RS \\$1u
+.  rr groffer:TP.indent
+.  rr groffer:TP_header.flag
+.  nr groffer:TP_body.flag 1
+..
+.c --------------------------------------------------------------------
+.c TP_end  ()
+.c
+.c End of former .TP_body paragraph.
+.c
+.de TP_end
+.  if !rgroffer:TP_body.flag \
+.    Error .\\$0: no previous .TP_body.
+.  if (\\n[groffer:TP.level] <= 0) \
+.    Error TP_end: wrong level.
+.  nr groffer:TP.level -1
+.  rr grogger:TP.indent
+.  rr groffer:TP_header.flag
+.  rr groffer:TP_body.flag
+.  br
+.  RE
+..
+.
+.\" End of macro definitions
+.
+.
+.\" --------------------------------------------------------------------
+.\" SH "SYNOPSIS"
+.\" --------------------------------------------------------------------
+.
+.ad l
+.Synopsis groffer
+.RI [ option... ]
+.Opt_[--]
+.RI [ "\%filespec" "\*[Ellipsis]]"
+./Synopsis
+.
+.Synopsis groffer
+.Opt_alt - h -- help
+./Synopsis
+.
+.Synopsis groffer
+.Opt_alt - v -- version
+./Synopsis
+.
+.
+.\" --------------------------------------------------------------------
+.SH DESCRIPTION
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program is the easiest way to use
+.BR \%groff (@MAN1EXT@).
+It can display arbitrary documents written in the
+.I \%groff
+language, see
+.BR \%groff (@MAN7EXT@),
+or other
+.I \%roff
+languages, see
+.BR \%roff (@MAN7EXT@),
+that are compatible to the original
+.I \%troff
+language.
+.
+The
+.B \%groffer
+program also includes many of the features for finding and displaying
+the \%\f[CR]Unix\f[] manual pages
+.nh
+.RI ( man\~pages ),
+.hy
+such that it can be used as a replacement for a
+.BR \%man (1)
+program.
+.
+Moreover, compressed files that can be handled by
+.BR \%gzip (1)
+or
+.BR \%bzip2 (1)
+are decompressed on-the-fly.
+.
+.
+.P
+The normal usage is quite simple by supplying a file name or name of a
+.I \%man\~page
+without further options.
+.
+But the option handling has many possibilities for creating special
+behaviors.
+.
+This can be done either in configuration files, with the shell
+environment variable
+.BR \%$GROFFER_OPT ,
+or on the command line.
+.
+.
+.P
+The output can be generated and viewed in several different ways
+available for
+.IR \%groff .
+.
+This includes the
+.I \%groff
+native \%\f[CR]X\~Window\f[] viewer
+.BR \%gxditview (@MAN1EXT@),
+each
+.IR \%Postcript ,
+.IR \%pdf ,
+or
+.I \%dvi
+display program, a web browser by generating
+.I \%html
+in
+.IR \%www\~mode ,
+or several
+.I \%text\~modes
+in text terminals.
+.
+.
+.P
+Most of the options that must be named when running
+.B \%groff
+directly are determined automatically for
+.BR \%groffer ,
+due to the internal usage of the
+.BR \%grog (@MAN1EXT@)
+program.
+.
+But all parts can also be controlled manually by arguments.
+.
+.
+.P
+Several file names can be specified on the command line arguments.
+.
+They are transformed into a single document in the normal way of
+.BR \%groff .
+.
+.
+.P
+Option handling is done in \f[CR]GNU\f[] style.
+.
+Options and file names can be mixed freely.
+.
+The option
+.RB ` \-\- '
+closes the option handling, all following arguments are treated as
+file names.
+.
+Long options can be abbreviated.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "OPTION OVERVIEW"
+.\" --------------------------------------------------------------------
+.
+.TP
+.I breaking options
+.RS
+.P
+.Opt_[alt] - h -- help
+.Opt_[alt] - v -- version
+.RE
+.
+.
+.TP
+.I \%groffer mode options
+.RS
+.P
+.Opt_[alt] -- auto
+.Opt_[alt] -- default
+.Opt_[alt] -- default\-modes mode1,mode2,\*[Ellipsis]
+.Opt_[alt] -- dvi
+.Opt_[alt] -- dvi\-viewer prog
+.Opt_[alt] -- dvi\-viewer\-tty prog
+.Opt_[alt] -- groff
+.Opt_[alt] -- html
+.Opt_[alt] -- html\-viewer prog
+.Opt_[alt] -- html\-viewer\-tty prog
+.Opt_[alt] -- mode display_mode
+.Opt_[alt] -- pdf
+.Opt_[alt] -- pdf\-viewer prog
+.Opt_[alt] -- pdf\-viewer\-tty prog
+.Opt_[alt] -- ps
+.Opt_[alt] -- ps\-viewer prog
+.Opt_[alt] -- ps\-viewer\-tty prog
+.Opt_[alt] -- text
+.Opt_[alt] -- tty
+.Opt_[alt] -- tty\-viewer prog
+.Opt_[alt] -- tty\-viewer\-tty prog
+.Opt_[alt] -- www
+.Opt_[alt] -- www\-viewer prog
+.Opt_[alt] -- www\-viewer\- prog
+.Opt_[alt] -- x -- X
+.Opt_[alt] -- x\-viewer -- X\-viewer prog
+.Opt_[alt] -- x\-viewer\-tty -- X\-viewer\-tty prog
+.RE
+.
+.
+.TP
+.I development options
+.RS
+.P
+.Opt_[alt] -- debug
+.Opt_[alt] -- do\-nothing
+.Opt_[alt] -- shell prog
+.Opt_[alt] - Q -- source
+.Opt_[alt] - V
+.RE
+.
+.
+.TP
+.I options related to \%groff
+.RS
+.P
+.Opt_[alt] - T -- device device
+.Opt_[alt] - Z -- intermediate\-output -- ditroff
+.P
+All further
+.B \%groff
+short options are accepted.
+.RE
+.
+.
+.TP
+.I options for man\~pages
+.Opt_[alt] -- apropos
+.Opt_[alt] -- apropos\-data
+.Opt_[alt] -- apropos\-devel
+.Opt_[alt] -- apropos\-progs
+.Opt_[alt] -- whatis
+.Opt_[alt] -- man
+.Opt_[alt] -- no-man
+.Opt_[alt] -- no-special
+.
+.
+.TP
+.I long options taken over from GNU man
+.RS
+.P
+.Opt_[alt] -- all
+.Opt_[alt] -- ascii
+.Opt_[alt] -- ditroff
+.Opt_[alt] -- extension suffix
+.Opt_[alt] -- locale language
+.Opt_[alt] -- local-file
+.Opt_[alt] -- manpath dir1:dir2:\*[Ellipsis]
+.Opt_[alt] -- pager program
+.Opt_[alt] -- sections sec1:sec2:\*[Ellipsis]
+.Opt_[alt] -- systems sys1,sys2,\*[Ellipsis]
+.Opt_[alt] -- troff-device device
+.P
+Further long options of \f[CR]GNU\f[]
+.B man
+are accepted as well.
+.RE
+.
+.
+.TP
+.I X Window Toolkit options
+.RS
+.P
+.Opt_[alt] -- bd pixels
+.Opt_[alt] -- bg -- background color
+.Opt_[alt] -- bw pixels
+.Opt_[alt] -- display X-display
+.Opt_[alt] -- fg -- foreground color
+.Opt_[alt] -- ft -- font font_name
+.Opt_[alt] -- geometry size_pos
+.Opt_[alt] -- resolution value
+.Opt_[alt] -- rv
+.Opt_[alt] -- title string
+.Opt_[alt] -- xrm X-resource
+.RE
+.
+.
+.TP
+.I \%filespec arguments
+.RS
+.P
+No
+.I \%filespec
+parameters means standard input.
+.
+.
+.TP 10m
+.Opt_short ""
+stands for standard input (can occur several times).
+.
+.
+.TP
+.I filename
+the path name of an existing file.
+.
+.
+.TP
+.BI man: name ( section )
+.TP+
+.IB name ( section )
+search the \%man\~page
+.I \%name
+in \%man\~section
+.IR section .
+.
+.
+.TP
+.BI man: name . s
+.TP+
+.IB name . s
+if
+.I s
+is a character in
+.BR \%[1-9on] ,
+search for a \%man\~page
+.I \%name
+in \%man\~section
+.IR s .
+.
+.
+.TP
+.BI man: name
+\%man\~page in the lowest \%man\~section that has
+.IR \%name .
+.
+.
+.TP
+.I "s name"
+if
+.I s
+is a character in
+.BR \%[1-9on] ,
+search for a \%man\~page
+.I \%name
+in \%man\~section
+.IR s .
+.
+.
+.TP
+.I name
+if
+.I \%name
+is not an existing file search for the man\~page
+.I \%name
+in the lowest man\~section.
+.
+.RE
+.
+.
+.\" --------------------------------------------------------------------
+.SH "OPTION DETAILS"
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program can usually be run with very few options.
+.
+But for special purposes, it supports many options.
+.
+These can be classified in 5 option classes.
+.
+.
+.P
+All short options of
+.B \%groffer
+are compatible with the short options of
+.BR \%groff (@MAN1EXT@).
+.
+All long options of
+.B \%groffer
+are compatible with the long options of
+.BR \%man (1).
+.
+.
+.\" --------------------------------------------------------------------
+.SS "groffer breaking Options"
+.\" --------------------------------------------------------------------
+.
+As soon as one of these options is found on the command line it is
+executed, printed to standard output, and the running
+.B \%groffer
+is terminated thereafter.
+.
+All other arguments are ignored.
+.
+.
+.Opt_def - h -- help
+Print a helping information with a short explanation of option sto
+standard output.
+.
+.
+.Opt_def - v -- version
+Print version information to standard output.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "groffer Mode Options"
+.\" --------------------------------------------------------------------
+.
+The display mode and the viewer programs are determined by these
+options.
+.
+If none of these mode and viewer options is specified
+.B \%groffer
+tries to find a suitable display mode automatically.
+.
+The default modes are
+.I mode x
+with
+.B gxditview
+in \%\f[CR]X\~Window\f[] and
+.I mode tty
+with device
+.I latin1
+under
+.B less
+on a terminal.
+.
+.
+.P
+There are two kinds of options for viewers.
+.Opt_long \fImode\fP-viewer
+chooses the normal viewer programs that run on their own in
+\%\f[CR]X\~Window\f[], while
+.Opt_long \fImode\fP-viewer-tty
+chooses programs that run on the terminal (on tty).
+.
+Most graphical viewers are programs running in \%\f[CR]X\~Window\f[],
+so there aren't many opportunities to call the tty viewers.
+.
+But they give the chance to view the output source; for example,
+.Opt_long ps\-viewer\-tty=less
+shows the content of the
+.I Postscript
+output with the pager
+.BR less .
+.
+.
+.P
+The \%\f[CR]X\~Window\f[] viewers are not critical, you can use both
+.Opt_long *\-viewer
+and
+.Opt_long *\-viewer\-tty
+for them; with
+.Opt_long *\-viewer\-tty
+the viewer program will not become independently, it just stays
+coupled with
+.BR groffer .
+But the program will not run if you specify a terminal program with
+.Opt_long *\-viewer
+because this viewer will stay in background without a chance to reach
+it.
+.
+So you really need
+.Opt_long *\-viewer\-tty
+for viewers that run on tty.
+.
+.
+.Opt_def -- auto
+Equivalent to
+.Opt_long_arg mode auto .
+.
+.
+.Opt_def -- default
+Reset all configuration from previously processed command line options
+to the default values.
+.
+This is useful to wipe out all former options of the configuration, in
+.Env_var $GROFFER_OPT ,
+and restart option processing using only the rest of the command line.
+.
+.
+.Opt_def -- default\-modes mode1,mode2,\*[Ellipsis]
+Set the sequence of modes for
+.I \%auto\~mode
+to the comma separated list given in the argument.
+.
+See
+.Opt_long mode
+for details on modes.  Display in the default manner; actually, this
+means to try the modes
+.IR x ,
+.IR ps ,
+and
+.I \%tty
+in this sequence.
+.
+.
+.
+.Opt_def -- dvi
+Equivalent to
+.Opt_long_arg mode \%dvi .
+.
+.
+.Opt_def -- dvi\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%dvi\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH .
+.
+Known \%\f[CR]X\~Window\f[]
+.I \%dvi
+viewers include
+.BR \%xdvi (1)
+and
+.BR \%dvilx (1)
+.
+In each case, arguments can be provided additionally.
+.
+.
+.Opt_def -- dvi\-viewer\-tty prog
+Choose a program running on the terminal for viewing the output of
+.IR \%dvi\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- groff
+Equivalent to
+.Opt_long_arg mode groff .
+.
+.
+.Opt_def -- html
+Equivalent to
+.Opt_long_arg mode html .
+.
+.
+.Opt_def -- html\-viewer
+Choose an \%\f[CR]X\~Window\f[] web browser program for viewing in
+.I \%html\~mode .
+.
+It can be the path name of an executable file or a program in
+.Env_var $PATH .
+.
+In each case, arguments can be provided additionally.
+.
+.
+.Opt_def -- html\-viewer\-tty
+Choose a terminal program for viewing the output of
+.I \%html\~mode .
+.
+It can be the path name of an executable file or a program in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- mode value
+.
+Set the display mode.
+.
+The following mode values are recognized:
+.
+.RS
+.
+.TP
+.Header_CB auto
+Select the automatic determination of the display mode.
+.
+The sequence of modes that are tried can be set with the
+.Opt_long default\-modes
+option.
+.
+Useful for restoring the
+.I \%default\~mode
+when a different mode was specified before.
+.
+.
+.TP
+.Header_CB dvi
+Display formatted input in a
+.I \%dvi
+viewer program.
+.
+By default, the formatted input is displayed with the
+.BR \%xdvi (1)
+program.
+.Opt_long dvi .
+.
+.
+.TP
+.Header_CB groff
+After the file determination, switch
+.B \%groffer
+to process the input like
+.BR \%groff (@MAN1EXT@)
+would do.
+.
+This disables the
+.I \%groffer
+viewing features.
+.
+.
+.TP
+.Header_CB html
+Translate the input into html format and display the result in a web
+browser program.
+.
+By default, the existence of a sequence of standard web browsers is
+tested, starting with
+.BR \%konqueror (1)
+and
+.BR \%mozilla (1).
+The text html viewer is
+.BR \%lynx (1).
+.
+.
+.TP
+.Header_CB pdf
+Display formatted input in a
+.I \%PDF
+(Portable Document Format) viewer
+program.
+.
+By default, the input is formatted by
+.B \%groff
+using the Postscript device, then it is transformed into the PDF file
+format using
+.BR \%gs (1),
+and finally displayed either with the
+.BR \%xpdf (1)
+or the
+.BR \%acroread (1)
+program.
+.
+PDF has a big advantage because the text is displayed graphically and
+is searchable as well.
+.
+But as the transformation takes a considerable amount of time, this
+mode is not suitable as a default device for the
+.I \%auto\~mode .
+.
+.
+.TP
+.Header_CB ps
+Display formatted input in a Postscript viewer program.
+.
+By default, the formatted input is displayed with the
+.BR \%ghostview (@MAN1EXT@)
+program.
+.
+.
+.TP
+.Header_CB text
+Format in a
+.I \%groff\~text\~mode
+and write the result to standard output without a pager or viewer
+program.
+.
+The text device,
+.I \%latin1
+by default, can be chosen with option
+.Opt_short T .
+.
+.
+.TP
+.Header_CB tty
+Format in a
+.I \%groff\~text\~mode
+and write the result to standard output using a text pager program,
+even when in \%\f[CR]X\~Window\f[].
+.
+.
+.TP
+.Header_CB www
+Equivalent to
+.Opt_long_arg mode html .
+.
+.
+.TP
+.Header_CB x
+Display the formatted input in a native
+.I roff
+viewer.
+.
+By default, the formatted input is displayed with the
+.BR \%gxditview (@MAN1EXT@)
+program being distributed together with
+.BR \%groff .
+But the standard \%\f[CR]X\~Window\f[] tool
+.BR \%xditview (1)
+can also be chosen with the option
+.Opt_long x\-viewer .
+The default resolution is
+.BR 75\~dpi ,
+but
+.B 100\~dpi
+are also possible.
+.
+The default
+.I groff
+device
+for the resolution of
+.B 75\~dpi
+is
+.BR X75\-12 ,
+for
+.B 100\~dpi
+it is
+.BR X100 .
+.
+The corresponding
+.I "groff intermediate output"
+for the actual device is generated and the result is displayed.
+.
+For a resolution of
+.BR 100\~dpi ,
+the default width of the geometry of the display program is chosen to
+.BR 850\~dpi .
+.
+.
+.TP
+.Header_CB X
+Equivalent to
+.Opt_long_arg mode x .
+.
+.
+.P
+The following modes do not use the
+.I \%groffer
+viewing features.
+.
+They are only interesting for advanced applications.
+.
+.
+.TP
+.Header_CB groff
+Generate device output with plain
+.I \%groff
+without using the special viewing features of
+.IR \%groffer .
+If no device was specified by option
+.Opt_short T
+the
+.I \%groff
+default
+.B \%ps
+is assumed.
+.
+.
+.TP
+.Header_CB source
+Display the source code of the input without formatting; equivalent to
+.Opt_short Q .
+.
+.
+.RE
+.
+.
+.Opt_def -- pdf
+Equivalent to
+.Opt_long_arg mode pdf .
+.
+.
+.Opt_def -- pdf\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%pdf\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- pdf\-viewer\-tty prog
+Choose a terminal viewer program for
+.IR \%pdf\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- ps
+Equivalent to
+.Opt_long_arg mode ps .
+.
+.
+.Opt_def -- ps\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%ps\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH .
+.
+Common Postscript viewers inlude
+.BR \%gv (1),
+.BR \%ghostview (1),
+and
+.BR \%gs (1),
+.
+In each case, arguments can be provided additionally.
+.
+.
+.Opt_def -- ps\-viewer\-tty prog
+Choose a terminal viewer program for
+.IR \%ps\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- text
+Equivalent to
+.Opt_long_arg mode text .
+.
+.
+.Opt_def -- tty
+Equivalent to
+.Opt_long_arg mode tty .
+.
+.
+.Opt_def -- tty\-viewer prog
+Choose a text pager for mode
+.IR tty .
+The standard pager is
+.BR less (1).
+This option is eqivalent to
+.I man
+option
+.Opt_long_arg pager prog .
+The option argument can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- tty\-viewer\-tty prog
+This is equivalent to
+.Opt_long tty\-viewer
+because the programs for
+.I tty
+mode run on a terminal anyway.
+.
+.
+.Opt_def -- www
+Equivalent to
+.Opt_long_arg mode html .
+.
+.
+.Opt_def -- www\-viewer prog
+Equivalent to
+.Opt_long html\-viewer .
+.
+.
+.Opt_def -- www\-viewer\-tty prog
+Equivalent to
+.Opt_long html\-viewer\-tty .
+.
+.
+.Opt_def -- X -- x
+Equivalent to
+.Opt_long_arg mode x .
+.
+.
+.Opt_def -- X\-viewer -- x\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%x\~mode .
+Suitable viewer programs are
+.BR \%gxditview (@MAN1EXT@)
+which is the default and
+.BR \%xditview (1).
+The argument can be any executable file or a program in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- X\-viewer\-tty -- x\-viewer\-tty prog
+Choose a terminal viewer program for
+.IR \%x\~mode .
+The argument can be any executable file or a program in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.TP
+.Opt_--
+Signals the end of option processing; all remaining arguments are
+interpreted as
+.I \%filespec
+parameters.
+.
+.
+.P
+Besides these,
+.B \%groffer
+accepts all short options that are valid for the
+.BR \%groff (@MAN1EXT@)
+program.
+.
+All
+.RB \%non- groffer
+options are sent unmodified via
+.B \%grog
+to
+.BR \%groff .
+.
+So postprocessors, macro packages, compatibility with
+.I classical
+.IR \%troff ,
+and much more can be manually specified.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "Options for Development"
+.\" --------------------------------------------------------------------
+.
+.Opt_def -- debug
+Enable five debugging informations.
+.
+The temporary files are kept and not deleted, the name of the
+temporary directory and the shell name for
+.File_name groffer2.sh
+are printed, the parameters are printed at several steps of
+development, and a function stack is output with function
+\f[CR]error_user()\f[] as well.
+.
+Neither the function call stack that is printed at each opening and
+closing of a function call nor the landmark information that is
+printed to determine how far the program is running are used.
+.
+This seems to be the most useful among all debugging options.
+.
+.
+.Opt_def -- debug\-all
+Enable all seven debugging informations including the function call
+stack and the landmark information.
+.
+.
+.Opt_def -- debug\-keep
+Enable two debugging information, the printing of the name of the
+temporary directory and the keeping of the temporary files.
+.
+.
+.Opt_def -- debug\-lm
+Enable one debugging information, the landmark information.
+.
+.
+.Opt_def -- debug\-params
+Enable one debugging information, the parameters at several steps.
+.
+.
+.Opt_def -- debug\-shell
+Enable one debugging information, the shell name for
+.File_name groffer2.sh .
+.
+.
+.Opt_def -- debug\-stacks
+Enable one debugging information, the function call stack.
+.
+.
+.Opt_def -- debug\-tmpdir
+Enable one debugging information, the name of the temporary directory.
+.
+.
+.Opt_def -- debug\-user
+Enable one debugging information, the function stack with
+\f[CR]error_user()\f[].
+.
+.
+.Opt_def -- do-nothing
+This is like
+.Opt_long version ,
+but without the output; no viewer is started.
+.
+This makes only sense in development.
+.
+.
+.Opt_def -- print=text
+Just print the argument to standard error.
+.
+This is good for parameter check.
+.
+.
+.Opt_def -- shell "shell_program"
+Specify the shell under which the
+.File_name \%groffer2.sh
+script should be run.
+.
+This option overwrites the automatic shell determination of the
+program.
+.
+If the argument
+.I shell_program
+is empty a former shell option and the automatic shell determination
+is cancelled and the default shell is restored.
+.
+Some shells run considerably faster than the standard shell.
+.
+.
+.Opt_def - Q -- source
+Output the roff source code of the input files without further
+processing.
+.
+This is the equivalent
+.Opt_long_arg mode source .
+.
+.
+.Opt_def - V
+This is an advanced option for debugging only.
+.
+Instead of displaying the formatted input, a lot of
+.I \%groffer
+specific information is printed to standard output:
+.
+.RS
+.Topic
+the output file name in the temporary directory,
+.
+.Topic
+the display mode of the actual
+.B \%groffer
+run,
+.
+.Topic
+the display program for viewing the output with its arguments,
+.
+.Topic
+the active parameters from the config files, the arguments in
+.Env_var $GROFFER_OPT ,
+and the arguments of the command line,
+.
+.Topic
+the pipeline that would be run by the
+.B \%groff
+program, but without executing it.
+.RE
+.
+.
+.P
+Other useful debugging options are the
+.B \%groff
+option
+.Opt_short Z
+and
+.Opt_long_arg mode groff .
+.
+.
+.\" --------------------------------------------------------------------
+.SH "Options related to groff"
+.\" --------------------------------------------------------------------
+.
+All short options of
+.B \%groffer
+are compatible with the short options of
+.BR \%groff (@MAN1EXT@).
+.
+The following of
+.B \%groff
+options have either an additional special meaning within
+.B \%groffer
+or make sense for normal usage.
+.
+.
+.P
+Because of the special outputting behavior of the
+.B \%groff
+option
+.Opt_short Z
+.B \%groffer
+was designed to be switched into
+.I \%groff\~mode ;
+the
+.I \%groffer
+viewing features are disabled there.
+.
+The other
+.B \%groff
+options do not switch the mode, but allow to customize the formatting
+process.
+.
+.
+.Opt_def - a
+This generates an ascii approximation of output in the
+.IR \%text\~modes .
+.
+That could be important when the text pager has problems with control
+sequences in
+.IR "tty mode" .
+.
+.
+.Opt_def - m file
+Add
+.I \%file
+as a
+.I \%groff
+macro file.
+.
+This is useful in case it cannot be recognized automatically.
+.
+.
+.Opt_def - P opt_or_arg
+Send the argument
+.I \%opt_or_arg
+as an option or option argument to the actual
+.B \%groff
+postprocessor.
+.
+.
+.Opt_def - T -- device devname
+.
+This option determines
+.BR \%groff 's
+output device.
+.
+The most important devices are the text output devices for referring
+to the different character sets, such as
+.BR \%ascii ,
+.BR \%utf8 ,
+.BR \%latin1 ,
+and others.
+.
+Each of these arguments switches
+.B \%groffer
+into a
+.I \%text\~mode
+using this device, to
+.I \%mode\~tty
+if the actual mode is not a
+.IR \%text\~mode .
+.
+The following
+.I \%devname
+arguments are mapped to the corresponding
+.B \%groffer
+.Opt_long_arg mode \fIdevname\fR
+option:
+.BR \%dvi ,
+.BR \%html ,
+and
+.BR \%ps .
+All
+.B \%X*
+arguments are mapped to
+.IR \%mode\~x .
+Each other
+.I \%devname
+argument switches to
+.I \%mode\~groff
+using this device.
+.
+.
+.Opt_def - X
+is equivalent to
+.BR "groff \-X" .
+It displays the
+.I groff intermediate output
+with
+.BR gxditview .
+As the quality is relatively bad this option is deprecated; use
+.Opt_long X
+instead because the
+.I \%x\~mode
+uses an
+.IR X *
+device for a better display.
+.
+.
+.Opt_def - Z -- intermediate-output -- ditroff
+Switch into
+.I \%groff\~mode
+and format the input with the
+.I \%groff intermediate output
+without postprocessing; see
+.BR \%groff_out (@MAN5EXT@).
+This is equivalent to option
+.Opt_long ditroff
+of
+.IR \%man ,
+which can be used as well.
+.
+.
+.P
+All other
+.B \%groff
+options are supported by
+.BR \%groffer ,
+but they are just transparently transferred to
+.B \%groff
+without any intervention.
+.
+The options that are not explicitly handled by
+.B \%groffer
+are transparently passed to
+.BR \%groff .
+.
+Therefore these transparent options are not documented here, but in
+.BR \%groff (@MAN1EXT@).
+Due to the automatism in
+.BR \%groffer ,
+none of these
+.B \%groff
+options should be needed, except for advanced usage.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Options for man\~pages"
+.\" --------------------------------------------------------------------
+.
+.Opt_def -- apropos
+Start the
+.BR \%apropos (1)
+command or facility of
+.BR \%man (1)
+for searching the
+.I \%filespec
+arguments within all
+.I \%man\~page
+descriptions.
+.
+Each
+.I \%filespec
+argument is taken for search as it is; section specific parts are not
+handled, such that
+.B 7 groff
+searches for the two arguments
+.B 7
+and
+.B groff
+with a large result; for the
+.I \%filespec
+.B groff.7
+nothing will be found.
+.
+The display differs from the
+.B \%apropos
+program by the following concepts:
+.RS
+.Topic
+construct a
+.I \%groff
+frame to the output of
+.BR \%apropos ,
+.Topic
+each
+.I \%filespec
+argument is searched on its own.
+.Topic
+the restriction by
+.Opt_long sections
+is handled as well,
+.Topic
+wildcard characters are allowed and handled without a further option.
+.RE
+.
+.
+.Opt_def -- apropos\-data
+Show only the
+.B \%apropos
+descriptions for data documents, these are the
+.BR \%man (7)
+sections 4, 5, and 7.
+.
+Direct section declarations are ignored, wildcards are accepted.
+.
+.
+.Opt_def -- apropos\-devel
+Show only the
+.B \%apropos
+descriptions for development documents, these are the
+.BR man (7)
+sections 2, 3, and 9.
+.
+Direct section declarations are ignored, wildcards are accepted.
+.
+.
+.Opt_def -- apropos\-progs
+Show only the
+.B \%apropos
+descriptions for documents on programs, these are the
+.BR \%man (7)
+sections 1, 6, and 8.
+.
+Direct section declarations are ignored, wildcards are accepted.
+.
+.
+.Opt_def -- whatis
+For each
+.I \%filespec
+argument search all
+.I \%man\~pages
+and display their description \[em] or say that it is not a
+.IR \%man\~page .
+This differs from
+.IR man 's
+.B whatis
+output by the following concepts
+.RS
+.Topic
+each retrieved file name is added,
+.Topic
+local files are handled as well,
+.Topic
+the display is framed by a
+.I groff
+output format,
+.Topic
+wildcard characters are allowed without a further option.
+.RE
+.
+.
+.P
+The following two options were added to
+.B \%groffer
+for choosing whether the file name arguments are interpreted as names
+for local files or as a search pattern for
+.IR \%man\~pages .
+.
+The default is looking up for local files.
+.
+.
+.Opt_def -- man
+Check the non-option command line arguments
+.nh
+.RI ( filespecs )
+.hy
+first on being
+.IR \%man\~pages ,
+then whether they represent an existing file.
+.
+By default, a
+.I \%filespec
+is first tested whether it is an existing file.
+.
+.
+.Opt_def -- no-man -- local-file
+Do not check for
+.IR \%man\~pages .
+.
+.Opt_long local-file
+is the corresponding
+.B man
+option.
+.
+.
+.Opt_def -- no-special
+Disable former calls of
+.Opt_long all ,
+.Opt_long apropos* ,
+and
+.Opt_long whatis .
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Long options taken over from GNU man"
+.\" --------------------------------------------------------------------
+.
+The long options of
+.B \%groffer
+were synchronized with the long options of \f[CR]GNU\f[]
+.BR man .
+.
+All long options of \f[CR]GNU\f[]
+.B man
+are recognized, but not all of these options are important to
+.BR \%groffer ,
+so most of them are just ignored.
+.
+.
+.P
+In the following, the
+.B man
+options that have a special meaning for
+.B \%groffer
+are documented.
+.
+.
+.P
+The full set of long and short options of the \f[CR]GNU\f[]
+.B man
+program can be passed via the environment variable
+.Env_var $MANOPT ;
+see
+.BR \%man (1)
+if your system has \f[CR]GNU\f[]
+.B man
+installed.
+.
+.
+.Opt_def -- all
+In searching
+.IR \%man\~pages ,
+retrieve all suitable documents instead of only one.
+.
+.
+.Opt_def - 7 -- ascii
+In
+.IR \%text\~modes ,
+display ASCII translation of special characters for critical environment.
+.
+This is equivalent to
+.BR "groff -mtty_char" ;
+see
+.BR groff_tmac (@MAN5EXT@).
+.
+.
+.Opt_def -- ditroff
+Eqivalent to
+.B \%groffer
+.Opt_short Z .
+.
+.
+.Opt_def -- extension suffix
+Restrict
+.I \%man\~page
+search to file names that have
+.I \%suffix
+appended to their section element.
+.
+For example, in the file name
+.I \%/usr/share/man/man3/terminfo.3ncurses.gz
+the
+.I \%man\~page
+extension is
+.IR \%ncurses .
+.
+.
+.Opt_def -- locale language
+.
+Set the language for
+.IR \%man\~pages .
+.
+This has the same effect, but overwrites
+.Env_var $LANG
+.
+.
+.Opt_def -- location
+Print the location of the retrieved files to standard error.
+.
+.
+.Opt_def -- no-location
+Do not display the location of retrieved files; this resets a former
+call to
+.Opt_long location .
+.
+This was added by
+.BR \%groffer .
+.
+.
+.Opt_def -- manpath "'dir1:dir2:\*[Ellipsis]'"
+Use the specified search path for retrieving
+.I \%man\~pages
+instead of the program defaults.
+.
+If the argument is set to the empty string "" the search for
+.I \%man\~page
+is disabled.
+.
+.
+.Opt_def -- pager
+Set the pager program in
+.IR \%tty\~mode ;
+default is
+.BR \%less .
+This is equivalent to
+.Opt_long tty\-viewer .
+.
+.
+.Opt_def -- sections "'sec1:sec2:\*[Ellipsis]'"
+Restrict searching for
+.I \%man\~pages
+to the given
+.IR sections ,
+a colon-separated list.
+.
+.
+.Opt_def -- systems "'sys1,sys2,\*[Ellipsis]'"
+Search for
+.I \%man\~pages
+for the given operating systems; the argument
+.I \%systems
+is a comma-separated list.
+.
+.
+.Opt_def -- where
+Eqivalent to
+.Opt_long location .
+.
+.
+.\" --------------------------------------------------------------------
+.SS "X\~\%Window\~\%Toolkit Options"
+.\" --------------------------------------------------------------------
+.
+The following long options were adapted from the corresponding
+\%\f[CR]X\~\Window\~Toolkit\f[] options.
+.
+.B \%groffer
+will pass them to the actual viewer program if it is an
+\%\f[CR]X\~Window\f[] program.
+.
+Otherwise these options are ignored.
+.
+.
+.P
+Unfortunately these options use the old style of a single minus for
+long options.
+.
+For
+.B \%groffer
+that was changed to the standard with using a double minus for long
+options, for example,
+.B \%groffer
+uses the option
+.Opt_long font
+for the \%\f[CR]X\~Window\f[] option
+.Opt_short font .
+.
+.
+.P
+See
+.BR \%X (1),
+.BR \%X (7),
+and the documentation on the \%\f[CR]X\~Window\~Toolkit\f[] options
+for more details on these options and their arguments.
+.
+.
+.Opt_def -- background color
+Set the background color of the viewer window.
+.
+.
+.Opt_def -- bd pixels
+Specifies the color of the border surrounding the viewer window.
+.
+.
+.Opt_def -- bg color
+This is equivalent to
+.Opt_long background .
+.
+.
+.Opt_def -- bw pixels
+Specifies the width in pixels of the border surrounding the viewer
+window.
+.
+.
+.Opt_def -- display X-display
+Set the \%\f[CR]X\~Window\f[] display on which the viewer program
+shall be started, see the \%\f[CR]X\~Window\f[] documentation for the
+syntax of the argument.
+.
+.
+.Opt_def -- foreground color
+Set the foreground color of the viewer window.
+.
+.
+.Opt_def -- fg color
+This is equivalent to
+.Opt_short foreground .
+.
+.
+.Opt_def -- font font_name
+Set the font used by the viewer window.
+.
+The argument is an \%\f[CR]X\~Window\f[] font name.
+.
+.
+.Opt_def -- ft font_name
+This is equivalent to
+.Opt_long ft .
+.
+.
+.Opt_def -- geometry size_pos
+Set the geometry of the display window, that means its size and its
+starting position.
+.
+See
+.BR \%X (7)
+for the syntax of the argument.
+.
+.
+.Opt_def -- resolution value
+Set \%\f[CR]X\~Window\f[] resolution in dpi (dots per inch) in some
+viewer programs.
+.
+The only supported dpi values are
+.B 75
+and
+.BR 100 .
+.
+Actually, the default resolution for
+.B \%groffer
+is set to
+.BR 75\~dpi .
+The resolution also sets the default device in
+.IR "mode x" .
+.
+.
+.Opt_def -- rv
+Reverse foreground and background color of the viewer window.
+.
+.
+.Opt_def -- title "'some text'"
+Set the title for the viewer window.
+.
+.
+.Opt_def -- xrm "'resource'"
+Set \f[CR]\%X\~Window\f[] resource.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Filespec Arguments"
+.\" --------------------------------------------------------------------
+.
+A
+.I \%filespec
+parameter is an argument that is not an option or option argument.
+.
+It means an input source.
+.
+In
+.BR \%groffer ,
+.I \%filespec
+parameters are a file name or a template for searching
+.IR \%man\~pages .
+.
+These input sources are collected and composed into a single output
+file such as
+.B \%groff
+does.
+.
+.
+.P
+The strange \%\f[CR]POSIX\f[] behavior to regard all arguments behind
+the first non-option argument as
+.I \%filespec
+arguments is ignored.
+.
+The \f[CR]GNU\f[] behavior to recognize options even when mixed with
+.I \%filespec
+arguments is used througout.
+.
+But, as usual, the double minus argument
+.Opt_long
+ends the option handling and interprets all following arguments as
+.I \%filespec
+arguments; so the \%\f[CR]POSIX\f[] behavior can be easily adopted.
+.
+.
+.P
+For the following, it is necessary to know that on each system the
+.I \%man\~pages
+are sorted according to their content into several sections.
+.
+The
+.I classical man sections
+have a single-character name, either a digit from
+.B 1
+to
+.B 9
+or one of the characters
+.B n
+or
+.BR o .
+.
+In the following, a stand-alone character
+.I s
+stands for a
+.IR "classical man section" .
+The internal precedence of
+.B \%man
+for searching
+.I \%man\~pages
+with the same name within several sections goes according to the
+classical single-character sequence.
+.
+On some systems, this single character can be extended by a following
+string.
+.
+But the special
+.B \%groffer
+.I \%man\~page
+facility is based on the classical single character sections.
+.
+.
+.P
+Each
+.I \%filespec
+parameter can have one of the following forms in decreasing sequence.
+.
+.
+.Topic
+No
+.I \%filespec
+parameters means that
+.B \%groffer
+waits for standard input.
+.
+The minus option
+.Opt_short ""
+stands for standard input, too; it can occur several times.
+.
+.
+.Topic
+Next a
+.I \%filespec
+is tested whether it is the path name of an existing file.
+.
+Otherwise it is assumed to be a searching pattern for a
+.IR \%man\~page .
+.
+.
+.Topic
+.BI \%man: name ( section )
+and
+.IB \%name ( section )
+search the \%man\~page
+.I \%name
+in \%man\~section\~\c
+.IR \%section ,
+where
+.I \%section
+can be any string, but it must exist in the
+.I \%man
+system.
+.
+.
+.Topic
+Next some patterns based on the
+.I classical man sections
+are checked.
+.
+.BI \%man: name . s
+and
+.IB \%name . s
+search for a \%man\~page
+.I \%name
+in \%man\~section
+.I s
+if
+.I s
+is a
+.I classical man section
+mentioned above.
+.
+Otherwise a
+.I \%man\~page
+named
+.IR \%name.s
+is searched in the lowest
+.B man\~section .
+.
+.
+.Topic
+Now
+.BI \%man: name
+searches for a
+.I \%man\~page
+in the lowest
+.I \%man\~section
+that has a document called
+.IR \%name .
+.
+.
+.Topic
+The pattern
+.I \%s\~name
+originates from a strange argument parsing of the
+.B man
+program.
+.
+If
+.I s
+is a
+.I classical man section
+interpret it as a search for a
+.I \%man\~page
+called
+.I \%name
+in man\~section
+.IR s ,
+otherwise interpret both
+.I s
+and
+.I \%name
+as two independent
+.I \%filespec
+arguments.
+.
+.
+.Topic
+We are left with the argument
+.I \%name
+which is not an existing file.
+.
+So this searches for the
+.I \%man\~page
+called
+.I \%name
+in the lowest
+.I \%man\~section
+that has a document for this name.
+.
+.
+.P
+Wildcards in
+.I \%filespec
+arguments are only accepted for
+.Opt_long apropos*
+and
+.Opt_long whatis ;
+for normal display, they are interpreted as characters.
+.
+.
+.P
+Several file name arguments can be supplied.
+.
+They are mixed by
+.B \%groff
+into a single document.
+.
+Note that the set of option arguments must fit to all of these file
+arguments.
+.
+So they should have at least the same style of the
+.I \%groff
+language.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "OUTPUT MODES"
+.\" --------------------------------------------------------------------
+.
+By default, the
+.B \%groffer
+program collects all input into a single file, formats it with the
+.B \%groff
+program for a certain device, and then chooses a suitable viewer
+program.
+.
+The device and viewer process in
+.B \%groffer
+is called a
+.IR \%mode .
+.
+The mode and viewer of a running
+.B \%groffer
+program is selected automatically, but the user can also choose it
+with options.
+.
+.
+The modes are selected by option the arguments of
+.Opt_long_arg mode \fIanymode .
+Additionally, each of this argument can be specified as an option of
+its own, such as
+.Opt_long \fIanymode .
+Most of these modes have a viewer program, which can be chosen by an
+option that is constructed like
+.Opt_long \fIanymode\fR\-viewer .
+.
+.
+.P
+Several different modes are offered, graphical modes for
+\f[CR]\%X\~Window\f[],
+.IR \%text\~modes ,
+and some direct
+.I \%groff\~modes
+for debugging and development.
+.
+.
+.P
+By default,
+.B \%groffer
+first tries whether
+.I \%x\~mode
+is possible, then
+.IR \%ps\~mode ,
+and finally
+.IR \%tty\~mode .
+.
+This mode testing sequence for
+.I \%auto\~mode
+can be changed by specifying a comma separated list of modes with the
+option
+.Opt_long default\-modes.
+.
+.
+.P
+The searching for
+.I \%man\~pages
+and the decompression of the input are active in every mode.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Graphical Display Modes"
+.\" --------------------------------------------------------------------
+.
+The graphical display modes work mostly in the \%\f[CR]X\~Window\f[]
+environment (or similar implementations within other windowing
+environments).
+.
+The environment variable
+.Env_var $DISPLAY
+and the option
+.Opt_long display
+are used for specifying the \%\f[CR]X\~Window\f[] display to be used.
+.
+If this environment variable is empty
+.B \%groffer
+assumes that no \%\f[CR]X\~Window\f[] is running and changes to a
+.IR \%text\~mode .
+.
+You can change this automatic behavior by the option
+.Opt_long default\-modes .
+.
+.
+.P
+Known viewers for the graphical display modes and their standard
+\%\f[CR]X\~Window\f[] viewer progams are
+.
+.Topic
+\%\f[CR]X\~Window\f[]
+.I roff
+viewers such as
+.BR \%gxditview (@MAN1EXT@)
+or
+.BR \%xditview (1)
+(in
+.IR \%x\~mode ),
+.
+.Topic
+in a Postscript viewer
+.nh
+.RI ( \%ps\~mode ),
+.hy
+.
+.Topic
+in a dvi viewer program
+.nh
+.RI ( \%dvi\~mode ),
+.hy
+.
+.Topic
+in a PDF viewer
+.nh
+.RI ( \%pdf\~mode ),
+.hy
+.
+.Topic
+in a web browser
+.nh
+.RI ( html
+or
+.IR \%www\~mode ).
+.hy
+.RE
+.
+.
+.P
+The
+.I \%pdf\~mode
+has a major advantage \[em] it is the only graphical diplay mode that
+allows to search for text within the viewer; this can be a really
+important feature.
+.
+Unfortunately, it takes some time to transform the input into the PDF
+format, so it was not chosen as the major mode.
+.
+.
+.P
+These graphical viewers can be customized by options of the
+\%\f[CR]X\~Window\~Toolkit\f[].
+.
+But the
+.B \%groffer
+options use a leading double minus instead of the single minus used by
+the \%\f[CR]X\~Window\~Toolkit\f[].
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Text modes"
+.\" --------------------------------------------------------------------
+.
+There are two modes for text output,
+.I \%mode\~text
+for plain output without a pager and
+.I \%mode\~tty
+for a text output on a text terminal using some pager program.
+.
+.
+.P
+If the variable
+.Env_var \%$DISPLAY
+is not set or empty,
+.B \%groffer
+assumes that it should use
+.IR \%tty\~\%mode .
+.
+.
+.P
+In the actual implementation, the
+.I groff
+output device
+.I \%latin1
+is chosen for
+.IR \%text\~modes .
+.
+This can be changed by specifying option
+.Opt_short T
+or
+.Opt_long device .
+.
+.
+.P
+The pager to be used can be specified by one of the options
+.Opt_long pager
+and
+.Opt_long tty\-viewer ,
+or by the environment variable
+.Env_var $PAGER .
+If all of this is not used the
+.BR \%less (1)
+program with the option
+.Opt_short r
+for correctly displaying control sequences is used as the default
+pager.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Special Modes for Debugging and Development"
+.\" --------------------------------------------------------------------
+.
+These modes use the
+.I \%groffer
+file determination and decompression.
+.
+This is combined into a single input file that is fed directly into
+.B \%groff
+with different strategy without the
+.I \%groffer
+viewing facilities.
+.
+These modes are regarded as advanced, they are useful for debugging
+and development purposes.
+.
+.
+.P
+The
+.I \%source\~mode
+with option
+.Opt_short Q
+and
+.Opt_long source
+just displays the decompressed input.
+.
+.
+.P
+The
+.I \%groff\~mode
+passes the input to
+.B \%groff
+using only some suitable options provided to
+.BR \%groffer .
+.
+This enables the user to save the generated output into a file or pipe
+it into another program.
+.
+.
+.P
+In
+.IR \%groff\~\%mode ,
+the option
+.Opt_short Z
+disables post-processing, thus producing the
+.nh
+.I groff intermediate
+.IR output .
+.hy
+.
+In this mode, the input is formatted, but not postprocessed; see
+.BR \%groff_out (@MAN5EXT@)
+for details.
+.
+.
+.P
+All
+.B \%groff
+short options are supported by
+.BR \%groffer .
+.
+.
+.\" --------------------------------------------------------------------
+.SH "MAN\~PAGE\~SEARCHING"
+.\" --------------------------------------------------------------------
+.
+The default behavior of
+.B \%groffer
+is to first test whether a file parameter represents a local file; if
+it is not an existing file name, it is assumed to represent a name of
+a
+.IR \%man\~page .
+.
+This behavior can be modified by the following options.
+.
+.
+.TP
+.Opt_long man
+forces to interpret all file parameters as
+.I \%filespecs
+for searching
+.IR \%man\~pages .
+.
+.TP
+.Opt_long no\-man
+.TP+
+.Opt_long local\-file
+disable the
+.I man
+searching; so only local files are displayed.
+.
+.
+.P
+If neither a local file nor a
+.I \%man\~page
+was retrieved for some file parameter a warning is issued on standard
+error, but processing is continued.
+.
+.
+.P
+The
+.B \%groffer
+program provides a search facility for
+.IR \%man\~pages .
+.
+All long options, all environment variables, and most of the
+functionality of the \f[CR]GNU\f[]
+.BR \%man (1)
+program were implemented.
+.
+This inludes the extended file names of
+.IR \%man\~pages ,
+for example, the
+.I \%man\~page
+of
+.B \%groff
+in man\~section 7 may be stored under
+.File_name /usr/share/man/man7/groff.7.gz ,
+where
+.File_name /usr/share/man/
+is part of the man\~path, the subdirectory
+.I \%man7
+and the file extension
+.I .7
+refer to the man\~section 7;
+.I \%.gz
+shows the compression of the file.
+.
+.
+.P
+The
+.I cat\~pages
+(preformatted
+.IR \%man\~pages )
+are intentionally excluded from the search because
+.B \%groffer
+is a
+.I roff
+program that wants to format by its own.
+.
+With the excellent performance of the actual computers, the
+preformatted
+.I \%man\~pages
+aren't necessary any longer.
+.
+.
+.P
+The algorithm for retrieving
+\I \%man\~pages
+uses five search methods.
+.
+They are successively tried until a method works.
+.
+.
+.Topic
+The search path can be manually specified by using the option
+.Opt_long manpath .
+An empty argument disables the
+.I \%man\~page
+searching.
+.
+This overwrites the other methods.
+.
+.
+.Topic
+If this is not available the environment variable
+.Env_var $MANPATH
+is searched.
+.
+.
+.Topic
+If this is empty, the program tries to read it from the environment
+variable
+.Env_var $MANOPT .
+.
+.
+.Topic
+If this does not work a reasonable default path from
+.Env_var $PATH
+is searched for
+.IR \%man\~pages .
+.
+.
+.Topic
+If this does not work, the
+.BR \%manpath (1)
+program for determining a path of
+.I man
+directories is tried.
+.
+.
+.P
+After this, the path elements for the language (locale) and operating
+system specific
+.I \%man\~pages
+are added to the
+.IR man\~path ;
+their sequence is determined automatically.
+.
+For example, both
+.File_name /usr/share/man/linux/fr
+and
+.File_name /usr/share/man/fr/linux
+for french linux
+.I \%man\~pages
+are found.
+.
+The language and operating system names are determined from both
+environment variables and command line options.
+.
+.
+.P
+The locale (language) is determined like in \f[CR]GNU\f[]
+.BR man ,
+that is from highest to lowest precedence:
+.Topic
+.Opt_long locale
+.
+.Topic
+.Env_var $GROFFER_OPT
+.
+.Topic
+.Env_var $MANOPT
+.
+.Topic
+.Env_var $LCALL
+.
+.Topic
+.Env_var $LC_MESSAGES
+.
+.Topic
+.Env_var $LANG .
+.
+.
+.P
+The language locale is usually specified in the
+\%\f[CR]POSIX\~1003.1\f[] based format:
+.P
+.nh
+\f[I]\f[][\f[CB]_\f[]\f[I]\f[][\f[CB].\f[]\
+\f[I]\f[][\f[CB],\f[]\f[I]\f[]]]],
+.hy
+.P
+but the two-letter code in
+.nh
+.I 
+.hy
+is sufficient for most purposes.
+.
+.
+.P
+If no
+.I \%man\~pages
+for a complicated locale are found the country part consisting of the
+first two characters (without the `\f[CB]_\f[]', `\f[CB].\f[]', and
+`\f[CB],\f[]' parts) of the locale is searched as well.
+.
+.
+.P
+If still not found the corresponding
+.I \%man\~page
+in the default language is used instead.
+.
+As usual, this default can be specified by one of \f[CR]C\f[] or
+\f[CR]\%POSIX\f[].
+.
+The
+.I \%man\~pages
+in the default language are usually in English.
+.
+.
+.P
+Several operating systems can be given by appending their names,
+separated by a comma.
+.
+This is then specified by the environment variable
+.Env_var $SYSTEM
+or by the command line option
+.Opt_long systems .
+The precedence is similar to the locale case above from highest to
+lowest precedence:
+.
+Topic
+.Opt_long systems
+.
+.Topic
+.Env_var $GROFFER_OPT
+.
+.Topic
+.Env_var $MANOPT
+.
+.Topic
+.Env_var $SYSTEM .
+.
+.
+.P
+When searching for
+.I \%man\~pages
+this
+.I man\~path
+with the additional language and system specific directories is used.
+.
+.
+.P
+The search can further be restricted by limiting it to certain
+sections.
+.
+A single section can be specified within each
+.I \%filespec
+argument, several sections as a colon-separated list in command line
+option
+.Opt_long sections
+or environment variable
+.Env_var $MANSECT .
+.
+When no section was specified a set of standard sections is searched
+until a suitable
+.I \%man\~page
+was found.
+.
+.
+.P
+Finally, the search can be restricted to a so-called
+.IR extension .
+This is a postfix that acts like a subsection.
+.
+It can be specified by
+.Opt_long extension
+or environment variable
+.Env_var $EXTENSION .
+.
+.
+.P
+For further details on
+.I \%man\~page
+searching, see
+.BR \%man (1).
+.
+.
+.\" --------------------------------------------------------------------
+.SH DECOMPRESSION
+.\" --------------------------------------------------------------------
+.
+The program has a decompression facility.
+.
+If standard input or a file that was retrieved from the command line
+parameters is compressed with a format that is supported by either
+.BR \%gzip (1)
+or
+.BR \%bzip2 (1)
+it is decompressed on-the-fly.
+.
+This includes the \f[CR]GNU\f[]
+.BR \%.gz ,
+.BR \%.bz2 ,
+and the traditional
+.B \%.Z
+compression.
+.
+The program displays the concatenation of all decompressed input in
+the sequence that was specified on the command line.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "ENVIRONMENT"
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program supports many system variables, most of them by courtesy of
+other programs.
+.
+All environment variables of
+.BR \%groff (@MAN1EXT@)
+and \f[CR]GNU\f[]
+.BR \%man (1)
+and some standard system variables are honored.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Native groffer Variables"
+.\" --------------------------------------------------------------------
+.
+.TP
+.Env_var $GROFFER_OPT
+Store options for a run of
+.BR \%groffer .
+.
+The options specified in this variable are overridden by the options
+given on the command line.
+.
+The content of this variable is run through the shell builtin `eval';
+so arguments containing white-space or special shell characters should
+be quoted.
+.
+Do not forget to export this variable, otherwise it does not exist
+during the run of
+.BR groffer .
+.
+.
+.\" --------------------------------------------------------------------
+.SS "System Variables"
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program is a shell script that is run through
+.File_name /bin/sh ,
+which can be internally linked to programs like
+.BR \%bash (1).
+The corresponding system environment is automatically effective.
+.
+The following variables have a special meaning for
+.BR \%groffer .
+.
+.
+.TP
+.Env_var $DISPLAY
+If this variable is set this indicates that the \%\f[CR]X\~Window\f[]
+system is running.
+.
+Testing this variable decides on whether graphical or text output is
+generated.
+.
+This variable should not be changed by the user carelessly, but it can
+be used to start the graphical
+.B \%groffer
+on a remote \%\f[CR]X\~Window\f[] terminal.
+.
+For example, depending on your system,
+.B \%groffer
+can be started on the second monitor by the command
+.Shell_cmd DISPLAY=:0.1\~groffer\~ what.ever &
+.
+.
+.TP
+.Env_var $LC_ALL
+.TP+
+.Env_var $LC_MESSAGES
+.TP+
+.Env_var $LANG
+If one of these variables is set (in the above sequence), its content
+is interpreted as the locale, the language to be used, especially when
+retrieving
+\IR \%man\~pages .
+.
+A locale name is typically of the form
+.nh
+.IR language [\c
+.B _\c
+.IR territory [\c
+.B .\c
+.IR codeset [\c
+.B @\c
+.IR modifier ]]],
+.hy
+where
+.I \%language
+is an ISO 639 language code,
+.I \%territory
+is an ISO 3166 country code, and
+.I \%codeset
+is a character set or encoding identifier like ISO-8859-1 or UTF-8;
+see
+.BR \%setlocale (3).
+.
+The locale values \f[CR]C\f[] and \%\f[CR]POSIX\f[]
+stand for the default, i.e. the
+.I \%man\~page
+directories without a language prefix.
+.
+This is the same behavior as when all 3\~variables are unset.
+.
+.
+.TP
+.Env_var $PAGER
+This variable can be used to set the pager for the tty output.
+.
+For example, to disable the use of a pager completely set this
+variable to the
+.BR \%cat (1)
+program
+.Shell_cmd PAGER=cat\~groffer\~ anything
+.
+.
+.TP
+.Env_var $PATH
+All programs within the
+.B \%groffer
+shell script are called without a fixed path.
+.
+Thus this environment variable determines the set of programs used
+within the run of
+.BR \%groffer .
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Groff Variables"
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program internally calls
+.BR \%groff ,
+so all environment variables documented in
+.BR \%groff (@MAN1EXT@)
+are internally used within
+.B \%groffer
+as well.
+.
+The following variable has a direct meaning for the
+.B \%groffer
+program.
+.
+.TP
+.Env_var $GROFF_TMPDIR
+If the value of this variable is an existing, writable directory,
+.B \%groffer
+uses it for storing its temporary files, just as
+.B groff
+does.
+.
+.
+.\" --------------------------------------------------------------------
+.SS "Man Variables"
+.\" --------------------------------------------------------------------
+.
+Parts of the functionality of the
+.B man
+program were implemented in
+.BR \%groffer ;
+support for all environment variables documented in
+.BR \%man (1)
+was added to
+.BR \%groffer ,
+but the meaning was slightly modified due to the different approach in
+.BR \%groffer ;
+but the user interface is the same.
+.
+The
+.B man
+environment variables can be overwritten by options provided with
+.Env_var $MANOPT ,
+which in turn is overwritten by the command line.
+.
+.
+.TP
+.Env_var $EXTENSION
+Restrict the search for
+.I \%man\~pages
+to files having this extension.
+.
+This is overridden by option
+.Opt_long extension ;
+see there for details.
+.
+.
+.TP
+.Env_var $MANOPT
+This variable contains options as a preset for
+.BR \%man (1).
+As not all of these are relevant for
+.B \%groffer
+only the essential parts of its value are extracted.
+.
+The options specified in this variable overwrite the values of the
+other environment variables that are specific to
+.IR man .
+.
+All options specified in this variable are overridden by the options
+given on the command line.
+.
+.
+.TP
+.Env_var $MANPATH
+If set, this variable contains the directories in which the
+.I \%man\~page
+trees are stored.
+.
+This is overridden by option
+.Opt_long manpath .
+.
+.
+.TP
+.Env_var $MANSECT
+If this is a colon separated list of section names, the search for
+.I \%man\~pages
+is restricted to those manual sections in that order.
+.
+This is overridden by option
+.Opt_long sections .
+.
+.
+.TP
+.Env_var $SYSTEM
+If this is set to a comma separated list of names these are interpreted
+as
+.I \%man\~page
+trees for different operating systems.
+.
+This variable can be overwritten by option
+.Opt_long systems ;
+see there for details.
+.
+.
+.P
+The environment variable
+.Env_var $MANROFFSEQ
+is ignored by
+.B \%groffer
+because the necessary preprocessors are determined automatically.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "CONFIGURATION FILES"
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program can be preconfigured by two configuration files.
+.
+.
+.TP
+.File_name /etc/groff/groffer.conf
+System-wide configuration file for
+.BR \%groffer .
+.
+.
+.TP
+.File_name $HOME/.groff/groffer.conf
+User-specific configuration file for
+.BR \%groffer ,
+where
+.Env_var $HOME
+denotes the user's home directory.
+.
+This file is called after the system-wide configuration file to enable
+overriding by the user.
+.
+.
+.P
+The precedence of option delivery is given in the following.
+.
+The configuration file in
+.File_name /etc
+has the lowest precedence; it is overwritten by the configuration file
+in the home directory; both configuration files are overwritten by the
+environment variable
+.Env_var $GROFFER_OPT ;
+everything is overwritten by the command line.
+.
+.
+.P
+In the configuration files, arbitrary spaces are allowed at the
+beginning of each line, they are just ignored.
+.
+Apart from that, the lines of the configuration lines either start
+with a minus character, all other lines are interpreted as shell
+commands.
+.
+.
+.P
+The lines with the beginning minus are interpreted as
+.B groffer
+options.
+.
+This easily allows to set general
+.B \%groffer
+options that should be used with any call of
+.BR \%groffer .
+.
+Each line can represent a single short option, a short option cluster,
+or a long option with two minus signs, eventually with an argument.
+.
+The argument can be appended either after a space character or an
+equal sign
+.RB ` = '.
+The argument can be surrounded by quotes, but this is not necessary.
+.
+The options from these lines are collected and prepended to the
+existing value of
+.Env_var $GROFFER_OPT
+at the end of each configuration file.
+.
+.
+.P
+After the transformation of the minus lines, the configuration files
+have been transferred into a shell script that is called within
+.B \%groffer
+using the `\c
+.CB \.\~\c
+.IR \%filename '
+shell syntax.
+.
+.
+.P
+It makes sense to use these configuration files for the following
+tasks:
+.
+.Topic
+Preset command line options, such as choosing a
+.I \%mode
+or a viewer.
+.
+These are written into lines starting with a single or double minus
+sign, followed by the option name.
+.
+.Topic
+Preset environment variables recognized by
+.BR \%groffer ;
+but do not forget to export them.
+.
+.Topic
+You can also write a shell function for calling, for example a viewer
+program for some
+.IR \%mode .
+Such a function can be fed into a corresponding
+.Opt_long \f[I]mode\f[]\-viewer
+option.
+.
+.Topic
+Enter
+.Opt_long shell
+to specify a shell for the run of
+.File_name groffer2.sh .
+Some shells run much faster than the standard shell.
+.
+.
+.P
+As an example, consider the following configuration file in
+.File_name ~/.groff/groffer.conf ,
+say.
+.
+.P
+.ft CR
+.nh
+.nf
+# groffer configuration file
+#
+# groffer options that are used in each call of groffer
+\-\-shell=ksh
+\-\-foreground=DarkBlue
+\-\-resolution=100
+\-\-x\-viewer='gxditview \-geometry 900x1200'
+#
+# some shell commands
+if test "$DISPLAY" = ""; then
+  export DISPLAY='localhost:0.0'
+fi
+date >>~/mygroffer.log
+.fi
+.hy
+.ft
+.
+.
+.P
+The lines starting with
+.B #
+are command lines.
+.
+This configuration sets four
+.B \%groffer
+options (the lines starting with `\-') and runs two shell commands (the
+rest of the script).
+.
+This has the following effects:
+.
+.
+.Topic
+Use
+.B ksh
+as the shell to run the
+.B \%groffer
+script; if it works it should be faster than the usual
+.BR sh .
+.
+.
+.Topic
+Use a text color of
+.B \%DarkBlue
+in all viewers that support this, such as
+.BR \%gxditview .
+.
+.
+.Topic
+Use a resolution of
+.B 100\~dpi
+in all viewers that support this, such as
+.BR \%gxditview .
+.
+By this, the default device in
+.I x mode
+is set to
+.BR X100 .
+.
+.
+.Topic
+Force
+.BR \%gxditview (@MAN1EXT@)
+as the
+.I \%x-mode
+viewer using the geometry option for setting the width to
+.B 900\~dpi
+and the height to
+.BR 1200\~dpi .
+This geometry is suitable for a resolution of
+.BR 100\~dpi .
+.
+.
+.Topic
+If the environment variable
+.Env_var $DISPLAY
+is empty set it to
+.IR localhost:0.0 .
+.
+That allows to start
+.B \%groffer
+in the standard \%\f[CR]X\~Window\f[] display, even when the program
+is called from a text console.
+.
+.
+.Topic
+Just for fun, the date of each
+.B \%groffer
+start is written to the file
+.File_name mygroffer.log
+in the home directory.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "EXAMPLES"
+.\" --------------------------------------------------------------------
+.
+The usage of
+.B \%groffer
+is very easy.
+.
+Usually, it is just called with a file name or
+.IR \%man\~page .
+.
+The following examples, however, show that
+.B \%groffer
+has much more fancy capabilities.
+.
+.
+.TP
+.Shell_cmd "groffer\~/usr/local/share/doc/groff/meintro.ms.gz"
+Decompress, format and display the compressed file
+.File_name meintro.ms.gz
+in the directory
+.File_name /usr/local/share/doc/groff ,
+using the standard viewer
+.B \%gxditview
+as graphical viewer when in \%\f[CR]X\~Window\f[], or the
+.BR \%less (1)
+pager program when not in \%\f[CR]X\~Window\f[].
+.
+.
+.TP
+.Shell_cmd "groffer\~groff"
+If the file
+.File_name \%./groff
+exists use it as input.
+.
+Otherwise interpret the argument as a search for the
+.I \%man\~page
+named
+.B \%groff
+in the smallest possible
+.IR \%man\~section ,
+being section 1 in this case.
+.
+.
+.TP
+.Shell_cmd "groffer\~man:groff"
+search for the
+.I \%man\~page
+of
+.B \%groff
+even when the file
+.File_name ./groff
+exists.
+.
+.
+.TP
+.Shell_cmd "groffer\~groff.7"
+.TP+
+.Shell_cmd "groffer\~7\~groff"
+search the
+.I \%man\~page
+of
+.B \%groff
+in
+.I \%man\~section
+.BR 7 .
+This section search works only for a digit or a single character from
+a small set.
+.
+.
+.TP
+.Shell_cmd "groffer\~fb.modes"
+If the file
+.File_name ./fb.modes
+does not exist interpret this as a search for the
+.I \%man\~page
+of
+.BR fb.modes .
+As the extension
+.I \%modes
+is not a single character in classical section style the argument is
+not split to a search for
+.BR fb .
+.
+.
+.TP
+.Shell_cmd "groffer\~groff\~\[cq]troff(1)\[cq]\~man:roff"
+.
+The arguments that are not existing files are looked-up as the
+following
+.IR \%man\~pages :
+.B \%groff
+(automatic search, should be found in \fIman\fP\~section\~1),
+.B \%troff
+(in section\~1),
+and
+.B \%roff
+(in the section with the lowest number, being\~7 in this case).
+.
+The quotes around
+.nh
+.I \[cq]troff(1)\[cq]
+.hy
+are necessary because the paranthesis are special shell characters;
+escaping them with a backslash character
+.I \[rs](
+and
+.I \[rs])
+would be possible, too.
+.
+The formatted files are concatenated and displayed in one piece.
+.
+.
+.TP
+.Shell_cmd "LANG=de\~groffer\~--man\~--www\~--www-viever=galeon\~ls"
+.
+Retrieve the German
+.I \%man\~page
+(language
+.IR de )
+for the
+.B ls
+program, decompress it, format it to
+.I \%html
+format
+.nh
+.RI ( \%www\~mode )
+.hy
+and view the result in the web browser
+.BR \%galeon .
+The option
+.Opt_long man
+guarantees that the
+.I \%man\~page
+is retrieved, even when a local file
+.File_name \%ls
+exists in the actual directory.
+.
+.
+.TP
+.Shell_cmd "groffer\~--source\~'man:roff(7)'"
+.
+Get the
+.I \%man\~page
+called
+.I \%roff
+in \fIman\fP\~section 7, decompress it, and print its unformatted
+content, its source code.
+.
+.
+.TP
+.Shell_cmd "cat\~file.gz\~|\~groffer\~-Z\~-mfoo"
+.
+Decompress the standard input, send this to
+.I \%groff intermediate output mode
+without post-processing
+.RB ( groff
+option
+.Opt_short Z ),
+using macro package by
+.I \%foo
+.RB ( groff
+option
+.Opt_short m ) .
+.
+.
+.TP
+.Shell_cmd "echo\~'\[rs]f[CB]WOW!'\~|"
+.TP+
+.Shell_cmd+ "groffer --x --bg red --fg yellow --geometry 200x100 -"
+.
+Display the word \f[CB]WOW!\f[] in a small window in constant-width
+bold font, using color yellow on red background.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "COMPATIBILITY"
+.\" --------------------------------------------------------------------
+.
+The
+.B \%groffer
+program consists of two shell scripts.
+.
+.
+.P
+The starting script is the file
+.File_name \%groffer
+that is installed in a
+.File_name bin
+directory.
+.
+It is generated from the source file
+.File_name \%groffer.sh .
+.
+It is just a short starting script without any functions such that it
+can run on very poor shells.
+.
+.
+.P
+The main part of the
+.B \%groffer
+program is the file
+.File_name groffer2.sh
+that is installed in the
+.I groff
+library directory.
+.
+This script can be run under a different shell by using the
+.B \%groffer
+option
+.Opt_long shell .
+.
+.
+.P
+Both scripts are compatible with both
+\f[CR]GNU\f[] and \%\f[CR]POSIX\f[].
+.
+\%\f[CR]POSIX\f[] compatibility refers to
+\%\f[CR]IEEE\~P1003.2/D11.2\f[] of September 1991, a very early
+version of the \%\f[CR]POSIX\f[] standard that is still freely
+available in the internet at
+.URL http://\:www.funet.fi/\:pub/\:doc/\:posix/\:p1003.2/\:d11.2/\:all \
+"\%POSIX\~P1003.2\~draft\~11.2" .
+.
+.
+.P
+Only a restricted set of shell language elements and shell builtins is
+used to achieve even compatibility with some Bourne shells that are
+not fully \%\f[CR]POSIX\f[] compatible.
+.
+The
+.B \%groffer
+shell scripts were tested on many shells, including the following
+Bourne shells:
+.BR \%ash (1),
+.BR \%bash (1),
+.BR \%dash (1),
+.BR \%ksh (1),
+.BR \%pdksh (1),
+.BR \%posh (1),
+and
+.BR \%zsh (1).
+So it should work on most actual free and commercial operating
+systems.
+.
+.
+.P
+The shell for the run of
+.File_name groffer2.sh
+can be chosen by the option
+.Opt_long shell
+on the command line or the environment variable
+.Env_var $GROFF_OPT .
+If you want to add it to one of the
+.B \%groffer
+configuration files you must write a line starting with
+.Opt_long shell .
+.
+.
+.P
+The
+.B \%groffer
+program provides its own parser for command line arguments that is
+compatible to both \%\f[CR]POSIX\f[]
+.BR \%getopts (1)
+and \%\f[CR]GNU\f[]
+.BR \%getopt (1).
+It can handle option arguments and file names containing white space
+and a large set of special characters.
+.
+The following standard types of options are supported.
+.
+.
+.Topic
+The option consisiting of a single minus
+.Opt_short
+refers to standard input.
+.
+.
+.Topic
+A single minus followed by characters refers to a single character
+option or a combination thereof; for example, the
+.B \%groffer
+short option combination
+.Opt_short Qmfoo
+is equivalent to
+.Opt_short Q\~\-m\~foo .
+.
+.
+.Topic
+Long options are options with names longer than one character; they
+are always preceded by a double minus.
+.
+An option argument can either go to the next command line argument or
+be appended with an equal sign to the argument; for example,
+.Opt_alt -- long=arg
+is equivalent to
+.Opt_alt -- long\~arg .
+.
+.
+.Topic
+An argument of
+.Opt_--
+ends option parsing; all further command line arguments are
+interpreted as
+.I \%filespec
+parameters, i.e. file names or constructs for searching
+.IR \%man\~pages ).
+.
+.
+.Topic
+All command line arguments that are neither options nor option
+arguments are interpreted as
+.I \%filespec
+parameters and stored until option parsing has finished.
+.
+For example, the command line
+.Shell_cmd "groffer file1 -a -o arg file2"
+is equivalent to
+.Shell_cmd "groffer -a -o arg -- file1 file2"
+.
+.
+.P
+The free mixing of options and
+.I \%filespec
+parameters follows the GNU principle.
+.
+That does not fulfill the strange option behavior of \%\f[CR]POSIX\f[]
+that ends option processing as soon as the first non-option argument
+has been reached.
+.
+The end of option processing can be forced by the option
+.RB ` \-\- '
+anyway.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "BUGS"
+.\" --------------------------------------------------------------------
+.
+Report bugs to the
+.MTO bug-groff@gnu.org "bug-groff mailing list" .
+.
+Include a complete, self-contained example that will allow the bug to
+be reproduced, and say which version of
+.B \%groffer
+you are using.
+.
+.
+.P
+You can also use the
+.MTO groff@gnu.org "groff mailing list" ,
+but you must first subscribe to this list.
+.
+You can do that by visiting the
+.URL http://\:lists.gnu.org/\:mailman/\:listinfo/\:groff \
+"groff mailing list web page" .
+.
+.
+.P
+See
+.BR \%groff (@MAN1EXT@)
+for information on availability.
+.
+.
+.\" --------------------------------------------------------------------
+.SH "SEE ALSO"
+.\" --------------------------------------------------------------------
+.
+.P
+.BR \%groff (@MAN1EXT@),
+.BR \%@g@troff (@MAN1EXT@)
+.RS
+Details on the options and environment variables available in
+.BR \%groff ;
+all of them can be used with
+.BR \%groffer .
+.RE
+.
+.
+.TP
+.BR \%groff (@MAN7EXT@)
+Documentation of the
+.I \%groff
+language.
+.
+.
+.TP
+.BR \%grog (@MAN1EXT@)
+Internally,
+.B \%groffer
+tries to guess the
+.B \%groff
+command line options from the input using this program.
+.
+.
+.TP
+.BR groff_out (@MAN5EXT@)
+Documentation on the
+.I \%groff intermediate output
+.nh
+.RI ( ditroff
+output).
+.hy
+.
+.
+.TP
+.BR groff_tmac (@MAN5EXT@)
+Documentation on the
+.I \%groff
+macro files.
+.
+.
+.TP
+.BR \%man (1)
+The standard program to display
+.IR \%man\~pages .
+.
+The information there is only useful if it is the
+.I \%man\~page
+for GNU
+.BR man .
+Then it documents the options and environment variables that are
+supported by
+.BR \%groffer .
+.
+.
+.P
+.BR \%ash (1),
+.BR \%bash (1),
+.BR \%dash (1),
+.BR \%ksh (1),
+.BR \%pdksh (1),
+.BR \%posh (1),
+.BR \%sh (1),
+.BR \%zsh (1)
+.RS
+Bourne shells that were tested with
+.BR \%groffer .
+.RE
+.
+.
+.P
+.BR \%gxditview (@MAN1EXT@),
+.BR \%xditview (1x)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%x\~mode .
+.RE
+.
+.
+.P
+.BR \%kghostview (1),
+.BR \%ggv (1),
+.BR \%gv (1),
+.BR \%ghostview (1),
+.BR \%gs (1)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%ps\~mode .
+.RE
+.
+.
+.P
+.BR \%kghostview (1),
+.BR \%ggv (1),
+.BR \%xpdf (1),
+.BR \%acroread (1),
+.BR \%kpdf (1)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%pdf\~mode .
+.RE
+.
+.
+.P
+.BR \%kdvi (1),
+.BR \%xdvi (1),
+.BR \%dvilx (1)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%dvi\~mode .
+.RE
+.
+.
+.P
+.BR \%konqueror (1),
+.BR \%mozilla (1),
+.BR \%lynx (1)
+.RS
+Web-browsers for
+.BR \%groffer 's
+.I \%html
+or
+.IR \%www\~mode .
+.RE
+.
+.
+.TP
+.BR \%less (1)
+Standard pager program for the
+.I \%tty\~mode .
+.
+.
+.P
+.BR \%gzip (1),
+.BR \%bzip2 (1)
+.RS
+The decompression programs supported by
+.BR \%groffer .
+.RE
+.
+.
+.\" --------------------------------------------------------------------
+.SH "AUTHOR"
+.\" --------------------------------------------------------------------
+.author
+.
+.
+.\" --------------------------------------------------------------------
+.SH "COPYING"
+.\" --------------------------------------------------------------------
+.copyleft
+.
+.
+.\" --------------------------------------------------------------------
+.\" Emacs settings
+.\" --------------------------------------------------------------------
+.
+.\" Local Variables:
+.\" mode: nroff
+.\" End:
diff --git a/contrib/groffer/groffer.sh b/contrib/groffer/groffer.sh
new file mode 100644
index 0000000..1cb55c7
--- /dev/null
+++ b/contrib/groffer/groffer.sh
@@ -0,0 +1,299 @@
+#! /bin/sh
+
+# groffer - display groff files
+
+# Source file position: /contrib/groffer/groffer.sh
+
+# Copyright (C) 2001,2002,2003,2004,2005
+# Free Software Foundation, Inc.
+# Written by Bernd Warken
+
+# This file is part of `groffer', which is part of `groff' version
+# @VERSION@.  See $_GROFF_VERSION.
+
+# `groff' is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# `groff' 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 `groff'; see the files COPYING and LICENSE in the top
+# directory of the `groff' source.  If not, write to the Free Software
+# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+########################################################################
+
+_PROGRAM_VERSION='0.9.22';
+_LAST_UPDATE='22 August 2005';
+
+export _PROGRAM_VERSION;
+export _LAST_UPDATE;
+
+export GROFFER_OPT;		# option environment for groffer
+
+export _CONF_FILE_ETC;		# configuration file in /etc
+export _CONF_FILE_HOME;		# configuration file in $HOME
+export _CONF_FILES;		# configuration files
+_CONF_FILE_ETC='/etc/groff/groffer.conf';
+_CONF_FILE_HOME="${HOME}/.groff/groffer.conf";
+_CONF_FILES="${_CONF_FILE_ETC} ${_CONF_FILE_HOME}";
+
+# characters
+
+export _AT;
+export _SP;
+export _SQ;
+export _TAB;
+
+_AT='@';
+_SP=' ';
+_SQ="'";
+_TAB='	';
+
+export _ERROR;
+_ERROR='7';			# for syntax errors; no `-1' in `ash'
+
+# @...@ constructs
+
+export _GROFF_VERSION
+_GROFF_VERSION='@VERSION@';
+if test _@VERSION@_ = _${_AT}VERSION${_AT}_
+then
+  _GROFF_VERSION='1.19.2';
+fi;
+
+export _AT_BINDIR_AT;
+export _AT_G_AT;
+export _AT_LIBDIR_AT;
+export _GROFFER_LIBDIR;
+if test _@BINDIR@_ = _${_AT}BINDIR${_AT}_
+then
+  # script before `make'
+  _AT_BINDIR_AT='.';
+  _AT_G_AT='';
+  _AT_LIBDIR_AT='';
+  _GROFFER_LIBDIR='.';
+else
+  _AT_BINDIR_AT='@BINDIR@';
+  _AT_G_AT='@g@';
+  _AT_LIBDIR_AT='@libdir@';
+  _GROFFER_LIBDIR="${_AT_LIBDIR_AT}"'/groff/groffer';
+fi;
+
+export _GROFFER_SH;		# file name of this shell script
+case "$0" in
+*groffer*)
+  _GROFFER_SH="$0";
+  # was: _GROFFER_SH="${_AT_BINDIR_AT}/groffer";
+  ;;
+*)
+  echo 'The groffer script should be started directly.' >&2
+  exit 1;
+  ;;
+esac;
+
+export _GROFFER2_SH;		# file name of the script that follows up
+_GROFFER2_SH="${_GROFFER_LIBDIR}"/groffer2.sh;
+
+export _NULL_DEV;
+if test -c /dev/null
+then
+  _NULL_DEV="/dev/null";
+else
+  _NULL_DEV="NUL";
+fi;
+
+
+# Test of the `$()' construct.
+if test _"$(echo "$(echo 'test')")"_ \
+     != _test_
+then
+  echo 'The "$()" construct did not work.' >&2;
+  exit "${_ERROR}";
+fi;
+
+# Test of sed program
+if test _"$(echo red | sed -e 's/r/s/')"_ != _sed_
+then
+  echo 'The sed program did not work.' >&2;
+  exit "${_ERROR}";
+fi;
+
+
+########################### configuration
+
+# read and transform the configuration files, execute the arising commands
+for f in "${_CONF_FILE_HOME}" "${_CONF_FILE_ETC}"
+do
+  if test -f "$f"
+  then
+    o="";			# $o means groffer option
+    # use "" quotes because of ksh and posh
+    eval "$(cat "$f" | sed -n -e '
+# Ignore comments
+/^['"${_SP}${_TAB}"']*#/d
+# Delete leading and final space
+s/^['"${_SP}${_TAB}"']*//
+s/['"${_SP}${_TAB}"']*$//
+# Print all shell commands
+/^[^-]/p
+# Replace empty arguments
+s/^\(-[^ ]*\)=$/o="${o} \1 '"${_SQ}${_SQ}"'"/p
+# Replace division between option and argument by single space
+s/[='"${_SP}${_TAB}"']['"${_SP}${_TAB}"']*/'"${_SP}"'/
+# Handle lines without spaces
+s/^\(-[^'"${_SP}"']*\)$/o="${o} \1"/p
+# Print options that have their argument encircled with single quotes
+/^-[^ ]* '"${_SQ}"'.*'"${_SQ}"'$/s/^.*$/o="${o} &"/p
+# Replace encircled double quotes by single quotes and print the result
+s/^\(-[^ ]*\) "\(.*\)"$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
+# Encircle the remaining arguments with single quotes
+s/^\(-[^ ]*\) \(.*\)$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
+')"
+    if test _"${o}"_ != __
+    then
+      if test _"{GROFFER_OPT}"_ = __
+      then
+        GROFFER_OPT="${o}";
+      else
+        GROFFER_OPT="${o} ${GROFFER_OPT}";
+      fi;
+    fi;
+  fi;
+done;
+
+# integrate $GROFFER_OPT into the command line; it isn't needed any more
+if test _"${GROFFER_OPT}"_ != __
+then
+  eval set x "${GROFFER_OPT}" '"$@"';
+  shift;
+  GROFFER_OPT='';
+fi;
+
+
+########################### Determine the shell
+
+export _SHELL;
+
+# use "``" instead of "$()" for using the case ")" construct
+# do not use "" quotes because of ksh
+_SHELL=`
+  # $x means list.
+  # $s means shell.
+  # The command line arguments are taken over.
+  # Shifting herein does not have an effect outside.
+  export x;  
+  case " $*" in
+  *\ --sh*)			# abbreviation for --shell
+    x='';
+    s='';
+    # determine all --shell arguments, store them in $x in reverse order
+    while test $# != 0
+    do
+      case "$1" in
+      --shell|--sh|--she|--shel)
+        if test "$#" -ge 2
+        then
+          s="$2";
+          shift;
+        fi;
+        ;;
+      --shell=*|--sh=*|--she=*|--shel=*)
+        # delete up to first "=" character
+        s="$(echo x"$1" | sed -e 's/^x[^=]*=//')";
+        ;;
+      *)
+        shift;
+        continue;
+      esac;
+      if test _"${x}"_ = __
+      then
+        x="'${s}'";
+      else
+        x="'${s}' ${x}";
+      fi;
+      shift;
+    done;
+
+    # from all possible shells in $x determine the first being a shell
+    # or being empty
+    s="$(
+      # "" quotes because of posh
+      eval set x "${x}";
+      shift;
+      if test $# != 0
+      then
+        for i
+        do
+          if test _"$i"_ = __
+          then
+            # use the empty argument as the default shell
+            echo empty;
+            break;
+          else
+            # test $i on being a shell program;
+            # use this kind of quoting for posh
+            if test _"$(eval "$i -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2
+            then
+              # shell found
+              cat <${_NULL_DEV})"_ = _ok_ >&2
+    then
+      _SHELL="$s";
+      break;
+    fi;
+  done;
+fi;
+
+
+########################### start groffer2.sh
+
+if test _"${_SHELL}"_ = _empty_
+then
+  _SHELL='';
+fi;
+
+if test _"${_SHELL}"_ = __
+then
+  # no shell found, so start groffer2.sh normally
+  eval exec "'${_GROFFER2_SH}'" '"$@"';
+  exit;
+else
+  # start groffer2.sh with the found $_SHELL
+  # do not quote $_SHELL to allow arguments
+  eval exec "${_SHELL} '${_GROFFER2_SH}'" '"$@"';
+  exit;
+fi;
diff --git a/contrib/groffer/groffer2.sh b/contrib/groffer/groffer2.sh
new file mode 100644
index 0000000..60ca911
--- /dev/null
+++ b/contrib/groffer/groffer2.sh
@@ -0,0 +1,5854 @@
+#! /bin/sh
+
+# groffer - display groff files
+
+# Source file position: /contrib/groffer/groffer2.sh
+# Installed position: /lib/groff/groffer/groffer2.sh
+
+# This file should not be run independently.  It is called by
+# `groffer.sh' in the source or by the installed `groffer' program.
+
+# Copyright (C) 2001,2002,2003,2004,2005
+# Free Software Foundation, Inc.
+# Written by Bernd Warken
+
+# Last update: 22 August 2005
+
+# This file is part of `groffer', which is part of `groff'.
+
+# `groff' is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# `groff' 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 `groff'; see the files COPYING and LICENSE in the top
+# directory of the `groff' source.  If not, write to the Free Software
+# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+
+########################################################################
+#             Test of rudimentary shell functionality
+########################################################################
+
+
+########################################################################
+# Test of `unset'
+#
+export _UNSET;
+export _foo;
+_foo=bar;
+_res="$(unset _foo 2>&1)";
+if unset _foo >${_NULL_DEV} 2>&1 && \
+   test _"${_res}"_ = __ && test _"${_foo}"_ = __
+then
+  _UNSET='unset';
+  eval "${_UNSET}" _foo;
+  eval "${_UNSET}" _res;
+else
+  _UNSET=':';
+fi;
+
+
+########################################################################
+# Test of `test'.
+#
+if test a = a && test a != b && test -f "${_GROFFER_SH}"
+then
+  :;
+else
+  echo '"test" did not work.' >&2;
+  exit "${_ERROR}";
+fi;
+
+
+########################################################################
+# Test of `echo' and the `$()' construct.
+#
+if echo '' >${_NULL_DEV}
+then
+  :;
+else
+  echo '"echo" did not work.' >&2;
+  exit "${_ERROR}";
+fi;
+if test _"$(t1="$(echo te)" &&
+            t2="$(echo '')" &&
+            t3="$(echo 'st')" &&
+            echo "${t1}${t2}${t3}")"_ \
+     != _test_
+then
+  echo 'The "$()" construct did not work' >&2;
+  exit "${_ERROR}";
+fi;
+
+
+########################################################################
+# Test of sed program; test in groffer.sh is not valid here.
+#
+if test _"$(echo red | sed -e 's/r/s/')"_ != _sed_
+then
+  echo 'The sed program did not work.' >&2;
+  exit "${_ERROR}";
+fi;
+
+
+########################################################################
+# Test of function definitions.
+#
+_t_e_s_t_f_u_n_c_()
+{
+  return 0;
+}
+
+if _t_e_s_t_f_u_n_c_ 2>${_NULL_DEV}
+then
+  :;
+else
+  echo 'Shell '"${_SHELL}"' does not support function definitions.' >&2;
+  exit "${_ERROR}";
+fi;
+
+
+########################################################################
+#                    debug - diagnostic messages
+########################################################################
+
+export _DEBUG_STACKS;
+_DEBUG_STACKS='no';		# disable stack output in each function
+#_DEBUG_STACKS='yes';		# enable stack output in each function
+
+export _DEBUG_LM;
+_DEBUG_LM='no';			# disable landmark messages
+#_DEBUG_LM='yes';		# enable landmark messages
+
+export _DEBUG_KEEP_FILES;
+_DEBUG_KEEP_FILES='no'		# disable file keeping in temporary dir
+#_DEBUG_KEEP_FILES='yes'	# enable file keeping in temporary dir
+
+export _DEBUG_PRINT_PARAMS;
+_DEBUG_PRINT_PARAMS='no';	# disable printing of all parameters
+#_DEBUG_PRINT_PARAMS='yes';	# enable printing of all parameters
+
+export _DEBUG_PRINT_SHELL;
+_DEBUG_PRINT_SHELL='no';	# disable printing of the shell name
+#_DEBUG_PRINT_SHELL='yes';	# enable printing of the shell name
+
+export _DEBUG_PRINT_TMPDIR;
+_DEBUG_PRINT_TMPDIR='no';	# disable printing of the temporary dir
+#_DEBUG_PRINT_TMPDIR='yes';	# enable printing of the temporary dir
+
+export _DEBUG_USER_WITH_STACK;
+_DEBUG_USER_WITH_STACK='no';	# disable stack dump in error_user()
+#_DEBUG_USER_WITH_STACK='yes';	# enable stack dump in error_user()
+
+# determine all --debug* options
+case " $*" in
+*\ --debug*)
+  case " $* " in
+  *' --debug '*)
+    # _DEBUG_STACKS='yes';
+    # _DEBUG_LM='yes';
+    _DEBUG_KEEP_FILES='yes';
+    _DEBUG_PRINT_PARAMS='yes';
+    _DEBUG_PRINT_SHELL='yes';
+    _DEBUG_PRINT_TMPDIR='yes';
+    _DEBUG_USER_WITH_STACK='yes';
+    ;;
+  esac;
+  d=' --debug-all --debug-keep --debug-lm --debug-params --debug-shell '\
+'--debug-stacks --debug-tmpdir --debug-user ';
+  for i
+  do
+    case "$i" in
+    --debug-s)
+      echo 'The abbreviation --debug-s has multiple options: '\
+'--debug-shell and --debug-stacks.' >&2
+      exit "${_ERROR}";
+      ;;
+    esac;
+    case "$d" in
+    *\ ${i}*)
+      # extract whole word of abbreviation $i
+      s="$(cat <&2;
+fi;
+
+if test _"${_DEBUG_PRINT_SHELL}"_ = _yes_
+then
+  if test _"${_SHELL}"_ = __
+  then
+    if test _"${POSIXLY_CORRECT}"_ = _y_
+    then
+      echo 'shell: bash as /bin/sh (none specified)' >&2;
+    else
+      echo 'shell: /bin/sh (none specified)' >&2;
+    fi;
+  else
+    echo "shell: ${_SHELL}" >&2;
+  fi;
+fi;
+
+
+########################################################################
+#                       Environment Variables
+########################################################################
+
+# Environment variables that exist only for this file start with an
+# underscore letter.  Global variables to this file are written in
+# upper case letters, e.g. $_GLOBAL_VARIABLE; temporary variables
+# start with an underline and use only lower case letters and
+# underlines, e.g.  $_local_variable .
+
+#   [A-Z]*     system variables,      e.g. $MANPATH
+#   _[A-Z_]*   global file variables, e.g. $_MAN_PATH
+#   _[a-z_]*   temporary variables,   e.g. $_manpath
+
+# Due to incompatibilities of the `ash' shell, the name of loop
+# variables in `for' must be single character
+#   [a-z]      local loop variables,   e.g. $i
+
+
+########################################################################
+# read-only variables (global to this file)
+########################################################################
+
+# function return values; `0' means ok; other values are error codes
+export _ALL_EXIT;
+export _BAD;
+export _GOOD;
+export _NO;
+export _OK;
+export _YES;
+
+_GOOD='0';			# return ok
+_BAD='1';			# return negatively, error code `1'
+# $_ERROR was already defined as `7' in groffer.sh.
+
+_NO="${_BAD}";
+_YES="${_GOOD}";
+_OK="${_GOOD}";
+
+# quasi-functions, call with `eval', e.g `eval "${return_ok}"'
+export return_ok;
+export return_good;
+export return_bad;
+export return_yes;
+export return_no;
+export return_error;
+export return_var;
+return_ok="func_pop; return ${_OK}";
+return_good="func_pop; return ${_GOOD}";
+return_bad="func_pop; return ${_BAD}";
+return_yes="func_pop; return ${_YES}";
+return_no="func_pop; return ${_NO}";
+return_error="func_pop; return ${_ERROR}";
+return_var="func_pop; return";	# add number, e.g. `eval "${return_var} $n'
+
+
+export _DEFAULT_MODES;
+_DEFAULT_MODES='x,ps,tty';
+export _DEFAULT_RESOLUTION;
+_DEFAULT_RESOLUTION='75';
+
+export _DEFAULT_TTY_DEVICE;
+_DEFAULT_TTY_DEVICE='latin1';
+
+# _VIEWER_* viewer programs for different modes (only X is necessary)
+# _VIEWER_* a comma-separated list of viewer programs (with options)
+export _VIEWER_DVI;		# viewer program for dvi mode
+export _VIEWER_HTML_TTY;	# viewer program for html mode in tty
+export _VIEWER_HTML_X;		# viewer program for html mode in X
+export _VIEWER_PDF;		# viewer program for pdf mode
+export _VIEWER_PS;		# viewer program for ps mode
+export _VIEWER_X;		# viewer program for X mode
+_VIEWER_DVI='kdvi,xdvi,dvilx';
+_VIEWER_HTML_TTY='lynx';
+_VIEWER_HTML_X='konqueror,mozilla,netscape,galeon,opera,amaya,arena';
+_VIEWER_PDF='kghostview --scale 1.45,ggv,xpdf,acroread,kpdf';
+_VIEWER_PS='kghostview --scale 1.45,ggv,gv,ghostview,gs_x11,gs';
+_VIEWER_X='gxditview,xditview';
+
+# Search automatically in standard sections `1' to `8', and in the
+# traditional sections `9', `n', and `o'.  On many systems, there
+# exist even more sections, mostly containing a set of man pages
+# special to a specific program package.  These aren't searched for
+# automatically, but must be specified on the command line.
+export _MAN_AUTO_SEC_LIST;
+_MAN_AUTO_SEC_LIST="'1' '2' '3' '4' '5' '6' '7' '8' '9' 'n' 'o'";
+export _MAN_AUTO_SEC_CHARS;
+_MAN_AUTO_SEC_CHARS='[123456789no]';
+
+export _SPACE_SED;
+_SPACE_SED='['"${_SP}${_TAB}"']';
+
+export _SPACE_CASE;
+_SPACE_CASE='[\'"${_SP}"'\'"${_TAB}"']';
+
+export _PROCESS_ID;		# for shutting down the program
+_PROCESS_ID="$$";
+
+
+############ the command line options of the involved programs
+#
+# The naming scheme for the options environment names is
+# $_OPTS__[_]
+#
+# :    program name GROFFER, GROFF, or CMDLINE (for all
+#            command line options)
+# :  LONG (long options) or SHORT (single character options)
+# : ARG for options with argument, NA for no argument;
+#            without _ both the ones with and without arg.
+#
+# Each option that takes an argument must be specified with a
+# trailing : (colon).
+
+# exports
+export _OPTS_GROFFER_SHORT_NA;
+export _OPTS_GROFFER_SHORT_ARG;
+export _OPTS_GROFFER_LONG_NA;
+export _OPTS_GROFFER_LONG_ARG;
+export _OPTS_GROFF_SHORT_NA;
+export _OPTS_GROFF_SHORT_ARG;
+export _OPTS_GROFF_LONG_NA;
+export _OPTS_GROFF_LONG_ARG;
+export _OPTS_X_SHORT_ARG;
+export _OPTS_X_SHORT_NA;
+export _OPTS_X_LONG_ARG;
+export _OPTS_X_LONG_NA;
+export _OPTS_MAN_SHORT_ARG;
+export _OPTS_MAN_SHORT_NA;
+export _OPTS_MAN_LONG_ARG;
+export _OPTS_MAN_LONG_NA;
+export _OPTS_MANOPT_SHORT_ARG;
+export _OPTS_MANOPT_SHORT_NA;
+export _OPTS_MANOPT_LONG_ARG;
+export _OPTS_MANOPT_LONG_NA;
+export _OPTS_CMDLINE_SHORT_NA;
+export _OPTS_CMDLINE_SHORT_ARG;
+export _OPTS_CMDLINE_LONG_NA;
+export _OPTS_CMDLINE_LONG_ARG;
+
+###### groffer native options
+
+_OPTS_GROFFER_SHORT_NA="'h' 'Q' 'v' 'V' 'X' 'Z'";
+_OPTS_GROFFER_SHORT_ARG="'T'";
+
+_OPTS_GROFFER_LONG_NA="'auto' \
+'apropos' 'apropos-data' 'apropos-devel' 'apropos-progs' \
+'debug' 'debug-all' 'debug-keep' 'debug-lm' 'debug-params' 'debug-shell' \
+'debug-stacks' 'debug-tmpdir' 'debug-user' 'default' 'do-nothing' 'dvi' \
+'groff' 'help' 'intermediate-output' 'html' 'man' \
+'no-location' 'no-man' 'no-special' 'pdf' 'ps' 'rv' 'source' \
+'text' 'text-device' \
+'tty' 'tty-device' 'version' 'whatis' 'where' 'www' 'x' 'X'";
+
+_OPTS_GROFFER_LONG_ARG="\
+'default-modes' 'device' 'dvi-viewer' 'dvi-viewer-tty' 'extension' 'fg' \
+'fn' 'font' 'foreground' 'html-viewer' 'html-viewer-tty' 'mode' \
+'pdf-viewer' 'pdf-viewer-tty' 'print' 'ps-viewer' 'ps-viewer-tty' 'shell' \
+'title' 'tty-viewer' 'tty-viewer-tty' 'www-viewer' 'www-viewer-tty' \
+'x-viewer' 'x-viewer-tty' 'X-viewer' 'X-viewer-tty'";
+
+##### groffer options inhereted from groff
+
+_OPTS_GROFF_SHORT_NA="'a' 'b' 'c' 'C' 'e' 'E' 'g' 'G' 'i' 'l' 'N' 'p' \
+'R' 's' 'S' 't' 'U' 'z'";
+_OPTS_GROFF_SHORT_ARG="'d' 'f' 'F' 'I' 'L' 'm' 'M' 'n' 'o' 'P' 'r' \
+'w' 'W'";
+_OPTS_GROFF_LONG_NA="";
+_OPTS_GROFF_LONG_ARG="";
+
+##### groffer options inhereted from the X Window toolkit
+
+_OPTS_X_SHORT_NA="";
+_OPTS_X_SHORT_ARG="";
+
+_OPTS_X_LONG_NA="'iconic' 'rv'";
+
+_OPTS_X_LONG_ARG="'background' 'bd' 'bg' 'bordercolor' 'borderwidth' \
+'bw' 'display' 'fg' 'fn' 'font' 'foreground' 'ft' 'geometry' \
+'resolution' 'title' 'xrm'";
+
+###### groffer options inherited from man
+
+_OPTS_MAN_SHORT_NA="";
+_OPTS_MAN_SHORT_ARG="";
+
+_OPTS_MAN_LONG_NA="'all' 'ascii' 'catman' 'ditroff' \
+'local-file' 'location' 'troff' 'update'";
+
+_OPTS_MAN_LONG_ARG="'locale' 'manpath' \
+'pager' 'preprocessor' 'prompt' 'sections' 'systems' 'troff-device'";
+
+###### additional options for parsing $MANOPT only
+
+_OPTS_MANOPT_SHORT_NA="'7' 'a' 'c' 'd' 'D' 'f' 'h' 'k' 'l' 't' 'u' \
+'V' 'w' 'Z'";
+_OPTS_MANOPT_SHORT_ARG="'e' 'L' 'm' 'M' 'p' 'P' 'r' 'S' 'T'";
+
+_OPTS_MANOPT_LONG_NA="${_OPTS_MAN_LONG_NA} \
+'apropos' 'debug' 'default' 'help' 'html' 'ignore-case' 'location-cat' \
+'match-case' 'troff' 'update' 'version' 'whatis' 'where' 'where-cat'";
+
+_OPTS_MANOPT_LONG_ARG="${_OPTS_MAN_LONG_NA} \
+'config_file' 'encoding' 'extension' 'locale'";
+
+###### collections of command line options
+
+_OPTS_CMDLINE_SHORT_NA="${_OPTS_GROFFER_SHORT_NA} \
+${_OPTS_GROFF_SHORT_NA} ${_OPTS_X_SHORT_NA} ${_OPTS_MAN_SHORT_NA}";
+_OPTS_CMDLINE_SHORT_ARG="${_OPTS_GROFFER_SHORT_ARG} \
+${_OPTS_GROFF_SHORT_ARG} ${_OPTS_X_SHORT_ARG} ${_OPTS_MAN_SHORT_ARG}";
+
+_OPTS_CMDLINE_LONG_NA="${_OPTS_GROFFER_LONG_NA} \
+${_OPTS_GROFF_LONG_NA} ${_OPTS_X_LONG_NA} ${_OPTS_MAN_LONG_NA}";
+_OPTS_CMDLINE_LONG_ARG="${_OPTS_GROFFER_LONG_ARG} \
+${_OPTS_GROFF_LONG_ARG} ${_OPTS_MAN_LONG_ARG} ${_OPTS_X_LONG_ARG}";
+
+
+########################################################################
+# read-write variables (global to this file)
+########################################################################
+
+export _ALL_PARAMS;		# All options and file name parameters
+export _ADDOPTS_GROFF;		# Transp. options for groff (`eval').
+export _ADDOPTS_POST;		# Transp. options postproc (`eval').
+export _ADDOPTS_X;		# Transp. options X postproc (`eval').
+export _APROPOS_PROG;		# Program to run apropos.
+export _APROPOS_SECTIONS;	# Sections for different --apropos-*.
+export _DEFAULT_MODES;		# Set default modes.
+export _DISPLAY_MODE;		# Display mode.
+export _DISPLAY_PROG;		# Viewer program to be used for display.
+export _DISPLAY_ARGS;		# X resources for the viewer program.
+export _FILEARGS;		# Stores filespec parameters.
+export _FILESPEC_ARG;		# Stores the actual filespec parameter.
+export _FUNC_STACK;		# Store debugging information.
+export _REGISTERED_TITLE;	# Processed file names.
+# _HAS_* from availability tests
+export _HAS_COMPRESSION;	# `yes' if gzip compression is available
+export _HAS_BZIP;		# `yes' if bzip2 compression is available
+# _MAN_* finally used configuration of man searching
+export _MAN_ALL;		# search all man pages per filespec
+export _MAN_ENABLE;		# enable search for man pages
+export _MAN_EXT;		# extension for man pages
+export _MAN_FORCE;		# force file parameter to be man pages
+export _MAN_IS_SETUP;		# setup man variables only once
+export _MAN_LANG;		# language for man pages
+export _MAN_LANG2;		# language for man pages
+export _MAN_LANG_DONE;		# language dirs added to man path
+export _MAN_PATH;		# search path for man pages
+export _MAN_SEC;		# sections for man pages; sep. `:'
+export _MAN_SEC_DONE;		# sections added to man path
+export _MAN_SYS;		# system names for man pages; sep. `,'
+export _MAN_SYS;		# system names added to man path
+# _MANOPT_* as parsed from $MANOPT
+export _MANOPT_ALL;		# $MANOPT --all
+export _MANOPT_EXTENSION;	# $MANOPT --extension
+export _MANOPT_LANG;		# $MANOPT --locale
+export _MANOPT_PATH;		# $MANOPT --manpath
+export _MANOPT_PAGER;		# $MANOPT --pager
+export _MANOPT_SEC;		# $MANOPT --sections
+export _MANOPT_SYS;		# $MANOPT --systems
+# _OPT_* as parsed from groffer command line
+export _OPT_ALL;		# display all suitable man pages.
+export _OPT_APROPOS;		# call `apropos' program.
+export _OPT_BD;			# set border color in some modes.
+export _OPT_BG;			# set background color in some modes.
+export _OPT_BW;			# set border width in some modes.
+export _OPT_DEFAULT_MODES;	# `,'-list of modes when no mode given.
+export _OPT_DEVICE;		# device option.
+export _OPT_DO_NOTHING;		# do nothing in main_display().
+export _OPT_DISPLAY;		# set X display.
+export _OPT_FG;			# set foreground color in some modes.
+export _OPT_FN;			# set font in some modes.
+export _OPT_GEOMETRY;		# set size and position of viewer in X.
+export _OPT_ICONIC;		# -iconic option for X viewers.
+export _OPT_LANG;		# set language for man pages
+export _OPT_LOCATION;		# print processed file names to stderr
+export _OPT_MODE;		# values: X, tty, Q, Z, ""
+export _OPT_MANPATH;		# manual setting of path for man-pages
+export _OPT_PAGER;		# specify paging program for tty mode
+export _OPT_RESOLUTION;		# set X resolution in dpi
+export _OPT_RV;			# reverse fore- and background colors.
+export _OPT_SECTIONS;		# sections for man page search
+export _OPT_SYSTEMS;		# man pages of different OS's
+export _OPT_TITLE;		# title for gxditview window
+export _OPT_TEXT_DEVICE;	# set device for tty mode.
+export _OPT_V;			# groff option -V.
+export _OPT_VIEWER_DVI;		# viewer program for dvi mode
+export _OPT_VIEWER_PDF;		# viewer program for pdf mode
+export _OPT_VIEWER_PS;		# viewer program for ps mode
+export _OPT_VIEWER_HTML;	# viewer program for html mode
+export _OPT_VIEWER_X;		# viewer program for x mode
+export _OPT_WHATIS;		# print the man description
+export _OPT_XRM;		# specify X resource.
+export _OPT_Z;			# groff option -Z.
+export _OUTPUT_FILE_NAME;	# output generated, see main_set_res..()
+export _VIEWER_TERMINAL;	# viewer options for terminal (--*-viewer-tty)
+# _TMP_* temporary directory and files
+export _TMP_DIR;		# groffer directory for temporary files
+export _TMP_CAT;		# stores concatenation of everything
+export _TMP_STDIN;		# stores stdin, if any
+
+# these variables are preset in section `Preset' after the rudim. test
+
+
+########################################################################
+# Preset and reset of read-write global variables
+########################################################################
+
+
+export _START_DIR;		# directory at start time of the script
+_START_DIR="$(pwd)";
+
+# For variables that can be reset by option `--default', see reset().
+
+_FILEARGS='';
+
+# _HAS_* from availability tests
+_HAS_COMPRESSION='';
+_HAS_BZIP='';
+
+# _TMP_* temporary files
+_TMP_DIR='';
+_TMP_CAT='';
+_TMP_CONF='';
+_TMP_STDIN='';
+
+
+########################################################################
+# reset ()
+#
+# Reset the variables that can be affected by options to their default.
+#
+reset()
+{
+  if test "$#" -ne 0
+  then
+    error "reset() does not have arguments.";
+  fi;
+
+  _ADDOPTS_GROFF='';
+  _ADDOPTS_POST='';
+  _ADDOPTS_X='';
+  _APROPOS_PROG='';
+  _APROPOS_SECTIONS='';
+  _DISPLAY_ARGS='';
+  _DISPLAY_MODE='';
+  _DISPLAY_PROG='';
+  _REGISTERED_TITLE='';
+
+  # _MAN_* finally used configuration of man searching
+  _MAN_ALL='no';
+  _MAN_ENABLE='yes';		# do search for man-pages
+  _MAN_EXT='';
+  _MAN_FORCE='no';		# first local file, then search man page
+  _MAN_IS_SETUP='no';
+  _MAN_LANG='';
+  _MAN_LANG2='';
+  _MAN_PATH='';
+  _MAN_SEC='';
+  _MAN_SEC_DONE='no';
+  _MAN_SYS='';
+  _MAN_SYS_DONE='no';
+
+  # _MANOPT_* as parsed from $MANOPT
+  _MANOPT_ALL='no';
+  _MANOPT_EXTENSION='';
+  _MANOPT_LANG='';
+  _MANOPT_PATH='';
+  _MANOPT_PAGER='';
+  _MANOPT_SEC='';
+  _MANOPT_SYS='';
+
+  # _OPT_* as parsed from groffer command line
+  _OPT_ALL='no';
+  _OPT_APROPOS='no';
+  _OPT_BD='';
+  _OPT_BG='';
+  _OPT_BW='';
+  _OPT_DEFAULT_MODES='';
+  _OPT_DEVICE='';
+  _OPT_DISPLAY='';
+  _OPT_DO_NOTHING='no';
+  _OPT_FG='';
+  _OPT_FN='';
+  _OPT_GEOMETRY='';
+  _OPT_ICONIC='no';
+  _OPT_LANG='';
+  _OPT_LOCATION='no';
+  _OPT_MODE='';
+  _OPT_MANPATH='';
+  _OPT_PAGER='';
+  _OPT_RESOLUTION='';
+  _OPT_RV='no';
+  _OPT_SECTIONS='';
+  _OPT_SYSTEMS='';
+  _OPT_TITLE='';
+  _OPT_TEXT_DEVICE='';
+  _OPT_V='no';
+  _OPT_VIEWER_DVI='';
+  _OPT_VIEWER_PDF='';
+  _OPT_VIEWER_PS='';
+  _OPT_VIEWER_HTML='';
+  _OPT_VIEWER_X='';
+  _OPT_WHATIS='no';
+  _OPT_XRM='';
+  _OPT_Z='no';
+  _VIEWER_TERMINAL='no';
+}
+
+reset;
+
+
+########################################################################
+#          Functions for error handling and debugging
+########################################################################
+
+
+##############
+# echo1 (*)
+#
+# Output to stdout.
+#
+# Arguments : arbitrary text including `-'.
+#
+echo1()
+{
+  cat <*)
+#
+# Output to stderr.
+#
+# Arguments : arbitrary text.
+#
+echo2()
+{
+  cat >&2 <)
+#
+# Print  to standard error as a debugging aid.
+#
+# Globals: $_DEBUG_LM
+#
+landmark()
+{
+  if test _"${_DEBUG_LM}"_ = _yes_
+  then
+    echo2 "LM: $*";
+  fi;
+}
+
+landmark "1: debugging functions";
+
+
+##############
+# clean_up ()
+#
+# Clean up at exit.
+#
+clean_up()
+{
+  cd "${_START_DIR}" >"${_NULL_DEV}" 2>&1;
+  if test _${_DEBUG_KEEP_FILES}_ = _yes_
+  then
+    echo2 "Kept temporary directory ${_TMP_DIR}."
+  else
+    if test _"${_TMP_DIR}"_ != __
+    then
+      if test -d "${_TMP_DIR}" || test -f "${_TMP_DIR}"
+      then
+        rm -f -r "${_TMP_DIR}" >${_NULL_DEV} 2>&1;
+      fi; 
+    fi;
+  fi;
+}
+
+
+#############
+# diag (text>*)
+#
+# Output a diagnostic message to stderr
+#
+diag()
+{
+  echo2 '>>>>>'"$*";
+}
+
+
+#############
+# error (*)
+#
+# Print an error message to standard error, print the function stack,
+# exit with an error condition.  The argument should contain the name
+# of the function from which it was called.  This is for system errors.
+#
+error()
+{
+  case "$#" in
+    1) echo2 'groffer error: '"$1"; ;;
+    *) echo2 'groffer error: wrong number of arguments in error().'; ;;
+  esac;
+  func_stack_dump;
+  if test _"${_TMP_DIR}"_ != __ && test -d "${_TMP_DIR}"
+  then
+    : >"${_TMP_DIR}"/,error;
+  fi;
+  exit "${_ERROR}";
+}
+
+
+#############
+# error_user (*)
+#
+# Print an error message to standard error; exit with an error condition.
+# The error is supposed to be produce by the user.  So the funtion stack
+# is omitted.
+#
+error_user()
+{
+  case "$#" in
+    1)
+      echo2 'groffer error: '"$1";
+       ;;
+    *)
+      echo2 'groffer error: wrong number of arguments in error_user().';
+      ;;
+  esac;
+  if test _"${_DEBUG_USER_WITH_STACK}"_ = _yes_
+  then
+    func_stack_dump;
+  fi;
+  if test _"${_TMP_DIR}"_ != __ && test -d "${_TMP_DIR}"
+  then
+    : >"${_TMP_DIR}"/,error;
+  fi;
+  exit "${_ERROR}";
+}
+
+
+#############
+# exit_test ()
+#
+# Test whether the former command ended with error().  Exit again.
+#
+# Globals: $_ERROR
+#
+exit_test()
+{
+  if test "$?" = "${_ERROR}"
+  then
+    exit ${_ERROR};
+  fi;
+  if test _"${_TMP_DIR}"_ != __ && test -f "${_TMP_DIR}"/,error
+  then
+    exit ${_ERROR};
+  fi;
+}
+
+
+#############
+# func_check (   "$@")
+#
+# Check number of arguments and register to _FUNC_STACK.
+#
+# Arguments: >=3
+#   : name of the calling function.
+#   :    a relational operator: = != < > <= >=
+#   :   number of arguments to be checked against 
+#   "$@":        the arguments of the calling function.
+#
+# Variable prefix: fc
+#
+func_check()
+{
+  if test "$#" -lt 3
+  then
+    error 'func_check() needs at least 3 arguments.';
+  fi;
+  fc_fname="$1";
+  case "$3" in
+    1)
+      fc_nargs="$3";
+      fc_s='';
+      ;;
+    0|[2-9])
+      fc_nargs="$3";
+      fc_s='s';
+      ;;
+    *)
+      error "func_check(): third argument must be a digit.";
+      ;;
+  esac;
+  case "$2" in
+    '='|'-eq')
+      fc_op='-eq';
+      fc_comp='exactly';
+      ;;
+    '>='|'-ge')
+      fc_op='-ge';
+      fc_comp='at least';
+      ;;
+    '<='|'-le')
+      fc_op='-le';
+      fc_comp='at most';
+      ;;
+    '<'|'-lt')
+      fc_op='-lt';
+      fc_comp='less than';
+      ;;
+    '>'|'-gt')
+      fc_op='-gt';
+      fc_comp='more than';
+      ;;
+    '!='|'-ne')
+      fc_op='-ne';
+      fc_comp='not';
+      ;;
+    *)
+      error \
+        'func_check(): second argument is not a relational operator.';
+      ;;
+  esac;
+  shift;
+  shift;
+  shift;
+  if test "$#" "${fc_op}" "${fc_nargs}"
+  then
+    do_nothing;
+  else
+    error "func_check(): \
+${fc_fname}"'() needs '"${fc_comp} ${fc_nargs}"' argument'"${fc_s}"'.';
+  fi;
+  func_push "${fc_fname}";
+  if test _"${_DEBUG_STACKS}"_ = _yes_
+  then
+    echo2 '+++ '"${fc_fname} $@";
+    echo2 '>>> '"${_FUNC_STACK}";
+  fi;
+  eval ${_UNSET} fc_comp;
+  eval ${_UNSET} fc_fname;
+  eval ${_UNSET} fc_nargs;
+  eval ${_UNSET} fc_op;
+  eval ${_UNSET} fc_s;
+}
+
+
+#############
+# func_pop ()
+#
+# Retrieve the top element from the stack.
+#
+# The stack elements are separated by `!'; the popped element is
+# identical to the original element, except that all `!' characters
+# were removed.
+#
+# Arguments: 1
+#
+func_pop()
+{
+  if test "$#" -ne 0
+  then
+    error 'func_pop() does not have arguments.';
+  fi;
+  case "${_FUNC_STACK}" in
+  '')
+    if test _"${_DEBUG_STACKS}"_ = _yes_
+    then
+      error 'func_pop(): stack is empty.';
+    fi;
+    ;;
+  *!*)
+    # split at first bang `!'.
+    _FUNC_STACK="$(echo1 "${_FUNC_STACK}" | sed -e 's/^[^!]*!//')";
+    exit_test;
+    ;;
+  *)
+    _FUNC_STACK='';
+    ;;
+  esac;
+  if test _"${_DEBUG_STACKS}"_ = _yes_
+  then
+    echo2 '<<< '"${_FUNC_STACK}";
+  fi;
+}
+
+
+#############
+# func_push ()
+#
+# Store another element to stack.
+#
+# The stack elements are separated by `!'; if  contains a `!'
+# it is removed first.
+#
+# Arguments: 1
+#
+# Variable prefix: fp
+#
+func_push()
+{
+  if test "$#" -ne 1
+  then
+    error 'func_push() needs 1 argument.';
+  fi;
+  case "$1" in
+  *'!'*)
+    # remove all bangs `!'.
+    fp_element="$(echo1 "$1" | sed -e 's/!//g')";
+    exit_test;
+    ;;
+  *)
+    fp_element="$1";
+    ;;
+  esac;
+  if test _"${_FUNC_STACK}"_ = __
+  then
+    _FUNC_STACK="${fp_element}";
+  else
+    _FUNC_STACK="${fp_element}!${_FUNC_STACK}";
+  fi;
+  eval ${_UNSET} fp_element;
+}
+
+
+#############
+# func_stack_dump ()
+#
+# Print the content of the stack.  Ignore the arguments.
+#
+func_stack_dump()
+{
+  diag 'call stack: '"${_FUNC_STACK}";
+}
+
+
+########################################################################
+#                        System Test
+########################################################################
+
+landmark "2: system test";
+
+# Test the availability of the system utilities used in this script.
+
+
+########################################################################
+# Test of function `sed'.
+#
+
+if test _"$(echo xTesTx \
+           | sed -e 's/^.\([Tt]e*x*sTT*\).*$/\1/' \
+           | sed -e 's|T|t|g')"_ != _test_
+then
+  error 'Test of "sed" command failed.';
+fi;
+
+
+########################################################################
+# Test of function `cat'.
+#
+if test _"$(echo test | cat)"_ != _test_
+then
+  error 'Test of "cat" command failed.';
+fi;
+
+
+########################################################################
+# Test for compression.
+#
+if test _"$(echo 'test' | gzip -c -d -f - 2>${_NULL_DEV})"_ = _test_
+then
+  _HAS_COMPRESSION='yes';
+  if echo1 'test' | bzip2 -c 2>${_NULL_DEV} | bzip2 -t 2>${_NULL_DEV} \
+     && test _"$(echo 'test' | bzip2 -c 2>${_NULL_DEV} \
+                             | bzip2 -d -c 2>${_NULL_DEV})"_ \
+             = _test_
+  then
+    _HAS_BZIP='yes';
+  else
+    _HAS_BZIP='no';
+  fi;
+else
+  _HAS_COMPRESSION='no';
+  _HAS_BZIP='no';
+fi;
+
+
+########################################################################
+#       Definition of normal Functions in alphabetical order
+########################################################################
+landmark "3: functions";
+
+########################################################################
+# apropos_filespec ()
+#
+# Setup for the --apropos* options
+#
+apropos_filespec()
+{
+
+  func_check apropos_filespec '=' 0 "$@";
+  if obj _OPT_APROPOS is_yes
+  then
+    eval to_tmp_line \
+      "'.SH $(echo1 "${_FILESPEC_ARG}" | sed 's/[^\\]-/\\-/g')'";
+    exit_test;
+    if obj _APROPOS_PROG is_empty
+    then
+      error 'apropos_filespec: apropos_setup() must be run first.';
+    fi;
+    if obj _APROPOS_SECTIONS is_empty
+    then
+      if obj _OPT_SECTIONS is_empty
+      then
+        s='^.*(.*).*$';
+      else
+        s='^.*(['"$(echo1 "${_OPT_SECTIONS}" | sed -e 's/://g')"']';
+      fi;
+    else
+      s='^.*(['"${_APROPOS_SECTIONS}"']';
+    fi;
+    eval "${_APROPOS_PROG}" "'${_FILESPEC_ARG}'" | \
+      sed -n -e '
+/^'"${_FILESPEC_ARG}"': /p
+/'"$s"'/p
+' | \
+      sort |\
+      sed -e '
+s/^\(.* (..*)\)  *-  *\(.*\)$/\.br\n\.TP 15\n\.BR \1\n\2/
+' >>"${_TMP_CAT}";
+  fi;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# apropos_setup ()
+#
+# Setup for the --apropos* options
+#
+apropos_setup()
+{
+  func_check apropos_setup '=' 0 "$@";
+  if obj _OPT_APROPOS is_yes
+  then
+    if is_prog apropos
+    then
+      _APROPOS_PROG='apropos';
+    elif is_prog man
+    then
+      if man --apropos man >${_NULL_DEV} 2>${_NULL_DEV}
+      then
+        _APROPOS_PROG='man --apropos';
+      elif man -k man >${_NULL_DEV} 2>${_NULL_DEV}
+      then
+        _APROPOS_PROG='man -k';
+      fi;
+    fi;
+    if obj _APROPOS_PROG is_empty
+    then
+      error 'apropos_setup: no apropos program available.';
+    fi;
+    to_tmp_line '.TH GROFFER APROPOS';
+  fi;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# base_name ()
+#
+# Get the file name part of , i.e. delete everything up to last
+# `/' from the beginning of .  Remove final slashes, too, to get a
+# non-empty output.
+#
+# Arguments : 1
+# Output    : the file name part (without slashes)
+#
+# Variable prefix: bn
+#
+base_name()
+{
+  func_check base_name = 1 "$@";
+  bn_name="$1";
+  case "${bn_name}" in
+    */)
+      # delete all final slashes
+      bn_name="$(echo1 "${bn_name}" | sed -e 's|//*$||')";
+      exit_test;
+      ;;
+  esac;
+  case "${bn_name}" in
+    /|'')
+      eval ${_UNSET} bn_name;
+      eval "${return_bad}";
+      ;;
+    */*)
+      # delete everything before and including the last slash `/'.
+      echo1 "${bn_name}" | sed -e 's|^.*//*\([^/]*\)$|\1|';
+      ;;
+    *)
+      obj bn_name echo1;
+      ;;
+  esac;
+  eval ${_UNSET} bn_name;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# cat_z ()
+#
+# Decompress if possible or just print  to standard output.
+#
+# gzip, bzip2, and .Z decompression is supported.
+#
+# Arguments: 1, a file name.
+# Output: the content of , possibly decompressed.
+#
+if test _"${_HAS_COMPRESSION}"_ = _yes_
+then
+  cat_z()
+  {
+    func_check cat_z = 1 "$@";
+    case "$1" in
+      '')
+        error 'cat_z(): empty file name';
+        ;;
+      '-')
+        error 'cat_z(): for standard input use save_stdin()';
+        ;;
+    esac;
+    if obj _HAS_BZIP is_yes
+    then
+      if bzip2 -t "$1" 2>${_NULL_DEV}
+      then
+        bzip2 -c -d "$1" 2>${_NULL_DEV};
+        eval "${return_ok}";
+      fi;
+    fi;
+    gzip -c -d -f "$1" 2>${_NULL_DEV};
+    eval "${return_ok}";
+  }
+else
+  cat_z()
+  {
+    func_check cat_z = 1 "$@";
+    cat "$1";
+    eval "${return_ok}";
+  }
+fi;
+
+
+########################################################################
+# clean_up ()
+#
+# Do the final cleaning up before exiting; used by the trap calls.
+#
+# defined above
+
+
+########################################################################
+# diag (*)
+#
+# Print marked message to standard error; useful for debugging.
+#
+# defined above
+
+
+########################################################################
+landmark '4: dirname()*';
+########################################################################
+
+#######################################################################
+# dirname_append ( )
+#
+# Append `name' to `dir' with clean handling of `/'.
+#
+# Arguments : 2
+# Output    : the generated new directory name /
+#
+dirname_append()
+{
+  func_check dirname_append = 2 "$@";
+  if is_empty "$1"
+  then
+    error "dir_append(): first argument is empty.";
+  fi;
+  if is_empty "$2"
+  then
+    echo1 "$1";
+  else
+    dirname_chop "$1"/"$2";
+  fi;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# dirname_chop ()
+#
+# Remove unnecessary slashes from directory name.
+#
+# Argument: 1, a directory name.
+# Output:   path without double, or trailing slashes.
+#
+# Variable prefix: dc
+#
+dirname_chop()
+{
+  func_check dirname_chop = 1 "$@";
+  # replace all multiple slashes by a single slash `/'.
+  dc_res="$(echo1 "$1" | sed -e 's|///*|/|g')";
+  exit_test;
+  case "${dc_res}" in
+  ?*/)
+    # remove trailing slash '/';
+    echo1 "${dc_res}" | sed -e 's|/$||';
+    ;;
+  *)
+    obj dc_res echo1
+    ;;
+  esac;
+  eval ${_UNSET} dc_res;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# do_filearg ()
+#
+# Append the file, man-page, or standard input corresponding to the
+# argument to the temporary file.  If this is compressed in the gzip
+# or Z format it is decompressed.  A title element is generated.
+#
+# Argument either:
+#   - name of an existing file.
+#   - `-' to represent standard input (several times allowed).
+#   - `man:name.(section)' the man-page for `name' in `section'.
+#   - `man:name.section' the man-page for `name' in `section'.
+#   - `man:name' the man-page for `name' in the lowest `section'.
+#   - `name.section' the man-page for `name' in `section'.
+#   - `name' the man-page for `name' in the lowest `section'.
+# Globals :
+#   $_TMP_STDIN, $_MAN_ENABLE, $_MAN_IS_SETUP, $_OPT_MAN
+#
+# Output  : none
+# Return  : $_GOOD if found, ${_BAD} otherwise.
+#
+# Variable prefix: df
+#
+do_filearg()
+{
+  func_check do_filearg = 1 "$@";
+  df_filespec="$1";
+  # store sequence into positional parameters
+  case "${df_filespec}" in
+  '')
+    eval ${_UNSET} df_filespec;
+    eval "${return_good}";
+    ;;
+  '-')
+    register_file '-';
+    eval ${_UNSET} df_filespec;
+    eval "${return_good}";
+    ;;
+  */*)			       # with directory part; so no man search
+    set 'File';
+    ;;
+  *)
+    if obj _MAN_ENABLE is_yes
+    then
+      if obj _MAN_FORCE is_yes
+      then
+        set 'Manpage' 'File';
+      else
+        set 'File' 'Manpage';
+      fi;
+      else
+      set 'File';
+    fi;
+    ;;
+  esac;
+  for i
+  do
+    case "$i" in
+    File)
+      if test -f "${df_filespec}"
+      then
+        if test -r "${df_filespec}"
+        then
+          register_file "${df_filespec}";
+          eval ${_UNSET} df_filespec;
+          eval ${_UNSET} df_no_man;
+          eval "${return_good}";
+        else
+          echo2 "could not read \`${df_filespec}'";
+          eval ${_UNSET} df_filespec;
+          eval ${_UNSET} df_no_man;
+          eval "${return_bad}";
+        fi;
+      else
+        if obj df_no_man is_not_empty
+        then
+          if obj _OPT_WHATIS is_yes
+          then
+            to_tmp_line "This is neither a file nor a man page."
+          else
+            echo2 "\`${df_filespec}' is neither a file nor a man page."
+          fi;
+        fi;
+        df_no_file=yes;
+        continue;
+      fi;
+      ;;
+    Manpage)			# parse filespec as man page
+      if obj _MAN_IS_SETUP is_not_yes
+      then
+        man_setup;
+      fi;
+      if man_do_filespec "${df_filespec}"
+      then
+        eval ${_UNSET} df_filespec;
+        eval ${_UNSET} df_no_file;
+        eval "${return_good}";
+      else
+        if obj df_no_file is_not_empty
+        then
+          if obj _OPT_WHATIS is_yes
+          then
+            to_tmp_line "This is neither a file nor a man page."
+          else
+            echo2 "\`${df_filespec}' is neither a file nor a man page."
+          fi;
+        fi;
+        df_no_man=yes;
+        continue;
+      fi;
+      ;;
+    esac;
+  done;
+  eval ${_UNSET} df_filespec;
+  eval ${_UNSET} df_no_file;
+  eval ${_UNSET} df_no_man;
+  eval "${return_bad}";
+} # do_filearg()
+
+
+########################################################################
+# do_nothing ()
+#
+# Dummy function.
+#
+do_nothing()
+{
+  eval return "${_OK}";
+}
+
+
+########################################################################
+# echo2 (*)
+#
+# Print to standard error with final line break.
+#
+# defined above
+
+
+########################################################################
+# error (*)
+#
+# Print error message and exit with error code.
+#
+# defined above
+
+
+########################################################################
+# exit_test ()
+#
+# Test whether the former command ended with error().  Exit again.
+#
+# defined above
+
+
+########################################################################
+# func_check (   "$@")
+#
+# Check number of arguments and register to _FUNC_STACK.
+#
+# Arguments: >=3
+#   : name of the calling function.
+#   :    a relational operator: = != < > <= >=
+#   :   number of arguments to be checked against 
+#   "$@":        the arguments of the calling function.
+#
+# defined above
+
+#########################################################################
+# func_pop ()
+#
+# Delete the top element from the function call stack.
+#
+# defined above
+
+
+########################################################################
+# func_push ()
+#
+# Store another element to function call stack.
+#
+# defined above
+
+
+########################################################################
+# func_stack_dump ()
+#
+# Print the content of the stack.
+#
+# defined above
+
+
+########################################################################
+# get_first_essential (*)
+#
+# Retrieve first non-empty argument.
+#
+# Return  : `1' if all arguments are empty, `0' if found.
+# Output  : the retrieved non-empty argument.
+#
+# Variable prefix: gfe
+#
+get_first_essential()
+{
+  func_check get_first_essential '>=' 0 "$@";
+  if is_equal "$#" 0
+  then
+    eval "${return_ok}";
+  fi;
+  for i
+  do
+    gfe_var="$i";
+    if obj gfe_var is_not_empty
+    then
+      obj gfe_var echo1;
+      eval ${_UNSET} gfe_var;
+      eval "${return_ok}";
+    fi;
+  done;
+  eval ${_UNSET} gfe_var;
+  eval "${return_bad}";
+}
+
+
+########################################################################
+landmark '5: is_*()';
+########################################################################
+
+########################################################################
+# is_dir ()
+#
+# Test whether `name' is a directory.
+#
+# Arguments : 1
+# Return    : `0' if arg1 is a directory, `1' otherwise.
+#
+is_dir()
+{
+  func_check is_dir '=' 1 "$@";
+  if test _"$1"_ != __ && test -d "$1" && test -r "$1"
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_empty ()
+#
+# Test whether `string' is empty.
+#
+# Arguments : <=1
+# Return    : `0' if arg1 is empty or does not exist, `1' otherwise.
+#
+is_empty()
+{
+  func_check is_empty '=' 1 "$@";
+  if test _"$1"_ = __
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_equal ( )
+#
+# Test whether `string1' is equal to .
+#
+# Arguments : 2
+# Return    : `0' both arguments are equal strings, `1' otherwise.
+#
+is_equal()
+{
+  func_check is_equal '=' 2 "$@";
+  if test _"$1"_ = _"$2"_
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_existing ()
+#
+# Test whether `name' is an existing file or directory.  Solaris 2.5 does
+# not have `test -e'.
+#
+# Arguments : 1
+# Return    : `0' if arg1 exists, `1' otherwise.
+#
+is_existing()
+{
+  func_check is_existing '=' 1 "$@";
+  if test _"$1"_ = __
+  then
+    eval "${return_no}";
+  fi;
+  if test -f "$1" || test -d "$1" || test -c "$1"
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_file ()
+#
+# Test whether `name' is a readable file.
+#
+# Arguments : 1
+# Return    : `0' if arg1 is a readable file, `1' otherwise.
+#
+is_file()
+{
+  func_check is_file '=' 1 "$@";
+  if is_not_empty "$1" && test -f "$1" && test -r "$1"
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_non_empty_file ()
+#
+# Test whether `file_name' is a non-empty existing file.
+#
+# Arguments : <=1
+# Return    :
+#   `0' if arg1 is a non-empty existing file
+#   `1' otherwise
+#
+is_non_empty_file()
+{
+  func_check is_non_empty_file '=' 1 "$@";
+  if is_file "$1" && test -s "$1"
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_not_dir ()
+#
+# Test whether `name' is not a readable directory.
+#
+# Arguments : 1
+# Return    : `0' if arg1 is a directory, `1' otherwise.
+#
+is_not_dir()
+{
+  func_check is_not_dir '=' 1 "$@";
+  if is_dir "$1"
+  then
+    eval "${return_no}";
+  fi;
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_not_empty ()
+#
+# Test whether `string' is not empty.
+#
+# Arguments : <=1
+# Return    : `0' if arg1 exists and is not empty, `1' otherwise.
+#
+is_not_empty()
+{
+  func_check is_not_empty '=' 1 "$@";
+  if is_empty "$1"
+  then
+    eval "${return_no}";
+  fi;
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_not_equal ( )
+#
+# Test whether `string1' differs from `string2'.
+#
+# Arguments : 2
+#
+is_not_equal()
+{
+  func_check is_not_equal '=' 2 "$@";
+  if is_equal "$1" "$2"
+  then
+    eval "${return_no}";
+  fi
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_not_file ()
+#
+# Test whether `name' is a not readable file.
+#
+# Arguments : 1 (empty allowed)
+#
+is_not_file()
+{
+  func_check is_not_file '=' 1 "$@";
+  if is_file "$1"
+  then
+    eval "${return_no}";
+  fi;
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_not_prog ([ [*]])
+#
+# Verify that arg is a not program in $PATH.
+#
+# Arguments : >=0 (empty allowed)
+#   more args are ignored, this allows to specify progs with arguments
+#
+is_not_prog()
+{
+  func_check is_not_prog '>=' 0 "$@";
+  case "$#" in
+  0)
+    eval "${return_yes}";
+    ;;
+  *)
+    if where_is "$1" >${_NULL_DEV}
+    then
+      eval "${return_no}";
+    fi;
+    ;;
+  esac
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_not_writable ()
+#
+# Test whether `name' is a not a writable file or directory.
+#
+# Arguments : >=1 (empty allowed), more args are ignored
+#
+is_not_writable()
+{
+  func_check is_not_writable '>=' 1 "$@";
+  if is_writable "$1"
+  then
+    eval "${return_no}";
+  fi;
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_not_X ()
+#
+# Test whether not running in X Window by checking $DISPLAY
+#
+is_not_X()
+{
+  func_check is_X '=' 0 "$@";
+  if obj DISPLAY is_empty
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_not_yes ()
+#
+# Test whether `string' is not "yes".
+#
+# Arguments : 1
+#
+is_not_yes()
+{
+  func_check is_not_yes = 1 "$@";
+  if is_yes "$1"
+  then
+    eval "${return_no}";
+  fi;
+  eval "${return_yes}";
+}
+
+
+########################################################################
+# is_prog ([ [*]])
+#
+# Determine whether  is a program in $PATH
+#
+# Arguments : >=0 (empty allowed)
+#   * are ignored, this allows to specify progs with arguments.
+#
+is_prog()
+{
+  func_check is_prog '>=' 0 "$@";
+  case "$#" in
+  0)
+    eval "${return_no}";
+    ;;
+  *)
+    if where_is "$1" >${_NULL_DEV}
+    then
+      eval "${return_yes}";
+    fi;
+    ;;
+  esac
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_writable ()
+#
+# Test whether `name' is a writable file or directory.
+#
+# Arguments : >=1 (empty allowed), more args are ignored
+#
+is_writable()
+{
+  func_check is_writable '>=' 1 "$@";
+  if test _"$1"_ = __
+  then
+    eval "${return_no}";
+  fi;
+  if test -r "$1"
+  then
+    if test -w "$1"
+    then
+      eval "${return_yes}";
+    fi;
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_X ()
+#
+# Test whether running in X Window by checking $DISPLAY
+#
+is_X()
+{
+  func_check is_X '=' 0 "$@";
+  if obj DISPLAY is_not_empty
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# is_yes ()
+#
+# Test whether `string' has value "yes".
+#
+# Return    : `0' if arg1 is `yes', `1' otherwise.
+#
+is_yes()
+{
+  func_check is_yes '=' 1 "$@";
+  if is_equal "$1" 'yes'
+  then
+    eval "${return_yes}";
+  fi;
+  eval "${return_no}";
+}
+
+
+########################################################################
+# landmark ()
+#
+# Print debugging information on standard error if $_DEBUG_LM is `yes'.
+#
+# Globals: $_DEBUG_LM
+#
+# Defined in section `Debugging functions'.
+
+
+########################################################################
+# leave ([])
+#
+# Clean exit without an error or with .
+#
+leave()
+{
+  clean_up;
+  if test $# = 0
+  then
+    exit "${_OK}";
+  else
+    exit "$1";
+  fi;
+}
+
+
+########################################################################
+landmark '6: list_*()';
+########################################################################
+#
+# `list' is an object class that represents an array or list.  Its
+# data consists of space-separated single-quoted elements.  So a list
+# has the form "'first' 'second' '...' 'last'".  See list_append() for
+# more details on the list structure.  The array elements of `list'
+# can be get by `eval set x "$list"; shift`.
+
+
+########################################################################
+# list_append ( ...)
+#
+# Arguments: >=2
+#   : a variable name for a list of single-quoted elements
+#   :  some sequence of characters.
+# Output: none, but $ is set to
+#   if  is empty:  "'' '...'"
+#   otherwise:           "$list '' ..."
+#
+# Variable prefix: la
+#
+list_append()
+{
+  func_check list_append '>=' 2 "$@";
+  la_name="$1";
+  eval la_list='"${'$1'}"';
+  shift;
+  for s
+  do
+    la_s="$s";
+    case "${la_s}" in
+    *\'*)
+      # escape each single quote by replacing each
+      # "'" (squote) by "'\''" (squote bslash squote squote);
+      # note that the backslash must be doubled in the following `sed'
+      la_element="$(echo1 "${la_s}" | sed -e 's/'"${_SQ}"'/&\\&&/g')";
+      exit_test;
+      ;;
+    '')
+      la_element="";
+      ;;
+    *)
+      la_element="${la_s}";
+      ;;
+    esac;
+    if obj la_list is_empty
+    then
+      la_list="'${la_element}'";
+    else
+      la_list="${la_list} '${la_element}'";
+    fi;
+  done;
+  eval "${la_name}"='"${la_list}"';
+  eval ${_UNSET} la_element;
+  eval ${_UNSET} la_list;
+  eval ${_UNSET} la_name;
+  eval ${_UNSET} la_s;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# list_from_cmdline ( [...])
+#
+# Transform command line arguments into a normalized form.
+#
+# Options, option arguments, and file parameters are identified and
+# output each as a single-quoted argument of its own.  Options and
+# file parameters are separated by a '--' argument.
+#
+# Arguments: >=1
+#   : common part of a set of 4 environment variable names:
+#     $_SHORT_NA:  list of short options without an arg.
+#     $_SHORT_ARG: list of short options that have an arg.
+#     $_LONG_NA:   list of long options without an arg.
+#     $_LONG_ARG:  list of long options that have an arg.
+#   ...: the arguments from a command line, such as "$@",
+#                     the content of a variable, or direct arguments.
+#
+# Output: ['-[-]opt' ['optarg']]... '--' ['filename']...
+#
+# Example:
+#   list_from_cmdline PRE 'a b' 'c' '' 'long' -a f1 -bcarg --long=larg f2
+# If $PRE_SHORT_NA, $PRE_SHORT_ARG, $PRE_LONG_NA, and $PRE_LONG_ARG are
+# none-empty option lists, this will result in printing:
+#     '-a' '-b' '-c' 'arg' '--long' 'larg' '--' 'f1' 'f2'
+#
+#   Use this function in the following way:
+#     eval set x "$(args_norm PRE_NAME "$@")";
+#     shift;
+#     while test "$1" != '--'; do
+#       case "$1" in
+#       ...
+#       esac;
+#       shift;
+#     done;
+#     shift;         #skip '--'
+#     # all positional parameters ("$@") left are file name parameters.
+#
+# Variable prefix: lfc
+#
+list_from_cmdline()
+{
+  func_check list_from_cmdline '>=' 1 "$@";
+  lfc_short_n="$(obj_data "$1"_SHORT_NA)";  # short options, no argument
+  lfc_short_a="$(obj_data "$1"_SHORT_ARG)"; # short options, with argument
+  lfc_long_n="$(obj_data "$1"_LONG_NA)";    # long options, no argument
+  lfc_long_a="$(obj_data "$1"_LONG_ARG)";   # long options, with argument
+  exit_test;
+  if obj lfc_short_n is_empty
+  then
+    error 'list_from_cmdline(): no $'"$1"'_SHORT_NA options.';
+  fi;
+  if obj lfc_short_a is_empty
+  then
+    error 'list_from_cmdline(): no $'"$1"'_SHORT_ARG options.';
+  fi;
+  if obj lfc_long_n is_empty
+  then
+    error 'list_from_cmdline(): no $'"$1"'_LONG_NA options.';
+  fi;
+  if obj lfc_long_a is_empty
+  then
+    error 'list_from_cmdline(): no $'"$1"'_LONG_ARG options.';
+  fi;
+
+  shift;
+  if is_equal "$#" 0
+  then
+    echo1 --
+    eval ${_UNSET} lfc_fparams;
+    eval ${_UNSET} lfc_short_a;
+    eval ${_UNSET} lfc_short_n;
+    eval ${_UNSET} lfc_long_a;
+    eval ${_UNSET} lfc_long_n;
+    eval ${_UNSET} lfc_result;
+    eval "${return_ok}";
+  fi;
+
+  lfc_fparams='';
+  lfc_result='';
+  while test "$#" -ge 1
+  do
+    lfc_arg="$1";
+    shift;
+    case "${lfc_arg}" in
+    --) break; ;;
+    --*=*)
+      # delete leading '--';
+      lfc_abbrev="$(echo1 "${lfc_arg}" | sed -e 's/^--//')";
+      lfc_with_equal="${lfc_abbrev}";
+      # extract option by deleting from the first '=' to the end
+      lfc_abbrev="$(echo1 "${lfc_with_equal}" | \
+                    sed -e 's/^\([^=]*\)=.*$/\1/')";
+      lfc_opt="$(list_single_from_abbrev lfc_long_a "${lfc_abbrev}")";
+      exit_test;
+      if obj lfc_opt is_empty
+      then
+        error_user "--${lfc_abbrev} is not an option.";
+      else
+        # get the option argument by deleting up to first `='
+        lfc_optarg="$(echo1 "${lfc_with_equal}" | sed -e 's/^[^=]*=//')";
+        exit_test;
+        list_append lfc_result "--${lfc_opt}" "${lfc_optarg}";
+        continue;
+      fi;
+      ;;
+    --*)
+      # delete leading '--';
+      lfc_abbrev="$(echo1 "${lfc_arg}" | sed -e 's/^--//')";
+      if list_has lfc_long_n "${lfc_abbrev}"
+      then
+        lfc_opt="${lfc_abbrev}";
+      else
+        exit_test;
+        lfc_opt="$(list_single_from_abbrev lfc_long_n "${lfc_abbrev}")";
+        exit_test;
+        if obj lfc_opt is_not_empty && is_not_equal "$#" 0
+        then
+          a="$(list_single_from_abbrev lfc_long_a "${lfc_abbrev}")";
+          exit_test;
+          if obj a is_not_empty
+          then
+            error_user "The abbreviation ${lfc_arg} \
+has multiple options: --${lfc_opt} and --${a}.";
+          fi;
+        fi;
+      fi;
+      if obj lfc_opt is_not_empty
+      then
+        # long option, no argument
+        list_append lfc_result "--${lfc_opt}";
+        continue;
+      fi;
+      lfc_opt="$(list_single_from_abbrev lfc_long_a "${lfc_abbrev}")";
+      exit_test;
+      if obj lfc_opt is_not_empty
+      then
+        # long option with argument
+        if test "$#" -le 0
+        then
+          error_user "no argument for option --${lfc_opt}."
+        fi;
+        list_append lfc_result "--${lfc_opt}" "$1";
+        shift;
+        continue;
+      fi;
+      error_user "${lfc_arg} is not an option.";
+      ;;
+    -?*)			# short option (cluster)
+      # delete leading `-';
+      lfc_rest="$(echo1 "${lfc_arg}" | sed -e 's/^-//')";
+      exit_test;
+      while obj lfc_rest is_not_empty
+      do
+        # get next short option from cluster (first char of $lfc_rest)
+        lfc_optchar="$(echo1 "${lfc_rest}" | sed -e 's/^\(.\).*$/\1/')";
+        # remove first character from ${lfc_rest};
+        lfc_rest="$(echo1 "${lfc_rest}" | sed -e 's/^.//')";
+        exit_test;
+        if list_has lfc_short_n "${lfc_optchar}"
+        then
+          list_append lfc_result "-${lfc_optchar}";
+          continue;
+        elif list_has lfc_short_a "${lfc_optchar}"
+        then
+          if obj lfc_rest is_empty
+          then
+            if test "$#" -ge 1
+            then
+              list_append lfc_result "-${lfc_optchar}" "$1";
+              shift;
+              continue;
+            else
+              error_user "no argument for option -${lfc_optchar}.";
+            fi;
+          else			# rest is the argument
+            list_append lfc_result "-${lfc_optchar}" "${lfc_rest}";
+            lfc_rest='';
+            continue;
+          fi;
+        else
+          error_user "unknown option -${lfc_optchar}.";
+        fi;
+      done;
+      ;;
+    *)
+      # Here, $lfc_arg is not an option, so a file parameter.
+      list_append lfc_fparams "${lfc_arg}";
+
+      # Ignore the strange POSIX option handling to end option
+      # parsing after the first file name argument.  To reuse it, do
+      # a `break' here if $POSIXLY_CORRECT of `bash' is not empty.
+      # When `bash' is called as `sh' $POSIXLY_CORRECT is set
+      # automatically to `y'.
+      ;;
+    esac;
+  done;
+  list_append lfc_result '--';
+  if obj lfc_fparams is_not_empty
+  then
+    lfc_result="${lfc_result} ${lfc_fparams}";
+  fi;
+  if test "$#" -gt 0
+  then
+    list_append lfc_result "$@";
+  fi;
+  obj lfc_result echo1;
+  eval ${_UNSET} lfc_abbrev;
+  eval ${_UNSET} lfc_fparams;
+  eval ${_UNSET} lfc_short_a;
+  eval ${_UNSET} lfc_short_n;
+  eval ${_UNSET} lfc_long_a;
+  eval ${_UNSET} lfc_long_n;
+  eval ${_UNSET} lfc_result;
+  eval ${_UNSET} lfc_arg;
+  eval ${_UNSET} lfc_opt;
+  eval ${_UNSET} lfc_opt_arg;
+  eval ${_UNSET} lfc_opt_char;
+  eval ${_UNSET} lfc_with_equal;
+  eval ${_UNSET} lfc_rest;
+  eval "${return_ok}";
+} # list_from_cmdline()
+
+
+########################################################################
+# list_from_split ( )
+#
+# In , escape all white space characters and replace each
+#  by space.
+#
+# Arguments: 2: a  that is to be split into parts divided by
+#               
+# Output:    the resulting list string
+#
+# Variable prefix: lfs
+#
+list_from_split()
+{
+  func_check list_from_split = 2 "$@";
+
+  # precede each space or tab by a backslash `\' (doubled for `sed')
+  lfs_s="$(echo1 "$1" | sed -e 's/\('"${_SPACE_SED}"'\)/\\\1/g')";
+  exit_test;
+
+  # replace split character of string by the list separator ` ' (space).
+  case "$2" in
+    /)				# cannot use normal `sed' separator
+      echo1 "${lfs_s}" | sed -e 's|'"$2"'| |g';
+      ;;
+    ?)				# use normal `sed' separator
+      echo1 "${lfs_s}" | sed -e 's/'"$2"'/ /g';
+      ;;
+    ??*)
+      error 'list_from_split(): separator must be a single character.';
+      ;;
+  esac;
+  eval ${_UNSET} lfs_s;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# list_get ()
+#
+# Check whether  is a space-separated list of '-quoted elements.
+#
+# If the test fails an error is raised.
+# If the test succeeds the argument is echoed.
+#
+# Testing criteria:
+#   A list has the form "'first' 'second' '...' 'last'".  So it has a
+#   leading and a final quote and the elements are separated by "' '"
+#   constructs.  If these are all removed there should not be any
+#   unescaped single-quotes left.  Watch out for escaped single
+#   quotes; they have the form '\'' (sq bs sq sq).
+
+# Arguments: 1
+# Output: the argument  unchanged, if the check succeeded.
+#
+# Variable prefix: lg
+#
+list_get()
+{
+  func_check list_get = 1 "$@";
+  eval lg_list='"${'$1'}"';
+  # remove leading and final space characters
+  lg_list="$(echo1 "${lg_list}" | sed -e '
+s/^'"${_SPACE_SED}"'*//
+s/'"${_SPACE_SED}"'*$//
+')";
+  exit_test;
+  case "${lg_list}" in
+  '')
+    eval ${_UNSET} lg_list;
+    eval "${return_ok}";
+    ;;
+  \'*\')
+    obj lg_list echo1;
+    eval ${_UNSET} lg_list;
+    eval "${return_ok}";
+    ;;
+  *)
+    error "list_get(): bad list: $1"
+    ;;
+  esac;
+  eval ${_UNSET} lg_list;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# list_has ( )
+#
+# Test whether the list  has the element .
+#
+# Arguments: 2
+#   : a variable name for a list of single-quoted elements
+#   :  some sequence of characters.
+#
+# Variable prefix: lh
+#
+list_has()
+{
+  func_check list_has = 2 "$@";
+  eval lh_list='"${'$1'}"';
+  if obj lh_list is_empty
+  then
+    eval "${_UNSET}" lh_list;
+    eval "${return_no}";
+  fi;
+  case "$2" in
+    \'*\')  lh_element=" $2 "; ;;
+    *)      lh_element=" '$2' "; ;;
+  esac;
+  if string_contains " ${lh_list} " "${lh_element}"
+  then
+    eval "${_UNSET}" lh_list;
+    eval "${_UNSET}" lh_element;
+    eval "${return_yes}";
+  else
+    eval "${_UNSET}" lh_list;
+    eval "${_UNSET}" lh_element;
+    eval "${return_no}";
+  fi;
+}
+
+
+########################################################################
+# list_has_abbrev ( )
+#
+# Test whether the list  has an element starting with .
+#
+# Arguments: 2
+#   : a variable name for a list of single-quoted elements
+#   :   some sequence of characters.
+#
+# Variable prefix: lha
+#
+list_has_abbrev()
+{
+  func_check list_has_abbrev = 2 "$@";
+  eval lha_list='"${'$1'}"';
+  if obj lha_list is_empty
+  then
+    eval "${_UNSET}" lha_list;
+    eval "${return_no}";
+  fi;
+  case "$2" in
+    \'*)
+      lha_element="$(echo1 "$2" | sed -e 's/'"${_SQ}"'$//')";
+      exit_test;
+      ;;
+    *) lha_element="'$2"; ;;
+  esac;
+  if string_contains " ${lha_list}" " ${lha_element}"
+  then
+    eval "${_UNSET}" lha_list;
+    eval "${_UNSET}" lha_element;
+    eval "${return_yes}";
+  else
+    eval "${_UNSET}" lha_list;
+    eval "${_UNSET}" lha_element;
+    eval "${return_no}";
+  fi;
+  eval "${return_ok}";
+}
+
+
+########################################################################
+# list_has_not ( )
+#
+# Test whether  has no .
+#
+# Arguments: 2
+#   :    a space-separated list of single-quoted elements.
+#   : some sequence of characters.
+#
+# Variable prefix: lhn
+#
+list_has_not()
+{
+  func_check list_has_not = 2 "$@";
+  eval lhn_list='"${'$1'}"';
+  if obj lhn_list is_empty
+  then
+    eval "${_UNSET}" lhn_list;
+    eval "${return_yes}";
+  fi;
+  case "$2" in
+    \'*\') lhn_element=" $2 "; ;;
+    *)     lhn_element=" '$2' "; ;;
+  esac;
+  if string_contains " ${lhn_list} " "${lhn_element}"
+  then
+    eval "${_UNSET}" lhn_list;
+    eval "${_UNSET}" lhn_element;
+    eval "${return_no}";
+  else
+    eval "${_UNSET}" lhn_list;
+    eval "${_UNSET}" lhn_element;
+    eval "${return_yes}";
+  fi;
+}
+
+
+########################################################################
+# list_single_from_abbrev ( )
+#
+# Check whether the list has an element starting with .  If
+# there are more than a single element an error is created.
+#
+# Arguments: 2
+#   :   a variable name for a list of single-quoted elements
+#   : some sequence of characters.
+#
+# Output: the found element.
+#
+# Variable prefix: lsfa
+#
+list_single_from_abbrev()
+{
+  func_check list_single_from_abbrev = 2 "$@";
+  eval lsfa_list='"${'$1'}"';
+  if obj lsfa_list is_empty
+  then
+    eval "${_UNSET}" lsfa_list;
+    eval "${return_no}";
+  fi;
+  lsfa_abbrev="$2";
+  if list_has lsfa_list "${lsfa_abbrev}"
+  then
+    obj lsfa_abbrev echo1;
+    eval "${_UNSET}" lsfa_abbrev;
+    eval "${_UNSET}" lsfa_list;
+    eval "${return_yes}";
+  fi;
+  if list_has_abbrev lsfa_list "${lsfa_abbrev}"
+  then
+    lsfa_element='';
+    eval set x "${lsfa_list}";
+    shift;
+    for i
+    do
+      case "$i" in
+      ${lsfa_abbrev}*)
+        if obj lsfa_element is_not_empty
+        then
+          error_user "The abbreviation --${lsfa_abbrev} \
+has multiple options: --${lsfa_element} and --${i}.";
+        fi;
+        lsfa_element="$i";
+        ;;
+      esac;
+    done;
+    obj lsfa_element echo1;
+    eval "${_UNSET}" lsfa_abbrev;
+    eval "${_UNSET}" lsfa_element;
+    eval "${_UNSET}" lsfa_list;
+    eval "${return_yes}";
+  else
+    eval "${_UNSET}" lsfa_abbrev;
+    eval "${_UNSET}" lsfa_element;
+    eval "${_UNSET}" lsfa_list;
+    eval "${return_no}";
+  fi;
+}
+
+
+########################################################################
+landmark '7: man_*()';
+########################################################################
+
+########################################################################
+# man_do_filespec ()
+#
+# Print suitable man page(s) for filespec to $_TMP_CAT.
+#
+# Arguments : 2
+#   : argument of the form `man:name.section', `man:name',
+#               `man:name(section)', `name.section', `name'.
+#
+# Globals   : $_OPT_ALL
+#
+# Output    : none.
+# Return    : `0' if man page was found, `1' else.
+#
+# Only called from do_fileargs(), checks on $MANPATH and $_MAN_ENABLE
+# are assumed (see man_setup()).
+#
+# Variable prefix: mdf
+#
+man_do_filespec()
+{
+  func_check man_do_filespec = 1 "$@";
+  if obj _MAN_PATH is_empty
+  then
+    eval "${return_bad}";
+  fi;
+  if is_empty "$1"
+  then
+    eval "${return_bad}";
+  fi;
+  mdf_spec="$1";
+  mdf_name='';
+  mdf_section='';
+  case "${mdf_spec}" in
+  */*)				# not a man spec with containing '/'
+    eval ${_UNSET} mdf_got_one;
+    eval ${_UNSET} mdf_name;
+    eval ${_UNSET} mdf_section;
+    eval ${_UNSET} mdf_spec;
+    eval "${return_bad}";
+    ;;
+  man:?*\(?*\))			# man:name(section)
+    mdf_name="$(echo1 "${mdf_spec}" \
+                | sed -e 's/^man:\(..*\)(\(..*\))$/\1/')";
+    mdf_section="$(echo1 "${mdf_spec}" \
+                   | sed -e 's/^man:\(..*\)(\(..*\))$/\2/')";
+    exit_test;
+    ;;
+  man:?*.${_MAN_AUTO_SEC_CHARS}) # man:name.section
+    mdf_name="$(echo1 "${mdf_spec}" \
+                | sed -e 's/^man:\(..*\)\..$/\1/')";
+    mdf_section="$(echo1 "${mdf_spec}" \
+                   | sed -e 's/^.*\(.\)$/\1/')";
+    exit_test;
+    ;;
+  man:?*)			# man:name
+    mdf_name="$(echo1 "${mdf_spec}" | sed -e 's/^man://')";
+    exit_test;
+    ;;
+  ?*\(?*\))			# name(section)
+    mdf_name="$(echo1 "${mdf_spec}" \
+                | sed -e 's/^\(..*\)(\(..*\))$/\1/')";
+    mdf_section="$(echo1 "${mdf_spec}" \
+                   | sed -e 's/^\(..*\)(\(..*\))$/\2/')";
+    exit_test;
+    ;;
+  ?*.${_MAN_AUTO_SEC_CHARS})	# name.section
+    mdf_name="$(echo1 "${mdf_spec}" \
+                | sed -e 's/^\(..*\)\..$/\1/')";
+    mdf_section="$(echo1 "${mdf_spec}" \
+                   | sed -e 's/^.*\(.\)$/\1/')";
+    exit_test;
+    ;;
+  ?*)
+    mdf_name="${mdf_spec}";
+    ;;
+  esac;
+  if obj mdf_name is_empty
+  then
+    eval ${_UNSET} mdf_got_one;
+    eval ${_UNSET} mdf_name;
+    eval ${_UNSET} mdf_section;
+    eval ${_UNSET} mdf_spec;
+    eval "${return_bad}";
+  fi;
+  mdf_got_one='no';
+  if obj mdf_section is_empty
+  then
+    if obj _OPT_SECTIONS is_empty
+    then
+      eval set x "${_MAN_AUTO_SEC_LIST}";
+    else
+      # use --sections when no section is given to filespec
+      eval set x "$(echo1 "${_OPT_SECTIONS}" | sed -e 's/:/ /g')";
+    fi;
+    shift;
+    for s
+    do
+      mdf_s="$s";
+      if man_search_section "${mdf_name}" "${mdf_s}"
+      then			# found
+        if obj _MAN_ALL is_yes
+        then
+          mdf_got_one='yes';
+        else
+          eval ${_UNSET} mdf_got_one;
+          eval ${_UNSET} mdf_name;
+          eval ${_UNSET} mdf_s;
+          eval ${_UNSET} mdf_section;
+          eval ${_UNSET} mdf_spec;
+          eval "${return_good}";
+        fi;
+      fi;
+    done;
+  else
+    if man_search_section "${mdf_name}" "${mdf_section}"
+    then
+      eval ${_UNSET} mdf_got_one;
+      eval ${_UNSET} mdf_name;
+      eval ${_UNSET} mdf_s;
+      eval ${_UNSET} mdf_section;
+      eval ${_UNSET} mdf_spec;
+      eval "${return_good}";
+    else
+      eval ${_UNSET} mdf_got_one;
+      eval ${_UNSET} mdf_name;
+      eval ${_UNSET} mdf_section;
+      eval ${_UNSET} mdf_spec;
+      eval "${return_bad}";
+    fi;
+  fi;
+  if obj _MAN_ALL is_yes && obj mdf_got_one is_yes
+  then
+    eval ${_UNSET} mdf_got_one;
+    eval ${_UNSET} mdf_name;
+    eval ${_UNSET} mdf_s;
+    eval ${_UNSET} mdf_section;
+    eval ${_UNSET} mdf_spec;
+    eval "${return_good}";
+  fi;
+  eval ${_UNSET} mdf_got_one;
+  eval ${_UNSET} mdf_name;
+  eval ${_UNSET} mdf_s;
+  eval ${_UNSET} mdf_section;
+  eval ${_UNSET} mdf_spec;
+  eval "${return_bad}";
+} # man_do_filespec()
+
+
+########################################################################
+# man_register_file (  [
]) +# +# Write a found man page file and register the title element. +# +# Arguments: 1, 2, or 3; maybe empty +# Output: none +# +man_register_file() +{ + func_check man_register_file '>=' 2 "$@"; + case "$#" in + 2|3) do_nothing; ;; + *) + error "man_register_file() expects 2 or 3 arguments."; + ;; + esac; + if is_empty "$1" + then + error 'man_register_file(): file name is empty'; + fi; + to_tmp "$1"; + case "$#" in + 2) + register_title "man:$2"; + eval "${return_ok}"; + ;; + 3) + register_title "$2.$3"; + eval "${return_ok}"; + ;; + esac; + eval "${return_ok}"; +} + + +######################################################################## +# man_search_section (
) +# +# Retrieve man pages. +# +# Arguments : 2 +# Globals : $_MAN_PATH, $_MAN_EXT +# Return : 0 if found, 1 otherwise +# +# Variable prefix: mss +# +man_search_section() +{ + func_check man_search_section = 2 "$@"; + if obj _MAN_PATH is_empty + then + eval "${return_bad}"; + fi; + if is_empty "$1" + then + eval "${return_bad}"; + fi; + if is_empty "$2" + then + eval "${return_bad}"; + fi; + mss_name="$1"; + mss_section="$2"; + eval set x "$(path_split "${_MAN_PATH}")"; + exit_test; + shift; + mss_got_one='no'; + if obj _MAN_EXT is_empty + then + for d + do + mss_dir="$(dirname_append "$d" "man${mss_section}")"; + exit_test; + if obj mss_dir is_dir + then + mss_prefix="$(\ + dirname_append "${mss_dir}" "${mss_name}.${mss_section}")"; + if obj _OPT_WHATIS is_yes + then + mss_files="$(eval ls "${mss_prefix}"'*' 2>${_NULL_DEV} | + sed -e '\| found|s|.*||' + )"; + else + mss_files="$(eval ls "'${mss_prefix}'"'*' 2>${_NULL_DEV} | + sed -e '\| found|s|.*||' + )"; + fi; + exit_test; + if obj mss_files is_not_empty + then + # for f in $mss_files + for f in $(eval set x ${mss_files}; shift; echo1 "$@") + do + exit_test; + mss_f="$f"; + if obj mss_f is_file + then + if is_yes "${mss_got_one}" + then + register_file "${mss_f}"; + elif obj _MAN_ALL is_yes + then + man_register_file "${mss_f}" "${mss_name}"; + else + man_register_file "${mss_f}" "${mss_name}" "${mss_section}"; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + mss_got_one='yes'; + fi; + done; + fi; + fi; + done; + else + mss_ext="${_MAN_EXT}"; + # check for directory name having trailing extension + for d + do + mss_dir="$(dirname_append $d man${mss_section}${mss_ext})"; + exit_test; + if obj mss_dir is_dir + then + mss_prefix=\ + "$(dirname_append "${mss_dir}" "${mss_name}.${mss_section}")"; + mss_files="$( eval ls "${mss_prefix}"'*' 2>${_NULL_DEV} | + sed -e '\|not found|s|.*||' + )"; + exit_test; + if obj mss_files is_not_empty + then + # for f in $mss_files + for f in $(eval set x ${mss_files}; shift; echo1 "$@") + do + mss_f="$f"; + if obj mss_f is_file + then + if is_yes "${mss_got_one}" + then + register_file "${mss_f}"; + elif obj _MAN_ALL is_yes + then + man_register_file "${mss_f}" "${mss_name}"; + else + man_register_file "${mss_f}" "${mss_name}" "${mss_section}"; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + mss_got_one='yes'; + fi; + done; + fi; + fi; + done; + # check for files with extension in directories without extension + for d + do + mss_dir="$(dirname_append "$d" "man${mss_section}")"; + exit_test; + if obj mss_dir is_dir + then + mss_prefix="$(dirname_append "${mss_dir}" \ + "${mss_name}.${mss_section}${mss_ext}")"; + mss_files="$(eval ls "${mss_prefix}"'*' 2>${_NULL_DEV} | + sed -e '\|not found|s|.*||' + )"; + exit_test; + if obj mss_files is_not_empty + then + # for f in $mss_files + for f in $(eval set x ${mss_files}; shift; echo1 "$@") + do + mss_f="$f"; + if obj mss_f is_file + then + if is_yes "${mss_got_one}" + then + register_file "${mss_f}"; + elif obj _MAN_ALL is_yes + then + man_register_file "${mss_f}" "${mss_name}"; + else + man_register_file "${mss_f}" "${mss_name}" "${mss_section}"; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + mss_got_one='yes'; + fi; + done; + fi; + fi; + done; + fi; + if obj _MAN_ALL is_yes && is_yes "${mss_got_one}" + then + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_bad}"; +} # man_search_section() + + +######################################################################## +# man_setup () +# +# Setup the variables $_MAN_* needed for man page searching. +# +# Globals: +# in: $_OPT_*, $_MANOPT_*, $LANG, $LC_MESSAGES, $LC_ALL, +# $MANPATH, $MANROFFSEQ, $MANSEC, $PAGER, $SYSTEM, $MANOPT. +# out: $_MAN_PATH, $_MAN_LANG, $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2, +# $_MAN_SEC, $_MAN_ALL +# in/out: $_MAN_ENABLE +# +# The precedence for the variables related to `man' is that of GNU +# `man', i.e. +# +# $LANG; overridden by +# $LC_MESSAGES; overridden by +# $LC_ALL; this has the same precedence as +# $MANPATH, $MANROFFSEQ, $MANSEC, $PAGER, $SYSTEM; overridden by +# $MANOPT; overridden by +# the groffer command line options. +# +# Variable prefix: ms +# +man_setup() +{ + func_check main_man_setup = 0 "$@"; + + if obj _MAN_IS_SETUP is_yes + then + eval "${return_ok}"; + fi; + _MAN_IS_SETUP='yes'; + + if obj _MAN_ENABLE is_not_yes + then + eval "${return_ok}"; + fi; + + # determine basic path for man pages + _MAN_PATH="$(get_first_essential \ + "${_OPT_MANPATH}" "${_MANOPT_PATH}" "${MANPATH}")"; + exit_test; + if obj _MAN_PATH is_empty + then + manpath_set_from_path; + else + _MAN_PATH="$(path_clean "${_MAN_PATH}")"; + exit_test; + fi; + if obj _MAN_PATH is_empty + then + if is_prog 'manpath' + then + _MAN_PATH="$(manpath 2>${_NULL_DEV})"; # not always available + exit_test; + fi; + fi; + if obj _MAN_PATH is_empty + then + _MAN_ENABLE="no"; + eval "${return_ok}"; + fi; + + _MAN_ALL="$(get_first_essential "${_OPT_ALL}" "${_MANOPT_ALL}")"; + exit_test; + if obj _MAN_ALL is_empty + then + _MAN_ALL='no'; + fi; + + _MAN_SYS="$(get_first_essential \ + "${_OPT_SYSTEMS}" "${_MANOPT_SYS}" "${SYSTEM}")"; + ms_lang="$(get_first_essential \ + "${_OPT_LANG}" "${LC_ALL}" "${LC_MESSAGES}" "${LANG}")"; + exit_test; + case "${ms_lang}" in + C|POSIX) + _MAN_LANG=""; + _MAN_LANG2=""; + ;; + ?) + _MAN_LANG="${ms_lang}"; + _MAN_LANG2=""; + ;; + *) + _MAN_LANG="${ms_lang}"; + # get first two characters of $ms_lang + _MAN_LANG2="$(echo1 "${ms_lang}" | sed -e 's/^\(..\).*$/\1/')"; + exit_test; + ;; + esac; + # from now on, use only $_LANG, forget about $_OPT_LANG, $LC_*. + + manpath_add_lang_sys; # this is very slow + + _MAN_SEC="$(get_first_essential \ + "${_OPT_SECT}" "${_MANOPT_SEC}" "${MANSEC}")"; + exit_test; + if obj _MAN_PATH is_empty + then + _MAN_ENABLE="no"; + eval ${_UNSET} ms_lang; + eval "${return_ok}"; + fi; + + _MAN_EXT="$(get_first_essential \ + "${_OPT_EXTENSION}" "${_MANOPT_EXTENSION}")"; + exit_test; + eval ${_UNSET} ms_lang; + eval "${return_ok}"; +} # man_setup() + + +######################################################################## +landmark '8: manpath_*()'; +######################################################################## + +######################################################################## +# manpath_add_lang_sys () +# +# Add language and operating system specific directories to man path. +# +# Arguments : 0 +# Output : none +# Globals: +# in: $_MAN_SYS: has the form `os1,os2,...', a comma separated +# list of names of operating systems. +# $_MAN_LANG and $_MAN_LANG2: each a single name +# in/out: $_MAN_PATH: has the form `dir1:dir2:...', a colon +# separated list of directories. +# +# Variable prefix: mals +# +manpath_add_lang_sys() +{ + func_check manpath_add_lang_sys = 0 "$@"; + if obj _MAN_PATH is_empty + then + eval "${return_ok}"; + fi; + # twice test both sys and lang + eval set x "$(path_split "${_MAN_PATH}")"; + shift; + exit_test; + mals_mp=''; + for p + do # loop on man path directories + mals_mp="$(_manpath_add_lang_sys_single "${mals_mp}" "$p")"; + exit_test; + done; + eval set x "$(path_split "${mals_mp}")"; + shift; + exit_test; + for p + do # loop on man path directories + mals_mp="$(_manpath_add_lang_sys_single "${mals_mp}" "$p")"; + exit_test; + done; + _MAN_PATH="$(path_chop "${mals_mp}")"; + exit_test; + eval ${_UNSET} mals_mp; + eval "${return_ok}"; +} + + +# To the directory in $1 append existing sys/lang subdirectories +# Function is necessary to split the OS list. +# +# globals: in: $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2 +# argument: 2: `man_path' and `dir' +# output: colon-separated path of the retrieved subdirectories +# +# Variable prefix: _mals +# +_manpath_add_lang_sys_single() +{ + func_check _manpath_add_lang_sys_single = 2 "$@"; + _mals_res="$1"; + _mals_parent="$2"; + eval set x "$(list_from_split "${_MAN_SYS}" ',')"; + shift; + exit_test; + for d in "$@" "${_MAN_LANG}" "${_MAN_LANG2}" + do + _mals_dir="$(dirname_append "${_mals_parent}" "$d")"; + exit_test; + if obj _mals_res path_not_contains "${_mals_dir}" && \ + obj _mals_dir is_dir + then + _mals_res="${_mals_res}:${_mals_dir}"; + fi; + done; + if path_not_contains "${_mals_res}" "${_mals_parent}" + then + _mals_res="${_mals_res}:${_mals_parent}"; + fi; + path_chop "${_mals_res}"; + eval ${_UNSET} _mals_dir; + eval ${_UNSET} _mals_parent; + eval ${_UNSET} _mals_res; + eval "${return_ok}"; +} + +# end manpath_add_lang_sys () + + +######################################################################## +# manpath_set_from_path () +# +# Determine basic search path for man pages from $PATH. +# +# Return: `0' if a valid man path was retrieved. +# Output: none +# Globals: +# in: $PATH +# out: $_MAN_PATH +# +# Variable prefix: msfp +# +manpath_set_from_path() +{ + func_check manpath_set_from_path = 0 "$@"; + + msfp_manpath=''; + + # get a basic man path from $PATH + if obj PATH is_not_empty + then + eval set x "$(path_split "${PATH}")"; + shift; + exit_test; + for d + do + # delete the final `/bin' part + msfp_base="$(echo1 "$d" | sed -e 's|//*bin/*$||')"; + exit_test; + for e in /share/man /man + do + msfp_mandir="${msfp_base}$e"; + if test -d "${msfp_mandir}" && test -r "${msfp_mandir}" + then + msfp_manpath="${msfp_manpath}:${msfp_mandir}"; + fi; + done; + done; + fi; + + # append some default directories + for d in /usr/local/share/man /usr/local/man \ + /usr/share/man /usr/man \ + /usr/X11R6/man /usr/openwin/man \ + /opt/share/man /opt/man \ + /opt/gnome/man /opt/kde/man + do + msfp_d="$d"; + if obj msfp_manpath path_not_contains "${msfp_d}" && obj mfsp_d is_dir + then + msfp_manpath="${msfp_manpath}:${mfsp_d}"; + fi; + done; + + _MAN_PATH="${msfp_manpath}"; + eval ${_UNSET} msfp_base; + eval ${_UNSET} msfp_d; + eval ${_UNSET} msfp_mandir; + eval ${_UNSET} msfp_manpath; + eval "${return_ok}"; +} # manpath_set_from_path() + + +######################################################################## +landmark '9: obj_*()'; +######################################################################## + +######################################################################## +# obj ( ...) +# +# This works like a method (object function) call for an object. +# Run " $ ...". +# +# The first argument represents an object whose data is given as first +# argument to (). +# +# Argument: >=2 +# : variable name +# : a program or function name +# +# Variable prefix: o +# +obj() +{ + func_check obj '>=' 2 "$@"; + eval o_arg1='"${'$1'}"'; + if is_empty "$2" + then + error "obj(): function name is empty." + else + o_func="$2"; + fi; + shift; + shift; + eval "${o_func}"' "${o_arg1}" "$@"'; + n="$?"; + eval ${_UNSET} o_arg1; + eval ${_UNSET} o_func; + eval "${return_var} $n"; +} # obj() + + +######################################################################## +# obj_data () +# +# Print the data of , i.e. the content of $. +# For possible later extensions. +# +# Arguments: 1 +# : a variable name +# Output: the data of +# +# Variable prefix: od +# +obj_data() +{ + func_check obj '=' 1 "$@"; + if is_empty "$1" + then + error "obj_data(): object name is empty." + fi; + eval od_res='"${'$1'}"'; + obj od_res echo1; + eval ${_UNSET} od_res; + eval "${return_ok}"; +} + + +######################################################################## +# obj_from_output ( ...) +# +# Run '$="$( ...)"' to set the result of a +# function call to a global variable. +# +# Arguments: >=2 +# : a variable name +# : the name of a function or program +# : optional argument to +# Output: none +# +# Variable prefix: ofo +# +obj_from_output() +{ + func_check obj_from_output '>=' 2 "$@"; + if is_empty "$1" + then + error "res(): variable name is empty."; + elif is_empty "$2" + then + error "res(): function name is empty." + else + ofo_result_name="$1"; + fi; + shift; + eval "${ofo_result_name}"'="$('"$@"')"'; + exit_test; + eval "${return_ok}"; +} + + +######################################################################## +# obj_set ( ) +# +# Set the data of , i.e. call "$=". +# +# Arguments: 2 +# : a variable name +# : a string +# Output:: none +# +obj_set() +{ + func_check obj_set '=' 2 "$@"; + if is_empty "$1" + then + error "obj_set(): object name is empty." + fi; + eval "$1"='"$2"'; + eval "${return_ok}"; +} + + +######################################################################## +# path_chop () +# +# Remove unnecessary colons from path. +# +# Argument: 1, a colon separated path. +# Output: path without leading, double, or trailing colons. +# +path_chop() +{ + func_check path_chop = 1 "$@"; + + # replace multiple colons by a single colon `:' + # remove leading and trailing colons + echo1 "$1" | sed -e ' +s/^:*// +s/:::*/:/g +s/:*$// +'; + eval "${return_ok}"; +} + + +######################################################################## +# path_clean () +# +# Remove non-existing directories from a colon-separated list. +# +# Argument: 1, a colon separated path. +# Output: colon-separated list of existing directories. +# +# Variable prefix: pc +# +path_clean() +{ + func_check path_clean = 1 "$@"; + if is_not_equal "$#" 1 + then + error 'path_clean() needs 1 argument.'; + fi; + pc_arg="$1"; + eval set x "$(path_split "${pc_arg}")"; + exit_test; + shift; + pc_res=""; + for i + do + pc_i="$i"; + if obj pc_i is_not_empty \ + && obj pc_res path_not_contains "${pc_i}" \ + && obj pc_i is_dir + then + case "${pc_i}" in + ?*/) + pc_res="${pc_res}$(dirname_chop "${pc_i}")"; + exit_test; + ;; + *) + pc_res="${pc_res}:${pc_i}"; + exit_test; + ;; + esac; + fi; + done; + eval ${_UNSET} pc_arg; + eval ${_UNSET} pc_i; + eval ${_UNSET} pc_res; + if path_chop "${pc_res}" + then + eval "${return_ok}"; + else + eval "${return_bad}"; + fi; +} + + +######################################################################## +# path_contains ( ) +#- +# Test whether `dir' is contained in `path', a list separated by `:'. +# +# Arguments : 2 arguments. +# Return : `0' if arg2 is substring of arg1, `1' otherwise. +# +path_contains() +{ + func_check path_contains = 2 "$@"; + case ":$1:" in + *":$2:"*) + eval "${return_yes}"; + ;; + *) + eval "${return_no}"; + ;; + esac; + eval "${return_ok}"; +} + + +######################################################################## +# path_not_contains ( ) +# +# Test whether `dir' is not contained in colon separated `path'. +# +# Arguments : 2 arguments. +# +path_not_contains() +{ + func_check path_not_contains = 2 "$@"; + if path_contains "$1" "$2" + then + eval "${return_no}"; + else + eval "${return_yes}"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# path_split () +# +# In `path' escape white space and replace each colon by a space. +# +# Arguments: 1: a colon-separated path +# Output: the resulting list, process with `eval set' +# +path_split() +{ + func_check path_split = 1 "$@"; + list_from_split "$1" ':'; + eval "${return_ok}"; +} + + +######################################################################## +landmark '10: register_*()'; +######################################################################## + +######################################################################## +# register_file () +# +# Write a found file and register the title element. +# +# Arguments: 1: a file name +# Output: none +# +register_file() +{ + func_check register_file = 1 "$@"; + if is_empty "$1" + then + error 'register_file(): file name is empty'; + fi; + if is_equal "$1" '-' + then + to_tmp "${_TMP_STDIN}"; + register_title 'stdin'; + else + to_tmp "$1"; + register_title "$(base_name "$1")"; + exit_test; + fi; + eval "${return_ok}"; +} # register_file() + + +######################################################################## +# register_title () +# +# Create title element from and append to $_REGISTERED_TITLE +# +# Globals: $_REGISTERED_TITLE (rw) +# +# Variable prefix: rt +# +register_title() +{ + func_check register_title '=' 1 "$@"; + if is_empty "$1" + then + eval "${return_ok}"; + fi; + + case "${_REGISTERED_TITLE}" in + *\ *\ *\ *) + eval "${return_ok}"; + ;; + esac; + + # remove directory part + rt_title="$(base_name "$1")"; + # replace space characters by `_' + rt_title="$(echo1 "${rt_title}" | sed -e 's/[ ]/_/g')"; + # remove extension `.bz2' + rt_title="$(echo1 "${rt_title}" | sed -e 's/\.bz2$//')"; + # remove extension `.gz' + rt_title="$(echo1 "${rt_title}" | sed -e 's/\.gz$//')"; + # remove extension `.Z' + rt_title="$(echo1 "${rt_title}" | sed -e 's/\.Z$//')"; + exit_test; + + if obj rt_title is_empty + then + eval ${_UNSET} rt_title; + eval "${return_ok}"; + fi; + if obj _REGISTERED_TITLE is_empty + then + _REGISTERED_TITLE="${rt_title}"; + else + _REGISTERED_TITLE="${_REGISTERED_TITLE} ${rt_title}"; + fi; + eval ${_UNSET} rt_title; + eval "${return_ok}"; +} # register_title() + + +######################################################################## +# reset () +# +# Reset the variables that can be affected by options to their default. +# +# +# Defined in section `Preset' after the rudimentary shell tests. + + +######################################################################## +# rm_file () +# +# Remove file if $_DEBUG_KEEP_FILES allows it. +# +# Globals: $_DEBUG_KEEP_FILES +# +rm_file() +{ + func_check rm_file '=' 1 "$@"; + if is_file "$1" + then + rm -f "$1" >${_NULL_DEV} 2>&1; + fi; + if is_existing "$1" + then + eval "${return_bad}"; + else + eval "${return_good}"; + fi; +} + + +######################################################################## +# rm_file_with_debug () +# +# Remove file if $_DEBUG_KEEP_FILES allows it. +# +# Globals: $_DEBUG_KEEP_FILES +# +rm_file_with_debug() +{ + func_check rm_file_with_debug '=' 1 "$@"; + if obj _DEBUG_KEEP_FILES is_not_yes + then + if is_file "$1" + then + rm -f "$1" >${_NULL_DEV} 2>&1; + fi; + fi; + if is_existing "$1" + then + eval "${return_bad}"; + else + eval "${return_good}"; + fi; +} + + +######################################################################## +# rm_tree () +# +# Remove file if $_DEBUG_KEEP_FILES allows it. +# +# Globals: $_DEBUG_KEEP_FILES +# +rm_tree() +{ + func_check rm_tree '=' 1 "$@"; + if is_existing "$1" + then + rm -f -r "$1" >${_NULL_DEV} 2>&1; + fi; + if is_existing "$1" + then + eval "${return_bad}"; + else + eval "${return_good}"; + fi; +} + + +######################################################################## +# save_stdin () +# +# Store standard input to temporary file (with decompression). +# +# Variable prefix: ss +# +if obj _HAS_COMPRESSION is_yes +then + save_stdin() + { + func_check save_stdin '=' 0 "$@"; + ss_f="${_TMP_DIR}"/INPUT; + cat >"${ss_f}"; + cat_z "${ss_f}" >"${_TMP_STDIN}"; + rm_file "${ss_f}"; + eval ${_UNSET} ss_f; + eval "${return_ok}"; + } +else + save_stdin() + { + func_check save_stdin = 0 "$@"; + cat >"${_TMP_STDIN}"; + eval "${return_ok}"; + } +fi; + + +######################################################################## +# special_filespec () +# +# Handle special modes like whatis and apropos. +# +special_filespec() +{ + func_check special_setup '=' 0 "$@"; + if obj _OPT_APROPOS is_yes + then + if obj _OPT_WHATIS is_yes + then + error \ + 'special_setup: $_OPT_APROPOS and $_OPT_WHATIS are both "yes"'; + fi; + apropos_filespec; + eval "${return_ok}"; + fi; + if obj _OPT_WHATIS is_yes + then + whatis_filespec; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# special_setup () +# +# Handle special modes like whatis and apropos. +# +special_setup() +{ + func_check special_setup '=' 0 "$@"; + if obj _OPT_APROPOS is_yes + then + if obj _OPT_WHATIS is_yes + then + error \ + 'special_setup: $_OPT_APROPOS and $_OPT_WHATIS are both "yes"'; + fi; + apropos_setup; + eval "${return_ok}"; + fi; + if obj _OPT_WHATIS is_yes + then + whatis_header; + fi; + eval "${return_ok}"; +} + + +######################################################################## +landmark '11: stack_*()'; +######################################################################## + +######################################################################## +# string_contains ( ) +# +# Test whether `part' is contained in `string'. +# +# Arguments : 2 text arguments. +# Return : `0' if arg2 is substring of arg1, `1' otherwise. +# +string_contains() +{ + func_check string_contains '=' 2 "$@"; + case "$1" in + *"$2"*) + eval "${return_yes}"; + ;; + *) + eval "${return_no}"; + ;; + esac; + eval "${return_ok}"; +} + + +######################################################################## +# string_not_contains ( ) +# +# Test whether `part' is not substring of `string'. +# +# Arguments : 2 text arguments. +# Return : `0' if arg2 is substring of arg1, `1' otherwise. +# +string_not_contains() +{ + func_check string_not_contains '=' 2 "$@"; + if string_contains "$1" "$2" + then + eval "${return_no}"; + else + eval "${return_yes}"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +landmark '12: tmp_*()'; +######################################################################## + +######################################################################## +# tmp_cat () +# +# output the temporary cat file (the concatenation of all input) +# +tmp_cat() +{ + func_check tmp_cat '=' 0 "$@"; + cat "${_TMP_CAT}"; + eval "${return_var}" "$?"; +} + + +######################################################################## +# tmp_create (?) +# +# Create temporary file. +# +# It's safe to use the shell process ID together with a suffix to +# have multiple temporary files. +# +# Globals: $_TMP_DIR +# +# Output : name of created file +# +# Variable prefix: tc +# +tmp_create() +{ + func_check tmp_create '<=' 1 "$@"; + # the output file does not have `,' as first character, so these are + # different names from the output file. + tc_tmp="${_TMP_DIR}/,$1"; + : >"${tc_tmp}" + obj tc_tmp echo1; + eval ${_UNSET} tc_tmp; + eval "${return_ok}"; +} + + +######################################################################## +# to_tmp () +# +# print file (decompressed) to the temporary cat file +# +to_tmp() +{ + func_check to_tmp '=' 1 "$@"; + if obj _TMP_CAT is_empty + then + error 'to_tmp_line: $_TMP_CAT is not yet set'; + fi; + if is_file "$1" + then + if obj _OPT_LOCATION is_yes + then + echo2 "$1"; + fi; + if obj _OPT_WHATIS is_yes + then + whatis_filename "$1" >>"${_TMP_CAT}"; + else + cat_z "$1" >>"${_TMP_CAT}"; + fi; + else + error "to_tmp(): could not read file \`$1'."; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# to_tmp_line ([]) +# +# print line to the temporary cat file +# +to_tmp_line() +{ + func_check to_tmp '>=' 0 "$@"; + if obj _TMP_CAT is_empty + then + error 'to_tmp_line: $_TMP_CAT is not yet set'; + fi; + echo1 "$*" >>"${_TMP_CAT}"; + eval "${return_ok}"; +} + + +######################################################################## +# trap_set +# +# call function on signal 0 +# +trap_set() +{ + func_check trap_set '=' 0 "$@"; + trap 'clean_up' 0 2>${_NULL_DEV} || :; + eval "${return_ok}"; +} + + +######################################################################## +# trap_unset () +# +# disable trap on signal 0. +# +trap_unset() +{ + func_check trap_unset '=' 0 "$@"; + trap '' 0 2>${_NULL_DEV} || :; + eval "${return_ok}"; +} + + +######################################################################## +# usage () +# +# print usage information to stderr; for groffer option --help. +# +usage() +{ + func_check usage = 0 "$@"; + echo; + version; + echo1 'Usage: groffer [option]... [filespec]...'; + cat <&1 | sed -e '/^ *$/q' | sed -e '1s/^/is part of /'; + eval "${return_ok}"; +} + + +######################################################################## +# warning () +# +# Print warning to stderr +# +warning() +{ + echo2 "warning: $*"; +} + + +######################################################################## +# whatis_filename () +# +# Interpret as a man page and display its `whatis' +# information as a fragment written in the groff language. +# +# Variable prefix: wf +# +whatis_filename() +{ + func_check whatis_filename = 1 "$@"; + wf_arg="$1"; + if obj wf_arg is_not_file + then + error "whatis_filename(): argument is not a readable file." + fi; + wf_dot='^\.'"${_SPACE_SED}"'*'; + if obj _FILESPEC_ARG is_equal '-' + then + wf_arg='stdin'; + fi; + cat <) +# +# Output path of a program if in $PATH. +# +# Arguments : >=1 (empty allowed) +# more args are ignored, this allows to specify progs with arguments +# Return : `0' if arg1 is a program in $PATH, `1' otherwise. +# +# Variable prefix: w +# +where_is() +{ + func_check where_is '>=' 1 "$@"; + w_arg="$1"; + if obj w_arg is_empty + then + eval ${_UNSET} w_arg; + eval "${return_bad}"; + fi; + case "${w_arg}" in + /*) + eval ${_UNSET} w_arg; + eval ${_UNSET} w_file; + if test -f "${w_arg}" && test -x "${w_arg}" + then + eval "${return_ok}"; + else + eval "${return_bad}"; + fi; + ;; + esac; + eval set x "$(path_split "${PATH}")"; + exit_test; + shift; + for p + do + case "$p" in + */) w_file=${p}${w_arg}; ;; + *) w_file=${p}/${w_arg}; ;; + esac; + if test -f "${w_file}" && test -x "${w_file}" + then + obj w_file echo1; + eval ${_UNSET} w_arg; + eval ${_UNSET} w_file; + eval "${return_ok}"; + fi; + done; + eval ${_UNSET} w_arg; + eval ${_UNSET} w_file; + eval "${return_bad}"; +} + + +######################################################################## +# main* Functions +######################################################################## + +# The main area contains the following parts: +# - main_init(): initialize temporary files and set exit trap +# - main_parse_MANOPT(): parse $MANOPT +# - main_parse_args(): argument parsing +# - main_set_mode (): determine the display mode +# - main_do_fileargs(): process filespec arguments +# - main_set_resources(): setup X resources +# - main_display(): do the displaying +# - main(): the main function that calls all main_*() + + +####################################################################### +# main_init () +# +# set exit trap and create temporary files +# +# Globals: $_TMP_DIR, $_TMP_CAT, $_TMP_STDIN +# +# Variable prefix: mi +# +main_init() +{ + func_check main_init = 0 "$@"; + # call clean_up() on shell termination. + trap_set; + + # create temporary directory + umask 0022; + _TMP_DIR=''; + for d in "${GROFF_TMPDIR}" "${TMPDIR}" "${TMP}" "${TEMP}" \ + "${TEMPDIR}" "${HOME}"'/tmp' '/tmp' "${HOME}" '.' + do + mi_dir="$d"; + if obj mi_dir is_empty || obj mi_dir is_not_dir || \ + obj mi_dir is_not_writable + then + continue; + fi; + + case "${mi_dir}" in + */) + _TMP_DIR="${mi_dir}"; + ;; + *) + _TMP_DIR="${mi_dir}"'/'; + ;; + esac; + _TMP_DIR="${_TMP_DIR}groffer${_PROCESS_ID}"; + if obj _TMP_DIR rm_tree + then + : + else + mi_tdir_="${_TMP_DIR}"_; + mi_n=1; + mi_tdir_n="${mi_tdir_}${mi_n}"; + while obj mi_tdir_n is_existing + do + if obj mi_tdir_n rm_tree + then + # directory could not be removed + mi_n="$(expr "${mi_n}" + 1)"; + mi_tdir_n="${mi_tdir_}${mi_n}"; + continue; + fi; + done; + _TMP_DIR="${mi_tdir_n}"; + fi; + eval mkdir "${_TMP_DIR}"; + if is_not_equal "$?" 0 + then + obj _TMP_DIR rm_tree; + _TMP_DIR=''; + continue; + fi; + if obj _TMP_DIR is_dir && obj _TMP_DIR is_writable + then + # $_TMP_DIR can now be used as temporary directory + break; + fi; + obj _TMP_DIR rm_tree; + _TMP_DIR=''; + continue; + done; + if obj _TMP_DIR is_empty + then + error "main_init: \ +Couldn't create a directory for storing temporary files."; + fi; + if obj _DEBUG_PRINT_TMPDIR is_yes + then + echo2 "temporary directory: ${_TMP_DIR}"; + fi; + + _TMP_CAT="$(tmp_create groffer_cat)"; + _TMP_STDIN="$(tmp_create groffer_input)"; + exit_test; + + eval ${_UNSET} mi_dir; + eval ${_UNSET} mi_n; + eval ${_UNSET} mi_tdir_; + eval ${_UNSET} mi_tdir_n; + eval "${return_ok}"; +} # main_init() + + +######################################################################## +# main_parse_MANOPT () +# +# Parse $MANOPT to retrieve man options, but only if it is a non-empty +# string; found man arguments can be overwritten by the command line. +# +# Globals: +# in: $MANOPT, $_OPTS_MANOPT_* +# out: $_MANOPT_* +# +# Variable prefix: mpm +# +main_parse_MANOPT() +{ + func_check main_parse_MANOPT = 0 "$@"; + + if obj MANOPT is_not_empty + then + # Delete leading and final spaces + MANOPT="$(echo1 "${MANOPT}" | sed -e ' +s/^'"${_SPACE_SED}"'*// +s/'"${_SPACE_SED}"'*$// +')"; + exit_test; + fi; + if obj MANOPT is_empty + then + eval "${return_ok}"; + fi; + + mpm_list=''; + # add arguments in $MANOPT by mapping them to groffer options + eval set x "$(list_from_cmdline _OPTS_MANOPT "${MANOPT}")"; + exit_test; + shift; + until test "$#" -le 0 || is_equal "$1" '--' + do + mpm_opt="$1"; + shift; + case "${mpm_opt}" in + -7|--ascii) + list_append mpm_list '--ascii'; + ;; + -a|--all) + list_append mpm_list '--all'; + ;; + -c|--catman) + do_nothing; + shift; + ;; + -d|--debug) + do_nothing; + ;; + -D|--default) + # undo all man options so far + mpm_list=''; + ;; + -e|--extension) + list_append mpm_list '--extension'; + shift; + ;; + -f|--whatis) + list_append mpm_list '--whatis'; + shift; + ;; + -h|--help) + do_nothing; + shift; + ;; + -k|--apropos) + # groffer's --apropos takes an argument, but man's does not, so + do_nothing; + ;; + -l|--local-file) + do_nothing; + ;; + -L|--locale) + list_append mpm_list '--locale' "$1"; + shift; + ;; + -m|--systems) + list_append mpm_list '--systems' "$1"; + shift; + ;; + -M|--manpath) + list_append mpm_list '--manpath' "$1"; + shift; + ;; + -p|--preprocessor) + do_nothing; + shift; + ;; + -P|--pager) + list_append mpm_list '--pager' "$1"; + shift; + ;; + -r|--prompt) + do_nothing; + shift; + ;; + -S|--sections) + list_append mpm_list '--sections' "$1"; + shift; + ;; + -t|--troff) + do_nothing; + shift; + ;; + -T|--device) + list_append mpm_list '-T' "$1"; + shift; + ;; + -u|--update) + do_nothing; + shift; + ;; + -V|--version) + do_nothing; + ;; + -w|--where|--location) + list_append mpm_list '--location'; + ;; + -Z|--ditroff) + do_nothing; + ;; + # ignore all other options + esac; + done; + + # prepend $mpm_list to the command line + if obj mpm_list is_not_empty + then + eval set x "${mpm_list}" '"$@"'; + shift; + fi; + + eval ${_UNSET} mpm_list; + eval ${_UNSET} mpm_opt; + eval "${return_ok}"; +} # main_parse_MANOPT() + + +######################################################################## +# main_parse_args (*) +# +# Parse arguments; process options and filespec parameters +# +# Arguments: pass the command line arguments unaltered. +# Globals: +# in: $_OPTS_* +# out: $_OPT_*, $_ADDOPTS, $_FILEARGS +# +# Variable prefix: mpa +# +main_parse_args() +{ + func_check main_parse_args '>=' 0 "$@"; + _ALL_PARAMS="$(list_from_cmdline _OPTS_CMDLINE "$@")"; + exit_test; + if obj _DEBUG_PRINT_PARAMS is_yes + then + echo2 "parameters: ${_ALL_PARAMS}"; + fi; + eval set x "${_ALL_PARAMS}"; + shift; + + # By the call of `eval', unnecessary quoting was removed. So the + # positional shell parameters ($1, $2, ...) are now guaranteed to + # represent an option or an argument to the previous option, if any; + # then a `--' argument for separating options and + # parameters; followed by the filespec parameters if any. + + # Note, the existence of arguments to options has already been checked. + # So a check for `$#' or `--' should not be done for arguments. + + until test "$#" -le 0 || is_equal "$1" '--' + do + mpa_opt="$1"; # $mpa_opt is fed into the option handler + shift; + case "${mpa_opt}" in + -h|--help) + usage; + leave; + ;; + -Q|--source) # output source code (`Quellcode'). + _OPT_MODE='source'; + ;; + -T|--device|--troff-device) # device; arg + _OPT_DEVICE="$1"; + _check_device_with_mode; + shift; + ;; + -v|--version) + version; + leave; + ;; + -V) + _OPT_V='yes'; + ;; + -Z|--ditroff|--intermediate-output) # groff intermediate output + _OPT_Z='yes'; + ;; + -X) + if is_X + then + _OPT_MODE=X; + fi; + ;; + -?) + # delete leading `-' + mpa_optchar="$(echo1 "${mpa_opt}" | sed -e 's/^-//')"; + exit_test; + if list_has _OPTS_GROFF_SHORT_NA "${mpa_optchar}" + then + list_append _ADDOPTS_GROFF "${mpa_opt}"; + elif list_has _OPTS_GROFF_SHORT_ARG "${mpa_optchar}" + then + list_append _ADDOPTS_GROFF "${mpa_opt}" "$1"; + shift; + else + error "main_parse_args(): Unknown option : \`$1'"; + fi; + ;; + --all) + _OPT_ALL='yes'; + ;; + --apropos) # run `apropos' + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS=''; + _OPT_WHATIS='no'; + ;; + --apropos-data) # run `apropos' for data sections + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS='457'; + _OPT_WHATIS='no'; + ;; + --apropos-devel) # run `apropos' for development sections + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS='239'; + _OPT_WHATIS='no'; + ;; + --apropos-progs) # run `apropos' for program sections + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS='168'; + _OPT_WHATIS='no'; + ;; + --ascii) + list_append _ADDOPTS_GROFF '-mtty-char'; + if obj _OPT_MODE is_empty + then + _OPT_MODE='text'; + fi; + ;; + --auto) # the default automatic mode + _OPT_MODE=''; + ;; + --bd) # border color for viewers, arg; + _OPT_BD="$1"; + shift; + ;; + --bg|--backgroud) # background color for viewers, arg; + _OPT_BG="$1"; + shift; + ;; + --bw) # border width for viewers, arg; + _OPT_BW="$1"; + shift; + ;; + --debug|--debug-all|--debug-keep|--debug-lm|--debug-params|\ +--debug-shell|--debug-stacks|--debug-tmpdir|--debug-user) + # debug is handled at the beginning + :; + ;; + --default) # reset variables to default + reset; + ;; + --default-modes) # sequence of modes in auto mode; arg + _OPT_DEFAULT_MODES="$1"; + shift; + ;; + --display) # set X display, arg + _OPT_DISPLAY="$1"; + shift; + ;; + --do-nothing) + _OPT_DO_NOTHING='yes'; + ;; + --dvi) + if is_X + then + _OPT_MODE='dvi'; + fi; + ;; + --dvi-viewer) # viewer program for dvi mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_DVI="$1"; + shift; + ;; + --dvi-viewer-tty) # viewer program for dvi mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_DVI="$1"; + shift; + ;; + --extension) # the extension for man pages, arg + _OPT_EXTENSION="$1"; + shift; + ;; + --fg|--foreground) # foreground color for viewers, arg; + _OPT_FG="$1"; + shift; + ;; + --fn|--font) # set font for viewers, arg; + _OPT_FN="$1"; + shift; + ;; + --geometry) # window geometry for viewers, arg; + _OPT_GEOMETRY="$1"; + shift; + ;; + --groff) + _OPT_MODE='groff'; + ;; + --html|--www) # display with web browser + _OPT_MODE=html; + ;; + --html-viewer|--www-viewer) # viewer program for html mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_HTML="$1"; + shift; + ;; + --html-viewer-tty|--www-viewer-tty) # viewer for html mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_HTML="$1"; + shift; + ;; + --iconic) # start viewers as icons + _OPT_ICONIC='yes'; + ;; + --locale) # set language for man pages, arg + # argument is xx[_territory[.codeset[@modifier]]] (ISO 639,...) + _OPT_LANG="$1"; + shift; + ;; + --local-file) # force local files; same as `--no-man' + _MAN_FORCE='no'; + _MAN_ENABLE='no'; + ;; + --location|--where) # print file locations to stderr + _OPT_LOCATION='yes'; + ;; + --man) # force all file params to be man pages + _MAN_ENABLE='yes'; + _MAN_FORCE='yes'; + ;; + --manpath) # specify search path for man pages, arg + # arg is colon-separated list of directories + _OPT_MANPATH="$1"; + shift; + ;; + --mode) # display mode + mpa_arg="$1"; + shift; + case "${mpa_arg}" in + auto|'') # search mode automatically among default + _OPT_MODE=''; + ;; + groff) # pass input to plain groff + _OPT_MODE='groff'; + ;; + html|www) # display with a web browser + _OPT_MODE='html'; + ;; + dvi) # display with xdvi viewer + if is_X + then + _OPT_MODE='dvi'; + fi; + ;; + pdf) # display with PDF viewer + if is_X + then + _OPT_MODE='pdf'; + fi; + ;; + ps) # display with Postscript viewer + if is_X + then + _OPT_MODE='ps'; + fi; + ;; + text) # output on terminal + _OPT_MODE='text'; + ;; + tty) # output on terminal + _OPT_MODE='tty'; + ;; + X|x) # output on X roff viewer + if is_X + then + _OPT_MODE='x'; + fi; + ;; + Q|source) # display source code + _OPT_MODE="source"; + ;; + *) + error "main_parse_args(): unknown mode ${mpa_arg}"; + ;; + esac; + ;; + --no-location) # disable former call to `--location' + _OPT_LOCATION='yes'; + ;; + --no-man) # disable search for man pages + # the same as --local-file + _MAN_FORCE='no'; + _MAN_ENABLE='no'; + ;; + --no-special) # disable some special former calls + _OPT_ALL='no' + _OPT_APROPOS='no' + _OPT_WHATIS='no' + ;; + --pager|--tty-viewer|--tty-viewer-tty) + # set paging program for tty mode, arg + _VIEWER_TERMINAL='yes'; + _OPT_PAGER="$1"; + shift; + ;; + --pdf) + if is_X + then + _OPT_MODE='pdf'; + fi; + ;; + --pdf-viewer) # viewer program for ps mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_PDF="$1"; + shift; + ;; + --pdf-viewer-tty) # viewer program for ps mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_PDF="$1"; + shift; + ;; + --print) # for argument test + echo2 "$1"; + shift; + ;; + --ps) + if is_X + then + _OPT_MODE='ps'; + fi; + ;; + --ps-viewer) # viewer program for ps mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_PS="$1"; + shift; + ;; + --ps-viewer-tty) # viewer program for ps mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_PS="$1"; + shift; + ;; + --resolution) # set resolution for X devices, arg + mpa_arg="$1"; + shift; + case "${mpa_arg}" in + 75|75dpi) + mpa_dpi=75; + ;; + 100|100dpi) + mpa_dpi=100; + ;; + *) + error "main_parse_args(): \ +only resoutions of 75 or 100 dpi are supported"; + ;; + esac; + _OPT_RESOLUTION="${mpa_dpi}"; + ;; + --rv) + _OPT_RV='yes'; + ;; + --sections) # specify sections for man pages, arg + # arg is colon-separated list of section names + _OPT_SECTIONS="$1"; + shift; + ;; + --shell) + # already done during the first run; so ignore the argument + shift; + ;; + --systems) # man pages for different OS's, arg + # argument is a comma-separated list + _OPT_SYSTEMS="$1"; + shift; + ;; + --text) # text mode without pager + _OPT_MODE=text; + ;; + --title) # title for X viewers; arg + _OPT_TITLE="$1"; + shift; + ;; + --tty) # tty mode, text with pager + _OPT_MODE=tty; + ;; + --text-device|--tty-device) # device for tty mode; arg + _OPT_TEXT_DEVICE="$1"; + shift; + ;; + --whatis) + _OPT_WHATIS='yes'; + _OPT_ALL='yes'; + _OPT_APROPOS='no'; + ;; + --X|--x) + if is_X + then + _OPT_MODE=x; + fi; + ;; + --xrm) # pass X resource string, arg; + list_append _OPT_XRM "$1"; + shift; + ;; + --x-viewer|--X-viewer) # viewer program for x mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_X="$1"; + shift; + ;; + --x-viewer-tty|--X-viewer-tty) # viewer program for x mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_X="$1"; + shift; + ;; + *) + error 'main_parse_args(): error on argument parsing : '"\`$*'"; + ;; + esac; + done; + shift; # remove `--' argument + + if obj _OPT_DO_NOTHING is_yes + then + leave; + fi; + + # Remaining arguments are file names (filespecs). + # Save them to list $_FILEARGS + if is_equal "$#" 0 + then # use "-" for standard input + set x '-'; + shift; + fi; + _FILEARGS=''; + list_append _FILEARGS "$@"; + if list_has _FILEARGS '-' + then + save_stdin; + fi; + # $_FILEARGS must be retrieved with `eval set x "$_FILEARGS"; shift;' + eval ${_UNSET} mpa_arg; + eval ${_UNSET} mpa_dpi; + eval ${_UNSET} mpa_opt; + eval ${_UNSET} mpa_optchar; + eval "${return_ok}"; +} # main_parse_args() + + +# Called from main_parse_args() because double `case' is not possible. +# Globals: $_OPT_DEVICE, $_OPT_MODE +_check_device_with_mode() +{ + func_check _check_device_with_mode = 0 "$@"; + case "${_OPT_DEVICE}" in + dvi) + _OPT_MODE=dvi; + eval "${return_ok}"; + ;; + html) + _OPT_MODE=html; + eval "${return_ok}"; + ;; + lbp|lj4) + _OPT_MODE=groff; + eval "${return_ok}"; + ;; + ps) + _OPT_MODE=ps; + eval "${return_ok}"; + ;; + ascii|cp1047|latin1|utf8) + if obj _OPT_MODE is_not_equal text + then + _OPT_MODE=tty; # default text mode + fi; + eval "${return_ok}"; + ;; + X*) + _OPT_MODE=x; + eval "${return_ok}"; + ;; + *) # unknown device, go to groff mode + _OPT_MODE=groff; + eval "${return_ok}"; + ;; + esac; + eval "${return_error}"; +} # _check_device_with_mode() of main_parse_args() + + +######################################################################## +# main_set_mode () +# +# Determine the display mode. +# +# Globals: +# in: $DISPLAY, $_OPT_MODE, $_OPT_DEVICE +# out: $_DISPLAY_MODE +# +# Variable prefix: msm +# +main_set_mode() +{ + func_check main_set_mode = 0 "$@"; + + # set display + if obj _OPT_DISPLAY is_not_empty + then + DISPLAY="${_OPT_DISPLAY}"; + fi; + + if obj _OPT_V is_yes + then + list_append _ADDOPTS_GROFF '-V'; + fi; + if obj _OPT_Z is_yes + then + _DISPLAY_MODE='groff'; + list_append _ADDOPTS_GROFF '-Z'; + fi; + if obj _OPT_MODE is_equal 'groff' + then + _DISPLAY_MODE='groff'; + fi; + if obj _DISPLAY_MODE is_equal 'groff' + then + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + fi; + + if obj _OPT_MODE is_equal 'source' + then + _DISPLAY_MODE='source'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + fi; + + case "${_OPT_MODE}" in + '') # automatic mode + case "${_OPT_DEVICE}" in + X*) + if is_not_X + then + error_user "no X display found for device ${_OPT_DEVICE}"; + fi; + _DISPLAY_MODE='x'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + ascii|cp1047|latin1|utf8) + if obj _DISPLAY_MODE is_not_equal 'text' + then + _DISPLAY_MODE='tty'; + fi; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + esac; + if is_not_X + then + _DISPLAY_MODE='tty'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + fi; + + if obj _OPT_DEFAULT_MODES is_empty + then + msm_modes="${_DEFAULT_MODES}"; + else + msm_modes="${_OPT_DEFAULT_MODES}"; + fi; + ;; + text) + _DISPLAY_MODE='text'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + tty) + _DISPLAY_MODE='tty'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + html) + _DISPLAY_MODE='html'; + msm_modes="${_OPT_MODE}"; + ;; + *) # display mode was given + if is_not_X + then + error_user "You must be in X Window for ${_OPT_MODE} mode."; + fi; + msm_modes="${_OPT_MODE}"; + ;; + esac; + + # only viewer modes are left + eval set x "$(list_from_split "${msm_modes}" ',')"; + exit_test; + shift; + while test "$#" -gt 0 + do + m="$1"; + shift; + case "$m" in + dvi) + if obj _OPT_VIEWER_DVI is_not_empty + then + msm_viewer="${_OPT_VIEWER_DVI}"; + else + msm_viewer="$(_get_first_prog "$_VIEWER_DVI}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for dvi mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE="dvi"; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + html) + if obj _OPT_VIEWER_HTML is_not_empty + then + msm_viewer="${_OPT_VIEWER_HTML}"; + else + if is_X + then + msm_viewers="${_VIEWER_HTML_X}"; + else + msm_viewers="${_VIEWER_HTML_TTY}"; + fi; + msm_viewer="$(_get_first_prog "${msm_viewers}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for html mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE=html; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + pdf) + if obj _OPT_VIEWER_PDF is_not_empty + then + msm_viewer="${_OPT_VIEWER_PDF}"; + else + msm_viewer="$(_get_first_prog "${_VIEWER_PDF}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for pdf mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE="pdf"; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + ps) + if obj _OPT_VIEWER_PS is_not_empty + then + msm_viewer="${_OPT_VIEWER_PS}"; + else + msm_viewer="$(_get_first_prog "${_VIEWER_PS}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for ps mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE="ps"; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + text) + _DISPLAY_MODE='text'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + tty) + _DISPLAY_MODE='tty'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + x) + if obj _OPT_VIEWER_X is_not_empty + then + msm_viewer="${_OPT_VIEWER_X}"; + else + msm_viewer="$(_get_first_prog "${_VIEWER_X}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for x mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE='x'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + X) + _DISPLAY_MODE='X'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + esac; + done; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + error_user "No suitable display mode found."; +} # main_set_mode() + + +# _get_first_prog () +# +# Retrieve first argument that represents an existing program in $PATH. +# Local function for main_set_mode(). +# +# Arguments: 1; a comma-separated list of commands (with options), +# like $_VIEWER_*. +# +# Return : `1' if none found, `0' if found. +# Output : the argument that succeded. +# +# Variable prefix: _gfp +# +_get_first_prog() +{ + if is_equal "$#" 0 + then + error "_get_first_prog() needs 1 argument."; + fi; + if is_empty "$1" + then + return "${_BAD}"; + fi; + eval set x "$(list_from_split "$1" ',')"; + exit_test; + shift; + for i + do + _gfp_i="$i"; + if obj _gfp_i is_empty + then + continue; + fi; + if eval is_prog "$(get_first_essential ${_gfp_i})" + then + exit_test; + obj _gfp_i echo1; + eval ${_UNSET} _gfp_i; + return "${_GOOD}"; + fi; + done; + eval ${_UNSET} _gfp_i; + return "${_BAD}"; +} # _get_first_prog() of main_set_mode() + + +####################################################################### +# main_do_fileargs () +# +# Process filespec arguments in $_FILEARGS. +# +# Globals: +# in: $_FILEARGS (process with `eval set x "$_FILEARGS"; shift;') +# +# Variable prefix: mdfa +# +main_do_fileargs() +{ + func_check main_do_fileargs = 0 "$@"; + special_setup; + eval set x "${_FILEARGS}"; + shift; + eval ${_UNSET} _FILEARGS; + # temporary storage of all input to $_TMP_CAT + while test "$#" -ge 2 + do + # test for `s name' arguments, with `s' a 1-char standard section + mdfa_filespec="$1"; + _FILESPEC_ARG="$1"; + shift; + case "${mdfa_filespec}" in + '') + continue; + ;; + '-') + special_filespec; + if obj _OPT_APROPOS is_yes + then + continue; + fi; + register_file '-' + continue; + ;; + ?) + if obj _OPT_APROPOS is_yes + then + special_filespec; + continue; + fi; + if list_has_not _MAN_AUTO_SEC_LIST "${mdfa_filespec}" + then + special_filespec; + do_filearg "${mdfa_filespec}" + continue; + fi; + mdfa_name="$1"; + _FILESPEC_ARG="${_FILESPEC_ARG} $1"; + special_filespec; + case "${mdfa_name}" in + */*|man:*|*\(*\)|*."${mdfa_filespec}") + do_filearg "${mdfa_filespec}" + continue; + ;; + esac; + shift; + if do_filearg "man:${mdfa_name}(${mdfa_filespec})" + then + continue; + else + do_filearg "${mdfa_filespec}" + continue; + fi; + ;; + *) + special_filespec; + if obj _OPT_APROPOS is_yes + then + continue; + fi; + do_filearg "${mdfa_filespec}" + continue; + ;; + esac; + done; # end of `s name' test + while test "$#" -gt 0 + do + mdfa_filespec="$1"; + _FILESPEC_ARG="$1"; + shift; + special_filespec; + if obj _OPT_APROPOS is_yes + then + continue; + fi; + do_filearg "${mdfa_filespec}" + done; + obj _TMP_STDIN rm_file_with_debug; + eval ${_UNSET} mdfa_filespec; + eval ${_UNSET} mdfa_name; + eval "${return_ok}"; +} # main_do_fileargs() + + +######################################################################## +# main_set_resources () +# +# Determine options for setting X resources with $_DISPLAY_PROG. +# +# Globals: $_DISPLAY_PROG, $_OUTPUT_FILE_NAME +# +# Variable prefix: msr +# +main_set_resources() +{ + func_check main_set_resources = 0 "$@"; + # $msr_prog viewer program + # $msr_rl resource list + msr_title="$(get_first_essential \ + "${_OPT_TITLE}" "${_REGISTERED_TITLE}")"; + exit_test; + _OUTPUT_FILE_NAME=''; + eval set x "${msr_title}"; + shift; + until is_equal "$#" 0 + do + msr_n="$1"; + case "${msr_n}" in + '') + continue; + ;; + ,*) + msr_n="$(echo1 "$1" | sed -e 's/^,,*//')"; + exit_test; + ;; + esac + if obj msr_n is_empty + then + continue; + fi; + if obj _OUTPUT_FILE_NAME is_not_empty + then + _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}"','; + fi; + _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}${msr_n}"; + shift; + done; + case "${_OUTPUT_FILE_NAME}" in + '') + _OUTPUT_FILE_NAME='-'; + ;; + ,*) + error "main_set_resources(): ${_OUTPUT_FILE_NAME} starts with a comma."; + ;; + esac; + _OUTPUT_FILE_NAME="${_TMP_DIR}/${_OUTPUT_FILE_NAME}"; + + if obj _DISPLAY_PROG is_empty + then # for example, for groff mode + _DISPLAY_ARGS=''; + eval ${_UNSET} msr_n; + eval ${_UNSET} msr_prog; + eval ${_UNSET} msr_rl; + eval ${_UNSET} msr_title; + eval "${return_ok}"; + fi; + + eval set x "${_DISPLAY_PROG}"; + shift; + msr_prog="$(base_name "$1")"; + exit_test; + shift; + if test $# != 0 + then + if obj _DISPLAY_PROG is_empty + then + _DISPLAY_ARGS="$*"; + else + _DISPLAY_ARGS="$* ${_DISPLAY_ARGS}"; + fi; + fi; + msr_rl=''; + if obj _OPT_BD is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-bd' "${_OPT_BD}"; + ;; + esac; + fi; + if obj _OPT_BG is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-bg' "${_OPT_BG}"; + ;; + kghostview) + list_append msr_rl '--bg' "${_OPT_BG}"; + ;; + xpdf) + list_append msr_rl '-papercolor' "${_OPT_BG}"; + ;; + esac; + fi; + if obj _OPT_BW is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + _list_append msr_rl '-bw' "${_OPT_BW}"; + ;; + esac; + fi; + if obj _OPT_FG is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-fg' "${_OPT_FG}"; + ;; + kghostview) + list_append msr_rl '--fg' "${_OPT_FG}"; + ;; + esac; + fi; + if is_not_empty "${_OPT_FN}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-fn' "${_OPT_FN}"; + ;; + kghostview) + list_append msr_rl '--fn' "${_OPT_FN}"; + ;; + esac; + fi; + if is_not_empty "${_OPT_GEOMETRY}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi|xpdf) + list_append msr_rl '-geometry' "${_OPT_GEOMETRY}"; + ;; + kghostview) + list_append msr_rl '--geometry' "${_OPT_GEOMETRY}"; + ;; + esac; + fi; + if is_empty "${_OPT_RESOLUTION}" + then + _OPT_RESOLUTION="${_DEFAULT_RESOLUTION}"; + case "${msr_prog}" in + gxditview|xditview) + list_append msr_rl '-resolution' "${_DEFAULT_RESOLUTION}"; + ;; + xpdf) + case "${_DEFAULT_RESOLUTION}" in + 75) + # 72dpi is '100' + list_append msr_rl '-z' '104'; + ;; + 100) + list_append msr_rl '-z' '139'; + ;; + esac; + ;; + esac; + else + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-resolution' "${_OPT_RESOLUTION}"; + ;; + xpdf) + case "${_OPT_RESOLUTION}" in + 75) + list_append msr_rl '-z' '104'; + # '100' corresponds to 72dpi + ;; + 100) + list_append msr_rl '-z' '139'; + ;; + esac; + ;; + esac; + fi; + if is_yes "${_OPT_ICONIC}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-iconic'; + ;; + esac; + fi; + if is_yes "${_OPT_RV}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-rv'; + ;; + esac; + fi; + if is_not_empty "${_OPT_XRM}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi|xpdf) + eval set x "${_OPT_XRM}"; + shift; + for i + do + list_append msr_rl '-xrm' "$i"; + done; + ;; + esac; + fi; + if is_not_empty "${msr_title}" + then + case "${msr_prog}" in + gxditview|xditview) + list_append msr_rl '-title' "${msr_title}"; + ;; + esac; + fi; + _DISPLAY_ARGS="${msr_rl}"; + eval ${_UNSET} msr_n; + eval ${_UNSET} msr_prog; + eval ${_UNSET} msr_rl; + eval ${_UNSET} msr_title; + eval "${return_ok}"; +} # main_set_resources + + +######################################################################## +# main_display () +# +# Do the actual display of the whole thing. +# +# Globals: +# in: $_DISPLAY_MODE, $_OPT_DEVICE, +# $_ADDOPTS_GROFF, $_ADDOPTS_POST, $_ADDOPTS_X, +# $_TMP_CAT, $_OPT_PAGER, $PAGER, $_MANOPT_PAGER, +# $_OUTPUT_FILE_NAME +# +# Variable prefix: md +# +main_display() +{ + func_check main_display = 0 "$@"; + + export md_addopts; + export md_groggy; + export md_modefile; + + if obj _TMP_CAT is_non_empty_file + then + md_modefile="${_OUTPUT_FILE_NAME}"; + else + echo2 'groffer: empty input.'; + clean_up; + eval ${_UNSET} md_modefile; + eval "${return_ok}"; + fi; + + # go to the temporary directory to be able to access internal data files + cd "${_TMP_DIR}" >"${_NULL_DEV}" 2>&1; + + case "${_DISPLAY_MODE}" in + groff) + _ADDOPTS_GROFF="${_ADDOPTS_GROFF} ${_ADDOPTS_POST}"; + if obj _OPT_DEVICE is_not_empty + then + _ADDOPTS_GROFF="${_ADDOPTS_GROFF} -T${_OPT_DEVICE}"; + fi; + md_groggy="$(tmp_cat | eval grog "${md_options}")"; + exit_test; + _do_opt_V; + + obj md_modefile rm_file; + mv "${_TMP_CAT}" "${md_modefile}"; + trap_unset; + cat "${md_modefile}" | \ + { + trap_set; + eval "${md_groggy}" "${_ADDOPTS_GROFF}"; + } & + ;; + text|tty) + case "${_OPT_DEVICE}" in + '') + md_device="$(get_first_essential \ + "${_OPT_TEXT_DEVICE}" "${_DEFAULT_TTY_DEVICE}")"; + exit_test; + ;; + ascii|cp1047|latin1|utf8) + md_device="${_OPT_DEVICE}"; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_addopts="${_ADDOPTS_GROFF} ${_ADDOPTS_POST}"; + md_groggy="$(tmp_cat | grog -T${md_device})"; + exit_test; + if obj _DISPLAY_MODE is_equal 'text' + then + _do_opt_V; + tmp_cat | eval "${md_groggy}" "${md_addopts}"; + else + md_pager=''; + for p in "${_OPT_PAGER}" "${PAGER}" "${_MANOPT_PAGER}" \ + 'less -r -R' 'more' 'pager' 'cat' + do + md_p="$p"; + if eval is_prog ${md_p} + then # no "" for is_prog() allows args for $p + md_pager="${md_p}"; + break; + fi; + done; + if obj md_pager is_empty + then + error 'main_display(): no pager program found for tty mode'; + fi; + _do_opt_V; + tmp_cat | eval "${md_groggy}" "${md_addopts}" | \ + eval "${md_pager}"; + fi; + clean_up; + ;; + source) + tmp_cat; + clean_up; + ;; + + #### viewer modes + + dvi) + case "${_OPT_DEVICE}" in + ''|dvi) do_nothing; ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}" + ;; + esac; + md_modefile="${md_modefile}".dvi; + md_groggy="$(tmp_cat | grog -Tdvi)"; + exit_test; + _do_display; + ;; + html) + case "${_OPT_DEVICE}" in + ''|html) do_nothing; ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_modefile="${md_modefile}".html; + md_groggy="$(tmp_cat | grog -Thtml)"; + exit_test; + _do_display; + ;; + pdf) + case "${_OPT_DEVICE}" in + ''|ps) + do_nothing; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_groggy="$(tmp_cat | grog -Tps)"; + exit_test; + _do_display _make_pdf; + ;; + ps) + case "${_OPT_DEVICE}" in + ''|ps) + do_nothing; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_modefile="${md_modefile}".ps; + md_groggy="$(tmp_cat | grog -Tps)"; + exit_test; + _do_display; + ;; + x) + case "${_OPT_DEVICE}" in + X*) + md_device="${_OPT_DEVICE}" + ;; + *) + case "${_OPT_RESOLUTION}" in + 100) + md_device='X100'; + if obj _OPT_GEOMETRY is_empty + then + case "${_DISPLAY_PROG}" in + gxditview|xditview) + # add width of 800dpi for resolution of 100dpi to the args + list_append _DISPLAY_ARGS '-geometry' '800'; + ;; + esac; + fi; + ;; + *) + md_device='X75-12'; + ;; + esac + esac; + md_groggy="$(tmp_cat | grog -T${md_device} -Z)"; + exit_test; + _do_display; + ;; + X) + case "${_OPT_DEVICE}" in + '') + md_groggy="$(tmp_cat | grog -X)"; + exit_test; + ;; + X*|dvi|html|lbp|lj4|ps) + # these devices work with + md_groggy="$(tmp_cat | grog -T"${_OPT_DEVICE}" -X)"; + exit_test; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + md_groggy="$(tmp_cat | grog -Z)"; + exit_test; + ;; + esac; + _do_display; + ;; + *) + error "main_display(): unknown mode \`${_DISPLAY_MODE}'"; + ;; + esac; + eval ${_UNSET} md_addopts; + eval ${_UNSET} md_device; + eval ${_UNSET} md_groggy; + eval ${_UNSET} md_modefile; + eval ${_UNSET} md_options; + eval ${_UNSET} md_p; + eval ${_UNSET} md_pager; + eval "${return_ok}"; +} # main_display() + + +######################## +# _do_display ([]) +# +# Perform the generation of the output and view the result. If an +# argument is given interpret it as a function name that is called in +# the midst (actually only for `pdf'). +# +# Globals: $md_modefile, $md_groggy (from main_display()) +# +_do_display() +{ + func_check _do_display '>=' 0 "$@"; + _do_opt_V; + if obj _DISPLAY_PROG is_empty + then + trap_unset; + { + trap_set; + eval "${md_groggy}" "${_ADDOPTS_GROFF}" "${_TMP_CAT}"; + } & + else + obj md_modefile rm_file; + cat "${_TMP_CAT}" | \ + eval "${md_groggy}" "${_ADDOPTS_GROFF}" > "${md_modefile}"; + if is_not_empty "$1" + then + eval "$1"; + fi; + obj _TMP_CAT rm_file_with_debug; + if obj _VIEWER_TERMINAL is_yes # for programs that run on tty + then + eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\""; + else + case "${_DISPLAY_PROG}" in +# lynx\ *|less\ *|more\ *) # programs known to run on the terminal +# eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\""; +# ;; + *) + trap_unset; + { + trap_set; + eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\""; + } & + ;; + esac; + fi; + fi; + eval "${return_ok}"; +} # _do_display() of main_display() + + +############# +# _do_opt_V () +# +# Check on option `-V'; if set print the corresponding output and leave. +# +# Globals: $_ALL_PARAMS, $_ADDOPTS_GROFF, $_DISPLAY_MODE, $_DISPLAY_PROG, +# $_DISPLAY_ARGS, $md_groggy, $md_modefile +# +# Variable prefix: _doV +# +_do_opt_V() +{ + func_check _do_opt_V '=' 0 "$@"; + if obj _OPT_V is_yes + then + _OPT_V='no'; + echo1 "Parameters: ${_ALL_PARAMS}"; + echo1 "Display mode: ${_DISPLAY_MODE}"; + echo1 "Output file: ${md_modefile}"; + echo1 "Display prog: ${_DISPLAY_PROG} ${_DISPLAY_ARGS}"; + a="$(eval echo1 "'${_ADDOPTS_GROFF}'")"; + exit_test; + echo1 "Output of grog: ${md_groggy} $a"; + _doV_res="$(eval "${md_groggy}" "${_ADDOPTS_GROFF}")"; + exit_test; + echo1 "groff -V: ${_doV_res}" + leave; + fi; + eval "${return_ok}"; +} # _do_opt_V() of main_display() + + +############## +# _make_pdf () +# +# Transform to pdf format; for pdf mode in _do_display(). +# +# Globals: $md_modefile (from main_display()) +# +# Variable prefix: _mp +# +_make_pdf() +{ + func_check _do_display '=' 0 "$@"; + _mp_psfile="${md_modefile}"; + md_modefile="${md_modefile}.pdf"; + obj md_modefile rm_file; + if gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \ + -sOutputFile="${md_modefile}" -c save pop -f "${_mp_psfile}" + then + :; + else + error '_make_pdf: could not transform into pdf format.'; + fi; + obj _mp_psfile rm_file_with_debug; + eval ${_UNSET} _mp_psfile; + eval "${return_ok}"; +} # _make_pdf() of main_display() + + +######################################################################## +# main (*) +# +# The main function for groffer. +# +# Arguments: +# +main() +{ + func_check main '>=' 0 "$@"; + # Do not change the sequence of the following functions! + landmark '13: main_init()'; + main_init; + landmark '14: main_parse_MANOPT()'; + main_parse_MANOPT; + landmark '15: main_parse_args()'; + main_parse_args "$@"; + landmark '16: main_set_mode()'; + main_set_mode; + landmark '17: main_do_fileargs()'; + main_do_fileargs; + landmark '18: main_set_resources()'; + main_set_resources; + landmark '19: main_display()'; + main_display; + eval "${return_ok}"; +} + + +######################################################################## + +main "$@"; diff --git a/contrib/mm/ChangeLog b/contrib/mm/ChangeLog new file mode 100644 index 0000000..51c06e7 --- /dev/null +++ b/contrib/mm/ChangeLog @@ -0,0 +1,679 @@ +Thu May 26 08:23:40 2005 Werner LEMBERG + + * m.tmac: Load devtag.tmac. + +Wed Mar 16 06:56:02 2005 Larry Kollar + + Add rudimentary support for grohtml. + + * m.tmac (H): Call DEVTAG-NH and DEVTAG-EO-H. + (pg@enable-trap, pg@header): Do nothing for devhtml. + +Sun Mar 7 16:34:46 2004 Jeff Conrad + + * m.tmac (S): Improve debug message. + +Wed Mar 05:38:57 2004 Joergen Haegg + + * Changed default value for Hy in manual to 0 + * Check Hy at each new page + +Mon Mar 1 22:16:38 2004 Jeff Conrad + + * m.tmac (S): Fix scaling indicator for vertical spacing. + +Tue Nov 05:14:45 2003 Joergen Haegg + + * another patch from ulrich lauther to fix the + TOC up to 14 heading levels. + +Mon Oct 13:48:25 2003 Joergen Haegg + + * problem with more than 7 levels of headings fixed with + patch from ulrich lauther. + +Wed Apr 06:42:35 2003 Joergen Haegg + + * the footer was not adjusted by VM due to a missing + pg*extra-footer-size in the calculation of pg*last-pos + +Wed Apr 06:04:58 2003 Joergen Haegg + + * space adjustments in 4.MT to make it more like + the original + +Sun Mar 21:45:10 2003 Joergen Haegg + + * removed error check i 4.MT, .AF is not mandatory anymore + +Sat Mar 21:56:57 2003 Joergen Haegg + + * cov*firm now defined only if arg to AF is non-empty + That will also enable cov*default-firm from the mm locale-file + to work. + +Sat Mar 21:05:29 2003 Joergen Haegg + + * added .ll in pg@set-env to initialize the + header environment properly + +Wed Mar 19 23:02:16 2003 Werner LEMBERG + + * groff_mm.man: Some fixes from Robert D. Goulding + . + +Wed Sep 09:53:06 2002 Joergen Haegg + + * added implicit -mm to mmroff, it's now possible + to use mmroff with or without -mm as argument. + +Thu Aug 08 00:31:00 Bob Diertens + + * m.tmac (VM): Add missing backslash. + +Fri Jun 10:37:58 2002 Joergen Haegg + + * added init@reset for LT-macros so .S works for letters + +Thu May 06:30:06 2002 Joergen Haegg + + * adding -T to VM for setting the total + header and footer size. + * changing pg*extra-header-size unit from v to u in DS-size + calculation + +Mon May 05:40:16 2002 Joergen Haegg + + * All lists now get an empty line before the list + even if there is no empty lines between the items (bug in LB) + +Sat May 07:36:08 2002 Joergen Haegg + + * PIC is now drawn 1v higher, making it + possible to put a picture at 0,0. + * Indentbug in P fixed, Pt=2 now behaves as it should + +Wed May 10:18:26 2002 Joergen Haegg + + * added L, W and O in groff_mm.man + * extra space in expression removed in EPIC + * EPIC can leftadjust with -L + * EPIC was drawing 1v down + * forgot to add mmse.tmac and mm.tmac to cvs + +Fri May 20:35:32 2002 Joergen Haegg + + * Clarified manual about INITR + * Added mm.tmac and mmse.tmac wrappers + * Fixed bug in mmroff so a .qrf-file always will be created + * .EQ mark was not correctly positioned anymore. + * changed SP to sp in DS/DE to further correct .EQ + +Sun Dec 9 00:00:00 2001 Werner LEMBERG (wl@gnu.org) + + * Makefile.sim, groff_mm.man, groff_mmse.man: Minor fixes. + * mmroff.man: This is a section 1 man page. + Minor fixes. + * Makefile.sub: Install mmroff.man in section 1. + +Wed Nov 28 00:00:00 2001 Werner LEMBERG (wl@gnu.org) + + * m.tmac: Assure that the macro package is loaded only once. + +Wed Sep 5 00:00:00 2001 Werner LEMBERG (wl@gnu.org) + + * m.tmac: Enable all warnings only if no -W or -w option is given on + the command line (or rather, if only the default warnings are + set). + +Mon Sep 3 00:00:00 2001 Werner LEMBERG (wl@gnu.org) + + * groff_mm.man: Don't use .ne for TTY devices. + +Thu Jul 26 00:00:00 2001 Werner LEMBERG (wl@gnu.org) + + * groff_mm.man: Start always a new line after end of sentence. Add + some compatibility info to the HF variable. + +Thu Jul 26 00:00:00 2001 Larry Jones (larry.jones@sdrc.com) + + * m.tmac: Fix initialization of Hps1 and Hps2. + +Wed May 16 00:00:00 2001 Bruce Lilly (blilly@erols.com) + + * m.tmac (TH): Fix incorrect error message. + +Thu Apr 12 00:00:00 2001 Ruslan Ermilov (ru@FreeBSD.org) + + * groff_mm.man: Fixing some typos. + +Mon Mar 5 09:30:18 2001 Jörgen Hägg (jh@axis.com) + + * S didn't reset to default point size + * (dummy line to force cvs update...) + +Sat Jan 06 10:30:00 2001 Werner LEMBERG (wl@gnu.org) + + * Fixed assignment of page offset given as a command line argument. + +Fri Nov 17 05:34:17 2000 Jörgen Hägg (jh@axis.com) + + * Renamed tmac.m and tmac.mse to m.tmac and mse.tmac + +Thu Sep 14 05:52:48 2000 Jörgen Hägg (jh@axis.com) + + * New Changelog-format, it will show changes better. + Easier for other to use. (Somehow I didn't really + understand why the e-mail address was supposed to be + 'jh at axis.com' in the Changelog. :-) + +Mon Aug 28 00:00:00 2000 Bruno Haible (haible at clisp.cons.org) + + * Makefile.sub: New target 'all', makes all prerequisites of + 'install'. + +Thu Sep 7 06:17:42 2000 Jörgen Hägg (jh at axis.com) + + * version 2.0 + * Had to do something about my version numbering. + The main CVS archive was not in sync with mine. + So, now it is 2.0. :-) + +Sat Jun 17 23:00:00 2000 Eli Zaretskii (eliz@is.elta.co.il) + + * Makefile.sim (.man.n): Replace `;' with `|', since DOS/Windows + path lists use the semicolon as a separator. + +Sun Jun 4 21:39:00 2000 Kaneda Hiroshi (vanitas at ma3.seikyou.ne.jp) + + * Fixing a lot of typos in groff_mm.man + +Tue Mar 7 00:00:00 2000 OKAZAKI Tetsurou (okazaki at be.to) + + * Makefile.sub: Use $(INSTALL_SCRIPT) for script files. + +Sun Jan 30 22:52:20 2000 Jörgen Hägg (jh at axis.com) + + * version 1.34 + * Changed the version number in the CVS repository + * MC had a bug in column calculation, (thanks to T. Kurt Bond) + +Fri Sep 3 07:33:14 1999 Jörgen Hägg (jh at axis.com) + + * version 1.33 + * At last! I finally tracked down the PGFORM bug! + It didn't setup the @pl, @ll and @po as it should, now it does. + * mgm_ref/mgm_roff renamed to mmroff [-x] + * fixed y2k-bug in \*[DT] + * \n[cov*year] removed, hope noone used that. + * ISODATE added with Iso as command line flag + (iso-date suggested by Paul Eggert) + * Added ISODATE to tmac.mse and removed local settings + of new-date. + * INITI syntax changed and enhanced. Index processing is now + done with mmroff. + * A few examples has been added, new subdirectory 'examples'. + * Fixed bug with SETR, header references are now only saved + when Ref > 0 + * Problem with register H1h fixed + * Added test for missing abstract in 4.MT + * Updated Makefile.sub, using tmac_m_prefix. + +Mon Mar 15 22:22:42 1999 Jörgen Hägg (jh at axis.com) + + * OK, let's release this as a beta, 1.33 will be better. :-) + * version 1.32 + * fixed .el-error + * Added number variable Hss + * Changed Hps1 and Hps2 to units + * added hd*h1-text to be used in user defined macro TP. + * -U needed for SETR (I really need 'mv', 'echo', 'rm' + and 'test' builtin!) + * Rewritten the reference system, SETR now prints to stderr + if the number register Qrf > 0. Store in the filename + that is the argument to .INITR + The old behaviour is returned if number register Initr > 0. + * Fixed bug with List of XXXX, long lines messed up the result. + * added number register H1dot. + * added string variable H1txt + * added string variable Tcst + * added number register Dsp. + * added alias APPX for user-defined appendix title. + * added string variable Apptxt + * added H1h for use in TP in headers + * added macro EPIC + * added macro PIC (safe replacement for PSPIC) + * fixed Hps-bug, should be 1, not 1v. + * fixed bug with APPSK, variable not set. + +Wed Feb 4 15:46:04 1998 Jörgen Hägg (jh at axis.se) + + * version 1.31 + * .LI will now honor a space mark. + * Another fix for .AU to let it be used without arguments. + * uninitialized eq*label fixed + +Fri Sep 6 07:13:07 1996 Jörgen Hägg (jh at axis.se) + + * version 1.30 + * This is more like a beta-release, bugs might pop up. :-) + * last line in TOC was not correctly terminated (missing .br) + * changed the indentation for displays, it will now + indent to the current indent, not the one at the definition + of the display. + * Equation marks should now work better, indentation also. + * included these bug fixes from Larry Jones: + * The documentation for the argument to .AS was incorrect for MT 4. + * \*(EM should be a double-dash for nroff. + * \nS is in points, not units. + * If \nO isn't set, the default page offset should be .75i for nroff + and .963i for troff. + * .S D should set the point size to \nS, not 10. + * .S was setting the vertical spacing based on the old point size + instead of the new point size. + * Got rid of a spurrious .br that prevented run-in headings from + working. + * Reset the .SP counters in pg@header so that spacing on one page + won't affect spacing on subsequent pages. + * Allow .AU and .AF with no arguments (real mm does, even though it + isn't documented). + * Do .init@reset first thing to initialize the default environment. + * For MT 4, the title should be 4 points larger than the default size, + not 12 point. + * The cover environment needs to be initialized. + * Printing the abstract on the first page needs to be controlled by + the .AS argument. + * Heading eject should be suppressed if the heading immediately + follows the first page stuff (title, author, etc.). + * support for table of contents numbering style (.nr Oc) + * changes the troff empty line height from .25v to .5v + * fixed section page numbering + * fixed a really nasty bug in footnotes that could cause you + to lose the page footer completely if the very first + footnote on the page occurred at just the wrong place + + +Wed May 15 07:39:32 1996 Jörgen Hägg (jh at axis.se) + + * version 1.29 + * Syntax and scaling errror fixed, (thanks to Frazer Williams) + * DF/DE will now do a line-break before printing the display. + * Updated the manual for TB,FG,EX and EC. + * Added support for the ms- (and mgs-)macro .IX + * Added indexmacro IX, INITI, IND and INDP, support for + TXIND, TYIND and TZIND. + * PGFORM will now always really reset to the default + values for unspecified arguments. + * Floating displays tested and repaired, it should + now (finanlly) work exactly as the original (I hope :-). + * Should now set year correctly even after 2000. + * Stupid bug in PGNH fixed. + * Corrected line length for figure caption (FG and friends) + + +Mon Apr 24 07:37:52 1995 Jörgen Hägg (jh at axis.se) + + * version 1.28 + * Added AVL (AV without date) + * Fixed nroff scaling for W and L. + * Added support for register E and roman/bold + for all Subject/Date/From strings. + * Added support for register C (1-4), (for DRAFTs and other types) + * Will protest if not used with groff. + * Change of the internal number registers @ps and @vs, they + are now in units, and is set in the new macros .@ps and .@vs. + @ps and @vs is now corrected to the real point and vertical size. + * Macro EQ has now correct pointsize. + * Figures should now get the right page number in the index. + * User-defined macros can now be defined for list of + figures, tables, equations and exhibits (T{X,Y}{FG,TB,EC,EX}. + * Space may be omitted between prefix and mark in automatic lists (.AL) + See .LI + +Tue Jan 10 07:51:37 1995 Jörgen Hägg (jh at axis.se) + + * version 1.27 + * Manual updated + * More bugs fixed in DS/DF + * added alias for :g + * LC can now be used without argument (as the manual says. :-) + * Register :R now supported (RS/RF) + * footnote line was printed even if there was no room for + any footnotes. Fixed. + * Fixed 1C so that it can be used without page eject + * Added support for EOP (TPs twin) + * Hyphenation turned off by default. (Hy == 0) + +Fri Nov 4 08:14:50 1994 Jörgen Hägg (jh at axis.se) + + * version 1.25 + * DS/DF separated and several bugs fixed. Watch out for new though. :-) + * string DT was emptied by mistake in the previous version. + * RD made prettier. + * typo in AV and let@print-head fixed. + +Mon Oct 31 08:19:24 1994 Jörgen Hägg (jh at axis.se) + + * version 1.24 + * Bug fixed and format extended in .SG and .FC. + * date is always printed unless .ND without argument is used. + (I wonder what's the right thing to do, this might change.) + * Swedish letter-standards implemented in tmac.mse. + * .ND can be used to turn off the date. (Empty argument) + +Mon Oct 31 08:14:09 1994 Jörgen Hägg (jh at axis.se) + + * version 1.23 + * An attempt to get in sync with RCS. This is the distributed + version. + +Thu Oct 27 08:29:34 1994 Jörgen Hägg (jh at axis.se) + + * version 1.22 + * (version 1.21 lost... :-) + * Letter macros added!! + * The following macros are added: + * AV, FC, IA ,IE, LT, LO, NE, NS, SG, WA, WE + * nP also added. + +Tue Dec 14 16:26:36 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.20 + * spelling-corrections + * Makefile.sim updated to the correct version, and a uninstall + target added. + * @cur-lib removed from tmac.m (obsolete) + * fixed check for references i .TC, .RP now resets the flag correctly. + * floating display should now be printed if there is space. + * first version using RCS. I've been avoiding version control until it + became necessary. + * WC WD now works in two-column-mode. + +Tue Sep 7 08:37:00 1993 Jörgen Hägg (jh at efd.lth.se) + + * version 1.19 + * .lt is called in the header for .TP also. + * Variable Pgps added to control the header and footer point-size. + * Error-text printed with .APP removed. + * Error with .FG, .TB, .EC and .EX indentation fixed. + * header and footer line-length is not changed by MC or 2C. + * Default for page-length and page-offset is now taken from + \n[.p] and \n[.o]. + * Argument to .ab (abort) is supplied. + * Argument to .1C added. + * Argument to .PGFORM added. + * RP/RS/RF totally rewritten. Should work with 2C now. + +Fri Apr 23 10:37:25 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.18 + * Height of display is now more exactly calculated. + * tabs and blankspaces where wrong in .VERBON. + * error in manual for escape-character in VERBON. + * Makefile.sub: installed tmac.m as tmac.m and tmac.mse + * Installation of tmac.mse now supports TMAC_M. + * bug with N fixed. + +Mon Apr 5 09:36:01 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.17 + * MULB preserves size. + * bug in VERBON fixed, causing strange errors. + * section-page footer fixed. + * added support for numberregister S + * fixed bug with floating displays wich made floats to + generate space on a page, but broke page anyway. + * end-of-page trap reinstalled. + +Mon Mar 29 10:53:13 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.16 + * MUL* now use the previous font and family. + * extra blank page at end-of-text eliminated. + +Mon Mar 8 10:27:47 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.15 + * Didn't restore pointsize to current size in .H. + * B1/B2 did not work with indent. (MULE and friends) + * fixed old problem with trailing empty pages. + +Fri Mar 5 15:20:49 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.14 + * Sigh. Amazing what a missing \} can do. If the string + HP was set, then all text disappeared... + +Fri Mar 5 14:12:43 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.13 + * Fixed bug with handling ps/vs in .H. (again, sigh... ) + +Wed Mar 3 09:21:20 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.12 + * Line-break added to PGFORM. + * added more features to VERBON + * .S is not used anymore in H, it caused confusion with + normal text, but it will still set .vs. + * SK was broken, will now produce the requested number of + empty pages. + * dotted lines added to LIST OF FIGURES adn friends. + Also better linespacing. + +Mon Feb 22 12:41:06 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.11 + * missing left-parenthesis gave ") .sp" when N=4. + * N=4 removed user-specified header also. + * MOVE made linelength pageoffset wider than wanted. + * fixed (again) parenthesis in RP. + +Thu Jan 21 12:10:39 1993 Joergen Haegg (jh at efd.lth.se) + + * version 1.10 + * changed PROG_PREFIX to g in the manual-pages. + * Better check if new page is needed in .H, when Ej>0. + * Usage of variable Lsp now more complete. + * Space added in TOC when mark is equal to size. + * Usermacro HY moved after font-calulations. + * .S used instead of .ps, which will use .vs correct. + * Now possible to set Hps1/2 inside HX. + * .FD "" 1 is now fixed. + * section-page numbering bug fixed. + * several bugs in VERBON/OFF fixed. + +Tue Dec 8 16:43:15 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.09 + * N==4 gives no default header + +Sat Nov 21 14:28:20 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.08 + * Escape-character disabled between + VERBON/VERBOFF (turned on by an argument). + Pointsize and fontchange also added as arguments. + * MULB, MULN and MULE added to get multicolumn output + with different width. + * Number register N can now use 1-5. + * Register Sectp and Sectf added. + * Register P is now updated correctly for "section-page" numbering. + +Thu Nov 19 11:19:33 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.07 + * .OP fixed to eject a blank page if not odd. + +Fri Nov 13 09:46:09 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.06 + * Macro TL rewritten. TL depends now on a following .AU. + * NOTES updated. + * .lt is now used more frequent when linelength is changed. + * macro AST added. + * removed PH/EH/OH not needed in ?.MT. + +Wed Oct 28 14:35:43 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.05 + * .VM implemented. + * Possible bug in page heading fixed. Changed .sp to 'sp in HEADER. + +Thu Aug 20 13:56:31 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.04 + * page-break in .EQ moved. + * changed unit for footer-size and header-size from units to lines. + Fixes problems with .S and page-breaks. + * \n[%] is now treated as a string, wich makes it possible + to assign new formats to it. Unfortunately, it was necessary + to change the page-number-variable in GETPN to a string. + * Makefile.sub included. (Thank you, James) + +Thu May 7 16:14:10 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.03 + * Typo and centering in DS/DE fixed. + Even and odd pageheaders were reversed. + * LI: pad and mark-indent was lost in some earlier versions. Now fixed. + * fixed bug in reference to .FG, .TB, ... + * APP did not clear headercounters. + * Pointsize in titles is now only set at the beginning and + when PH, PF, OH, OF, EH and EF are used. + +Thu May 6 16:01:35 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.02 + * OP fixed. + +Fri Mar 6 09:36:09 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.01 + * two .LI without text between should not be printed + on the same row. Now fixed. + * figure titles and friends fixed, now possible with many .FG + in a DS/DE. Didn't always position correctly in previous version, + but is now always printed as it should. + * Makefile fixed for Ultrix. + * DS/DF could not handle empty arguments correct + * Missing .br i EQ added. + +Sat Jan 25 15:47:21 1992 Joergen Haegg (jh at efd.lth.se) + + * version 1.00 + * No betaversion anymore! + * Fixed headernumbers within appendixes. + * DS did not keep the same font as before DS. + * mmse did a line break. + +Fri Jan 24 14:38:16 1992 Joergen Haegg (jh at efd.lth.se) + + * version 0.16 + * bug in TC, multiple line headers did not wrap correctly. + * added support for mm/locale and mm/language_locale. + * cov*default-firm in locale sets name of firm in the MT covers. + * cov*location-xxxx in locale sets location xxxx to the contents + of cov*location-xxxx. Used in the MT covers. + * hanging indent in lists fixed. + * use larger empty lines if .nroff is defined. + * macros, like .P, can now be used inside abstracts. + * .S do not reset indentation anymore. + * .RS aA now sets a string, not an integer. + * appendix with .APP or .APPSK added. + +Thu Nov 28 22:00:59 1991 Joergen Haegg (jh at efd.lth.se) + + * version 0.15 + * Fixed .AU in MT 0-3, added support for variable Au. + * Bug in the positioning of the foot-notes. + * lists not indented properly. + * Hps1 and Hps2 added. + * COVER had to have an argument. + * table of contents can now have multiline header. + * .HU now increments headingvariable H? + * added the inclusion of a locale file. + +Sat Nov 23 14:40:17 1991 Joergen Haegg (jh at efd.lth.se) + + * version 0.14 + * bug when using -rO fixed. + * MT 1-4 added. + * default is now MT 1 + * .EQ/.EN can be used outside of .DS/.DE without complaints. But + I don't recommend it. Neither does the DWB books. + * LI don't break lines now if arg too big. + * PGFORM did not reset indent. + * Added the numbervariable Hps. + * Rewritten and added MT 0-5 + "string". + * Added TM. + * Indent to AS added + +Wed Nov 6 15:18:40 1991 Joergen Haegg (jh at efd.lth.se) + + * version 0.13 + * ds*format nod defined if PS/PE is used without DS/DE. + * GETST added, fourth argument to EX, FG, TB and EC added. + +Mon Nov 4 13:38:01 1991 Joergen Haegg (jh at efd.lth.se) + + * version 0.12 + * Fixed C,D,P,+-size in .S + +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * Next version will have ChangeLog entries... + * Bug in INITR fixed. + * VERBON/VERBOFF added to include programlistings + * Bug in .DE fixed, addition overflow +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * spelling error in month-names. + * WC should work now (no warranty :-) + * FD almost finished, some details missing. + * incorrect calculation of foot-notes fixed. + * DS/DE did not break page when the size was smaller than the paper + * Forward/backward referencesystem added. Se .INITR in README. + * mgmsw changed name to mgmse. +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * embarrassing bug in .P fixed + * .H did always eject page, now fixed. + * lost floating displays now found. + * accents added (from mgs) + * empty line in .EQ/.EN removed + * indentation in .TC corrected. + * indentation of DS/DE in lists fixed. + * .TB and friends now work inside DS/DE and outside. + * .WC partially implemented (WF and WD). Still working on it. + * .mso used if version>=1.02 +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * register P was not working. + * support for register Fg, Tb, Ec and Ex. + * list items was left on the previous page at a page break. + * tlevel in .TC now defaults to 2. + * string DT, EM and Tm supported. + * new macro: PGNH, see comments. + * bug in MOVE fixed. + * pagenumber in .TC fixed. + * a blank page was ejected if Ej==1, now fixed + * bug in floating display fixed (did break and SP wrong) + * bug in .SP fixed, no lines is now printed at top of page + * There are still problems with footnotes and displays in two column mode. +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * register P added (same as %) + * bug in floating displays fixed + * MOVE added + * MT added, see comment below + * COVER/COVEND added + * fixed bug in figure titles + * extended S, se comment below + * MT 0 added + * ms-cover added (COVER ms) +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * bugs in RD and comb. fonts fixed +Sun Jan 1 00:00:00 1991 Joergen Haegg (jh at efd.lth.se) + * HC added + * Combined fonts (IB,BI...) + * HM added + * RD added + * OP added + * TP&PX supported + * warnings for unimplemented macros diff --git a/contrib/mm/Makefile.sim b/contrib/mm/Makefile.sim new file mode 100644 index 0000000..2c645be --- /dev/null +++ b/contrib/mm/Makefile.sim @@ -0,0 +1,66 @@ +# +# $Id: Makefile.sim,v 2.3 2002/05/22 06:26:12 jhaegg Exp $ +# +# To install mgm separately as gm.tmac: +# make -f Makefile.sub tmacdir=/usr/local/lib/groff/tmac srcdir=. \ +# INSTALL_DATA='install -m 644' tmac_m=gm install +# +# or as m.tmac: +# +# tmacdir is the destination for your groff/tmac-directory, srcdir is +# this directory and INSTALL_DATA is the command to install a file with. +# If you dont have 'install': use 'cp'. + + +# change this to whatever you like +tmacdir=/usr/local/lib/groff/tmac +#tmac_m = gm +tmac_m = m +indexdir = xx +install = install -m 644 + +# Do not change anything below this line +srcdir = . +version = 2.8 +mdate = 2002-05-11 + +.SUFFIXES: .n .man + +all: + + +install: groff_mm.n groff_mmse.n + $(MAKE) -f Makefile.sub tmacdir=$(tmacdir) srcdir=$(srcdir) \ + INSTALL_DATA='$(install)' tmac_m=$(tmac_m) install + +uninstall: groff_mm.n groff_mmse.n + $(MAKE) -f Makefile.sub tmacdir=$(tmacdir) srcdir=$(srcdir) \ + INSTALL_DATA='$(install)' tmac_m=$(tmac_m) uninstall_sub + + +.man.n: + @echo Making $@ from $< + @-rm -f $@ + @sed -e "s|@HYPHENFILE@|$(hyphenfile)|g" \ + -e "s|@FONTDIR@|$(fontdir)|g" \ + -e "s|@FONTPATH@|$(fontpath)|g" \ + -e "s|@MACRODIR@|$(tmacdir)|g" \ + -e "s|@MACROPATH@|$(tmacpath)|g" \ + -e "s|@DEVICE@|$(DEVICE)|g" \ + -e "s|@DEFAULT_INDEX@|$(indexdir)/$(indexname)|g" \ + -e "s|@DEFAULT_INDEX_NAME@|$(indexname)|g" \ + -e "s|@INDEX_SUFFIX@|$(indexext)|g" \ + -e "s|@COMMON_WORDS_FILE@|$(common_words_file)|g" \ + -e "s|@MAN1EXT@|$(man1ext)|g" \ + -e "s|@MAN5EXT@|$(man5ext)|g" \ + -e "s|@MAN7EXT@|$(man7ext)|g" \ + -e "s|@TMAC_S@|$(tmac_s)|g" \ + -e "s|@TMAC_M@|$(tmac_m)|g" \ + -e "s|@TMAC_MDIR@|$(tmacdir)/mm|g" \ + -e "s|@BROKEN_SPOOLER_FLAGS@|$(BROKEN_SPOOLER_FLAGS)|g" \ + -e "s|@VERSION@|$(version)|g" \ + -e "s|@MDATE@|$(mdate)|g" \ + -e "s|@g@|$(g)|g" \ + -e "s!@G@;`echo $(g) | tr [a-z] [A-Z]`!g" \ + $< >$@ + diff --git a/contrib/mm/Makefile.sub b/contrib/mm/Makefile.sub new file mode 100644 index 0000000..40b7707 --- /dev/null +++ b/contrib/mm/Makefile.sub @@ -0,0 +1,62 @@ +# +# $Id: Makefile.sub,v 2.3 2002/05/22 06:26:12 jhaegg Exp $ +# +PROG=mmroff +MAN1=\ + mmroff.n +MAN7=\ + groff_mm.n \ + groff_mmse.n +FILES=0.MT 5.MT 4.MT ms.cov se_ms.cov +# Local configuration files with default values. +LOCALE=locale se_locale +CLEANADD=temp + +all: mmroff + +install: install_mm + +install_mm: install_mmroff install_m + -test -d $(tmacdir)/mm || $(mkinstalldirs) $(tmacdir)/mm + -for f in $(FILES); do \ + rm -f $(tmacdir)/mm/$$f; \ + $(INSTALL_DATA) $(srcdir)/mm/$$f $(tmacdir)/mm/$$f; \ + done + -for f in $(LOCALE); do \ + test -f $(tmacdir)/mm/$$f || touch $(tmacdir)/mm/$$f; \ + done + +install_m: + -test -d $(tmacdir) || $(mkinstalldirs) $(tmacdir) + -rm -f $(tmacdir)/tmac.$(tmac_m_prefix)m + -rm -f $(tmacdir)/$(tmac_m_prefix)m.tmac + $(INSTALL_DATA) $(srcdir)/m.tmac $(tmacdir)/$(tmac_m_prefix)m.tmac + @sed -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \ + $(srcdir)/mse.tmac > $(tmacdir)/$(tmac_m_prefix)mse.tmac + @sed -e "s;^.mso mse.tmac;.mso $(tmac_m_prefix)mse.tmac;g" \ + $(srcdir)/mmse.tmac > $(tmacdir)/$(tmac_m_prefix)mmse.tmac + @sed -e "s;^.mso m.tmac;.mso $(tmac_m_prefix)m.tmac;g" \ + $(srcdir)/mm.tmac > $(tmacdir)/$(tmac_m_prefix)mm.tmac + +install_mmroff: mmroff + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -rm -f $(bindir)/mmroff + $(INSTALL_SCRIPT) mmroff $(bindir)/mmroff + +mmroff: mmroff.pl + -rm -f $@ + -sed -e 's;/usr/bin/perl;$(PERLPATH);' $(srcdir)/mmroff.pl >$@ + -chmod +x $@ + +uninstall_sub: + -for f in $(FILES); do rm -f $(tmacdir)/mm/$$f; done + -for f in $(LOCALE); do \ + test -s $(tmacdir)/mm/$$f || rm -f $(tmacdir)/mm/$$f; \ + done + -rm -f $(tmacdir)/tmac.$(tmac_m_prefix)m + -rm -f $(tmacdir)/$(tmac_m_prefix)m.tmac + -rm -f $(tmacdir)/$(tmac_m_prefix)mm.tmac + -rm -f $(tmacdir)/$(tmac_m_prefix)mse.tmac + -rm -f $(tmacdir)/$(tmac_m_prefix)mmse.tmac + -rmdir $(tmacdir)/mm + -rm -f $(bindir)/mmroff diff --git a/contrib/mm/NOTES b/contrib/mm/NOTES new file mode 100644 index 0000000..7643c10 --- /dev/null +++ b/contrib/mm/NOTES @@ -0,0 +1,105 @@ +###################################################################### +$Id: NOTES,v 2.0 2000/09/14 03:40:24 jhaegg Exp $ + +Beware! +This may be old information. Trust only the source. :-) + +Implementation notes. (Or how to make your own national mm) + +Different commands: + +COVER [arg] +MT [arg [addressee]] +The arg is part of a filename in mm/*.MT or mm/*.cov. +This file is read when the macro is executed. Therefore it must be +put before any text output. +In each file there are definitions of all extra macros needed for the +cover sheet. MT files is only for compatibility reasons, and has several +limits due to that it don't know when the cover starts, and cannot +change sizes. Use COVER for new coversheet macros. + +But with MT it is possible to write all of the AT&T covers. +An example can be found in mm/0.MT. + +When writing a new cover using COVER, have in mind that the cover +should print the page with the COVEND macro. This macro +should be defined by the new macrofile. + +Here is a part of ms.cov: +> .\"----------------- +> .de COVEND +> .sp |4.2c +> .cov@print-title +> .cov@print-authors +> .cov@print-firm +> .cov@print-abstract +> .cov@print-date +This is important, since COVER disables the page header. +> .pg@enable-top-trap +Should begin with page one (normally). +> .bp 1 +And enable the trap at the page footer. +> .pg@enable-trap +> .. + +######################### + +Variables for covers: +I = integer +S = string +D = diversion +M = macro + +Name Type Desc. +cov*au I The number of authors. + +cov*title M Title collected with .TL. + +cov*au!x!y S Author(s) given to .AU +cov*at!x!y S Author(s) title given to .AT + x is the author-index [1-cov*au], + y is the argument-index [1-9]. + Look at the table with indexes. + +cov*firm I Author(s) firm. + +cov*abs-arg I Argument to abstract. + +cov*abs-ind I Indent for abstract. + +cov*abs-name S The string 'ABSTRACT', changed with .AST + +cov*abstract M The abstract. + +cov*new-date S The date (todays date if ND is not used) + +cov*mt-type S MT type +cov*mt-addresse S MT addressee + + +########################## +Argument-index for cov*au: + +Index Desc. +1 name +2 initials +3 location +4 department +5 extension +6 room +7 arg 7 +8 arg 8 +9 arg 9 + +The location is set to the contents of string cov*location-xxxx +if location is equal to xxxx and cov*location-xxxx is defined +in the file locale. + + +Argument-index for cov*at: + +Index Desc. +1 title 1 +. . +. . +9 title 9 diff --git a/contrib/mm/README b/contrib/mm/README new file mode 100644 index 0000000..d755f02 --- /dev/null +++ b/contrib/mm/README @@ -0,0 +1,31 @@ + +$Id: README,v 2.2 2002/05/22 06:26:12 jhaegg Exp $ + +This is mgm, a macro package for groff. + +It is supposed to be compatible with the DWB mm macros, +and has several extensions. + +Send bug reports to jh@axis.com with a description of the problem +and a sample of text which reproduces the error. + +Don't forget to mention the version of mgm (look in the beginning +of m.tmac) and the version of groff. + +Any new ideas or improvements are welcome. + +Newest version is available here or at the groff CVS repository. +ftp://ftp.axis.se/pub/groff/mm.gz + +You can install mgm as a separate package without the configure in groff +with the following command: + +make -f Makefile.sim install + +This README should be bigger :-) + +/Jörgen Hägg + +Thanks to everyone who have sent me bug-reports and fixes. + + diff --git a/contrib/mm/examples/APP b/contrib/mm/examples/APP new file mode 100644 index 0000000..82352e5 --- /dev/null +++ b/contrib/mm/examples/APP @@ -0,0 +1,352 @@ +.H 1 " granary grand grandchild grandchildren granddaughter grandeur" +granary +grapheme +graphic +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.H 2 "grapefruit grapevine graph grapheme graphic graphite" +granary +grand +graphic +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.H 3 "grapple" +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.H 1 "Graves gravestone graveyard gravid gravitate gravy gray" +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.H 1 "Greenfield greengrocer greenhouse greenish Greenland Greensboro" +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.H 1 "greensward greenware Greenwich greenwood Greer greet" +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +.APP "" "Graves app a gravestone graveyard gravid gravitate gravy gray" +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.APP "" "Greenfield app b greengrocer greenhouse greenish Greenland Greensboro" +granary +grand +grandchild +grandchildren +granddaughter +grandeur +.H 2 "grandfather grandiloquent grandiose grandma grandmother grandnephew" +.H 2 "grandniece grandpa grandparent grandson grandstand granite granitic" +.H 2 "granny granola grant grantee grantor granular granulate" +.H 2 "granule Granville grape" +.H 2 "grapefruit grapevine graph grapheme graphic graphite" +.H 3 "grapple" +grandfather +grandiloquent +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +.APP ABC "greensward app abc greenware Greenwich greenwood Greer greet" +graven +Graves +.APP "" "handstand app f handwrite handwritten handy handyman handymen" +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +.APPSK "" 10 "Handel app c 10 handhold handicap handicapped handicapper" +.APPSK "" 23 "handicapping app d 23 handicraftsmen handiwork" +.APPSK "" 99 "handmade app e 99 handset handshake handsome handspike" +.nr Aph 0 +.APP "" "handstand app f handwrite handwritten handy handyman handymen" +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +.H 2 "graybeard grayish Grayson graywacke graze grease greasy great greatcoat" +.H 2 "greater grebe Grecian Greece greed greedy Greek green Greenbelt Greenberg" +.H 2 "Greenblatt Greenbriar Greene greenery" +.H 3 "Greenfield greengrocer greenhouse greenish Greenland Greensboro" +.H 3 "greensward greenware Greenwich greenwood Greer greet" +heady +heal +Healey +health +healthful +healthy +Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +heaven +heavenward +heavy +heavyweight +Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +.APP "" "hang hangable app f hangar hangman hangmen hangout hangover hank" +Hecuba +he'd +hedge +.H 2 "graybeard grayish Grayson graywacke graze grease greasy great greatcoat" +hedgehog +hedonism +hedonist +heed +heel +.H 2 "greater grebe Grecian Greece greed greedy Greek green Greenbelt Greenberg" +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +hello +helm +helmet +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +.APP "" "Hankel app g Hanley Hanlon Hanna Hannah Hannibal Hanoi Hanover" +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +henbane +hence +henceforth +henchman +henchmen +.H 2 "greater grebe Grecian Greece greed greedy Greek green Greenbelt Greenberg" +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +.TC diff --git a/contrib/mm/examples/B1B2 b/contrib/mm/examples/B1B2 new file mode 100644 index 0000000..a2bb3ad --- /dev/null +++ b/contrib/mm/examples/B1B2 @@ -0,0 +1,91 @@ +abetting +abeyance +abeyant +abhorred +abhorrent +abide +Abidjan +Abigail +abject +ablate +ablaze +able +ablution +Abner +abnormal +Abo +aboard +abode +abolish +.B1 +abolition +abominable +abominate +aboriginal +AAA +ABORIGINE +ABORNING +ABORT +ABOUND +ABOUT +ABOVE +ABOVEBOARD +ABOVEGROUND +abovementioned +abrade +Abraham +Abram +Abramson +abrasion +abrasive +abreact +.B2 +abreast +abrogate +abrupt +abscess +abscissa +abscissae +absence +absent +absentee +absenteeism +absentia +absentminded +absinthe +absolute +absolution +absolve +absorb +absorbent +absorption +absorptive +abstain +abstention +abstract +abstracter +abstractor +ABSURD +ABUILDING +ABUNDANT +ABUSABLE +ABUSE +ABUSIVE +ABUT +ABUTTED +ABUTTING +ABYSMAL +ABYSS +ABYSSINIA +AC +ACADEME +ACADEMIA +ACADEMIC +ACADEMICIAN +ACADEMY +ACADIA +ACANTHUS +ACAPULCO +ACCEDE +ACCELERATE +ACCELEROMETER diff --git a/contrib/mm/examples/COVER b/contrib/mm/examples/COVER new file mode 100644 index 0000000..d23597f --- /dev/null +++ b/contrib/mm/examples/COVER @@ -0,0 +1,235 @@ +.COVER +.ND 911123 +.TL "charge" "filing" +This is a test +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +.AU "Nisse Svensson" "DGY" "BF" "Computer Center" "5488" "5-2115" "nisse@vira.sture.elm" +.AF "MT GRANDSTAND GRANITE GRANITIC" +.AS 1 10 +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +grebe +Grecian +.AE +.COVEND +Greece +greed +greedy +Greek +green +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +grebe +Grecian +Greece +greed +greedy +Greek +green +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +greenware diff --git a/contrib/mm/examples/IND b/contrib/mm/examples/IND new file mode 100644 index 0000000..fbf6c43 --- /dev/null +++ b/contrib/mm/examples/IND @@ -0,0 +1,4191 @@ +.de foo +a=\\$1, b=\\$2 +.br +.. +.INITI N ind-data +.H 1 "halve" +.IND granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +.IND grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +.IND granulate +granule +Granville +grape +.H 2 "grandfather grandiloquent grandiose grandma grandmother grandnephew" +grapefruit +grapevine +graph +grapheme +graphic +.H 1 "halo halocarbon halogen Halpern Halsey Halstead halt halvah" +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +.IND grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +.H 1 "Han Hancock hand handbag handbook handclasp handcuff Handel handful" +grebe +Grecian +Greece +greed +greedy +.IND Greek +green +Greenbelt +Greenberg +.H 1 " granary grand grandchild grandchildren granddaughter grandeur" +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +.H 1 "handgun" +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +.IND gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +.IND grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +.IND groin +grommet +groom +groove +grope +grosbeak +gross +.H 1 "handicapped handicapper handicapping handicraft handicraftsman" +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +.IND growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor +guaranty +guard +guardhouse +.IND Guardia +guardian +Guatemala +.IND gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guiding +guignol +guild +.H 1 "handicraftsmen handiwork handkerchief handle" +guildhall +guile +Guilford +guillemot +guillotine +guilt +.IND guilty +guinea +guise +guitar +gules +gulf +.H 1 "handleable handlebar handline handmade handmaiden handout" +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +.IND gunfight +gunfire +gunflint +gunk +gunky +gunman +.IND gunmen +gunnery +gunny +gunplay +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +.H 1 "handset" +Gutenberg +Guthrie +gutsy +guttural +.IND guy +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +.IND gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +.IND Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +.H 1 "handshake handsome handspike handstand handwaving handwrite handwritten" +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +.IND Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +.IND haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +.IND halfhearted +halfway +halibut +halide +.H 1 "handy handyman handymen Haney Hanford hang hangable hangar" +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +.IND Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +.IND Hampton +hamster +Han +.H 1 "hangman hangmen hangout hangover hank Hankel Hanley" +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +.IND handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handset +handshake +handsome +handspike +handstand +handwaving +.H 1 "Hanlon Hanna Hannah Hannibal Hanoi Hanover Hanoverian Hans" +handwrite +handwritten +handy +handyman +handymen +Haney +.IND Hanford +hang +hangable +hangar +hangman +hangmen +hangout +hangover +.IND hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +.H 1 "Hansel" +haphazard +.IND haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardcopy +harden +hardhat +Hardin +.H 1 "Hansen hansom Hanson Hanukkah hap haphazard haploid haploidy" +Harding +hardscrabble +hardtack +hardtop +hardware +hardwood +.IND hardworking +hardy +hare +harelip +harem +.IND hark +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +.H 1 "haplology happen happenstance happy Hapsburg harangue harass Harbin" +harmony +harness +Harold +harp +harpoon +harpsichord +Harpy +Harriet +Harriman +Harrington +Harris +.IND Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +harvest +harvestman +Harvey +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +.IND hatchet +hatchway +.IND hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausdorff +Havana +have +haven +haven't +Havilland +havoc +haw +.IND Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +.H 2 "hammock Hammond hamper Hampshire Hampton hamster" +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +Hays +haystack +Hayward +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +.IND headache +.IND headboard +headdress +headland +headlight +headline +headmaster +headphone +headquarter +headquarters +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +.IND Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +.IND heaven +heavenward +heavy +heavyweight +.IND Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +.IND heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +.IND hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +.IND hello +helm +helmet +.H 1 "Halverson ham Hamal Hamburg hamburger Hamilton hamlet Hamlin hammerhead" +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +.IND henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +.IND hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +.IND Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +herewith +heritable +heritage +Herkimer +Herman +.IND Hermann +hermeneutic +Hermes +hermetic +Hermite +hermitian +Hermosa +Hernandez +hero +Herodotus +heroes +heroic +heroin +.IND heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +.IND hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +.IND Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +.IND hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +Hicks +hid +.IND hidalgo +hidden +hide +hideaway +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highest +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +.IND highwaymen +hijack +hijinks +hike +hilarious +hilarity +Hilbert +.IND Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +hindmost +.IND hindrance +hindsight +Hindu +Hinduism +Hines +hinge +Hinman +hint +hinterland +hip +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +.IND hiss +histamine +histidine +histochemic +.IND histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +.H 1 "harbinger" +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +.IND hoarfrost +hoarse +hob +Hobart +Hobbes +hobble +Hobbs +hobby +hobbyhorse +hobgoblin +hobo +Hoboken +hoc +hock +hockey +hocus +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +.IND hoi +.IND Hokan +Holbrook +Holcomb +hold +holden +holdout +holdover +holdup +hole +holeable +holiday +Holland +Hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +.IND Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +.IND holystone +.INDP +inject injudicious Injun injunct injunction injure injurious injury +injustice ink inkling inlaid inland inlay inlet Inman inmate inn innards +innate inner innermost innkeeper innocent innocuous innovate innuendo +innumerable inoculate inoffensive inoperable inoperative inopportune +inordinate inorganic input inputting inquest inquire inquiry inquisition +inquisitive inquisitor inroad insane insatiable inscribe inscription +inscrutable insect insecticide insecure inseminate insensible insensitive +inseparable insert inset inshore inside insidious insight insightful +insignia insignificant insincere insinuate insipid insist insistent +insofar insolent insoluble insolvable insolvent insomnia insomniac +insouciant inspect inspector inspiration inspire instable install +installation instalment instance instant instantaneous instantiate +.INITI H ind-data2 +.H 1 "halve" +.IND granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +.IND grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +.IND granulate +granule +Granville +grape +.H 2 "grandfather grandiloquent grandiose grandma grandmother grandnephew" +grapefruit +grapevine +graph +grapheme +graphic +.H 1 "halo halocarbon halogen Halpern Halsey Halstead halt halvah" +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +.IND grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +.H 1 "Han Hancock hand handbag handbook handclasp handcuff Handel handful" +grebe +Grecian +Greece +greed +greedy +.IND Greek +green +Greenbelt +Greenberg +.H 1 " granary grand grandchild grandchildren granddaughter grandeur" +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +.H 1 "handgun" +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +.IND gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +.IND grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +.IND groin +grommet +groom +groove +grope +grosbeak +gross +.H 1 "handicapped handicapper handicapping handicraft handicraftsman" +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +.IND growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor +guaranty +guard +guardhouse +.IND Guardia +guardian +Guatemala +.IND gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guiding +guignol +guild +.H 1 "handicraftsmen handiwork handkerchief handle" +guildhall +guile +Guilford +guillemot +guillotine +guilt +.IND guilty +guinea +guise +guitar +gules +gulf +.H 1 "handleable handlebar handline handmade handmaiden handout" +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +.IND gunfight +gunfire +gunflint +gunk +gunky +gunman +.IND gunmen +gunnery +gunny +gunplay +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +.H 1 "handset" +Gutenberg +Guthrie +gutsy +guttural +.IND guy +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +.IND gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +.IND Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +.H 1 "handshake handsome handspike handstand handwaving handwrite handwritten" +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +.IND Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +.IND haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +.IND halfhearted +halfway +halibut +halide +.H 1 "handy handyman handymen Haney Hanford hang hangable hangar" +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +.IND Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +.IND Hampton +hamster +Han +.H 1 "hangman hangmen hangout hangover hank Hankel Hanley" +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +.IND handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handset +handshake +handsome +handspike +handstand +handwaving +.H 1 "Hanlon Hanna Hannah Hannibal Hanoi Hanover Hanoverian Hans" +handwrite +handwritten +handy +handyman +handymen +Haney +.IND Hanford +hang +hangable +hangar +hangman +hangmen +hangout +hangover +.IND hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +.H 1 "Hansel" +haphazard +.IND haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardcopy +harden +hardhat +Hardin +.H 1 "Hansen hansom Hanson Hanukkah hap haphazard haploid haploidy" +Harding +hardscrabble +hardtack +hardtop +hardware +hardwood +.IND hardworking +hardy +hare +harelip +harem +.IND hark +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +.H 1 "haplology happen happenstance happy Hapsburg harangue harass Harbin" +harmony +harness +Harold +harp +harpoon +harpsichord +Harpy +Harriet +Harriman +Harrington +Harris +.IND Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +harvest +harvestman +Harvey +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +.IND hatchet +hatchway +.IND hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausdorff +Havana +have +haven +haven't +Havilland +havoc +haw +.IND Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +.H 2 "hammock Hammond hamper Hampshire Hampton hamster" +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +Hays +haystack +Hayward +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +.IND headache +.IND headboard +headdress +headland +headlight +headline +headmaster +headphone +headquarter +headquarters +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +.IND Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +.IND heaven +heavenward +heavy +heavyweight +.IND Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +.IND heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +.IND hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +.IND hello +helm +helmet +.H 1 "Halverson ham Hamal Hamburg hamburger Hamilton hamlet Hamlin hammerhead" +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +.IND henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +.IND hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +.IND Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +herewith +heritable +heritage +Herkimer +Herman +.IND Hermann +hermeneutic +Hermes +hermetic +Hermite +hermitian +Hermosa +Hernandez +hero +Herodotus +heroes +heroic +heroin +.IND heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +.IND hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +.IND Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +.IND hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +Hicks +hid +.IND hidalgo +hidden +hide +hideaway +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highest +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +.IND highwaymen +hijack +hijinks +hike +hilarious +hilarity +Hilbert +.IND Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +hindmost +.IND hindrance +hindsight +Hindu +Hinduism +Hines +hinge +Hinman +hint +hinterland +hip +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +.IND hiss +histamine +histidine +histochemic +.IND histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +.H 1 "harbinger" +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +.IND hoarfrost +hoarse +hob +Hobart +Hobbes +hobble +Hobbs +hobby +hobbyhorse +hobgoblin +hobo +Hoboken +hoc +hock +hockey +hocus +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +.IND hoi +.IND Hokan +Holbrook +Holcomb +hold +holden +holdout +holdover +holdup +hole +holeable +holiday +Holland +Hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +.IND Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +.IND holystone +.INDP +inject injudicious Injun injunct injunction injure injurious injury +injustice ink inkling inlaid inland inlay inlet Inman inmate inn innards +innate inner innermost innkeeper innocent innocuous innovate innuendo +innumerable inoculate inoffensive inoperable inoperative inopportune +inordinate inorganic input inputting inquest inquire inquiry inquisition +.INITI B ind-data3 +.H 1 "halve" +.IND granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +.IND grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +.IND granulate +granule +Granville +grape +.H 2 "grandfather grandiloquent grandiose grandma grandmother grandnephew" +grapefruit +grapevine +graph +grapheme +graphic +.H 1 "halo halocarbon halogen Halpern Halsey Halstead halt halvah" +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +.IND grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +.H 1 "Han Hancock hand handbag handbook handclasp handcuff Handel handful" +grebe +Grecian +Greece +greed +greedy +.IND Greek +green +Greenbelt +Greenberg +.H 1 " granary grand grandchild grandchildren granddaughter grandeur" +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +.H 1 "handgun" +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +.IND gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +.IND grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +.IND groin +grommet +groom +groove +grope +grosbeak +gross +.H 1 "handicapped handicapper handicapping handicraft handicraftsman" +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +.IND growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor +guaranty +guard +guardhouse +.IND Guardia +guardian +Guatemala +.IND gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guiding +guignol +guild +.H 1 "handicraftsmen handiwork handkerchief handle" +guildhall +guile +Guilford +guillemot +guillotine +guilt +.IND guilty +guinea +guise +guitar +gules +gulf +.H 1 "handleable handlebar handline handmade handmaiden handout" +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +.IND gunfight +gunfire +gunflint +gunk +gunky +gunman +.IND gunmen +gunnery +gunny +gunplay +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +.H 1 "handset" +Gutenberg +Guthrie +gutsy +guttural +.IND guy +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +.IND gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +.IND Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +.H 1 "handshake handsome handspike handstand handwaving handwrite handwritten" +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +.IND Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +.IND haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +.IND halfhearted +halfway +halibut +halide +.H 1 "handy handyman handymen Haney Hanford hang hangable hangar" +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +.IND Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +.IND Hampton +hamster +Han +.H 1 "hangman hangmen hangout hangover hank Hankel Hanley" +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +.IND handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handset +handshake +handsome +handspike +handstand +handwaving +.H 1 "Hanlon Hanna Hannah Hannibal Hanoi Hanover Hanoverian Hans" +handwrite +handwritten +handy +handyman +handymen +Haney +.IND Hanford +hang +hangable +hangar +hangman +hangmen +hangout +hangover +.IND hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +.H 1 "Hansel" +haphazard +.IND haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardcopy +harden +hardhat +Hardin +.H 1 "Hansen hansom Hanson Hanukkah hap haphazard haploid haploidy" +Harding +hardscrabble +hardtack +hardtop +hardware +hardwood +.IND hardworking +hardy +hare +harelip +harem +.IND hark +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +.H 1 "haplology happen happenstance happy Hapsburg harangue harass Harbin" +harmony +harness +Harold +harp +harpoon +harpsichord +Harpy +Harriet +Harriman +Harrington +Harris +.IND Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +harvest +harvestman +Harvey +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +.IND hatchet +hatchway +.IND hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausdorff +Havana +have +haven +haven't +Havilland +havoc +haw +.IND Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +.H 2 "hammock Hammond hamper Hampshire Hampton hamster" +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +Hays +haystack +Hayward +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +.IND headache +.IND headboard +headdress +headland +headlight +headline +headmaster +headphone +headquarter +headquarters +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +.IND Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +.IND heaven +heavenward +heavy +heavyweight +.IND Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +.IND heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +.IND hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +.IND hello +helm +helmet +.H 1 "Halverson ham Hamal Hamburg hamburger Hamilton hamlet Hamlin hammerhead" +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +.IND henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +.IND hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +.IND Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +herewith +heritable +heritage +Herkimer +Herman +.IND Hermann +hermeneutic +Hermes +hermetic +Hermite +hermitian +Hermosa +Hernandez +hero +Herodotus +heroes +heroic +heroin +.IND heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +.IND hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +.IND Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +.IND hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +Hicks +hid +.IND hidalgo +hidden +hide +hideaway +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highest +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +.IND highwaymen +hijack +hijinks +hike +hilarious +hilarity +Hilbert +.IND Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +hindmost +.IND hindrance +hindsight +Hindu +Hinduism +Hines +hinge +Hinman +hint +hinterland +hip +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +.IND hiss +histamine +histidine +histochemic +.IND histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +.H 1 "harbinger" +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +.IND hoarfrost +hoarse +hob +Hobart +Hobbes +hobble +Hobbs +hobby +hobbyhorse +hobgoblin +hobo +Hoboken +hoc +hock +hockey +hocus +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +.IND hoi +.IND Hokan +Holbrook +Holcomb +hold +holden +holdout +holdover +holdup +hole +holeable +holiday +Holland +Hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +.IND Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +.IND holystone +.INDP +inject injudicious Injun injunct injunction injure injurious injury +injustice ink inkling inlaid inland inlay inlet Inman inmate inn innards +innate inner innermost innkeeper innocent innocuous innovate innuendo +innumerable inoculate inoffensive inoperable inoperative inopportune +inordinate inorganic input inputting inquest inquire inquiry inquisition +.INITI B ind-data4 foo +.H 1 "halve" +.IND granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +.IND grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +.IND granulate +granule +Granville +grape +.H 2 "grandfather grandiloquent grandiose grandma grandmother grandnephew" +grapefruit +grapevine +graph +grapheme +graphic +.H 1 "halo halocarbon halogen Halpern Halsey Halstead halt halvah" +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +.IND grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +.H 1 "Han Hancock hand handbag handbook handclasp handcuff Handel handful" +grebe +Grecian +Greece +greed +greedy +.IND Greek +green +Greenbelt +Greenberg +.H 1 " granary grand grandchild grandchildren granddaughter grandeur" +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +.H 1 "handgun" +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +.IND gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +.IND grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +.IND groin +grommet +groom +groove +grope +grosbeak +gross +.H 1 "handicapped handicapper handicapping handicraft handicraftsman" +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +.IND growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor +guaranty +guard +guardhouse +.IND Guardia +guardian +Guatemala +.IND gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guiding +guignol +guild +.H 1 "handicraftsmen handiwork handkerchief handle" +guildhall +guile +Guilford +guillemot +guillotine +guilt +.IND guilty +guinea +guise +guitar +gules +gulf +.H 1 "handleable handlebar handline handmade handmaiden handout" +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +.IND gunfight +gunfire +gunflint +gunk +gunky +gunman +.IND gunmen +gunnery +gunny +gunplay +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +.H 1 "handset" +Gutenberg +Guthrie +gutsy +guttural +.IND guy +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +.IND gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +.IND Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +.H 1 "handshake handsome handspike handstand handwaving handwrite handwritten" +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +.IND Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +.IND haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +.IND halfhearted +halfway +halibut +halide +.H 1 "handy handyman handymen Haney Hanford hang hangable hangar" +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +.IND Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +.IND Hampton +hamster +Han +.H 1 "hangman hangmen hangout hangover hank Hankel Hanley" +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +.IND handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handset +handshake +handsome +handspike +handstand +handwaving +.H 1 "Hanlon Hanna Hannah Hannibal Hanoi Hanover Hanoverian Hans" +handwrite +handwritten +handy +handyman +handymen +Haney +.IND Hanford +hang +hangable +hangar +hangman +hangmen +hangout +hangover +.IND hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +.H 1 "Hansel" +haphazard +.IND haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardcopy +harden +hardhat +Hardin +.H 1 "Hansen hansom Hanson Hanukkah hap haphazard haploid haploidy" +Harding +hardscrabble +hardtack +hardtop +hardware +hardwood +.IND hardworking +hardy +hare +harelip +harem +.IND hark +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +.H 1 "haplology happen happenstance happy Hapsburg harangue harass Harbin" +harmony +harness +Harold +harp +harpoon +harpsichord +Harpy +Harriet +Harriman +Harrington +Harris +.IND Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +harvest +harvestman +Harvey +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +.IND hatchet +hatchway +.IND hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausdorff +Havana +have +haven +haven't +Havilland +havoc +haw +.IND Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +.H 2 "hammock Hammond hamper Hampshire Hampton hamster" +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +Hays +haystack +Hayward +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +.IND headache +.IND headboard +headdress +headland +headlight +headline +headmaster +headphone +headquarter +headquarters +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +.IND Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +.IND heaven +heavenward +heavy +heavyweight +.IND Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +.IND heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +.IND hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +.IND hello +helm +helmet +.H 1 "Halverson ham Hamal Hamburg hamburger Hamilton hamlet Hamlin hammerhead" +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +.IND henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +.IND hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +.IND Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +herewith +heritable +heritage +Herkimer +Herman +.IND Hermann +hermeneutic +Hermes +hermetic +Hermite +hermitian +Hermosa +Hernandez +hero +Herodotus +heroes +heroic +heroin +.IND heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +.IND hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +.IND Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +.IND hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +Hicks +hid +.IND hidalgo +hidden +hide +hideaway +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highest +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +.IND highwaymen +hijack +hijinks +hike +hilarious +hilarity +Hilbert +.IND Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +hindmost +.IND hindrance +hindsight +Hindu +Hinduism +Hines +hinge +Hinman +hint +hinterland +hip +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +.IND hiss +histamine +histidine +histochemic +.IND histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +.H 1 "harbinger" +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +.IND hoarfrost +hoarse +hob +Hobart +Hobbes +hobble +Hobbs +hobby +hobbyhorse +hobgoblin +hobo +Hoboken +hoc +hock +hockey +hocus +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +.IND hoi +.IND Hokan +Holbrook +Holcomb +hold +holden +holdout +holdover +holdup +hole +holeable +holiday +Holland +Hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +.IND Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +.IND holystone +.INDP +inject injudicious Injun injunct injunction injure injurious injury +injustice ink inkling inlaid inland inlay inlet Inman inmate inn innards +innate inner innermost innkeeper innocent innocuous innovate innuendo +innumerable inoculate inoffensive inoperable inoperative inopportune +inordinate inorganic input inputting inquest inquire inquiry inquisition diff --git a/contrib/mm/examples/LT b/contrib/mm/examples/LT new file mode 100644 index 0000000..cf06389 --- /dev/null +++ b/contrib/mm/examples/LT @@ -0,0 +1,1058 @@ +.ND 1994-10-26 +.\" .WA "Nisse Nilsson" notitle +.\" .WE +.WA "Sven Olsson" title +Return address +Street +City, State Zip Code +Text +.WE +.IA "Inside address" title +Addressee name XXXXXXX +Title XXXXXXXXXXXXXXX +Company xxxxxxxxxxxx +Street xxxxxxxxxxxxxx +City, State Zip Code +Text xxxxxxxxxxxxxxxxxx +.IE +.LO CN +.LO RN "referens" +.LO AT Attention +.LO SA "Hej hopp" +.LO SJ "Subject line" +.LT BL +hepp +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +grebe +Grecian +Greece +greed +greedy +Greek +green +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +.P +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +groin +grommet +groom +groove +grope +grosbeak +gross +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor +guaranty +guard +guardhouse +Guardia +guardian +Guatemala +gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guiding +guignol +guild +guildhall +guile +Guilford +guillemot +guillotine +guilt +guilty +guinea +guise +guitar +gules +gulf +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +gunfight +gunfire +gunflint +gunk +gunky +gunman +gunmen +gunnery +gunny +gunplay +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +Gutenberg +Guthrie +gutsy +guttural +guy +.P +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +halfhearted +halfway +halibut +halide +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +Hampton +hamster +Han +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handset +handshake +handsome +handspike +handstand +handwaving +handwrite +handwritten +handy +handyman +handymen +Haney +Hanford +hang +hangable +hangar +hangman +hangmen +hangout +hangover +hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +haphazard +haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardcopy +harden +hardhat +Hardin +Harding +hardscrabble +hardtack +hardtop +hardware +hardwood +hardworking +hardy +hare +harelip +harem +hark +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +harmony +harness +Harold +harp +harpoon +harpsichord +Harpy +Harriet +Harriman +Harrington +Harris +Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +.P +harvest +harvestman +Harvey +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +hatchet +hatchway +hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausdorff +Havana +have +haven +haven't +Havilland +havoc +haw +Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +Hays +haystack +Hayward +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +headache +headboard +headdress +headland +headlight +headline +headmaster +headphone +headquarter +headquarters +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +heaven +heavenward +heavy +heavyweight +Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +hello +helm +helmet +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +.P +herewith +heritable +heritage +Herkimer +Herman +Hermann +hermeneutic +Hermes +hermetic +Hermite +hermitian +Hermosa +Hernandez +hero +Herodotus +heroes +heroic +heroin +heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +Hicks +hid +hidalgo +hidden +hide +hideaway +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highest +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +highwaymen +hijack +hijinks +hike +hilarious +hilarity +Hilbert +Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +hindmost +hindrance +hindsight +Hindu +Hinduism +Hines +hinge +Hinman +hint +hinterland +hip +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +hiss +histamine +histidine +histochemic +histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +hoarfrost +hoarse +hob +Hobart +Hobbes +hobble +Hobbs +hobby +.P +hobbyhorse +hobgoblin +hobo +Hoboken +hoc +hock +hockey +hocus +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +hoi +Hokan +Holbrook +Holcomb +hold +holden +holdout +holdover +holdup +hole +holeable +holiday +Holland +Hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +holystone +.FC +.SG +.NS 7 +text text text +text text text +.NS 12 +Holyoke +holystone +.NS +holt +.NE diff --git a/contrib/mm/examples/LT.se b/contrib/mm/examples/LT.se new file mode 100644 index 0000000..63d823d --- /dev/null +++ b/contrib/mm/examples/LT.se @@ -0,0 +1,1062 @@ +.\" groff -mmse LT.se +.ND 1994-10-26 +.WA "Sven Olsson" title +Return address +Street +City, State Zip Code +Text +.WE +.IA "Inside address" title +Addressee name XXXXXXX +Title XXXXXXXXXXXXXXX +Company xxxxxxxxxxxx +Street xxxxxxxxxxxxxx +City, State Zip Code +Text xxxxxxxxxxxxxxxxxx +.IE +.LO DNAMN Dokumentnamn +.LO MDAT 1994-01-01 +.LO BIL 2 +.LO KOMP Kompletteringsuppgift +.LO DBET dokumentnummer +.LO BET ärendebeteckning +.LO MBET "Mottagarens b" +.LO SIDOR 22 +.\" vänster eller högerställt brev +.\" .LT SVH +.LT SVV +hepp +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grassland +grassy +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +grebe +Grecian +Greece +greed +greedy +Greek +green +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +.P +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +groin +grommet +groom +groove +grope +grosbeak +gross +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor +guaranty +guard +guardhouse +Guardia +guardian +Guatemala +gubernatorial +Guelph +Guenther +guerdon +guernsey +guerrilla +guess +guesswork +guest +guffaw +Guggenheim +Guiana +guidance +guide +guidebook +guideline +guidepost +guiding +guignol +guild +guildhall +guile +Guilford +guillemot +guillotine +guilt +guilty +guinea +guise +guitar +gules +gulf +gull +Gullah +gullet +gullible +gully +gulp +gum +gumbo +gumdrop +gummy +gumption +gumshoe +gun +Gunderson +gunfight +gunfire +gunflint +gunk +gunky +gunman +gunmen +gunnery +gunny +gunplay +gunpowder +gunshot +gunsling +Gunther +gurgle +Gurkha +guru +Gus +gush +gusset +gust +Gustafson +Gustav +Gustave +Gustavus +gusto +gusty +gut +Gutenberg +Guthrie +gutsy +guttural +guy +.P +Guyana +guzzle +Gwen +Gwyn +gym +gymnasium +gymnast +gymnastic +gymnosperm +gyp +gypsite +gypsum +gypsy +gyrate +gyrfalcon +gyro +gyrocompass +gyroscope +h +ha +Haag +Haas +habeas +haberdashery +Haberman +Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +halfhearted +halfway +halibut +halide +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +Hampton +hamster +Han +Hancock +hand +handbag +handbook +handclasp +handcuff +Handel +handful +handgun +handhold +handicap +handicapped +handicapper +handicapping +handicraft +handicraftsman +handicraftsmen +handiwork +handkerchief +handle +handleable +handlebar +handline +handmade +handmaiden +handout +handset +handshake +handsome +handspike +handstand +handwaving +handwrite +handwritten +handy +handyman +handymen +Haney +Hanford +hang +hangable +hangar +hangman +hangmen +hangout +hangover +hank +Hankel +Hanley +Hanlon +Hanna +Hannah +Hannibal +Hanoi +Hanover +Hanoverian +Hans +Hansel +Hansen +hansom +Hanson +Hanukkah +hap +haphazard +haploid +haploidy +haplology +happen +happenstance +happy +Hapsburg +harangue +harass +Harbin +harbinger +Harcourt +hard +hardbake +hardboard +hardboiled +hardcopy +harden +hardhat +Hardin +Harding +hardscrabble +hardtack +hardtop +hardware +hardwood +hardworking +hardy +hare +harelip +harem +hark +Harlan +Harlem +Harley +harm +harmful +Harmon +harmonic +harmonica +harmonious +harmony +harness +Harold +harp +harpoon +harpsichord +Harpy +Harriet +Harriman +Harrington +Harris +Harrisburg +Harrison +harrow +harry +harsh +harshen +hart +Hartford +Hartley +Hartman +Harvard +.P +harvest +harvestman +Harvey +hash +hashish +hasn't +hasp +hassle +hast +haste +hasten +Hastings +hasty +hat +hatch +hatchet +hatchway +hate +hateful +hater +Hatfield +hath +Hathaway +hatred +Hatteras +Hattie +Hattiesburg +Haugen +haughty +haul +haulage +haunch +haunt +Hausdorff +Havana +have +haven +haven't +Havilland +havoc +haw +Hawaii +Hawaiian +hawk +Hawkins +Hawley +hawthorn +Hawthorne +hay +Hayden +Haydn +Hayes +hayfield +Haynes +Hays +haystack +Hayward +hayward +hazard +hazardous +haze +hazel +hazelnut +hazy +he +head +headache +headboard +headdress +headland +headlight +headline +headmaster +headphone +headquarter +headquarters +headroom +headset +headsman +headsmen +headstand +headstone +headstrong +headwall +headwater +headway +headwind +heady +heal +Healey +health +healthful +healthy +Healy +heap +hear +heard +hearken +hearsay +hearse +Hearst +heart +heartbeat +heartbreak +hearten +heartfelt +hearth +hearty +heat +heater +heath +heathen +heathenish +Heathkit +heave +heaven +heavenward +heavy +heavyweight +Hebe +hebephrenic +Hebraic +Hebrew +Hecate +hecatomb +heck +heckle +Heckman +hectic +hector +Hecuba +he'd +hedge +hedgehog +hedonism +hedonist +heed +heel +heft +hefty +Hegelian +hegemony +Heidelberg +heigh +height +heighten +Heine +Heinrich +Heinz +heir +heiress +Heisenberg +held +Helen +Helena +Helene +Helga +helical +helicopter +heliocentric +heliotrope +helium +helix +he'll +hell +hellbender +hellebore +Hellenic +hellfire +hellgrammite +hellish +hello +helm +helmet +Helmholtz +helmsman +helmsmen +Helmut +help +helpful +helpmate +Helsinki +Helvetica +hem +hematite +Hemingway +hemisphere +hemispheric +hemlock +hemoglobin +hemolytic +hemorrhage +hemorrhoid +hemosiderin +hemp +Hempstead +hen +henbane +hence +henceforth +henchman +henchmen +Henderson +Hendrick +Hendricks +Hendrickson +henequen +Henley +henpeck +Henri +Henrietta +henry +hepatica +hepatitis +Hepburn +heptane +her +Hera +Heraclitus +herald +herb +Herbert +Herculean +Hercules +herd +herdsman +here +hereabout +hereafter +hereby +hereditary +heredity +Hereford +herein +hereinabove +hereinafter +hereinbelow +hereof +heresy +heretic +hereto +heretofore +hereunder +hereunto +.P +herewith +heritable +heritage +Herkimer +Herman +Hermann +hermeneutic +Hermes +hermetic +Hermite +hermitian +Hermosa +Hernandez +hero +Herodotus +heroes +heroic +heroin +heroine +heroism +heron +herpes +herpetology +Herr +herringbone +Herschel +herself +Hershel +Hershey +hertz +Hertzog +hesitant +hesitate +hesitater +Hesperus +Hess +Hesse +Hessian +Hester +heterocyclic +heterodyne +heterogamous +heterogeneity +heterogeneous +heterosexual +heterostructure +heterozygous +Hetman +Hettie +Hetty +Heublein +heuristic +Heusen +Heuser +hew +Hewett +Hewitt +Hewlett +hewn +hex +hexachloride +hexadecimal +hexafluoride +hexagon +hexagonal +hexameter +hexane +hey +heyday +hi +Hiatt +hiatus +Hiawatha +hibachi +Hibbard +hibernate +Hibernia +hick +Hickey +Hickman +hickory +Hicks +hid +hidalgo +hidden +hide +hideaway +hideous +hideout +hierarchal +hierarchic +hierarchy +hieratic +hieroglyphic +Hieronymus +hifalutin +Higgins +high +highball +highboy +highest +highfalutin +highhanded +highland +highlight +highroad +hightail +highway +highwayman +highwaymen +hijack +hijinks +hike +hilarious +hilarity +Hilbert +Hildebrand +hill +hillbilly +Hillcrest +Hillel +hillman +hillmen +hillock +hillside +hilltop +hilly +hilt +Hilton +hilum +him +Himalaya +himself +hind +hindmost +hindrance +hindsight +Hindu +Hinduism +Hines +hinge +Hinman +hint +hinterland +hip +hippo +Hippocrates +Hippocratic +hippodrome +hippopotamus +hippy +hipster +Hiram +hire +hireling +Hiroshi +Hiroshima +Hirsch +hirsute +his +Hispanic +hiss +histamine +histidine +histochemic +histochemistry +histogram +histology +historian +historic +historiography +history +histrionic +hit +Hitachi +hitch +Hitchcock +hither +hitherto +Hitler +hive +ho +hoagie +Hoagland +hoagy +hoar +hoard +hoarfrost +hoarse +hob +Hobart +Hobbes +hobble +Hobbs +hobby +.P +hobbyhorse +hobgoblin +hobo +Hoboken +hoc +hock +hockey +hocus +hodge +hodgepodge +Hodges +Hodgkin +hoe +Hoff +Hoffman +hog +hogan +hogging +hoi +Hokan +Holbrook +Holcomb +hold +holden +holdout +holdover +holdup +hole +holeable +holiday +Holland +Hollandaise +holler +Hollerith +Hollingsworth +Hollister +hollow +Holloway +hollowware +holly +hollyhock +Hollywood +Holm +Holman +Holmdel +Holmes +holmium +holocaust +Holocene +hologram +holography +Holst +Holstein +holster +holt +Holyoke +holystone +.FC +.SG +.NS 7 +text text text +text text text +.NS 12 +Holyoke +holystone +.NS +holt +.NE diff --git a/contrib/mm/examples/ML b/contrib/mm/examples/ML new file mode 100644 index 0000000..bbfca3d --- /dev/null +++ b/contrib/mm/examples/ML @@ -0,0 +1,169 @@ +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +.ML MARK +.LI "LOCALMARK" +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +.LI +.DS +Where shall we put this. +Where shall we put this. +Where shall we put this. +.DE +.LI +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +.LI +.DS +Where shall we put this. +.DE +.LI +graphic +graphite +grapple +grasp +grass +grassland +grassy +.LI +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +.LI +gratuity +grave +gravel +.LE +.SP 3 +.ML $ 1c +.LI +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +.LI +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +.LI +greater +grebe +Grecian +Greece +greed +greedy +Greek +green +.LI +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +.LE +.SP 3 +.ML X 1c 1 +.LI +Greenfield +greengrocer +grandson +grandstand +granite +granitic +granny +graph +.LI +grapheme +greenhouse +greenish +Greenland +Greensboro +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +.LI +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +.LI +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +.LI +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grassland +.LE diff --git a/contrib/mm/examples/MOVE b/contrib/mm/examples/MOVE new file mode 100644 index 0000000..588f0c7 --- /dev/null +++ b/contrib/mm/examples/MOVE @@ -0,0 +1,175 @@ +.PH "'hej'hopp'i skogen'" +.PF "'livet'är'härligt'" +.OH "'ojämn'%'sida'" +.EH "'ojämn'%'sida'" +.OF "'ojämn'%'sida'" +.EF "'ojämn'%'sida'" +10th +1st +2nd +3rd +4th +5th +6th +7th +8th +9th +a +AAA +AAAS +Aarhus +Aaron +AAU +ABA +Ababa +aback +abacus +abalone +abandon +abase +abash +abate +abater +abbas +abbe +abbey +abbot +Abbott +abbreviate +abc +abdicate +abdomen +abdominal +abet +abetted +abetting +abeyance +abeyant +abhorred +abhorrent +abide +Abidjan +Abigail +abject +ablate +ablaze +able +ablution +Abner +.MOVE 50 20 +abnormal +Abo +aboard +abode +abolish +abolition +abominable +abominate +aboriginal +AAA +ABORIGINE +ABORNING +ABORT +ABOUND +ABOUT +ABOVE +ABOVEBOARD +ABOVEGROUND +abovementioned +abrade +Abraham +Abram +Abramson +abrasion +abrasive +abreact +abreast +BBB +ABRIDGE +ABRIDGMENT +ABROAD +abrogate +abrupt +abscess +abscissa +abscissae +absence +absent +absentee +absenteeism +absentia +absentminded +.MOVE 30 10 +absinthe +absolute +absolution +absolve +absorb +absorbent +absorption +absorptive +abstain +abstention +abstinent +abstract +abstracter +abstractor +CCC +ABSTRUSE +ABSURD +ABUILDING +ABUNDANT +ABUSABLE +ABUSE +ABUSIVE +ABUT +ABUTTED +ABUTTING +ABYSMAL +ABYSS +ABYSSINIA +AC +ACADEME +ACADEMIA +ACADEMIC +ACADEMICIAN +ACADEMY +ACADIA +ACANTHUS +ACAPULCO +ACCEDE +ACCELERATE +ACCELEROMETER +ACCENT +ACCENTUAL +ACCENTUATE +ACCEPT +ACCEPTANT +acceptor +access +.MOVE 62 0 20 +accessible +accession +accessory +accident +accidental +accipiter +acclaim +acclamation +acclimate +accolade +accommodate +accompaniment +accompanist +accompany +accomplice +accomplish +accord +accordant +DDD +ACCORDION +ACCOST +ACCOUNT +ACCOUNTANT +ACCRA +.PGFORM diff --git a/contrib/mm/examples/MUL b/contrib/mm/examples/MUL new file mode 100644 index 0000000..ae91fae --- /dev/null +++ b/contrib/mm/examples/MUL @@ -0,0 +1,535 @@ +inject +injudicious +Injun +injunct +injunction +injure +injurious +injury +injustice +ink +inkling +inlaid +inland +inlay +inlet +Inman +inmate +inn +innards +innate +inner +innermost +innkeeper +innocent +innocuous +innovate +innuendo +innumerable +inoculate +inoffensive +inoperable +inoperative +inopportune +inordinate +inorganic +input +inputting +inquest +inquire +inquiry +inquisition +inquisitive +inquisitor +inroad +insane +insatiable +inscribe +inscription +inscrutable +insect +insecticide +insecure +inseminate +insensible +insensitive +inseparable +insert +inset +inshore +inside +insidious +insight +insightful +insignia +insignificant +insincere +insinuate +insipid +insist +insistent +insofar +insolent +insoluble +insolvable +insolvent +insomnia +insomniac +insouciant +inspect +inspector +inspiration +inspire +instable +install +installation +instalment +instance +instant +instantaneous +instantiate +instead +instep +instigate +instill +instillation +instinct +instinctual +institute +institution +instruct +instructor +instrument +instrumentation +insubordinate +insubstantial +insufferable +insufficient +insular +insulate +insulin +insult +insuperable +insupportable +insuppressible +insurance +insure +insurgent +insurmountable +insurrect +insurrection +intact +intake +intangible +integer +integrable +.MULB 4c 1 5c 1 4c 1 3c +Grenoble +Gresham +Greta +Gretchen +grew +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +grim +grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +groin +grommet +groom +groove +grope +grosbeak +gross +.MULN +h +ha +Haag +Haas +habeas +haberdashery +Haberman +Habib +habit +habitant +habitat +habitation +habitual +habituate +hacienda +hack +hackberry +Hackett +hackle +hackmatack +hackney +hackneyed +hacksaw +had +Hadamard +Haddad +haddock +Hades +Hadley +hadn't +Hadrian +hadron +hafnium +Hagen +Hager +haggard +haggle +Hagstrom +Hague +Hahn +Haifa +haiku +hail +hailstone +hailstorm +Haines +hair +haircut +hairdo +hairpin +hairy +Haiti +Haitian +Hal +halcyon +hale +Haley +half +halfback +halfhearted +halfway +halibut +halide +Halifax +halite +hall +hallelujah +Halley +hallmark +hallow +Halloween +hallucinate +hallway +halma +halo +halocarbon +halogen +Halpern +Halsey +Halstead +halt +halvah +halve +Halverson +ham +Hamal +Hamburg +hamburger +Hamilton +hamlet +Hamlin +hammerhead +hammock +Hammond +hamper +Hampshire +Hampton +hamster +Han +Hancock +hand +handbag +handbook +handclasp +handcuff +.MULN +coliform +coliseum +collaborate +collage +collagen +collapse +collapsible +collar +collarbone +collard +collate +collateral +colleague +collect +collectible +collector +college +collegial +collegian +collegiate +collet +collide +collie +Collier +collimate +collinear +Collins +collision +collocation +colloidal +Colloq +colloquia +colloquial +colloquium +colloquy +command +commandant +commandeer +commando +commemorate +commend +commendation +commendatory +commensurable +commensurate +comment +commentary +commentator +commerce +commercial +commingle +commiserate +commissariat +commissary +commission +commit +committable +committal +committed +committee +committeeman +committeemen +committeewoman +committeewomen +committing +commodious +commodity +commodore +common +commonality +.MULN +locoweed +lunch +luncheon +lunchroom +lunchtime +Lund +Lundberg +Lundquist +lung +lunge +lupine +Lura +lurch +lure +lurid +lurk +Lusaka +luscious +lush +lust +lustful +lustrous +lusty +lutanist +lute +lutetium +Luther +Lutheran +Lutz +lymphocyte +lymphoma +lynch +Lynchburg +Lynn +lynx +Lyon +Lyons +Lyra +lyric +lyricism +Lysenko +lysergic +lysine +.MULE +m +ma +Mabel +Mac +macabre +macaque +MacArthur +Macassar +Macbeth +MacDonald +MacDougall +mace +Macedon +Macedonia +MacGregor +Mach +Machiavelli +machination +machine +machinelike +machinery +machismo +macho +macintosh +mack +MacKenzie +mackerel +Mackey +Mackinac +Mackinaw +mackintosh +MacMillan +Macon +macrame +macro +macromolecular +macromolecule +macrophage +macroprocessor +macroscopic +macrostructure +mad +Madagascar +madam +Madame +madcap +madden +Maddox +made +Madeira +Madeleine +Madeline +madhouse +Madison +madman +madmen +Madonna +Madras +Madrid +madrigal +Madsen +madstone +Mae +Maelstrom +maestro +Mafia +magazine +Magdalene +magenta +Maggie +maggot +maggoty +magi +magic +magician +magisterial +magistrate +magma +magna +magnanimity +magnanimous +magnate +magnesia +magnesite +magnesium +magnet +magnetic +magnetite +magneto +magnetron +magnificent +magnify +magnitude +magnolia +magnum +Magnuson +Magog +magpie +Magruder +Mahayana +Mahayanist +mahogany +Mahoney +maid +maiden +maidenhair +maidservant +Maier +mail +mailbox +mailman +mailmen +maim +main +Maine +mainland +mainline +mainstay +mainstream +maintain +maintenance +maitre +majestic +majesty +major +make +makeshift +makeup +Malabar +maladapt +maladaptive +maladjust +maladroit +malady +Malagasy +malaise +malaprop +malaria +malarial +Malawi +Malay +Malaysia diff --git a/contrib/mm/examples/NCOL b/contrib/mm/examples/NCOL new file mode 100644 index 0000000..82c6f8d --- /dev/null +++ b/contrib/mm/examples/NCOL @@ -0,0 +1,196 @@ +granary +grand +grandchild +grandchildren +granddaughter +grandeur +grandfather +grandiloquent +grandiose +grandma +grandmother +grandnephew +grandniece +grandpa +grandparent +grandson +grandstand +granite +granitic +granny +granola +grant +grantee +grantor +granular +granulate +granule +Granville +grape +grapefruit +grapevine +graph +grapheme +graphic +graphite +grapple +grasp +grass +grassland +grassy +.MC 3c +grata +grate +grateful +grater +gratify +gratis +gratitude +gratuitous +gratuity +grave +gravel +graven +Graves +gravestone +graveyard +gravid +gravitate +gravy +gray +graybeard +grayish +Grayson +graywacke +graze +grease +greasy +great +greatcoat +greater +grebe +Grecian +Greece +greed +greedy +.NCOL +Greek +green +Greenbelt +Greenberg +Greenblatt +Greenbriar +Greene +greenery +Greenfield +greengrocer +greenhouse +greenish +Greenland +Greensboro +greensward +greenware +Greenwich +greenwood +Greer +greet +Greg +gregarious +Gregg +Gregory +gremlin +grenade +Grendel +Grenoble +Gresham +Greta +Gretchen +grew +grey +greyhound +greylag +grid +griddle +gridiron +grief +grievance +grieve +grievous +griffin +Griffith +grill +grille +grilled +grillwork +.NCOL +grim +grimace +Grimaldi +grime +Grimes +Grimm +grin +grind +grindstone +grip +gripe +grippe +grisly +grist +gristmill +Griswold +grit +gritty +grizzle +grizzly +groan +groat +grocer +grocery +groggy +groin +grommet +groom +groove +grope +grosbeak +gross +Grosset +Grossman +Grosvenor +grotesque +Groton +ground +groundsel +groundskeep +groundwork +group +groupoid +grout +grove +grovel +Grover +grow +growl +grown +grownup +growth +grub +grubby +grudge +gruesome +gruff +grumble +Grumman +grunt +gryphon +g's +GSA +GU +Guam +guanidine +guanine +guano +guarantee +guaranteeing +guarantor diff --git a/contrib/mm/examples/ND b/contrib/mm/examples/ND new file mode 100644 index 0000000..4b3694a --- /dev/null +++ b/contrib/mm/examples/ND @@ -0,0 +1,17 @@ +.nf +---------------------------------------------------------------------- +.ce +Testing +---------------------------------------------------------------------- +Date = \*[DT] +.ISODATE +Date = \*[DT] +.ISODATE 0 + +.ND "13 August 1992" +Date = \*[DT] + +.ISODATE +.ND "14 August 1992" +Date = \*[DT] +---------------------------------------------------------------------- diff --git a/contrib/mm/examples/README b/contrib/mm/examples/README new file mode 100644 index 0000000..cb6980f --- /dev/null +++ b/contrib/mm/examples/README @@ -0,0 +1,32 @@ + +This directory contains examples of my enhancements to MM. + +APP The appendix macro +B1B2 Box macro with text +COVER My general cover macro, this example is using + ms.cov. +IND A general indexing method, see manual for INITI +LT The letter macro +LT.se A swedish example with the extra + swedish macros for getting a letter conforming + to swedish standard letter, both left and right adjusted. +ML Marked list, an extended list type +MOVE The MOVE macro, how to begin to print on an exact position. +MUL Enhanced multicolumn mode. +NCOL Start on next column. (Not for MUL*) +ND New date, with iso date example +References How to use references +SETR General reference system, see manual for INITR + + +Examples that I should have: + +PIC How to include postscript pictures, see manual for PIC +VERBON Begin verbatim output + + +And remember, check the manual for all string and number registers, +I've made shure that mgm will be useful in several languages +and all english output can be redefined. +Check the manual for groff_mse (swedish format) and the +macro file, tmac.mse. diff --git a/contrib/mm/examples/References b/contrib/mm/examples/References new file mode 100644 index 0000000..72f6482 --- /dev/null +++ b/contrib/mm/examples/References @@ -0,0 +1,975 @@ +.PH "'this'is'a header'" +.PF "'this'is'a footer'" +.OH "'odd'%'page'" +.EH "'even'%'page'" +.OF "'odd'%'page'" +.EF "'even'%'page'" +10th +1st +2nd +3rd +4th +5th +6th +7th +8th +9th +a +AAA +.B +AAAS +Aarhus +Aaron +.R +AAU +ABA +Ababa +aback +abacus +abalone +abandon +abase +.H 1 "hej hopp" +abash +abate +abater +abbas +abbe +abbey +abbot +Abbott +abbreviate +abc +abdicate +abdomen +abet +abetted +abetting +abeyance +abeyant +.H 2 "hej hopp" +abhorred +abhorrent +abide +Abidjan +Abigail +abject +ablate +ablaze +able +ablution +Abner +abnormal +.H 2 "hej hopp" +Abo +aboard +abode +abolish +.HU "hej hopp" +.B1 +abolition +abominable +abominate\*(Rf +aboriginal +.RS +AAA +ABORIGINE +ABORNING +ABORT +ABOUND +ABOUT +ABOVE +ABOVEBOARD +ABOVEGROUND +.RF +abovementioned +abrade +Abraham\*(Rf +Abram\*(Rf +Abramson\*(Rf +abrasion\*(Rf +abrasive\*(Rf +abreact\*(Rf +.B2 +abreast\*(Rf +.RS +BBB +ABRIDGE +ABRIDGMENT +ABROAD +.RF +abrogate +abrupt +abscess\*(Rf +abscissa\*(Rf +abscissae\*(Rf +absence\*(Rf +absent +absentee +absenteeism +absentia +.H 3 "hej hopp" +absentminded +absinthe +absolute +absolution +absolve +absorb +absorbent +absorption +absorptive +abstain +abstention +abstinent\*(Rf +abstract +abstracter +abstractor +.RS nisse +CCC +ABSTRUSE +ABSURD +ABUILDING +ABUNDANT +ABUSABLE +ABUSE +ABUSIVE +ABUT +ABUTTED +ABUTTING +ABYSMAL +ABYSS +ABYSSINIA +AC +ACADEME +ACADEMIA +ACADEMIC +ACADEMICIAN +ACADEMY +ACADIA +ACANTHUS +ACAPULCO +ACCEDE +ACCELERATE +ACCELEROMETER +ACCENT +ACCENTUAL +ACCENTUATE +ACCEPT +ACCEPTANT +.RF +acceptor +access +accessible +accession +Ref \*[nisse] +accessory +.H 4 "hej hopp" +accident +accidental +accipiter +acclaim +acclamation +acclimate +accolade +accommodate +accompaniment +accompanist +accompany +accomplice +accomplish\*(Rf +accord +accordant +.RS +DDD +ACCORDION +ACCOST +ACCOUNT +ACCOUNTANT +ACCRA +ACCREDIT +ACCREDITATE +ACCREDITATION +ACCRETION +ACCRUAL +ACCRUE +.RF +acculturate +accumulate +accuracy +accurate +accusation +accusative +accusatory +accuse +accustom +ace +acerbic +acerbity +acetate +acetic +acetone +acetylene +ache +achieve +Achilles +aching +achromatic +acid +acidic +acidulous +.H 5 "hej hopp" +Ackerman +Ackley +acknowledge +acknowledgeable +ACM +acme +acolyte +acorn +acoustic +acquaint +acquaintance +acquiesce +acquiescent +acquire +acquisition +acquisitive +acquit +acquittal +acquitting +acre +acreage +acrid +acrimonious +acrimony +acrobacy +acrobat +acrobatic +acronym +acropolis +across +acrylate +acrylic +ACS +act +Actaeon +actinic +actinide +actinium +actinolite +actinometer +activate +activation +activism +Acton +actor +actress +Acts +actual +actuarial +actuate +.H 6 "hej hopp" +acuity +acumen +acute +acyclic +ad +Ada +adage +adagio +Adair +Adam +adamant +Adams +Adamson +adapt +adaptation +adaptive +add +added +addend +addenda +addendum +addict +Addis +Addison +addition +additional +additive +addle +address +addressee +Addressograph +adduce +Adelaide +Adele +Adelia +Aden +adenine +adenoma +adenosine +adept +adequacy +adequate +adhere +adherent +adhesion +adhesive +adiabatic +adieu +adipic +Adirondack +.H 7 "hej hopp" +adjacent +adject +adjectival +adjective +adjoin +adjoint +adjourn +adjudge +adjudicate +adjunct +adjust +adjutant +Adkins +Adler +administer +administrable +administrate +administratrix +admiral +admiralty +admiration +admire +admissible +admission +admit +admittance +admitted +admitting +admix +admixture +admonish +admonition +ado +adobe +adolescent +Adolph +Adolphus +Adonis +adopt +adoption +adoptive +adore +adorn +adposition +adrenal +adrenaline +Adrian +Adriatic +Adrienne +adrift +adroit +adsorb +adsorbate +adsorption +adsorptive +adulate +adult +adulterate +adulterous +adultery +adulthood +advance +advantage +advantageous +advent +adventitious +adventure +adventurous +adverb +adverbial +adversary +adverse +advert +advertise +advice +advisable +advise +advisee +advisor +advisory +advocacy +advocate +Aegean +aegis +Aeneas +Aeneid +aeolian +Aeolus +aerate +aerial +Aerobacter +aerobic +aerodynamic +aerogene +aeronautic +aerosol +aerospace +Aeschylus +aesthete +aesthetic +10th +1st +2nd +3rd +4th +5th +6th +7th +8th +9th +a +AAA +AAAS +Aarhus +Aaron +AAU +ABA +Ababa +aback +abacus +abalone +abandon +abase +.H 1 "hej hopp" +abash +abate +abater +abbas +abbe +abbey +abbot +Abbott +abbreviate +abc +abdicate +abdomen +abdominal +abduct +Abe +abed +Abel +Abelian +Abelson +Aberdeen +Abernathy +aberrant +aberrate +abet +abetted +abetting +abeyance +abeyant +.H 2 "hej hopp" +abhorred +abhorrent +abide +Abidjan +Abigail +abject +ablate +ablaze +able +ablution +Abner +abnormal +Abo +aboard +abode +abolish +abolition +abominable +abominate +aboriginal +aborigine +aborning +abort +abound +about +above +aboveboard +aboveground +abovementioned +abrade +Abraham +Abram +Abramson +abrasion +abrasive +abreact +abreast +abridge +abridgment +abroad +abrogate +abrupt +abscess +abscissa +abscissae +absence +absent +absentee +absenteeism +absentia +.H 3 "hej hopp" +absentminded +absinthe +absolute +absolution +absolve +absorb +absorbent +absorption +absorptive +abstain +abstention +abstinent +abstract +abstracter +abstractor +abstruse +absurd +abuilding +abundant +abusable +abuse +abusive +abut +abutted +abutting +abysmal +abyss +Abyssinia +AC +academe +academia +academic +academician +academy +Acadia +acanthus +Acapulco +accede +accelerate +accelerometer +accent +accentual +accentuate +accept +acceptant +acceptor +access +accessible +accession +accessory +.H 4 "hej hopp" +accident +accidental +accipiter +acclaim +acclamation +acclimate +accolade +accommodate +accompaniment +accompanist +accompany +accomplice +accomplish +accord +accordant +accordion +accost +account +accountant +Accra +accredit +accreditate +accreditation +accretion +accrual +accrue +acculturate +accumulate +accuracy +accurate +accusation +accusative +accusatory +accuse +accustom +ace +acerbic +acerbity +acetate +acetic +acetone +acetylene +ache +achieve +Achilles +aching +achromatic +acid +acidic +acidulous +.H 5 "hej hopp" +Ackerman +Ackley +acknowledge +acknowledgeable +ACM +acme +acolyte +acorn +acoustic +acquaint +acquaintance +acquiesce +acquiescent +acquire +acquisition +acquisitive +acquit +acquittal +acquitting +acre +acreage +acrid +acrimonious +acrimony +acrobacy +acrobat +acrobatic +acronym +acropolis +across +acrylate +acrylic +ACS +act +Actaeon +actinic +actinide +actinium +actinolite +actinometer +activate +activation +activism +Acton +actor +actress +Acts +actual +actuarial +actuate +.H 6 "hej hopp" +acuity +acumen +acute +acyclic +ad +Ada +adage +adagio +Adair +Adam +adamant +Adams +Adamson +adapt +adaptation +adaptive +add +added +addend +addenda +addendum +addict +Addis +Addison +addition +additional +additive +addle +address +addressee +Addressograph +adduce +Adelaide +Adele +Adelia +Aden +adenine +adenoma +adenosine +adept +adequacy +adequate +adhere +adherent +adhesion +adhesive +adiabatic +adieu +adipic +Adirondack +.H 7 "hej hopp" +adjacent +adject +adjectival +adjective +adjoin +adjoint +adjourn +adjudge +adjudicate +adjunct +adjust +adjutant +Adkins +Adler +administer +administrable +administrate +administratrix +admiral +admiralty +admiration +admire +admissible +admission +admit +admittance +admitted +admitting +admix +admixture +admonish +admonition +ado +adobe +adolescent +Adolph +Adolphus +Adonis +adopt +adoption +adoptive +adore +adorn +adposition +adrenal +adrenaline +Adrian +Adriatic +Adrienne +adrift +adroit +adsorb +adsorbate +adsorption +adsorptive +adulate +adult +adulterate +adulterous +adultery +adulthood +advance +advantage +advantageous +advent +adventitious +adverse +advert +advertise +advice +advisable +advise +advisee +advisor +advisory +advocacy +advocate +Aegean +aegis +Aeneas +Aeneid +aeolian +Aeolus +aerate +aerial +Aerobacter +aerobic +aerodynamic +aerogene +aeronautic +aerosol +aerospace +Aeschylus +aesthete +aesthetic +.H 1 "hej hopp" +acuity +acumen +acute +acyclic +ad +Ada +adage +adagio +Adair +Adam +adamant +Adams +Adamson +adapt +adaptation +adaptive +add +added +addend +addenda +addendum +addict +Addis +Addison +addition +additional +additive +addle +address +addressee +Addressograph +adduce +Adelaide +Adele +Adelia +Aden +adenine +adenoma +adenosine +adept +adequacy +adequate +adhere +adherent +adhesion +adhesive +adiabatic +adieu +adipic +Adirondack +.H 2 "hej hopp" +adjacent +adject +adjectival +adjective +adjoin +adjoint +adjourn +adjudge +adjudicate +.H 2 "hej hopp" +adjunct +adjust +adjutant +Adkins +Adler +administer +administrable +administrate +administratrix +admiral +admiralty +admiration +admire +admissible +admission +admit +admittance +admitted +admitting +admix +admixture +admonish +admonition +ado +adobe +adolescent +Adolph +Adolphus +Adonis +adopt +adoption +adoptive +adore +adorn +adposition +adrenal +adrenaline +Adrian +Adriatic +Adrienne +adrift +adroit +adsorb +adsorbate +adsorption +adsorptive +adulate +adult +adulterate +adulterous +adultery +adulthood +advance +advantage +advantageous +advent +adventitious +adverse +advert +advertise +advice +advisable +advise +advisee +advisor +advisory +advocacy +advocate +Aegean +aegis +Aeneas +Aeneid +aeolian +Aeolus +aerate +aerial +Aerobacter +aerobic +aerodynamic +aerogene +aeronautic +aerosol +aerospace +Aeschylus +aesthete +aesthetic +.RP 0 1 +.TC diff --git a/contrib/mm/examples/SETR b/contrib/mm/examples/SETR new file mode 100644 index 0000000..0a92241 --- /dev/null +++ b/contrib/mm/examples/SETR @@ -0,0 +1,109 @@ +.nr Cl 6 +.INITR setr +.H 1 " granary grand grandchild grandchildren granddaughter grandeur" +.SETR ref1 +.H 2 "grandfather grandiloquent grandiose grandma grandmother grandnephew" +.H 2 "grandniece grandpa grandparent grandson grandstand granite granitic" +.H 2 "granny granola grant grantee grantor granular granulate" +.SETR ref2 +.H 2 "granule Granville grape" +grant +grantee +grantor +granular +granulate +.br +granule +.B +REF 9: +.GETHN ref9 +, page number +.GETPN ref9 +.R +Granville +grape +.br +grapefruit +grapevine +graph +grapheme +graphic +graphite +\fBExhibit\fP +.GETHN ex1 + +grapple +grasp +grass +grassland +grassy +grata +grate +.H 2 "grapefruit grapevine graph grapheme graphic graphite" +.H 3 "grapple" +.SETR ref3 +.H 3 "grasp grass grassland grassy grata grate grateful" +.H 3 "grater gratify gratis gratitude" +.H 4 "gratuitous gratuity grave" +.H 4 "gravel graven" +.SETR ref4 +.H 1 "Graves gravestone graveyard gravid gravitate gravy gray" +.H 2 "graybeard grayish Grayson graywacke graze grease greasy great greatcoat" +.H 2 "greater grebe Grecian Greece greed greedy Greek green Greenbelt Greenberg" +.H 2 "Greenblatt Greenbriar Greene greenery" +.SETR ref5 +.H 1 "Greenfield greengrocer greenhouse greenish Greenland Greensboro" +.H 1 "greensward greenware Greenwich greenwood Greer greet" +grant +grantee +.DS + +Advertisements contain the only truths to be relied on in a newspaper. + -- Thomas Jefferson +.EX fortune "" "" ex1 +.DE +grantor +granular +.GETR ref1 +granulate +granule +.H 2 "Using variables" +.B +REF 2: +.GETHN ref2 c +.GETPN ref2 bbb +\*c, page number \*[bbb] +.R +Granville +grape +grapefruit +grapevine +graph +grapheme +.H 2 "Greg gregarious Gregg Gregory gremlin grenade Grendel" +.H 2 "Grenoble Gresham Greta Gretchen" +.SETR ref6 +.H 2 "grew" +.H 1 "grey greyhound greylag grid griddle gridiron grief" +.H 1 "grievance grieve grievous griffin Griffith grill grille grilled grillwork" +.H 3 "grim grimace Grimaldi grime Grimes Grimm grin grind grindstone" +.H 3 "grip gripe grippe grisly grist gristmill Griswold grit" +.SETR ref7 +.H 3 "gritty grizzle grizzly groan groat grocer grocery groggy groin" +.H 1 "grommet groom groove grope grosbeak gross Grosset Grossman Grosvenor grotesque" +.H 1 "Groton ground groundsel groundskeep groundwork group groupoid" +.H 4 "grout grove grovel Grover grow growl grown grownup growth grub grubby" +.H 4 "grudge gruesome gruff grumble Grumman grunt gryphon g's" +.SETR ref8 +.H 4 "GSA GU Guam guanidine guanine guano guarantee guaranteeing guarantor" +.H 4 "guaranty" +.H 1 "guard guardhouse Guardia guardian Guatemala gubernatorial Guelph Guenther" +.H 1 "guerdon guernsey guerrilla guess guesswork guest guffaw Guggenheim" +.SETR ref9 +.H 1 "Guiana guidance guide guidebook guideline guidepost guiding" +.H 1 "guignol" +.GETR ref6 +.H 1 "guild guildhall guile Guilford guillemot guillotine guilt" +.SETR ref10 +.H 1 "guilty guinea guise guitar gules gulf gull Gullah" +.H 1 "gullet gullible gully gulp gum gumbo gumdrop gummy gumption" diff --git a/contrib/mm/groff_mm.man b/contrib/mm/groff_mm.man new file mode 100644 index 0000000..91485a6 --- /dev/null +++ b/contrib/mm/groff_mm.man @@ -0,0 +1,2104 @@ +.\" +.\" $Id: groff_mm.man,v 2.13 2004/07/03 12:46:56 wlemb Exp $ +.\" +.de T2 +.if t .ne 2v +.ti -.5i +\\$1 +.sp -1 +.. +. +.de T3 +.if t .ne 2v +.ti -.5i +\fB\\$1\fP +.br +.. +. +.TH GROFF_MM @MAN7EXT@ "@MDATE@" "Groff Version @VERSION@" +.SH NAME +groff_mm \- groff mm macros +.SH SYNOPSIS +.B groff +.B \-m@TMAC_M_PREFIX@m +[ +.IR options .\|.\|. +] +[ +.IR files .\|.\|. +] +.SH DESCRIPTION +The groff mm macros are intended to be compatible with the DWB mm macros +with the following limitations: +.TP +.B \(bu +no Bell Labs localisms implemented. +.TP +.B \(bu +the macros OK and PM are not implemented. +.TP +.B \(bu +groff mm does not support cut marks +.LP +\fBm@TMAC_M_PREFIX@m\fP is intended to be international. +Therefore it is +possible to write short national macrofiles which change all +english text to the preferred language. +Use \fBm@TMAC_M_PREFIX@mse\fP as an example. +.\"######################################################################## +.LP +A file called \fBlocale\fP or \fIlang\fP\fB_locale\fP is read +after the initiation of the global variables. +It is therefore +possible to localize the macros with companyname and so on. +.sp +In this manual square brackets is used to show optional arguments. +.sp 3 +\fBNumber registers and strings\fP +.br +Many macros can be controlled by number registers and strings. +A number register is assigned with the \fBnr\fP command: +.br +\fB\&.nr\fP \fIXXX\fP \fI[+-]n [i]\fP +.br +\fBXXX\fP is the name of the register, \fBn\fP is the value to +be assigned, and \fBi\fP is increment value for auto-increment. +\fBn\fP can have a plus or minus sign as prefix if an increment +or decrement of the current value is wanted. +(Auto-increment or decrement +occurs if the number register is used with a plus or minus sign, +\fB\en+[XXX]\fP or \fB\en-[XXX]\fP.) +.sp +Strings is defined with \fBds\fP. +.br +\fB\&.ds\fP \fIYYY string\fP +.br +The string is assigned everything to the end of the line, even blanks. +Initial blanks in \fIstring\fP should be prefixed with +a double-quote. +(Strings are used in the text as \fB\e*[YYY]\fP.) +.sp +\fBSpecial formatting of number registers\fP +.br +A number register is printed with normal digits if no format has been +given. +Set the format with \fBaf\fP: +.br +\fB\&.af\fP \fIR c\fP +.br +\fIR\fP is the name of the register, \fIc\fP is the format. +.in +.5i +.T2 \fBForm\fP +\fBSequence\fP +.T2 1 +0, 1, 2, 3, ... +.T2 001 +000, 001, 002, 003, ... +.T2 i +0, i, ii, iii, iv, ... +.T2 I +0, I, II, III, IV, ... +.T2 a +0, a, b, c, ..., z, aa, ab, ... +.T2 A +0, A, B, C, ..., Z, AA, AB, ... +.in + +.LP +\fBMacros:\fP +.TP +.B ")E level text" +Adds \fBtext\fP (heading-text) to the table of contents +with \fBlevel\fP either 0 +or between 1-7. +See also \fB.H\fP. +This macro is used for customized +table of contents. +.TP +.B "1C [1]" +Begin one column processing. +An \fB1\fP as argument disables the page-break. +Use wide footnotes, small footnotes may be overprinted. +.TP +.B 2C +Begin two column processing. +Splits the page in two columns. +It is +a special case of \fBMC\fP. +See also \fB1C\fP. +.TP +.B AE +Abstract end, see \fBAS\fP. +.TP +.B "AF [name of firm]" +Authors firm, should be called before \fBAU\fP, see also \fBCOVER\fP. +.TP +.B "AL [type [text-indent [1]]]" +Start autoincrement list. +Items are numbered beginning on one. +The \fItype\fP argument controls the type of numbers. +.in +.5i +.T2 Arg +Description +.T2 1 +Arabic (the default) +.T2 A +Upper-case letters (A-Z) +.T2 a +Lower-case letters (a-z) +.T2 I +Upper-case roman +.T2 i +Lower-case roman +.in +\fIText-indent\fP sets the indent and overrides \fBLi\fP. +A third argument will prohibit printing of a blank line before each +item. +.TP +.B "APP name text" +Begin an appendix with name \fIname\fP. +Automatic naming occurs if +\fIname\fP is "". +The appendixes starts with \fBA\fP if auto is used. +An new page is ejected, and a header is also produced if the number +variable \fBAph\fP is non-zero. +This is the default. +The appendix always appear in the 'List of contents' with correct +pagenumber. +The name \fIAPPENDIX\fP can be changed by setting +the string \fBApp\fP to the desired text. +The string \fBApptxt\fP contains the current appendix text. +.TP +.B "APPSK name pages text" +Same as \fB.APP\fP, but the pagenr is incremented with \fIpages\fP. +This is used when diagrams or other non-formatted documents are +included as appendixes. +.TP +.B "AS [arg [indent]]" +Abstract start. +Indent is specified in 'ens', but scaling is allowed. +Argument \fIarg\fP controls where the abstract is printed. +.in +.5i +.T2 Arg +Placement +.T2 0 +Abstract will be printed on page 1 and on the cover sheet if +used in the released-paper style (\fBMT 4\fP), otherwise +it will be printed on page 1 without a cover sheet. +.T2 1 +Abstract will only be printed on the cover sheet (\fBMT 4\fP only). +.T2 2 +Abstract will be printed only on the cover sheet (other than \fBMT 4\fP only). +The cover sheet is printed without need for \fBCS\fP. +.in +Abstract is not printed at all in external letters (\fBMT 5\fP). +The \fIindent\fP controls the indentation of both margins, otherwise +will normal text indent be used. +.TP +.B "AST [title]" +Abstract title. +Default is \fBABSTRACT\fP. +Sets the text above the abstract text. +.TP +.B "AT title1 [title2 ...]" +Authors title. +\fBAT\fP must appear just after each \fBAU\fP. +The title will show up after the name in the signature block. +.TP +.B "AU [name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]]]" +Author information, specifies the author of the memo or paper, and +will be printed on the cover sheet and on other similar places. +\fBAU\fP must not appear before \fBTL\fP. +The author information +can contain initials, location, department, telephone extension, +room number or name and up to three extra arguments. +.TP +.B "AV [name [1]]" +Approval signature, generates an approval line with place for +signature and date. +The string \fBAPPROVED:\fP can be changed +with variable \fBLetapp\fP, and the string \fBDate\fP in \fBLetdate\fP. +.TP +.B "AVL [name]" +Letter signature, generates a line with place for signature. +.TP +.B "B [bold-text [prev-font-text [bold...]]]" +Begin boldface. +No limit on the number of arguments. +All arguments will be concatenated to one word, the first, third and so +on will be printed in boldface. +.TP +.B B1 +Begin box (as the ms macro). +Draws a box around the text. +The text will be indented one character, +and the right margin will be one character shorter. +.TP +.B B2 +End box. +Finish the box started by \fBB1\fP. +.TP +.B BE +End bottom block, see \fBBS\fP. +.TP +.B "BI [bold-text [italic-text [bold-text [...]]]]" +Bold-italic. +No limit on the number of arguments, see \fBB\fP. +.TP +.B "BL [text-indent [1]]" +Start bullet list, initialize a list with a bullet and a space +in the beginning of each list item (see \fBLI\fP). +\fIText-indent\fP +overrides the default indentation of the list items set by +number register \fBPi\fP. +A third argument will prohibit printing of a blank line before each +item. +.TP +.B "BR [bold-text [roman-text [bold-text [...]]]]" +Bold-roman. +No limit on the number of arguments. +.TP +.B BS +Bottom block start. +Begins the definition of a text block which is +printed at the bottom of each page. +Block ends with \fBBE\fP. +.TP +.B "BVL text-indent [mark-indent [1]]" +Start of +broken variable-item list. +Broken variable-item list has no fixed mark, it assumes that +every \fBLI\fP has a mark instead. +The text will always begin at the next line after the mark. +\fIText-indent\fP sets the indent to the text, and \fImark-indent\fP +the distance from the current indent to the mark. +A third argument will prohibit printing of a blank line before each +item. +.TP +.B "COVER [arg]" +\&\fBCOVER\fP begins a coversheet definition. +It is important +that \fB.COVER\fP appears before any normal text. +\&\fB.COVER\fP uses \fIarg\fP to build the filename +@TMAC_MDIR@/\fIarg\fP.cov. +Therefore it is possible to create unlimited +types of coversheets. +\fIms.cov\fP is supposed to look like the \fBms\fP coversheet. +\&\fB.COVER\fP requires a \fB.COVEND\fP at the end of the coverdefinition. +Always use this order of the covermacros: +.nf +\&.COVER +\&.TL +\&.AF +\&.AU +\&.AT +\&.AS +\&.AE +\&.COVEND +.fi +However, only \fB.TL\fP and \fB.AU\fP are required. +.TP +.B COVEND +This finish the cover description and prints the cover-page. +It is defined in the cover file. +.TP +.B DE +Display end. +Ends a block of text, display, that begins +with \fBDS\fP or \fBDF\fP. +.TP +.B "DF [format [fill [rindent]]]" +Begin floating display (no nesting allowed). +A floating display is saved in a queue and is printed in the +order entered. +\fIFormat\fP, \fIfill\fP and \fIrindent\fP is the same +as in \fBDS\fP. +Floating displays are controlled by the two number registers \fBDe\fP +and \fBDf\fP. +.sp +\fBDe register\fP +.in +.5i +.T2 0 +Nothing special, this is the default. +.T2 1 +A page eject will occur after each printed display, giving only +one display per page and no text following it. +.in +.sp +\fBDf register\fP +.in +.5i +.T2 0 +Displays are printed at the end of each section (when section-page +numbering is active) or at the end of the document. +.T2 1 +A new display will be printed on the current page if there is enough +space, otherwise it will be printed at the end of the document. +.T2 2 +One display will be printed at the top of each page or column +(in multi-column mode). +.T2 3 +Print one display if there is enough space for it, otherwise it will +be printed at the top of the next page or column. +.T2 4 +Print as many displays that will fit in a new page or column. +A page break will occur between each display if \fBDe\fP is not zero. +.T2 5 +Fill the current page with displays and the rest beginning at a new page +or column. +(This is the default.) +A page break will occur between each display +if \fBDe\fP is not zero. +.in +.TP +.B "DL [text-indent [1 [1]]]" +Dash list start. +Begins a list where each item is printed +after a dash. +\fIText-indent\fP changes the default indentation +of the list items set by +number register \fBPi\fP. +A second argument prevents the empty line between each list item +to be printed. +See \fBLI\fP. +A third argument will prohibit printing of a blank line before each +item. +.TP +.B "DS [format [fill [rindent]]]" +Static display start. +Begins collection of text until \fBDE\fP. +The text is printed together on the same page, unless it is longer +than the height of the page. +\fBDS\fP can be nested to a unlimited depth (reasonably :-). +.sp +\fBformat\fP +.in +.5i +.ds x " +.T2 """""" +No indentation. +.T2 none +No indentation. +.T2 L +No indentation. +.T2 I +Indent text with the value of number register \fBSi\fP. +.T2 C +Center each line +.T2 CB +Center the whole display as a block. +.T2 R +Right adjust the lines. +.T2 RB +Right adjust the whole display as a block +.in +.sp +L, I, C and CB can also be specified as 0, 1, 2 or 3 for compatibility +reasons. +(Don't use it.\ :-) +.sp +\fBfill\fP +.in +.5i +.T2 """""" +Line-filling turned off. +.T2 none +Line-filling turned off. +.T2 N +Line-filling turned off. +.T2 F +Line-filling turned on. +.in +.sp +N and F can also be specified as 0 or 1. +An empty line will normally be printed before and after the +display. +Setting number register \fBDs\fP to 0 will prevent this. +\fIRindent\fP shortens the line length by that amount. +.TP +.B "EC [title [override [flag [refname]]]]" +Equation title. +Sets a title for an equation. +The \fIoverride\fP argument +change the numbering. +.sp +\fBflag\fP +.in +.5i +.T2 none +\fIoverride\fP is a prefix to the number. +.T2 0 +\fIoverride\fP is a prefix to the number. +.T2 1 +\fIoverride\fP is a suffix to the number. +.T2 2 +\fIoverride\fP replaces the number. +.in +\fBEC\fP uses the number register \fBEc\fP as counter. +It is possible to use \fB.af\fP to change the format of the number. +If number register \fBOf\fP is 1, then the format of title +will use a dash instead of a dot after the number. +.br +The string \fBLe\fP controls the title of the +List of Equations, default is \fILIST OF EQUATIONS\fP. +The List of Equations will only be printed if number register \fBLe\fP +is 1, default 0. +The string \fBLiec\fP contains the word \fIEquation\fP, wich +is printed before the number. +If \fIrefname\fP is used, then the equation number is saved with +\&\fB.SETR\fP, and can be retrieved with \fB.GETST\fP \fIrefname\fP. +.br +Special handling of the title will occur if +\fBEC\fP is used inside \fBDS\fP/\fBDE\fP, it will not be +affected by the format of \fBDS\fP. +.TP +.B "EF [arg]" +Even-page footer, printed just above the normal page footer +on even pages, see \fBPF\fP. +.TP +.B "EH [arg]" +Even-page header, printed just below the normal page header +on even pages, see \fBPH\fP. +.TP +.B EN +Equation end, see \fBEQ\fP. +.TP +.B EOP +End of page user-defined macro. +This macro will be called +instead of the normal printing of the footer. +The macro +will be executed in a separate environment, without any +trap active. +See \fBTP\fP. +.sp +\fBStrings available to EOP\fP +.in +.5i +.T2 EOPf +Argument from \fBPF\fP. +.T2 EOPef +Argument from \fBEF\fP. +.T2 EOPof +Argument from \fBOF\fP. +.in +.TP +.B "EPIC [-L] width height [name]" +\fBEPIC\fP draws a box with the given \fIwidth\fP and \fIheight\fP, it will +also print the text \fIname\fP or a default string if +\fIname\fP is not specified.. +This is used to include external pictures, just give the size +of the picture. +\fB-L\fP will leftadjust the picture, the default is to center adjust. +See \fBPIC\fP +.TP +.B "EQ [label]" +Equation start. +\fBEQ\fP/\fBEN\fP are the delimiters for equations written for \fBeqn\fP. +\fBEQ\fP/\fBEN\fP must be inside a \fBDS\fP/\fBDE\fP-pair, except +when \fBEQ\fP is only used to set options in \fBeqn\fP. +The \fIlabel\fP will appear at the right margin of the equation, unless +number register \fBEq\fP is\ 1. +Then the label will appear at the +left margin. +.TP +.B "EX [title [override [flag [refname]]]]" +Exhibit title, arguments are the same as for \fBEC\fP. +\fBEX\fP uses the number register \fBEx\fP as counter. +The string \fBLx\fP controls the title of the +List of Exhibits, default is \fILIST OF EXHIBITS\fP. +The List of Exhibits will only be printed if number register \fBLx\fP +is 1, default 1. +The string \fBLiex\fP contains the word \fIExhibit\fP, which +is printed before the number. +If \fIrefname\fP is used, then the exhibit number is saved with +\&\fB.SETR\fP, and can be retrieved with \fB.GETST\fP \fIrefname\fP. +.br +Special handling of the title will occur if +\fBEX\fP is used inside \fBDS\fP/\fBDE\fP, it will not be +affected by the format of \fBDS\fP. +.TP +.B "FC [closing]" +Prints \fIYours\ very\ truly,\fP as a formal closing of a letter or +memorandum. +The argument replaces the defualt string. +The default is stored in string variable \fBLetfc\fP. +.TP +.B "FD [arg [1]]" +Footnote default format. +Controls the hyphenation (hyphen), right margin justification (adjust), +indentation of footnote text (indent). +It can also change the label +justification (ljust). +.sp +.if t .ne 14v +.nf +.ta .5i +.8i +.8i +.8i +.8i +\fBarg hyphen adjust indent ljust\fP +0 no yes yes left +1 yes yes yes left +2 no no yes left +3 yes no yes left +4 no yes no left +5 yes yes no left +6 no no no left +7 yes no no left +8 no yes yes right +9 yes yes yes right +10 no no yes right +11 yes no yes right +.sp +.fi +.DT +Argument greater than or equal to 11 is considered as arg 0. +Default for m@TMAC_M_PREFIX@m is 10. +.TP +.B FE +Footnote end. +.TP +.B "FG [title [override [flag [refname]]]]" +Figure title, arguments are the same as for \fBEC\fP. +\fBFG\fP uses the number register \fBFg\fP as counter. +The string \fBLf\fP controls the title of the +List of Figures, default is \fILIST OF FIGURES\fP. +The List of Figures will only be printed if number register \fBLf\fP +is 1, default 1. +The string \fBLifg\fP contains the word \fIFigure\fP, wich +is printed before the number. +If \fIrefname\fP is used, then the figure number is saved with +\&\fB.SETR\fP, and can be retrieved with \fB.GETST\fP \fIrefname\fP. +.br +Special handling of the title will occur if +\fBFG\fP is used inside \fBDS\fP/\fBDE\fP, it will not be +affected by the format of \fBDS\fP. +.TP +.B "FS [label]" +Footnote start. +The footnote is ended by \fBFE\fP. +Footnotes is normally automatically +numbered, the number is available in string \fBF\fP. +Just add \fB\e*F\fP in the text. +By adding \fIlabel\fP, it is possible +to have other number or names on the footnotes. +Footnotes in displays is now possible. +An empty line separates footnotes, the height of the line +is controlled by number register \fBFs\fP, default value is 1. +.TP +.B "GETHN refname [varname]" +Includes the headernumber where the corresponding \fBSETR\fP \fIrefname\fP +was placed. +Will be X.X.X. in pass\ 1. +See \fBINITR\fP. +If \fIvarname\fP is used, \fBGETHN\fP sets the stringvariable \fIvarname\fP to the +headernumber. +.TP +.B "GETPN refname [varname]" +Includes the pagenumber where the corresponding \fBSETR\fP \fIrefname\fP +was placed. +Will be 9999 in pass\ 1. +See \fBINITR\fP. +If \fIvarname\fP is used, \fBGETPN\fP sets the stringvariable \fIvarname\fP +to the pagenumber. +.TP +.B "GETR refname" +Combines \fBGETHN\fP and \fBGETPN\fP with the text 'chapter' and ', page'. +The string \fIQrf\fP contains the text for reference: +.ti +.5i +\&.ds Qrf See chapter \e\e*[Qrfh], page \e\e*[Qrfp]. +.br +\fIQrf\fP may be changed to support other languages. +Strings \fIQrfh\fP and \fIQrfp\fP are set by \fBGETR\fP +and contains the page and headernumber. +.TP +.B "GETST refname [varname]" +Includes the string saved with the second argument to \fB.SETR\fP. +Will be dummystring in pass 1. +If varname is used, \fBGETST\fP sets the stringvariable \fIvarname\fP to the +saved string. +See \fBINITR\fP. +.TP +.B "H level [heading-text [heading-suffix]]" +Numbered section heading. +Section headers can have a level between 1 and 14, level 1 is the +top level. +The text is given in \fIheading-text\fP, and must be +surrounded by double quotes if it contains spaces. +\fBHeading-suffix\fP is added to the header in the text but not in +the table of contents. +This is normally used for footnote marks +and similar things. +Don't use \fB\e*F\fP in \fIheading-suffix\fP, it won't +work. +A manual label must be used, see \fBFS\fP. +.sp +An eventual paragraph, \fBP\fP, directly after \fBH\fP will be +ignored, \fBH\fP is taking care of spacing and indentation. +.sp +\fBPage ejection before heading\fP +.br +Number register \fBEj\fP controls page ejection before the heading. +Normally, a level one heading gets two blank lines before it, higher levels +gets only one. +A new page is ejected before each +first-level heading if number register \fBEj\fP is 1. +All levels below or equal the value of \fBEj\fP gets a new page. +Default value for \fBEj\fP is 0. +.sp +\fBHeading break level\fP +.br +A line break occurs after the heading if the heading level is less +or equal to number register \fBHb\fP. +Default value 2. +.sp +\fBHeading space level\fP +.br +A blank line is inserted after the heading if the heading level is less +or equal to number register \fBHs\fP. +Default value 2. +.sp +Text will follow the heading on the same line if the level is greater +than both \fBHb\fP and \fBHs\fP. +.sp +\fBPost-heading indent\fP +.br +Indentation of the text after the heading is controlled by number +register \fBHi\fP, default value 0. +.sp +\fBHi\fP +.in +.5i +.T2 0 +The text will be left-justified. +.T2 1 +Indentation of the text will follow the value of number register \fBPt\fP, +see \fBP\fP. +.T2 2 +The text will be lined up with the first word of the heading. +.in +.sp +\fBCentered section headings\fP +.br +All headings whose level is equal or below number register \fBHc\fP +and also less than or equal to \fBHb\fP or \fBHs\fP +is centerered. +.sp +\fBFont control of the heading\fP +.br +The font of each heading level is controlled by string \fBHF\fP. +It contains a fontnumber or fontname for each level. +Default +is \fB2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\ 2\fP (all headings in italic). +Could also be written as \fBI\ I\ I\ I\ I\ I\ I\ I\ I\ I\ I\ I\ I\ I\fP. +Note that some other implementations use \fB3\ 3\ 2\ 2\ 2\ 2\ 2\fP as the +default value. +All omitted values are presumed to be a 1. +.sp +\fBPoint size control\fP. +.br +String \fBHP\fP controls the pointsize of each heading, in the +same way as \fBHF\fP controls the font. +A value of 0 selects the default point size. +Default value is \fB0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\ 0\fP. +Beware that only the +point size changes, not the vertical size. +That can be controlled by the user specified macro \fBHX\fP and/or +\fBHZ\fP. +.sp +\fBHeading counters\fP +.br +Fourteen number registers, named \fBH1\fP thru \fBH14\fP contains +the counter for each heading level. +The values are printed using arabic numerals, this can be changed +with the macro \fBHM\fP (see below). +All marks are concatenated before printing. +To avoid this, set +number register \fBHt\fP to\ 1. +That will only print the current +heading counter at each heading. +.sp +\fBAutomatic table of contents\fP +.br +All headings whose level is equal or below number register \fBCl\fP +is saved to be printed in the table of contents. +Default value is\ 2. +.sp +\fBSpecial control of the heading, user-defined macros\fP. +.br +These macros can be defined by the user to get a finer control +of vertical spacing, fonts or other features. +Argument \fIlevel\fP is the level-argument to \fBH\fP, but +0 for unnumbered headings (see \fBHU\fP). +Argument \fIrlevel\fP is the real level, it is +set to number register \fBHu\fP for unnumbered headings. +Argument \fIheading-text\fP is the text argument to \fBH\fP and \fBHU\fP. +.sp +\fBHX\ \fP\fIlevel\ rlevel\ heading-text\fP +.br +\fBHX\fP is called just before the printing of the heading. +The following register is available for \fBHX\fP. +\fBHX\fP may alter \fB}0\fP, \fB}2\fP and \fB;3\fP. +.in +.5i +.T3 "string }0" +Contains the heading mark plus two spaces if \fIrlevel\fP is non-zero, +otherwise empty. +.T3 "register ;0" +Contains the position of the text after the heading. +0 means that the text should follow the heading on the same line, 1 +means that a line break should occur before the text and +2 means that a blank line should separate the heading and the text. +.T3 "string }2" +Contains two spaces if register \fB;0\fP is\ 0. +It is used to +separate the heading from the text. +The string +is empty if \fB;0\fP is non-zero. +.T3 "register ;3" +Contains the needed space in units after the heading. +Default is 2v. + +Can be used to change things like numbering (\fB}0\fP), +vertical spacing (\fB}2\fP) +and the needed space after the heading. +.in +.sp +\fBHY\ \fP\fIdlevel\ rlevel\ heading-text\fP +.br +\fBHY\fP is called after size and font calculations and +might be used to change indentation. +.sp +\fBHZ\ \fP\fIdlevel\ rlevel\ heading-text\fP +.br +\fBHZ\fP is called after the printing of the heading, just before +\fBH\fP or \fBHU\fP exits. +Could be used to change the page header according to the section heading. +.TP +.B "HC [hyphenation-character]" +Set hyphenation character. +Default value is \e%. +Resets to the default if called without argument. +Hyphenation can be turned off by setting number +register \fBHy\fP to 0 in the beginning of the file. +.TP +.B "HM [arg1 [arg2 [... [arg14]]]]" +Heading mark style. +Controls the type of marking for printing of the heading counters. +Default is 1 for all levels. +.sp +\fBArgument\fP +.in +.5i +.T2 1 +Arabic numerals. +.T2 0001 +Arabic numerals with leading zeroes, one or more. +.T2 A +Upper-case alphabetic +.T2 a +Lower-case alphabetic +.T2 I +Upper-case roman numerals +.T2 i +lower-case roman numerals +.T2 \fIempty\fP +Arabic numerals. +.in +.TP +.B "HU heading-text" +Unnumbered section header. +\fBHU\fP behavies like \fBH\fP at the level in number register \fBHu\fP. +See \fBH\fP. +.TP +.B "HX dlevel rlevel heading-text" +Userdefined heading exit. +Called just before printing the header. +See \fBH\fP. +.TP +.B "HY dlevel rlevel heading-text" +Userdefined heading exit. +Called just before printing the header. +See \fBH\fP. +.TP +.B "HZ dlevel rlevel heading-text" +Userdefined heading exit. +Called just after printing the header. +See \fBH\fP. +.TP +.B "I [italic-text [prev-font-text [italic-text [...]]]]" +Italic. +Changes the font to italic if called without arguments. +With one argument it will set the word in italic. +With two argument it will concatenate them and set the first +word in italic and the second in the previous font. +There is no limit on the number of argument, all will be concatenated. +.TP +.B "IA [addressee-name [title]]" +Begins specification of the addressee and addressee's address in +letter style. +Several names can be specified with empty \fBIA\fP/\fBIE\fP-pairs, but +only one address. +See \fBLT\fP. +.TP +.B "IB [italic-text [bold-text [italic-text [...]]]]" +Italic-bold. +Even arguments is printed in italic, odd in boldface. +See \fBI\fP. +.TP +.B IE +Ends the address-specification after \fPIA\fP. +.TP +.B "INITI type filename [macro]" +Initialize the new index system, sets the filename to collect +index lines in with \fBIND\fP. +Argument \fItype\fP selects +the type of index, page number, header marks or both. +The default is \fIN\fP. + +It is also possible to create a macro that is responsible +for formatting each row. +Add the name of the macro as argument\ 3. +The macro will be called with the index as argument(s). +.sp +\fBtype\fP +.in +.5i +.T2 N +Page numbers +.T2 H +Header marks +.T2 B +Both page numbers and header marks, tab separated +.in +.TP +.B "INITR filename" +Initialize the refencemacros. +References will be written to stderr and is supposed to +be written to \fIfilename.qrf\fP. +Requires two passes with groff, this is handled by a +separate program called \fBmmroff\fP, the reason is that +groff is often installed without the unsafe operations that +\fBINITR\fP requiered. +The first pass looks for references and the second one includes them. +\fBINITR\fP can be used several times, but it is only the first +occurrence of \fBINITR\fP that is active. + +See also \fBSETR\fP, \fBGETPN\fP and \fBGETHN\fP. +.TP +.B "IND arg1 [arg2 [...]]" +\fBIND\fP writes a line in the index file selected by \fBINITI\fP +with all arguments and the page number or header mark separated by tabs. +.in +.5i +\fBExamples\fP +.br +arg1\etpage number +.br +arg1\etarg2\etpage number +.br +arg1\etheader mark +.br +arg1\etpage number\etheader mark +.in +.TP +.B "INDP" +\fBINDP\fP prints the index by running the command specified +by string variable \fBIndcmd\fP, normally \fIsort\ -t\et\fP. +\fBINDP\fP reads the output from the command to form +the index, normally in two columns (can be changed by defining \fBTYIND\fP). +The index is printed with string variable \fBIndex\fP as header, +default is \fBINDEX\fP. +One-column processing is +returned after the list. +\fBINDP\fP will call the +user-defined macros \fBTXIND\fP, \fBTYIND\fP and \fBTZIND\fP if defined. +\fBTXIND\fP is called before printing \fBINDEX\fP, \fBTYIND\fP +is called instead of printing \fBINDEX\fP. +\fBTZIND\fP is called +after the printing and should take care of restoring to normal +operation again. +.TP +.B "ISODATE [0]" +\fBISODATE\fP changes the predefined date string in \fBDT\fP to +ISO-format, ie YYYY-MM-DD. +This can also be done by +adding \fB-rIso=1\fP on the command line. +Reverts to old date format if argument is \fB0\fP. +.TP +.B "IR [italic-text [roman-text [italic-text [...]]]]" +Italic-roman. +Even arguments is printed in italic, odd in roman. +See \fBI\fP. +.TP +.B "LB text-indent mark-indent pad type [mark [LI-space [LB-space]]]" +List begin macro. +This is the common macro used for all lists. +\fIText-indent\fP is the number of spaces to indent the text from the +current indent. +.sp +\fIPad\fP and \fImark-indent\fP controls where to put the mark. +The mark is placed within the mark area, and \fImark-indent\fP +sets the number of spaces before this area. +It is normally\ 0. +The mark area ends where the text begins. +The start of the text +is still controlled by \fItext-indent\fP. +.sp +The mark is left justified whitin the mark area if \fIpad\fP is 0. +If \fIpad\fP is greater than 0, then \fImark-indent\fP is ignored, and +the mark is placed \fIpad\fP spaces before the text. +This will right justify the mark. +.sp +If \fItype\fP is 0 the list will have either a hanging indent or, if +argument \fImark\fP is given, the string \fImark\fP as mark. +.sp +If \fItype\fP is greater than 0 automatic numbering will occur, arabic +if \fImark\fP is empty. +\fIMark\fP can then be any of \fB1\fP, \fBA\fP, +\fBa\fP, \fBI\fP or \fBi\fP. +.sp +\fIType\fP selects one of six possible ways to display the mark. +.br +\fBtype\fP +.in +.6i +.T2 1 +x. +.T2 2 +x) +.T2 3 +(x) +.T2 4 +[x] +.T2 5 + +.T2 6 +{x} +.in +.sp +Every item in the list will get \fILI-space\fP number of blank lines +before them. +Default is\ 1. +.sp +\fBLB\fP itself will print \fILB-space\fP blank lines. +Default is\ 0. +.TP +.B "LC [list-level]" +List-status clear. +Terminates all current active lists down to \fIlist-level\fP, or 0 +if no argmuent is given. +This is used by \fBH\fP to clear any +active list. +.TP +.B "LE [1]" +List end. +Terminate the current list. +\fBLE\fP outputs a blank line +if an argument is given. +.TP +.B "LI [mark [1]]" +List item precedes every item in a list. +Without argument \fBLI\fP +will print the mark determined by the current list type. +By giving +\fBLI\fP one argument, it will use that as the mark instead. +Two arguments to \fBLI\fP will make \fImark\fP a prefix to +the current mark. +There will be no separating space between the prefix +and the mark if the second argument is \fB2\fP instead of \fB1\fP. +This behaviour can also be achieved by setting number register +\fBLimsp\fP to zero. +A zero length \fImark\fP will make a hanging +indent instead. +.sp +A blank line is normally printed before the list item. +This behaviour +can be controlled by number register \fBLs\fP. +Pre-spacing +will occur for each list-level less than or equal to \fBLs\fP. +Default value is\ 99. +(Nesting of lists is unlimited.\ :-) +.sp +The indentation can be changed thru number register \fBLi\fP. +Default is 6. +.sp +All lists begins with a list initialization macro, \fBLB\fP. +There are, however, seven predefined listtypes to +make lists easier to use. +They all call \fBLB\fP with different +default values. +.in +.5i +.T2 \fBAL\fP +Automatically Incremented List +.T2 \fBML\fP +Marked List +.T2 \fBVL\fP +Variable-Item List +.T2 \fBBL\fP +Bullet List +.T2 \fBDL\fP +Dash List +.T2 \fBRL\fP +Reference List +.T2 \fBBVL\fP +Broken Varable List. +.in +These lists are described at other places in this manual. +See also \fBLB\fP. +.TP +.B "LT [arg]" +Formats a letter in one of four different styles depending +on the argument. +See also \fBINTERNALS\fP. +.in +.5i +.T2 \fBArg +Style\fP +.T2 BL +Blocked. +Date line, return address, writer's address and closing +begins at the center of the line. +All other lines begin at the left margin. +.T2 SB +Semi-blocked. +Same as blocked, except that the first line in every +paragraph is indented five spaces. +.T2 FB +Full-blocked. +All lines begin at the left margin. +.T2 SP +Simplified. +Almost the same as the full-blocked style. +Subject and +the writer's identification are printed in all-capital. +.in +.TP +.B "LO type [arg]" +Specify options in letter (see \fB.LT\fP). +This is a list of the standard options: +.in +.5i +.T2 CN +Confidential notation. +Prints \fBCONFIDENTIAL\fP on the second line +below the date line. +Any argument replaces \fBCONFIDENTIAL\fP. +See also string variable \fBLetCN\fP. +.T2 RN +Reference notation. +Prints \fBIn reference to:\fP and the argument +two lines below the date line. +See also string variable \fBLetRN\fP. +.T2 AT +Attention. +Prints \fBATTENTION:\fP and the argument below the inside address. +See also string variable \fBLetAT\fP. +.T2 SA +Salutation. +Prints \fBTo Whom It May Concern:\fP or the argument if +it was present. +The salutation is printed two lines below the inside address. +See also string variable \fBLetSA\fP. +.T2 SJ +Subject line. +Prints the argument as subject prefixed with \fBSUBJECT:\fP +two lines below the inside address, except in letter type \fBSP\fP. +Then the subject is printed in all-captial without any prefix. +See also string variable \fBLetSJ\fP. +.in +.TP +.B "MC column-size [column-separation] " +Begin multiple columns. +Return to normal with \fB1C\fP. +\fBMC\fP will create as many columns as the current line length permits. +\fIColumn-size\fP is the width of each column, and \fIcolumn-separation\fP +is the space between two columns. +Default separation is the +column-size/15. +See also \fB1C\fP. +.TP +.B "ML mark [text-indent [1]]" +Marked list start. +The \fImark\fP argument will be printed before +each list item. +\fIText-indent\fP sets the indent and overrides \fBLi\fP. +A third argument will prohibit printing of a blank line before each +item. +.TP +.B "MT [arg [addressee]]" +Memorandum type. +The \fIarg\fP is part of a filename in \fI@TMAC_MDIR@/*.MT\fP. +Memorandum type 0 thru 5 are supported, including \fI"string"\fP. +\fIAddressee\fP just sets a variable, used in the AT&T macros. +.br +\fBarg\fP +.in +.5i +.T2 0 +Normal memorandum, no type printed +.T2 1 +Memorandum with \fIMEMORANDUM FOR FILE\fP printed +.T2 2 +Memorandum with \fIPROGRAMMER'S NOTES\fP printed +.T2 3 +Memorandum with \fIENGINEER'S NOTES\fP printed +.T2 4 +Released paper style +.T2 5 +External letter style +.in +See also \fBCOVER\fP/\fBCOVEND\fP, a more flexible type of front page. +.TP +.B "MOVE y-pos [x-pos [line-length]]" +Move to a position, pageoffset set to \fIx-pos\fP. +If \fIline-length\fP is not given, the difference between +current and new pageoffset is used. +Use \fBPGFORM\fP without arguments to return to normal. +.TP +.B "MULB cw1 space1 [cw2 space2 [cw3 ...]]" +Begin a special multi-column mode. +Every columns width must be specified. +Also the space between the columns must be specified. +The last column +does not need any space-definition. +\fBMULB\fP starts a diversion and \fBMULE\fP +ends the diversion and prints the columns. +The unit for width and space is 'n', but \fBMULB\fP accepts all +normal unitspecifications like 'c' and 'i'. +\fBMULB\fP operates in a separate environment. +.TP +.B "MULN" +Begin the next column. +This is the only way to switch column. +.TP +.B "MULE" +End the multi-column mode and print the columns. +.TP +.B "nP [type]" +Print numbered paragraph with header level two. +See \fB.P\fP. +.TP +.B "NCOL" +Force printing to the next column, don't use this together with +the \fBMUL*\fP macros, see \fB2C\fP. +.TP +.B "NS [arg [1]]" +Prints different types of notations. +The argument selects between +the predefined type of notations. +If the second argument is available, +then the argument becomes the entire notation. +If the argument doesn't exist in the predefined, it will be +printed as \fBCopy (\fP\fIarg\fP\fB) to\fP. +It is possible to add more standard notations, see the string variable +\fBLetns\fP and \fBLetnsdef\fP. +.nf +.in +.5i +.T2 \fBArg +Notation\fP +.T2 \fInone\fP +Copy To +.T2 """"" +Copy To +.T2 1 +Copy To (with att.) to +.T2 2 +Copy To (without att.) to +.T2 3 +Att. +.T2 4 +Atts. +.T2 5 +Enc. +.T2 6 +Encs. +.T2 7 +Under separate cover +.T2 8 +Letter to +.T2 9 +Memorandum to +.T2 10 +Copy (with atts.) to +.T2 11 +Copy (without atts.) to +.T2 12 +Abstract Only to +.T2 13 +Complete Memorandum to +.T2 14 +CC +.in +.fi +.TP +.B "ND new-date" +New date. +Override the current date. +Date is not +printed if \fInew-date\fP is an empty string. +.TP +.B "OF [arg]" +Odd-page footer, a line printed just above the normal footer. +See \fBEF\fP and \fBPF\fP. +.TP +.B "OH [arg]" +Odd-page header, a line printed just below the normal header. +See \fBEH\fP and \fBPH\fP. +.TP +.B OP +Make sure that the following text is printed at the top +of an odd-numbered page. +Will not output an empty page +if currently at the top of an odd page. +.TP +.B "P [type]" +Begin new paragraph. +\fBP\fP without argument will produce left justified text, even +the first line of the paragraph. +This is the same as setting +\fItype\fP to 0. +If the argument is\ 1, then the first line +of text following \fBP\fP will be indented by the number of +spaces in number register \fBPi\fP, normally 5. +.sp +Instead of giving 1 as argument to \fBP\fP it is possible to set the +paragraph type in number register \fBPt\fP. +Using 0 and\ 1 +will be the same as adding that value to \fBP\fP. +A value of 2 will indent all paragraphs, except after +headings, lists and displays. +.sp +The space between two paragraphs is controlled by number register \fBPs\fP, +and is 1 by default (one blank line). +.TP +.B "PGFORM [linelength [pagelength [pageoffset [1]]]]" +Sets linelength, pagelength and/or pageoffset. +This macro can be used for special formatting, like letterheads +and other. +It is normally the first command in a file, though it's not necessary. +\fBPGFORM\fP can be used without arguments +to reset everything after a \fBMOVE\fP. +A line-break is done unless the fourth argument is given. +This can be used to avoid the pagenumber on the first page while setting +new width and length. +(It seems as if this macro sometimes doesn't work too well. +Use the command line arguments +to change linelength, pagelength and pageoffset instead. +Sorry.) +.TP +.B PGNH +No header is printed on the next page. +Used to get rid of +the header in letters or other special texts. +This macro must be used before any text to inhibit the pageheader +on the first page. +.TP +.B "PIC [-L] [-C] [-R] [-I n] filename [width [height]]" +\fBPIC\fP includes a Postscript file in the document. +The macro depends on \fBmmroff\fP and \fBINITR\fP. +\fB-L\fP, \fB-C\fP, \fB-R\fP and \fB-I n\fP adjusts the picture +or indents it. +The optionally \fIwidth\fP and \fIheight\fP +can also be given to resize the picture. +.TP +.B PE +Picture end. +Ends a picture for \fB@TMAC_M_PREFIX@pic\fP, see the manual for \fB@TMAC_M_PREFIX@pic\fP. +.TP +.B "PF [arg]" +Page footer. +\fBPF\fP sets the line to be printed at the bottom of each page. +Normally empty. +See \fBPH\fP for the argument specification. +.TP +.B "PH [arg]" +Page header, a line printed at the top of each page. +The argument should be specified as "'left-part'center-part'right-part'", +where left-, center- and right-part is printed left-justified, centered +and right justified. +The character \fB%\fP is changed to the current +page number. +The default page-header is "''- % -''", the page +number between two dashes. +.TP +.B PS +Picture start (from pic). +Begins a picture for \fB@g@pic\fP, see +the manual. +.TP +.B PX +Page-header user-defined exit. +\fBPX\fP is called just after the printing of the page header +in \fIno-space\fP mode. +.TP +.B R +Roman. +Return to roman font, see also \fBI\fP. +.TP +.B "RB [roman-text [bold-text [roman-text [...]]]]" +Roman-bold. +Even arguments is printed in roman, odd in boldface. +See \fBI\fP. +.TP +.B "RD [prompt [diversion [string]]]" +Read from standard input to diversion and/or string. +The text will be saved in a diversion named \fIdiversion\fP. +Recall the text by writing the name of the diversion after a dot +on an empty line. +A string will also be defined if +\fIstring\fP is given. +\fIDiversion\fP and/or \fIprompt\fP can +be empty (""). +.TP +.B RF +Reference end. +Ends a reference definition and returns to normal +processing. +See \fBRS\fP. +.TP +.B "RI [roman-text [italic-text [roman-text [...]]]]" +Even arguments are printed in roman, odd in italic. +See \fBI\fP. +.TP +.B "RL [text-indent [1]]" +Reference list start. +Begins a list where each item is preceded with a automatically +incremented number between +square brackets. +\fIText-indent\fP changes the default indentation. +.TP +.B "RP [arg1 [arg2]]" +Produce reference page. +\fBRP\fP can be used if a reference page is wanted somewhere in the +document. +It is not needed if \fBTC\fP is used to produce +a table of content. +The reference page will then be printed automatically. +.sp +The reference counter will not be reset if \fIarg1\fP is 1. +.sp +\fIArg2\fP tells \fBRP\fP whether to eject a page or not. +.br +\fBArg2\fP +.in +.5i +.T2 0 +The reference page will be printed on a separate page. +This is +the default. +.T2 1 +Do not eject page after the list. +.T2 2 +Do not eject page before the list. +.T2 3 +Do not eject page before and after the list. +.in +The reference items will be separated by a blank line. +Setting number register \fBLs\fP to 0 will suppress the line. +.sp +The string \fBRp\fP contains the reference page title and +is normally set to \fIREFERENCES\fP. +.TP +.B "RS [string-name]" +\fBRS\fP begins an automatically numbered reference definition. +Put the string \fB\e*(Rf\fP where the reference mark +should be and write the reference between \fBRS\fP/\fBRF\fP +at next new line after the reference mark. +The reference number +is stored in number register \fB:R\fP. +If \fIstring-name\fP is given, a string with that name +will be defined and contain the current reference mark. +The string can be referenced as \fB\e*[\fIstring-name\fP]\fP later in +the text. +.TP +.B "S [size [spacing]]" +Set point size and vertical spacing. +If any argument is equal 'P', then +the previous value is used. +A 'C' means current value, and 'D' default value. +If '+' or '-' is used before the value, then increment or decrement of +the current value will be done. +.TP +.B "SA [arg]" +Set right-margin justification. +Justification is normally turned on. +No argumenent or \fB0\fP turns off justification, a \fB1\fP turns on +justification. +.TP +.B "SETR refname [string]" +Remember the current header and page-number as \fIrefname\fP. +Saves \fIstring\fP if \fIstring\fP is defined. +\fIstring\fP is retrieved +with \fB.GETST\fP. +See \fBINITR\fP. +.TP +.B "SG [arg [1]]" +Signature line. +Prints the authors name(s) after the formal closing. +The argument will be appended to the reference data, printed +at either the first or last author. +The reference data is the location, +department and initials specified with \fB.AU\fP. +It will be printed at the first author if the second argument is given, +otherwise at the last. +No reference data will be printed if the author(s) is specifed +thru \fB.WA\fP/\fB.WE\fP. +See \fBINTERNALS\fP. +.TP +.B "SK [pages]" +Skip pages. +If \fIpages\fP is \fB0\fP or omitted, a skip to the next page +will occur unless it is already at the top of a page. +Otherwise it will skip \fIpages\fP pages. +.TP +.B "SM string1 [string2 [string3]]" +Make a string smaller. +If \fIstring2\fP is given, \fIstring1\fP will be smaller and \fIstring2\fP +normal, concatenated with \fIstring1\fP. +With three argument, all is +concatenated, but only \fIstring2\fP is made smaller. +.TP +.B "SP [lines]" +Space vertically. +\fIlines\fP can have any scalingfactor, like \fI3i\fP or +\fI8v\fP. +Several \fBSP\fP in a line will only produce the +maximum number of lines, not the sum. +\fBSP\fP will also be ignored +until the first textline in a page. +Add a \fB\e&\fP before \fBSP\fP +to avoid this. +.TP +.B TAB +reset tabs to every\ 5n. +Normally used to reset any previous tabpositions. +.TP +.B "TB [title [override [flag [refname]]]]" +Table title, arguments are the same as for \fBEC\fP. +\fBTB\fP uses the number register \fBTb\fP as counter. +The string \fBLt\fP controls the title of the +List of Tables, default is \fILIST OF TABLES\fP. +The List of Tables will only be printed if number register \fBLt\fP +is 1, default 1. +The string \fBLitb\fP contains the word \fITABLE\fP, wich +is printed before the number. +.br +Special handling of the title will occur if +\fBTB\fP is used inside \fBDS\fP/\fBDE\fP, it will not be +affected by the format of \fBDS\fP. +.TP +.B "TC [slevel [spacing [tlevel [tab [h1 [h2 [h3 [h4 [h5]]]]]]]]]" +Table of contents. +This macro is normally used at the last line of the document. +It generates a table of contents with headings up to the level +controlled by number register \fBCl\fP. +Note that \fBCl\fP controls +the saving of headings, it has nothing to do with \fBTC\fP. +Headings with level less than or equal to \fIslevel\fP will get +\fIspacing\fP number of lines before them. +Headings with level less than or equal to \fItlevel\fP will have +their page numbers right justified with dots or spaces separating +the text and the page number. +Spaces is used if \fItab\fP +is greater than zero, otherwise dots. +Other headings will have the +page number directly at the end of the heading text (\fIragged right\fP). +.sp +The rest of the arguments will be printed, centered, before the +table of contents. +.sp +The user-defined macros \fBTX\fP and \fBTY\fP are used if \fBTC\fP is called +with at most four arguments. +\fBTX\fP is called before the printing +of \fICONTENTS\fP, and \fBTY\fP is called instead of printing \fICONTENTS\fP. +.sp +Equivalent macros can be defined for list of figures, tables, equations +and excibits by defining \fBTXxx\fP or \fBTYxx\fP, where \fBxx\fP +is \fBFg\fP, \fBTB\fP, \fBEC\fP or \fBEX\fP. +.sp +String \fBCi\fP can be set to control the indentations for each heading-level. +It must be scaled, like \fB.ds\ Ci\ .25i\ .5i\ .75i\ 1i\ 1i\fP. +The indentation is normally controlled by the maxlength of headings +in each level. +.sp +All texts can be redefined, new stringvariables +\fILifg\fP, \fILitb\fP, \fILiex\fP, \fILiec\fP and \fILicon\fP contain +"Figure", "TABLE", "Exhibit", "Equation" and "CONTENTS". +These can be redefined to other languages. +.TP +.B TE +Table end. +See \fBTS\fP. +.TP +.B "TH [N]" +Table header. +See \fBTS\fP. +\fBTH\fP ends the header of the table. +This header will +be printed again if a page-break occurs. +Argument \fIN\fP isn't implemented yet. +.TP +.B TL [charging-case number(s) [filing-case number(s)]] +Begin title of memorandum. +All text up to the next \fBAU\fP is included in the title. +\fICharging-case number\fP and \fIfiling-case\fP are saved +for use in the front page processing. +.TP +.B TM [num1 [num2 [...]]] +Technical memorandumnumbers used in \fB.MT\fP. +Unlimited number +of arguments may be given. +.TP +.B TP +Top of page user-defined macro. +This macro is called instead of the normal page header. +It is +possible to get complete control over the header. +Note that header and footer is printed in a separate environment. +Linelength is preserved though. +.TP +.B "TS [H]" +Table start. +This is the start of a table specification +to \fB@g@tbl\fP. +See separate manual for \fB@g@tbl\fP. +\fBTS\fP ends with \fBTE\fP. +Argument \fIH\fP tells \fBm@TMAC_M_PREFIX@m\fP that the table +has a header. +See \fBTH\fP. +.TP +.B TX +Userdefined table of contents exit. +This macro is called just before \fBTC\fP prints the word \fICONTENTS\fP. +See \fBTC\fP. +.TP +.B TY +Userdefined table of contents exit (no "CONTENTS"). +This macro is called instead of printing \fICONTENTS\fP. +See \fBTC\fP. +.TP +.B VERBON [flag [pointsize [font]]] +Begin verbatim output using courier font. +Usually for printing programs. +All character has equal width. +The pointsize can be changed with +the second argument. +By specifying the font-argument +it is possible to use another font instead of courier. +\fIflag\fP controls several special features. +It contains the sum of all wanted features. +.in +.5i +.T2 Value +Description +.T2 1 +Disable the escape-character (\e). +This is normally turned on during +verbose output. +.T2 2 +Add an empty line before the verbose text. +.T2 4 +Add an empty line after the verbose text. +.T2 8 +Print the verbose text with numbered lines. +This adds four digitsized +spaces in the beginning of each line. +Finer control is available with +the string-variable \fBVerbnm\fP. +It contains all arguments to the +\fBtroff\fP-command \fB.nm\fP, normally '1'. +.T2 16 +Indent the verbose text with five 'n':s. +This is controlled by the +number-variable \fBVerbin\fP (in units). +.in +.TP +.B VERBOFF +End verbatim output. +.TP +.B "VL text-indent [mark-indent [1]]" +Variable-item list has no fixed mark, it assumes that +every \fBLI\fP have a mark instead. +\fIText-indent\fP sets the indent to the text, and \fImark-indent\fP +the distance from the current indent to the mark. +A third argument will prohibit printing of a blank line before each +item. +.TP +.B "VM [-T] [top [bottom]]" +Vertical margin. Adds extra vertical top and margin space. +Option \fB-T\fP set the total space instead. +No argument resets the margin to zero or the default +\fI(7v 5v)\fP if \fB-T\fP +was used. It is higly recommended that macro \fBTP\fP and/or +\fBEOP\fP are defined +if using \fB-T\fP and setting top and/or bottom margin to less than the default. +.TP +.B "WA [writer-name [title]]" +Begins specification of the writer and writer's address. +Several names can be specified with empty \fBWA\fP/\fBWE\fP-pairs, but +only one address. +.TP +.B WE +Ends the address-specification after \fP.WA\fP. +.TP +.B "WC [format]" +Footnote and display width control. +.in +.5i +.T2 N +Set default mode, \fB-WF\fP, \fB-FF\fP, \fB-WD\fP and \fBFB\fP. +.T2 WF +Wide footnotes, wide also in two-column mode. +.T2 -WF +Normal footnote width, follow column mode. +.T2 FF +All footnotes gets the same width as the first footnote encountered. +.T2 -FF +Normal footnotes, width follows \fBWF\fP and \fB-WF\fP. +.T2 WD +Wide displays, wide also in two-column mode. +.T2 -WD +Normal display width, follow column mode. +.T2 FB +Floating displays generates a line break when printed on the current page. +.T2 -FB +Floating displays does not generate line break. +.in +.sp 3 +.LP +.\"######################################################################## +.LP +.B "Strings used in m@TMAC_M_PREFIX@m:" +.TP +.B App +A string containing the word "APPENDIX". +.TP +.B Apptxt +The current appendix text. +.TP +.B "EM" +Em dash string +.TP +.B H1txt +Will be updated by \fB.H\fP and \fB.HU\fP to the current heading text. +Also updated in table of contents & friends. +.TP +.B HF +Fontlist for headings, normally "2 2 2 2 2 2 2". +Nonnumeric fontnames may also be used. +.TP +.B HP +Pointsize list for headings. +Normally "0 0 0 0 0 0 0" which is the same as +"10 10 10 10 10 10 10". +.TP +.B Index +Contains \fIINDEX\fP. +.TP +.B Indcmd +Contains the index command, \fIsort\ -t\et\fP. +.TP +.B Lifg +String containing \fIFigure\fP. +.TP +.B Litb +String containing \fITABLE\fP. +.TP +.B Liex +String containing \fIExhibit\fP. +.TP +.B Liec +String containing \fIEquation\fP. +.TP +.B Licon +String containing \fICONTENTS\fP. +.TP +.B Lf +Contains "LIST OF FIGURES". +.TP +.B Lt +Contains "LIST OF TABLES". +.TP +.B Lx +Contains "LIST OF EXHIBITS". +.TP +.B Le +Contains "LIST OF EQUATIONS". +.TP +.B Letfc +Contains "Yours very truly,", used in \fB.FC\fP. +.TP +.B Letapp +Contains "APPROVED:", used in \fB.AV\fP. +.TP +.B Letdate +Contains "Date", used in \fB.AV\fP. +.TP +.B LetCN +Contains "CONFIDENTIAL", used in \fB.LO CN\fP. +.TP +.B LetSA +Contains "To Whom It May Concern:", used in \fB.LO SA\fP. +.TP +.B LetAT +Contains "ATTENTION:", used in \fB.LO AT\fP. +.TP +.B LetSJ +Contains "SUBJECT:", used in \fB.LO SJ\fP. +.TP +.B LetRN +Contains "In reference to:", used in \fB.LO RN\fP. +.TP +.B Letns +is an array containing the different strings used in \fB.NS\fP. +It is really a number of stringvariables prefixed with \fBLetns!\fP. +If the argument doesn't exist, it will be included +between \fB()\fP with \fBLetns!copy\fP as prefix and \fBLetns!to\fP as suffix. +Observe the space after \fBcopy\fP and before \fBto\fP. +.nf +.ta 1.5i +\fBName Value\fP +Letns!0 Copy to +Letns!1 Copy (with att.) to +Letns!2 Copy (without att.) to +Letns!3 Att. +Letns!4 Atts. +Letns!5 Enc. +Letns!6 Encs. +Letns!7 Under separate cover +Letns!8 Letter to +Letns!9 Memorandum to +Letns!10 Copy (with atts.) to +Letns!11 Copy (without atts.) to +Letns!12 Abstract Only to +Letns!13 Complete Memorandum to +Letns!14 CC +Letns!copy Copy " +Letns!to " to +.fi +.TP +.B Letnsdef +Defines the standard-notation used when no argument is given +to \fB.NS\fP. +Default is \fB0\fP. +.TP +.B "MO1 - MO12" +Strings containing \fIJanuary\fP thru \fIDecember\fP. +.TP +.B Qrf +String containing "See chapter \e\e*[Qrfh], page \e\en[Qrfp].". +.TP +.B Rp +Contains "REFERENCES". +.TP +.B Tcst +Contains current status of table of contents and list of XXXX. +Empty outside \fB.TC\fP. +Useful in user-defined macros like \fB.TP\fP. +.nf +.ta 1.5i +\fBValue Meaning\fP +co Table of contents +fg List of figures +tb List of tables +ec List of equations +ex List of exhibits +ap Appendix +.fi +.ta +.TP +.B Tm +Contains \e(tm, trade mark. +.TP +.B Verbnm +Argument to \fB.nm\fP in \fB.VERBON\fP, default: \fB1\fP. +.\"----------------------------------- +.LP +.B "Number variables used in m@TMAC_M_PREFIX@m:" +.TP +.B Aph +Print an appendix-page for every new appendix +if this numbervariable is non-zero. +No output will occur if \fBAph\fP is zero, but there will always +be an appendix-entry in the 'List of contents'. +.TP +.B Cl +Contents level [0:14], contents saved if heading level <= Cl, default 2. +.TP +.B Cp +Eject page between LIST OF XXXX if Cp == 0, default 0. +.TP +.B D +Debugflag, values >0 produces varying degree of debug. +A value of\ 1 +gives information about the progress of formatting, default\ 0. +.TP +.B De +Eject after floating display is output [0:1], default\ 0. +.TP +.B Dsp +Controls the space output before and after static displays +if defined. +Otherwise is the value of Lsp used. +.TP +.B Df +Floating keep output [0:5], default 5. +.TP +.B Ds +\fBLsp\fP space before and after display if == 1 [0:1], default 1. +.TP +.B Ej +Eject page, default 0. +.TP +.B Eq +Equation lable adjust 0=left, 1=right. +Default\ 0. +.TP +.B Fs +Footnote spacing, default 1. +.TP +.B "H1-H7" +Heading counters +.TP +.B H1dot +Append a dot after the level one heading number if >\ 0. +Default is\ 1. +.TP +.B H1h +Copy of number register \fBH1\fP, but it is incremented +just before the page break. +Useful in user defined header macros. +.TP +.B Hb +Heading break level [0:14], default\ 2. +.TP +.B Hc +Heading centering level, [0:14]. +Default\ 0. +.TP +.B Hi +Heading temporary indent [0:2], default\ 1. +.br +0\ ->\ 0 indent, left margin +.br +1\ ->\ indent to right , like .P 1 +.br +2\ ->\ indent to line up with text part of preceding heading +.TP +.B Hps +Number variable with the heading pre-space level. +If the heading-level +is less than or equal to \fBHps\fP, then two lines will precede the +section heading instead of one. +Default is first level only. +The real amount of lines is controlled by the variables \fBHps1\fP and +\fBHps2\fP. +.TP +.B Hps1 +This is the number of lines preceding \fB.H\fP when the heading-level +is greater than \fBHps\fP. +Value is in units, normally 0.5. +.TP +.B Hps2 +This is the number of lines preceding \fB.H\fP when the heading-level +is less than or equal to \fBHps\fP. +Value is in units, normally\ 1. +.TP +.B Hs +Heading space level [0:14], default\ 2. +.TP +.B Hss +This is the number of lines that follows \fB.H\fP when the heading-level +is less than or equal to \fBHs\fP. +Value is in units, normally\ 1. +.TP +.B Ht +Heading numbering type, default 0. +0 -> multiple (1.1.1 ...) +.br +1 -> single +.TP +.B Hu +Unnumbered heading level, default 2. +.TP +.B Hy +Hyphenation in body, default 0. +.br +0\ ->\ no hyphenation +.br +1\ ->\ hyphenation 14 on +.TP +.B Iso +Set this variable to 1 on the command line to get ISO-formatted date string. +(\fB-rIso=1\fP) +Useless inside a document. +.TP +.B L +Page length, only for command line settings. +.TP +.B Letwam +Max lines in return-address, used in \fB.WA\fP/\fB.WE\fP. +Default\ 14. +.TP +.B "Lf, Lt, Lx, Le" +Enables (1) or disables (0) the printing of List of figures, +List of tables, List of exhibits and List of equations. +Default: Lf=1, Lt=1, Lx=1, Le=0. +.TP +.B Li +List indent, used by .AL, default 6. +.TP +.B Limsp +Flag for space between prefix and mark in automatic lists (.AL). +.br +0\ ==\ no space +.br +1\ ==\ space +.TP +.B Ls +List space, if current listlevel > Ls then no spacing will occur around lists. +Default 99. +.TP +.B Lsp +The size of an empty line. +Normally 0.5v, but it is 1v +if \fBn\fP is set (\fB.nroff\fP). +.TP +.B N +Numbering style [0:5], default 0. +.br +0\ ==\ (default) normal header for all pages. +.br +1\ ==\ header replaces footer on first page, header is empty. +.br +2\ ==\ page header is removed on the first page. +.br +3\ ==\ "section-page" numbering enabled. +.br +4\ ==\ page header is removed on the first page. +.br +5\ ==\ "section-page" and "section-figure" numbering enabled. +See also the number-register Sectf and Sectp. +.TP +.B Np +Numbered paragraphs, default 0. +.br +0\ ==\ not numbered +.br +1\ ==\ numbered in first level headings. +.TP +.B O +Page offset, only for command line settings. +.TP +.B Of +Format of figure,table,exhibit,equation titles, default 0. +.br +0\ =\ ". " +.br +1\ =\ " - " +.TP +.B P +Current page-number, normally the same as % unless "section-page" numbering +is enabled. +.TP +.B Pi +paragraph indent, default 5. +.TP +.B Pgps +Controls whether header and footer pointsize should follow the current +setting or just change when the header and footer is defined. +.in +.5i +.ti -.5i +.T2 Value +Description +.T2 0 +Pointsize will only change to the current setting when \fB.PH\fP, \fB.PF\fP, +\&\fB.OH\fP, \fP.EH\fP, \fB.OF\fP or \fB.OE\fP is executed. +.T2 1 +Pointsize will change after every \fB.S\fP. +This is the default. +.in +.TP +.B Ps +paragraph spacing, default 1. +.TP +.B Pt +Paragraph type, default 0. +.br +0\ ==\ left-justified +.br +1\ ==\ indented .P +.br +2\ ==\ indented .P except after .H, .DE or .LE. +.TP +.B Sectf +Flag controlling "section-figures". +A non-zero value enables this. +See also register N. +.TP +.B Sectp +Flag controlling "section-page-numbers". +A non-zero value enables this. +See also register N. +.TP +.B Si +Display indent, default 5. +.TP +.B Verbin +Indent for \fB.VERBON\fP, default 5n. +.TP +.B W +Line length, only for command line settings. +.TP +.B .mgm +Always 1. +.LP +.SH INTERNALS +The letter macros is using different submacros depending on +the letter type. +The name of the submacro has the letter type +as suffix. +It is therefore possible to define other letter types, either +in the national macro-file, or as local additions. +\&\fB.LT\fP will set the number variables \fBPt\fP and \fBPi\fP to 0 and 5. +The following strings and macros must be defined for a new letter type: +.TP +\fBlet@init_\fP\fItype\fP +This macro is called directly by \fB.LT\fP. +It is supposed to initialize +variables and other stuff. +.TP +\fBlet@head_\fP\fItype\fP +This macro prints the letter head, and is called instead of the +normal page header. +It is supposed to remove the alias \fBlet@header\fP, +otherwise it will be called for all pages. +.TP +\fBlet@sg_\fP\fItype\ name\ title\ n\ flag\ [arg1\ [arg2\ [...]]]\fP +\&\fB.SG\fP is calling this macro only for letters, memorandums has +its own processing. +\fIname\fP and \fItitle\fP is specified +thru \fB.WA\fP/\fB.WB\fP. +\fIn\fP is the counter, 1-max, and +\fIflag\fP is true for the last name. +Any other argument to \fB.SG\fP +is appended. +.TP +\fBlet@fc_\fP\fItype\ closing\fP +This macro is called by \fB.FC\fP, and has the +formal closing as argument. +.LP +\&\fB.LO\fP is implemented as a general option-macro. +\fB.LO\fP demands +that a string named \fBLet\fP\fItype\fP is defined, where \fItype\fP +is the letter type. +\&\fB.LO\fP will then assign the argument to the string +variable \fBlet*lo-\fP\fItype\fP. +.LP +.\".SH BUGS +.SH AUTHOR +Jörgen Hägg, Lund, Sweden . +.SH FILES +.TP +.B @MACRODIR@/tmac.@TMAC_M_PREFIX@m +.TP +.B @TMAC_MDIR@/*.cov +.TP +.B @TMAC_MDIR@/*.MT +.TP +.B @TMAC_MDIR@/locale +.SH "SEE ALSO" +.BR groff (@MAN1EXT@), +.BR @g@troff (@MAN1EXT@), +.BR @g@tbl (@MAN1EXT@), +.BR @g@pic (@MAN1EXT@), +.BR @g@eqn (@MAN1EXT@) +.br +.BR groff_mmse (@MAN7EXT@) +. +.\" Local Variables: +.\" mode: nroff +.\" coding: latin-1 +.\" End: diff --git a/contrib/mm/groff_mmse.man b/contrib/mm/groff_mmse.man new file mode 100644 index 0000000..23a0352 --- /dev/null +++ b/contrib/mm/groff_mmse.man @@ -0,0 +1,86 @@ +.\" +.\" $Id: groff_mmse.man,v 2.2 2001/12/09 12:15:09 wlemb Exp $ +.\" Skrivet av Jörgen Hägg, Lund, Sverige +.\" +.TH GROFF_MMSE @MAN7EXT@ "@MDATE@" "Groff Version @VERSION@" +.SH NAMN +groff_mmse \- svenska mm makro för groff +.SH SYNTAX +.B groff +.B \-m@TMAC_M_PREFIX@mse +[ +.IR flaggor .\|.\|. +] +[ +.IR filer .\|.\|. +] +.SH BESKRIVNING +\fBm@TMAC_M_PREFIX@mse\fP är en svensk variant av \fBm@TMAC_M_PREFIX@m\fP. Alla texter +är översatta. En A4 sida får text som är 13 cm bred, 3.5 cm indragning +samt är 28.5 cm hög. +Det finns stöd för brevuppställning enligt svensk standard +för vänster och högerjusterad text. +.LP +\fBCOVER\fP kan använda \fIse_ms\fP som argument. Detta ger ett +svenskt försättsblad. +Se \fBgroff_mm(@MAN7EXT@)\fP för övriga detaljer. +.SH BREV +Tillgängliga brevtyper: +.TP +.B ".LT SVV" +Vänsterställd löptext med adressat i position T0 (vänsterställt). +.TP +.B ".LT SVH" +Högerställd löptext med adressat i position T4 (passar +fönsterkuvert). +.LP +Följande extra LO-variabler används. +.TP +.B ".LO DNAMN\fI namn\fP" +Anger dokumentets namn. +.TP +.br +.B ".LO MDAT\fI datum\fP" +Mottagarens datum, anges under \fBErt datum:\fP (\fBLetMDAT\fP). +.TP +.br +.B ".LO BIL\fI sträng\fP" +Anger bilaga, nummer eller sträng med \fBBilaga\fP (\fBLetBIL\fP) +som prefix. +.TP +.br +.B ".LO KOMP\fI text\fP" +Anger kompletteringsuppgift. +.TP +.br +.B ".LO DBET\fI beteckning\fP" +Anger dokumentbeteckning eller dokumentnummer. +.TP +.br +.B ".LO BET\fI beteckning\fP" +Anger beteckning (ärendebeteckning i form av diarienummer eller liknande). +.TP +.br +.B ".LO SIDOR\fI antal\fP" +Anger totala antalet sidor och skrivs ut efter sidnumret inom +parenteser. +.LP +Om makrot \fB.TP\fP är definierat anropas det efter utskrift av brevhuvudet. +Där lägger man lämpligen in postadress och annat som brevfot. +.SH "SKRIVET AV" +Jörgen Hägg, Lund, Sweden +.SH FILER +.B @MACRODIR@/tmac.@TMAC_M_PREFIX@mse +.B @TMAC_MDIR@/se_*.cov +.SH "SE OCKSÅ" +.BR groff (@MAN1EXT@), +.BR @g@troff (@MAN1EXT@), +.BR @g@tbl (@MAN1EXT@), +.BR @g@pic (@MAN1EXT@), +.BR @g@eqn (@MAN1EXT@) +.br +.BR groff_mm (@MAN7EXT@) +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/mm/m.tmac b/contrib/mm/m.tmac new file mode 100644 index 0000000..4b9c7f3 --- /dev/null +++ b/contrib/mm/m.tmac @@ -0,0 +1,3536 @@ +.\" +.de @revision +.ds RE \\$2 +.. +.\" +.\" $Id: m.tmac,v 2.26 2005/05/26 06:28:38 wl Exp $ +.@revision $Revision: 2.26 $ +.ig + +Copyright (C) 1991-2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. +mgm is written by Jörgen Hägg + +mgm is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +mgm 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +Please send bugreports with examples to jh@axis.com. + +Naming convention stolen from mgs. +Local names module*name +Extern names module@name +Env.var environ:name +Index array!index +.. +.if !\n(.g .ab These mm macros require groff. +.do if d PH .nx +.if \n(.C .ab The groff mm macros do not work in compatibility mode. +.if (\n[.warn] == 65543) .warn +.mso devtag.tmac +.\" ######## init ####### +.\" Contents level [0:14], contents saved if heading level <= Cl +.nr Cl 2 +.\" Eject page between LIST OF XXXX if Cp == 0 +.nr Cp 0 +.\" Debugflag +.if !r D .nr D 0 +.\" Eject after floating display is output [0:1] +.nr De 0 +.\" Floating keep output [0;5] +.nr Df 5 +.\" space before and after display if == 1 [0:1] +.nr Ds 1 +.\" Eject page +.nr Ej 0 +.\" Equation label adjust 0=left, 1=right +.nr Eq 0 +.\" Em dash string +.ie n .ds EM " -- +.el .ds EM \(em +.\" Footnote spacing +.nr Fs 1 +.\" H1-H7 heading counters +.nr H1 0 1 +.nr H2 0 1 +.nr H3 0 1 +.nr H4 0 1 +.nr H5 0 1 +.nr H6 0 1 +.nr H7 0 1 +.nr H8 0 1 +.nr H9 0 1 +.nr H10 0 1 +.nr H11 0 1 +.nr H12 0 1 +.nr H13 0 1 +.nr H14 0 1 +.\" Heading break level [0:14] +.nr Hb 2 +.\" heading centering level, [0:14] +.nr Hc 0 +.\" header format +.ds HF 2 2 2 2 2 2 2 2 2 2 2 2 2 2 +.\" heading temp. indent [0:2] +.\" 0 -> 0 indent, left margin +.\" 1 -> indent to right , like .P 1 +.\" 2 -> indent to line up with text part of preceding heading +.nr Hi 1 +.\" header pointsize +.ds HP 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +.\" heading space level [0:14] +.nr Hs 2 +.\" heading numbering type +.\" 0 -> multiple (1.1.1 ...) +.\" 1 -> single +.nr Ht 0 +.\" Unnumbered heading level +.nr Hu 2 +.\" hyphenation in body +.\" 0 -> no hyphenation +.\" 1 -> hyphenation 14 on +.nr Hy 0 +.\" text for toc, selfexplanatory. Look in the new variable section +.ds Lf LIST OF FIGURES +.nr Lf 1 +.ds Lt LIST OF TABLES +.nr Lt 1 +.ds Lx LIST OF EXHIBITS +.nr Lx 1 +.ds Le LIST OF EQUATIONS +.nr Le 0 +.\" List indent, used by .AL +.nr Li 6 +.\" List space, if listlevel > Ls then no spacing will occur around lists. +.nr Ls 99 +.\" Numbering style [0:5] +.if !r N .nr N 0 +.\" numbered paragraphs +.\" 0 == not numbered +.\" 1 == numbered in first level headings. +.nr Np 0 +.\" Format of figure,table,exhibit,equation titles. +.\" 0= ". ", 1=" - " +.nr Of 0 +.\" Table of contents page numbering style +.nr Oc 0 +.\" Page-number, normally same as %. +.nr P 0 +.\" paragraph indent +.nr Pi 5 +.\" paragraph spacing +.nr Ps 1 +.\" paragraph type +.\" 0 == left-justified +.\" 1 == indented .P +.\" 2 == indented .P except after .H, .DE or .LE. +.nr Pt 0 +.\" Reference title +.ds Rp REFERENCES +.\" Display indent +.nr Si 5 +.\" +.\" Current state of TOC, empty outside TC, inside +.\" it will be set to co,fg,tb,ec,ex or ap. +.ds Tcst +.\" +.ds Tm \(tm +.\" +.\"--------------------------------------------- +.\" Internal global variables +.\" +.\" This is for cover macro .MT +.\" .ds @language +.\" +.nr @copy_type 0 +.if r C .nr @copy_type \n[C] +.\" >0 if Subject/Date/From should be bold, roman otherwise +.ie n .ds @sdf_font R +.el .ds @sdf_font B +.if \n[@copy_type]=4 \{\ +. ls 2 +. nr Pi 10 +. nr Pt 1 +.\} +.\" +.\" +.if r E \{\ +. ie \n[E] .ds @sdf_font B +. el .ds @sdf_font R +.\} +.\" +.\" Current pointsize and vertical space, always in points. +.if !r S .nr S 10 +.ps \n[S] +.vs \n[S]+2 +.\" +.nr @ps \n[.ps] +.nr @vs \n[.v] +.if \n[D]>1 .tm @ps=\n[@ps], @vs=\n[@vs] +.if \n[D]>3 .tm INIT: l:\n[.l] p:\n[.p] o:\n[.o] +.\" +.\" Page length +.if r L \{\ +. ie n .pl \n[L]u +. el .pl \n[L]u +.\} +.nr @pl \n[.p] +.\" +.\" page width +.ie r W \{\ +. ie n .ll \n[W]u +. el .ll \n[W]u +.\} +.el .ll 6i +.nr @ll \n[.l] +.nr @cur-ll \n[@ll] +.lt \n[@ll]u +.\" +.\" page offset +.ie r O .po \n[O]u +.el \{\ +. ie n .po .75i +. el .po .963i +.\} +.\" +.nr @po \n[.o] +.\" +.\" non-zero if escape mechanism is turned off. Used by VERBON/OFF +.nr @verbose-flag 0 +.\"--------------------------------------------- +.\" New variables +.\" +.\" Appendix name +.ds App APPENDIX +.\" print appendixheader, 0 == don't +.nr Aph 1 +.\" +.\" Current appendix text +.ds Apptext +.\" Controls the space before and after static displays if defined. +.\" Lsp is used otherwise +.\" .nr Dsp 1v +.\" +.\" Add a dot after level one heading number if >0 +.nr H1dot 1 +.\" +.\" header prespace level. If level <= Hps, then two lines will be printed +.\" before the header instead of one. +.nr Hps 1 +.\" +.\" These variables controls the number of lines preceding .H. +.\" Hps1 is the number of lines when level > Hps +.nr Hps1 0.5v +.if n .nr Hps1 1v +.\" +.\" Hps2 is the number of lines when level <= Hps +.nr Hps2 1v +.if n .nr Hps2 2v +.\" +.\" Hss is the number of lines (Lsp) after the header. +.nr Hss 1 +.\" +.\" H1txt will be updated by .H and .HU, containing the heading text. +.\" Will also be updated in table of contents & friends +.\" +.ds H1txt +.\" +.\" header text for the index +.ds Index INDEX +.\" command to sort the index +.ds Indcmd sort +.\" +.\" flag for mkindex +.if !r Idxf .nr Idxf 0 +.\" Change these in the national configuration file +.ds Lifg Figure +.ds Litb TABLE +.ds Liex Exhibit +.ds Liec Equation +.ds Licon CONTENTS +.\" Flag for space between mark and prefix 1==space, 0==no space +.\" Can also be controlled by using '.LI mark 2' +.nr Limsp 1 +.\" +.\" Lsp controls the height of an empty line. Normally 0.5v +.\" Normally used for nroff compatibility. +.nr Lsp 0.5v +.if n .nr Lsp 1v +.ds MO1 January +.ds MO2 February +.ds MO3 March +.ds MO4 April +.ds MO5 May +.ds MO6 June +.ds MO7 July +.ds MO8 August +.ds MO9 September +.ds MO10 October +.ds MO11 November +.ds MO12 December +.\" for GETR +.ds Qrf See chapter \\*[Qrfh], page \\*[Qrfp]. +.\" +.\" header- and footer-size will only change to the current +.\" if Pgps is > 0. +.nr Pgps 1 +.\" +.\" section-page if Sectp > 0 +.nr Sectp 0 +.if (\n[N]=3):(\n[N]=5) \{\ +. nr Sectp 1 +. nr Ej 1 +.\} +.\" section-figure if Sectf > 0 +.nr Sectf 0 +.if \n[N]=5 .nr Sectf 1 +.\" +.\" argument to .nm in .VERBON. +.ds Verbnm "1 +.\" indent for VERBON +.nr Verbin 5n +.\" +.\" Letter section +.\" Formal closing (.FC) +.ds Letfc Yours very truly, +.\" +.\" Approval line +.ds Letapp APPROVED: +.\" Approval date-string +.ds Letdate Date +.\" +.ds LetCN CONFIDENTIAL\" Confidential default +.ds LetSA To Whom It May Concern:\" Salutation default +.ds LetAT ATTENTION:\" Attention string +.ds LetSJ SUBJECT:\" Subject string +.ds LetRN In reference to:\" Reference string +.\" +.\" Copy to (.NS) +.ds Letnsdef 0 +.ds Letns!copy Copy \" space! +.ds Letns!to " to +.ds Letns!0 Copy to +.ds Letns!1 Copy (with att.) to +.ds Letns!2 Copy (without att.) to +.ds Letns!3 Att. +.ds Letns!4 Atts. +.ds Letns!5 Enc. +.ds Letns!6 Encs. +.ds Letns!7 Under separate cover +.ds Letns!8 Letter to +.ds Letns!9 Memorandum to +.ds Letns!10 Copy (with atts.) to +.ds Letns!11 Copy (without atts.) to +.ds Letns!12 Abstract Only to +.ds Letns!13 Complete Memorandum to +.ds Letns!14 CC: +.\" +.\" Text printed below the footer. Controlled by @copy_type (C). +.ds Pg_type!0 +.ds Pg_type!1 OFFICIAL FILE COPY +.ds Pg_type!2 DATE FILE COPY +.ds Pg_type!3 D\ R\ A\ F\ T +.ds Pg_type!4 D\ R\ A\ F\ T +.\" Max lines in return address +.nr Letwam 14 +.\"-------------------------- +.\" test for mgm macro. This can be used if the text must test +.\" what macros is used. +.nr .mgm 1 +.\" +.\" Due to security problems with groff I had to rewrite +.\" the reference system. It's not as elegant as before, you +.\" have to run groff with '-z -rRef=1' and put stderr into the filename +.\" for .INITR +.\" +.\" Output references to stderr if non-zero +.ie !r Ref \{\ +. nr Ref 0 +.\} +.el .warn 0 +.\" +.\"--------------------------------------------- +.\" set local variables. +.ie d @language .mso mm/\*[@language]_locale +.el .mso mm/locale +.\"--------------------------------------------- +.if \n[D] .tm Groff mm, version \*[RE]. +.\" ####### module init ###### +.\" reset all things +.de init@reset +.ie \\n[misc@adjust] 'ad +.el 'na +.ie \\n[Hy] 'hy 14 +.el 'nh +'in 0 +'ti 0 +.ps \\n[@ps]u +.vs \\n[@vs]u +.. +.de @warning +'tm WARNING:(\\n[.F]) input line \\n[.c]:\\$* +.if \\n[D] .backtrace +.. +.de @error +'tm ****************** +'tm ERROR:(\\n[.F]) input line \\n[.c]:\\$* +.if \\n[D] .backtrace +'tm ****************** +.ab "Input aborted, syntax error" +.. +.de misc@toupper +.tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ +.br +\\$1 +.tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz +.br +.. +.\" ####### module debug ################################# +.de debug +'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s],\\n[.ps] \ +in=\\n[.i] fi=\\n[.u] .d=\\n[.d] nl=\\n[nl] pg=\\n[%] +.. +.de debug-all +.nr debug*n 1n +.nr debug*m 1m +'tm \\$1:\\n[.F]:\\n[c.] ll=\\n[.l] vs=\\n[.v] ps=\\n[.s] in=\\n[.i]\ + ad=\\n[.j] fi=\\n[.u] pl=\\n[.p] page=\\n[%] .o=\\n[.o] +'tm _______ .d=\\n[.d] .f=\\n[.f] .h=\\n[.h] .k=\\n[.k] .n=\\n[.n]\ + .p=\\n[.p] .t=\\n[.t] .z=\\n[.z] nl=\\n[nl] dn=\\n[dn] n=\\n[debug*n] +.. +.\" ####### module par ################################# +.nr par@ind-flag 1 \" indent on following P if Pt=2 +.nr hd*last-pos -1 +.nr hd*last-hsize -1 +.nr par*number 0 1 +.af par*number 01 +.nr par*number2 0 1 +.af par*number2 01 +.nr par*num-count 0 1 +.af par*num-count 01 +.\" reset numbered paragraphs, arg1 = headerlevel +.de par@reset-num +.if \\$1<3 .nr par*num-count 0 +.if (\\$1=1)&(\\n[Np]=1) .nr par*number 0 +.. +.\"------------ +.\" paragraph +.de P +.\" skip P if previous heading +.if \\n[D]>2 \{\ +. tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos] +. tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize] +.\} +.if !((\\n[nl]=\\n[hd*last-pos]):(\\n[hd*last-hsize]=\\n[.k])) \{\ +. if \\n[D]>2 .tm Paragraph set ind-flag=1 +. nr par@ind-flag 1 +.\} +.\" any collected unprinted text? +.par@doit \\$* +.if \\n[Np] \\n[H1].\\n+[par*number]\ \ \c +.. +.\"------------ +.de nP +.\" skip P if previous heading +.if \\n[D]>2 \{\ +. tm Paragraph nl=\\n[nl], last=\\n[hd*last-pos] +. tm Paragraph .k=\\n[.k], hsize=\\n[hd*last-hsize] +.\} +.if !((\\n[nl]=\\n[hd*last-pos]):(\\n[hd*last-hsize]=\\n[.k])) \{\ +. if \\n[D]>2 .tm Paragraph set ind-flag=1 +. nr par@ind-flag 1 +.\} +.par@doit \\$* +\\n[H2].\\n+[par*number2]\ \ \c +.nr par@ind-flag 1 +.. +.\"------------ +.de par@doit +.SP (u;\\n[Ps]*\\n[Lsp]) +.ie \\n[.$] \{\ +. if \\$1=1 .ti +\\n[Pi]n +.\} +.el \{\ +. if \\n[Pt]=1 .ti +\\n[Pi]n +. if (\\n[Pt]=2)&\\n[par@ind-flag] .ti +\\n[Pi]n +.\} +.. +.\" ####### module line ####################################### +.de SP +.br +.if !r line*lp\\n[.z] .nr line*lp\\n[.z] 0 +.if !r line*ac\\n[.z] .nr line*ac\\n[.z] 0 +.ie \\n[.$] .nr line*temp (v;\\$1) +.el .nr line*temp 1v +.\" +.ie \\n[line*lp\\n[.z]]=\\n[.d] \{\ +. \" go here if no output since the last .SP +. nr line*output \\n[line*temp]-\\n[line*ac\\n[.z]] +. if \\n[line*output]<0 .nr line*output 0 +. nr line*ac\\n[.z] +\\n[line*output] +.\} +.el \{\ +. nr line*ac\\n[.z] \\n[line*temp] +. nr line*output \\n[line*temp] +. \" no extra space in the beginning of a page +. if (\\n[.d]<0):(\\n[pg*head-mark]=\\n[.d]) .nr line*output 0 +.\} +.if \\n[line*output] .sp \\n[line*output]u +.nr line*lp\\n[.z] \\n[.d] +.. +.\" ######## module misc ############### +.nr misc@adjust 14 +.de SA +.if \\n[.$] \{\ +. if \\$1-1 .@error "SA: bad arg: \\$1" +. nr misc@adjust 0\\$1 +.\} +.ie \\n[misc@adjust] 'ad +.el 'na +.. +.\"------------- +.\" switch environment, keep all important settings. +.de misc@ev-keep +.nr misc*ll \\n[.l] +.ev \\$1 +.ll \\n[misc*ll]u +.lt \\n[misc*ll]u +.. +.\"------------- +.\" .misc@push stackname value +.de misc@push +.ie d misc*st-\\$1 .ds misc*st-\\$1 \\$2 \\*[misc*st-\\$1] +.el .ds misc*st-\\$1 \\$2 +.. +.\"------------- +.\" .misc@pop stackname +.\" value returned in the string misc*pop +.de misc@pop +.misc@pop-set misc*st-\\$1 \\*[misc*st-\\$1] +.. +.\"------------- +.de misc@pop-set +.ds misc*st-name \\$1 +.shift +.if \\n[.$]<1 .@error "stack \\*[misc*st-name] empty" +.ds misc*pop \\$1 +.shift +.ds \\*[misc*st-name] \\$* +.. +.\"------------- +.\" .misc@pop-nr stackname varname +.de misc@pop-nr +.misc@pop \\$1 +.nr \\$2 \\*[misc*pop] +.. +.\"------------- +.\" .misc@pop-ds stackname varname +.de misc@pop-ds +.misc@pop \\$1 +.ds \\$2 \\*[misc*pop] +.. +.\"----------- +.\" reset tabs +.de TAB +.ta T 5n +.. +.\"------------- +.\" .PGFORM linelength [ pagelength [ pageoffset [1]]] +.de PGFORM +.\" Break here to avoid problems with new linesetting of the previous line. +.\" Hope this doesn't break anything else :-) +.\" Don't break if arg_4 is a '1'. +.if \\n[D]>2 .tm PGFORM: \\$* +.if ''\\$4' .br +.if \\n[D]>3 .tm PGFORM: IN l:\\n[.l] p:\\n[.p] o:\\n[.o] +.ie !''\\$1' \{\ +. ll \\$1 +. nr @ll \\n[.l] +. nr @cur-ll \\n[@ll] +. lt \\n[@ll]u +.\} +.el \{\ +. ll \\n[@ll]u +. lt \\n[@ll]u +.\} +.\" +.ie !''\\$2' \{\ +. pl \\$2 +. nr @pl \\n[.p] +.\} +.el .pl \\n[@pl]u +.\" +.ie !''\\$3' \{\ +. po \\$3 +. nr @po \\n[.o] +.\} +.el .po \\n[@po]u +.if \\n[D]>3 .tm PGFORM: OUT l:\\n[.l] p:\\n[.p] o:\\n[.o] +.if \\n[D]>2 .tm PGFORM: ll=\\n[@ll], pl=\\n[@pl], po=\\n[@po] +'in 0 +.pg@move-trap +.if \\n[D]>2 \{\ +. tm Traps: +. ptr +.\} +.. +.\"------------- +.\" .MOVE y [[x] linelength] +.\" move to line y, indent to x +.de MOVE +.if !\\n[.$] .@error "MOVE y [x]: no arguments" +.if \\n[nl]<0 \c +.\" move to Y-pos +.sp |(v;\\$1) +.\" calc linelength +.ie \\n[.$]>2 .nr pg*i (n;\\$3) +.el \{\ +. ie \\n[.$]>1 .nr pg*i (n;\\n[@ll]u-\\$2) +. el .nr pg*i \\n[@ll]u +.\} +.\" move to X-pos, if any +.if !''\\$2' .po \\$2 +.\" set linelength +.ll \\n[pg*i]u +.. +.\"------------- +.de SM +.if !\\n[.$] .@error "SM: no arguments" +.if \\n[.$]=1 \s-1\\$1\s0 +.if \\n[.$]=2 \s-1\\$1\s0\\$2 +.if \\n[.$]=3 \\$1\s-1\\$2\s0\\$3 +.. +.\"------------- +.nr misc*S-ps \n[@ps] +.nr misc*S-vs \n[@vs] +.nr misc*S-ps1 \n[@ps] +.nr misc*S-vs1 \n[@vs] +.ds misc*a +.ds misc*b +.de S +.ie !\\n[.$] \{\ +. ds misc*a P +. ds misc*b P +.\} +.el \{\ +. ie \\n[.$]=1 .ds misc*b D +. el \{\ +. ie \w@\\$2@=0 .ds misc*b C +. el .ds misc*b \\$2 +. \} +. ie \w@\\$1@=0 .ds misc*a C +. el .ds misc*a \\$1 +.\} +.\" +.\" set point size +.if !'\\*[misc*a]'C' \{\ +. ie '\\*[misc*a]'P' .ps \\n[misc*S-ps]u +. el \{\ +. ie '\\*[misc*a]'D' .ps \\n[S] +. el .ps \\*[misc*a] +. if \\n[D]>2 .tm S: .ps \\*[misc*a] +. \} +.\} +.\" +.\" set vertical spacing +.if !'\\*[misc*b]'C' \{\ +. ie '\\*[misc*b]'P' .vs \\n[misc*S-vs]u +. el \{\ +. ie '\\*[misc*b]'D' .vs \\n[.ps]s+2p +. el .vs \\*[misc*b] +. if \\n[D]>2 .tm S: .vs \\*[misc*b] +. \} +.\} +.nr @ps \\n[.ps] +.nr @psu \\n[.ps]s +.nr @vs \\n[.v] +.nr @vsp \\n[.v]u/1p +.nr @res 1i +.\" +.if \\n[D]>1 \{\ +. tmc "S(\\$*): ma:\\*[misc*a], mb:\\*[misc*b] +. tm1 " => ps:\\n[.s]p (\\n[@psu]u), vs:\\n[@vsp]p (\\n[@vs]u) (res:\\n[@res]) +.\} +.nr misc*S-ps \\n[misc*S-ps1] +.nr misc*S-vs \\n[misc*S-vs1] +.nr misc*S-ps1 \\n[@ps] +.nr misc*S-vs1 \\n[@vs] +.pg@move-trap +.. +.\"------------ +.de HC +.ev 0 +.hc \\$1 +.ev +.ev 1 +.hc \\$1 +.ev +.ev 2 +.hc \\$1 +.ev +.. +.\"------------ +.de RD +.di misc*rd +'fl +.rd \\$1\t +.br +.di +.ie !''\\$3' \{\ +. di misc*rd2 +. ds \\$3 "\\*[misc*rd] +. br +. di +.\} +.if !''\\$2' .rn misc*rd \\$2 +.rm misc*rd misc*rd2 +.. +.\"------------ +.\" VERBON [flag [pointsize [font]]] +.\" flag +.\" bit function +.\" 0 escape on +.\" 1 add an empty line before verbose text +.\" 2 add an empty line after verbose text +.\" 3 numbered lines (controlled by the string Verbnm) +.\" 4 indent text by the numbervariable Verbin. +.de VERBON +.br +.nr misc*verb 0\\$1 +.if (0\\n[misc*verb]%4)/2 .SP \\n[Lsp]u +.misc@ev-keep misc*verb-ev +.nf +.if (0\\n[misc*verb]%16)/8 .nm \\*[Verbnm] +.ie !'\\$3'' .ft \\$3 +.el .ft CR +.ie 0\\$2 \{\ +. ss \\$2 +. ps \\$2 +. vs \\$2 +.\} +.el .ss 12 +.ta T 8u*\w@n@u +.if (0\\n[misc*verb]%32)/16 .in +\\n[Verbin]u +.if 0\\n[misc*verb]%2 \{\ +. eo +. nr @verbose-flag 1 \" tell pageheader to set ec/eo +.\} +.. +.de VERBOFF +.ec +.br +.if (0\\n[misc*verb]%8)/4 .SP \\n[Lsp]u +.if (0\\n[misc*verb]%16)/8 .nm +.if (0\\n[misc*verb]%32)/16 .in +.ev +.nr @verbose-flag 0 +.. +.\" ######## module pict ################# +.nr pict*width 0 +.nr pict*height 0 +.nr pict*mode 0 +.nr pict*ind 0 +.nr pict*id 0 1 +.\" I assume that the number variable pict*id is the same +.\" between two runs. +.de PIC +.br +.nr pict*ind 0 +.nr pict*box 0 +.while \\n[.$]>0 \{\ +. if '-B'\\$1' \{\ +. nr pict*box 1 +. shift +. continue +. \} +. if '-L'\\$1' \{\ +. nr pict*mode 0 +. shift +. continue +. \} +. if '-R'\\$1' \{\ +. nr pict*mode 1 +. shift +. continue +. \} +. if '-I'\\$1' \{\ +. nr pict*ind (m;\\$2) +. nr pict*mode 2 +. shift 2 +. continue +. \} +. if '-C'\\$1' \{\ +. nr pict*mode 3 +. shift +. continue +. \} +. ds pict*f \\$1 +. nr pict*id +1 +. shift +. if \\n[.$]>0 \{\ +. nr pict*width (i;\\$1) +. shift +. \} +. if \\n[.$]>0 \{\ +. nr pict*height (i;\\$1) +. shift +. \} +.\} +.\" let mmroff know the filename and id +.if \\n[Ref]>0 \{\ +. tm .\\\\" PIC id \\n[pict*id] +. tm .\\\\" PIC file \\*[pict*f] +.\} +.\" these are defined by mmroff in the second pass +.if d pict*file!\\n[pict*id] \{\ +. ds pict*f \\*[pict*file!\\n[pict*id]] +. nr pict*llx \\n[pict*llx!\\n[pict*id]] +. nr pict*lly \\n[pict*lly!\\n[pict*id]] +. nr pict*urx \\n[pict*urx!\\n[pict*id]] +. nr pict*ury \\n[pict*ury!\\n[pict*id]] +. \" +. nr pict*w (p;\\n[pict*urx]-\\n[pict*llx]) +. if \\n[pict*w]<0 .nr pict*w 0-\\n[pict*w] +. nr pict*h (p;\\n[pict*ury]-\\n[pict*lly]) +. if \\n[pict*h]<0 .nr pict*h 0-\\n[pict*h] +. if \\n[pict*width]>0 \{\ +. nr pict*rs (u;1000*\\n[pict*width]/\\n[pict*w]) +. nr pict*w (u;\\n[pict*w]*\\n[pict*rs]/1000) +. nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000) +. \} +. if \\n[pict*height]>0 \{\ +. nr pict*rs (u;1000*\\n[pict*height]/\\n[pict*h]) +. nr pict*h (u;\\n[pict*h]*\\n[pict*rs]/1000) +. \} +. if '0'\\n[pict*mode]' \{\ +. nr pict*in \\n[.i]u +. \} +. if '1'\\n[pict*mode]' \{\ +. nr pict*in (u;\\n[.l]-\\n[.i]-\\n[pict*w]) +. \} +. if '2'\\n[pict*mode]' \{\ +. nr pict*in \\n[pict*ind]u +. \} +. if '3'\\n[pict*mode]' \{\ +. nr pict*in (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2) +. \} +. ds pict*h " +. if \\n[pict*h]>0 .ds pict*h \\n[pict*h] +. \" +. ne \\n[pict*h]u-1v +. \" +. \" these lines are copied and modified from tmac.pspic. +. \" Originally written by James Clark +. br +. ie \\n[pict*box]>0 \{\ +\v'-1v'\h'\\n[pict*in]u'\ +\Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\ +\v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \ +\\n[pict*llx] \\n[pict*lly] \ +\\n[pict*urx] \\n[pict*ury] \ +\\n[pict*w] \\n[pict*h]' +.\} +. el \{\ +\v'-1v'\h'\\n[pict*in]u'\ +\X'ps: invis'\ +\Z'\D'p 0 \\n[pict*h]u \\n[pict*w]u 0 0 -\\n[pict*h]u''\ +\X'ps: endinvis'\ +\v'\\n[pict*h]u'\X'ps: import \\*[pict*f] \ +\\n[pict*llx] \\n[pict*lly] \ +\\n[pict*urx] \\n[pict*ury] \ +\\n[pict*w] \\n[pict*h]' +. \} +. br +. sp \\n[pict*h]u-1v +.\} +.. +.\" external picture +.\" -L left adjust +.de EPIC +.if \\n[.$]<2 .@error "EPIC: Not enough arguments" +.nr pict*adj 0 \" centered +.if '\\$1'-L' \{\ +. shift 1 \" left adjust +. nr pict*adj 1 +.\} +.if \\n[nl]<0 \& +.nr pict*w \\$1 +.nr pict*h \\$2 +.ds pict*name "External picture +.if !''$3' .ds pict*name \\$3 +.ne \\n[pict*h]u +.sp \\n[pict*h]u-1v +.nr pict*ind 0 +.if !\\n[pict*adj] .nr pict*ind (u;(\\n[.l]-\\n[.i]-\\n[pict*w])/2) +.mk +.in +\\n[pict*ind]u +\D'l \\n[pict*w]u 0'\ +\D'l 0 -\\n[pict*h]u'\ +\D'l -\\n[pict*w]u 0'\ +\D'l 0 \\n[pict*h]u'\ +\v'-(u;\\n[pict*h]/2)'\ +\h'(u;(\\n[pict*w]-\w'\\*[pict*name]'/2))'\\*[pict*name] +.in +.rt +.sp 1v +.. +.\" ######## module acc ################# +.\"----------- +.\" accents. These are copied from mgs, written by James Clark. +.de acc@over-def +.ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\ +\h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2' +.. +.de acc@under-def +.ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2' +.. +.acc@over-def ` \` +.acc@over-def ' \' +.acc@over-def ^ ^ +.acc@over-def ~ ~ +.acc@over-def : \(ad +.acc@over-def ; \(ad +.acc@under-def , \(ac +.\" ######## module uni ################# +.\" unimplemented macros +.de OK +'tm "OK: not implemented" +.. +.de PM +'tm "PM: not implemented" +.. +.\" ######## module hd ################# +.\" support for usermacro +.nr hd*h1-page 1 \" last page-number for level 1 header. +.nr hd*htype 0 +.ds hd*sect-pg +.ds hd*mark +.ds hd*suf-space +.nr hd*need 0 +.aln ;0 hd*htype +.als }0 hd*mark +.als }2 hd*suf-space +.aln ;3 hd*need +.\"------------- +.\" .hd@split varable index name val1 val2 ... +.de hd@split +.if \\$2>(\\n[.$]-3) .@error "\\$3 must have at least \\$2 values (\\*[\\$3]). +.nr hd*sp-tmp \\$2+3 +.ds \\$1 \\$[\\n[hd*sp-tmp]] +.. +.de HU +.H 0 "\\$1" +.. +.\"------------- +.de H +.if !r hd*cur-bline .nr hd*cur-bline \\n[nl] +.br +.df@print-float 2\" $$$ could be wrong... +.\" terminate all lists +.LC +.init@reset +.nr hd*level 0\\$1 +.nr hd*arg1 0\\$1 +.if !\\n[hd*level] .nr hd*level \\n[Hu] +.\" +.\" clear lower counters +.nr hd*i 1 1 +.while \\n+[hd*i]<15 .if \\n[hd*level]<\\n[hd*i] .nr H\\n[hd*i] 0 1 +.\" +.\" save last text for use in TP +.if \\n[hd*level]=1 .ds H1txt \\$2\\$3 +.\" +.\" This is a little fix to be able to get correct H1 heading number +.\" in page headers. Special attention was needed when other formats are used. +.ie !''\\g[H1]' \{\ +. ds hd*format \\g[H1] +. af H1 0 +. nr H1h \\n[H1] 1 +. af H1 \\*[hd*format] +.\} +.el .nr H1h \\n[H1] 1 +.if \\n[hd*level]=1 .nr H1h +1 +.\" +.\" Check if it's time for new page. Only if text has +.\" appeared before. +.if \\n[Ej]&(\\n[Ej]>=\\n[hd*level])&(\\n[nl]>\\n[hd*cur-bline]) .pg@next-page +.\" +.\" increment current counter +.nr H\\n[hd*level] +1 +.\" +.\" update pagenumber if section-page is used +.if (\\n[hd*level]=1)&(\\n[Sectp]>0) .hd@set-page 1 +.\" +.\" hd*mark is the text written to the left of the header. +.ds hd*mark \\n[H1]. +.\" +.if \\n[hd*level]>1 .as hd*mark \\n[H2] +.\" +.nr hd*i 2 1 +.while \\n+[hd*i]<15 .if \\n[hd*level]>(\\n[hd*i]-1) .as hd*mark .\\n[H\\n[hd*i]] +.if \\n[Ht] .ds hd*mark \\n[H\\n[hd*level]]. +.\" +.\" special case, no dot after level one heading if not H1dot true +.if (\\n[hd*level]=1)&(\\n[H1dot]=0) .ds hd*mark \\n[H1] +.\" +.as hd*mark \ \ \" add spaces between mark and heading +.if !\\n[hd*arg1] .ds hd*mark\" no mark for unnumbered +.\" +.if \\n[D]>1 .tm At header \\*[hd*mark] "\\$2" +.nr hd*htype 0 \" hd*htype = check break and space +. \" 0 = run-in, 1 = break only, 2 = space +.if \\n[hd*level]<=\\n[Hb] .nr hd*htype 1 +.if \\n[hd*level]<=\\n[Hs] .nr hd*htype 2 +. \" two spaces if hd*htype == 0 +.ie (\\n[hd*htype]=0)&(\w@\\$2@) .ds hd*suf-space " \" +.el .ds hd*suf-space +.nr hd*need 2v \" hd*need = header need space +.\"---------- user macro HX ------------ +.\" User exit macro to override numbering. +.\" May change hd*mark (}0), hd*suf-space (}2) and hd*need (;3) +.\" Can also change Hps1/2. +.if d HX .HX \\n[hd*level] \\n[hd*arg1] "\\$2\\$3" +.\"-------------------------------------- +.\" pre-space +.ie \\n[hd*level]<=\\n[Hps] .SP (u;\\n[Hps2]) +.el .SP (u;\\n[Hps1]) +.\" +.par@reset-num \\n[hd*level]\" reset numbered paragraph +.\" start diversion to measure size of header +.di hd*div +\\*[hd*mark]\\$2\\$3\\*[hd*suf-space] +.br +.di +.rm hd*div +.if \\n[hd*htype] .na \" no adjust if run-in +.if \\n[hd*htype]<2 .nr hd*need +\\n[Lsp]u \" add some extra space +.ne \\n[hd*need]u+\\n[dn]u+.5p-1v \" this is the needed space for a header +.\" +.\" size and font calculations +.hd@split hd*font \\n[hd*level] HF \\*[HF]\" get font for this level +.ft \\*[hd*font]\" set new font +.hd@split hd*new-ps \\n[hd*level] HP \\*[HP]\" get point size +.ie (\\*[hd*new-ps]=0):(\w@\\*[hd*new-ps]@=0) \{\ +. if \\n[hd*htype] \{\ +. if '\\*[hd*font]'3' \{\ +. ps -1 +. vs -1 +. \} +. if '\\*[hd*font]'B' \{\ +. ps -1 +. vs -1 +. \} +. \} +.\} +.el \{\ +. ps \\*[hd*new-ps] +. vs \\*[hd*new-ps]+2 +.\} +.\" +.\"---------- user macro HY ------------- +.\" user macro to reset indents +.if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3" +.DEVTAG-NH \\n[hd*level] \" HTML: mark beginning of heading +.\"-------------------------------------- +.nr hd*mark-size \w@\\*[hd*mark]@ +.if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc +.\" +.\" finally, output the header +\\*[hd*mark]\&\c +.\" and the rest of the header +.ie \\n[hd*htype] \{\ +\\$2\\$3 +. br +.\} +.el \\$2\\$3\\*[hd*suf-space]\&\c +.ft 1 +.\" restore pointsize and vertical size. +.ps \\n[@ps]u +.vs \\n[@vs]u +.\" +.\" table of contents +.if (\\n[hd*level]<=\\n[Cl])&\w@\\$2@ .toc@entry \\n[hd*level] "\\$2" +.\" set adjust to previous value +.SA +.\" do break or space +.if \\n[hd*htype] .br +.if \\n[hd*htype]>1 .SP (u;\\n[Lsp]*\\n[Hss]) +.if \\n[hd*htype] \{\ +. \" indent if Hi=1 and Pt=1 +. if (\\n[Hi]=1)&(\\n[Pt]=1) .ti +\\n[Pi]n +. \" indent size of mark if Hi=2 +. if \\n[hd*htype]&(\\n[Hi]>1) .ti +\\n[hd*mark-size]u +.\} +.nr par@ind-flag 0 \" no indent on .P if Pt=2 +.\" +.\" check if it is time to reset footnotes +.if (\\n[hd*level]=1)&\\n[ft*clear-at-header] .nr ft*nr 0 1 +.\" +.\" check if it is time to reset indexes +.if (\\n[hd*level]=1)&\\n[Sectf] \{\ +. nr lix*fg-nr 0 1 +. nr lix*tb-nr 0 1 +. nr lix*ec-nr 0 1 +. nr lix*ex-nr 0 1 +.\} +.\"---------- user macro HZ ---------- +.if d HZ .HZ \\n[hd*level] \\n[hd*arg1] "\\$2\\$3" +.nr hd*last-pos \\n[nl] +.nr hd*last-hsize \\n[.k] +.nr par@ind-flag 0 +.DEVTAG-EO-H \" HTML: end of heading +.. +.\"-------- +.de HM +.nr hd*i 0 1 +.while \\n+[hd*i]<15 .af H\\n[hd*i] \\$[\\n[hd*i]] 1 +.. +.\"---------------------- +.\" set page-nr, called from header +.\" +.de hd@set-page +.\" +.ie \\n[.$]>0 .nr P \\$1 +.el .nr P +1 +.\" Set section-page-string +.ds hd*sect-pg \\n[H1]-\\n[P] +.if \\n[Sectp]>1 .if '\\n[H1]'0' .ds hd*sect-pg " +.. +.\"########### module pg #################### +.\" set end of text trap +.wh 0 pg@header +.em pg@end-of-text +.\" +.ds pg*header ''- \\nP -'' +.ds pg*footer +.if \n[N]=4 .ds pg*header '''' +.if (\n[N]=3):(\n[N]=5) \{\ +. ds pg*header '''' +. ds pg*footer ''\\*[hd*sect-pg]'' +.\} +.ds pg*even-footer +.ds pg*odd-footer +.ds pg*even-header +.ds pg*odd-header +.\" +.nr pg*top-margin 0 +.nr pg*foot-margin 0 +.nr pg*block-size 0 +.nr pg*footer-size 5v\" 1v+footer+even/odd footer+2v +.nr pg*header-size 7v\" 3v+header+even/odd header+2v +.nr pg*extra-footer-size 0 +.nr pg*extra-header-size 0 +.nr ft*note-size 0 +.nr pg*cur-column 0 +.nr pg*cols-per-page 1 +.nr pg*cur-po \n[@po] +.nr pg*head-mark 0 +.\" +.nr pg*ps \n[@ps] +.nr pg*vs \n[@vs] +.\"------------------------- +.\" footer TRAPS: set, enable and disable +.de pg@set-new-trap +.nr pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) +.\" +.if \\n[D]>2 .tm pg*foot-trap \\n[@pl]u-(\\n[pg*block-size]u+\\n[ft*note-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) = \\n[pg*foot-trap] +.\" +.\" last-pos points to the position of the footer and bottom +.\" block below foot-notes. +.nr pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) +.if \\n[D]>2 .tm pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) = \\n[pg*last-pos] +.. +.de pg@enable-trap +.\" Disable in HTML mode +.if !'\*[.T]'html' \{\ +.wh \\n[pg*foot-trap]u pg@footer +.if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl] +.if \\n[D]>2 .ptr +.\} +.. +.de pg@disable-trap +.ch pg@footer +.. +.\" move to new trap (if changed). +.de pg@move-trap +.pg@disable-trap +.pg@set-new-trap +.pg@enable-trap +.. +.de pg@enable-top-trap +.\" set trap for pageheader. +.nr pg*top-enabled 1 +.. +.de pg@disable-top-trap +.\" remove trap for pageheader. +.nr pg*top-enabled 0 +.. +.\" no header on the next page +.de PGNH +.nr pg*top-enabled (-1) +.. +.\" set first trap for pagefooter +.pg@enable-top-trap +.pg@set-new-trap +.pg@enable-trap +.\"------------------------- +.\" stop output and begin on next page. Fix footnotes and all that. +.de pg@next-page +.\".debug next-page +.ne 999i \" activate trap +.\" .pg@footer +.. +.\"------------------------- +.\" support for PX, TP and EOP. +.als }t pg*header +.als }e pg*even-header +.als }o pg*odd-header +.als TPh pg*header +.als TPeh pg*even-header +.als TPoh pg*odd-header +.\" +.als EOPf pg*footer +.als EOPef pg*even-footer +.als EOPof pg*odd-footer +.\"------------------------------------------------------------ +.\" HEADER +.de pg@header +.\" Disable in HTML mode +.if !'\*[.T]'html' \{\ +.if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.]) +.\" check if Hy has been changed +.ie \\n[Hy] 'hy 14 +.el 'nh +.if \\n[Idxf] \{\ +.tl '''' +.\} +.\" assign current page-number to P +.hd@set-page +.\" reset spacing +.nr line*lp\\n[.z] 0 +.nr line*ac\\n[.z] 0 +.\" +.\" suppress pageheader if pagenumber == 1 and N == [124] +.if \\n[pg*top-enabled] \{\ +.\" must be fixed!! +.\". pg@disable-top-trap +. if \\n[pg*extra-header-size] 'sp \\n[pg*extra-header-size]u +. if \\n[pg*top-margin] 'sp \\n[pg*top-margin]u +. ev pg*tl-ev +. pg@set-env +. ie d let@header .let@header +. el \{\ +. ie d TP .TP +. el \{\ +' sp 3 +. ie ((\\n[%]=1)&((\\n[N]=1):(\\n[N]=2))) .sp +. el .tl \\*[pg*header] +. ie o .tl \\*[pg*odd-header] +. el .tl \\*[pg*even-header] +' sp 2 +. \} +. \} +. ev +. \" why no-space?? +. if d PX \{\ +. ns +. PX +. rs +. \} +. \" check for pending footnotes +. ft@check-old +. \" +. \" back to normal text processing +. pg@enable-trap +. \" mark for multicolumn +. nr pg*head-mark \\n[nl]u +. \" reset NCOL pointer at each new page. +. nr pg*last-ncol 0 +. \" set multicolumn +. \" +. pg@set-po +. \" print floating displays +. df@print-float 4 +. tbl@top-hook +. ns +.\} +.if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1 +.nr hd*cur-bline \\n[nl] \" .H needs to know if output has occured +.\} +.. +.\"--------------------------------------------------------- +.\" FOOTER +.de pg@footer +.ec +.if \\n[D]>2 .tm Footer# \\n[%] (\\n[.F]:\\n[c.]) nl=\\n[nl] +.pg@disable-trap +.\".debug footer +.tbl@bottom-hook +.\" increment pageoffset for MC +.\" move to the exact start of footer. +'sp |\\n[pg*foot-trap]u+1v +.\" +.if \\n[D]>3 .tm FOOTER after .sp, nl=\\n[nl] +.\" print footnotes +.if d ft*div .ft@print +.\" +.pg@inc-po +.if !\\n[pg*cur-column] .pg@print-footer +.\" next column +.pg@set-po +.pg@enable-trap +.if \\n[@verbose-flag] .eo \" to help VERBON/VERBOFF +.. +.\"------------------------- +.de pg@print-footer +.\" jump to the position just below the foot-notes. +'sp |\\n[pg*last-pos]u+1v +.if \\n[D]>3 .tm print-footer nl=\\n[nl] +.\" check if there are any bottom block +.if d pg*block-div .pg@block +.\" +.\" print the footer and eject new page +.ev pg*tl-ev +.pg@set-env +.\" user defined end-of-page macro +.ie d EOP .EOP +.el \{\ +. ie o .tl \\*[pg*odd-footer] +. el .tl \\*[pg*even-footer] +. ie (\\n[%]=1)&(\\n[N]=1) .tl \\*[pg*header] +. el .tl \\*[pg*footer] +. tl ''\\*[Pg_type!\\n[@copy_type]]'' +.\} +.ev +.\" be sure that floating displays and footnotes will be +.\" printed at the end of the document. +.ie (\\n[df*fnr]>=\\n[df*o-fnr]):\\n[ft*exist] \{\ +. ev ne +' bp +. ev +.\} +.el 'bp +.. +.\"------------------------- +.\" +.\" Initialize the title environment +.de pg@set-env +'na +'nh +'in 0 +'ti 0 +.ie \\n[Pgps] \{\ +. ps \\n[@ps]u +. vs \\n[@vs]u +.\} +.el \{\ +. ps \\n[pg*ps]u +. vs \\n[pg*vs]u +.\} +.lt \\n[@ll]u +.ll \\n[@ll]u +.. +.\"------------------------- +.de PH +.ds pg*header "\\$1 +.pg@set-new-size +.. +.de PF +.ds pg*footer "\\$1 +.pg@set-new-size +.. +.de OH +.ds pg*odd-header "\\$1 +.pg@set-new-size +.. +.de EH +.ds pg*even-header "\\$1 +.pg@set-new-size +.. +.de OF +.ds pg*odd-footer "\\$1 +.pg@set-new-size +.. +.de EF +.ds pg*even-footer "\\$1 +.pg@set-new-size +.. +.de pg@clear-hd +.ds pg*even-header +.ds pg*odd-header +.ds pg*header +.. +.de pg@clear-ft +.ds pg*even-footer +.ds pg*odd-footer +.ds pg*footer +.. +.de pg@set-new-size +.nr pg*ps \\n[@ps] +.nr pg*vs \\n[@vs] +.pg@move-trap +.. +.\"------------------------- +.\" end of page processing +.de pg@footnotes +.\".debug footnotes +.\" output footnotes. set trap for block +.\" +.. +.\"------------------------- +.\" print bottom block +.de pg@block +.ev pg*block-ev +'nf +'in 0 +.ll 100i +.pg*block-div +.br +.ev +.. +.\"------------------------- +.\" define bottom block +.de BS +.misc@ev-keep pg*block-ev +.init@reset +.br +.di pg*block-div +.. +.\"------------------------- +.de BE +.br +.di +.nr pg*block-size \\n[dn]u +.ev +.pg@move-trap +.. +.\"------------------------- +.\" print out all pending text +.de pg@end-of-text +.if \\n[D]>2 .tm ---------- End of text processing ---------------- +.df@eot-print +.ref@eot-print +.. +.\"------------------------- +.\" set top and bottom margins +.\" -T sets pg*footer-size and pg*header-size instead +.de VM +.ie '\\$1'-T' \{\ +. shift +. if \\n[.$]=0 \{\ +. nr pg*footer-size 5v +. nr pg*header-size 7v +. \} +. if \\n[.$]>0 .nr pg*header-size (v;\\$1) +. if \\n[.$]>1 .nr pg*footer-size (v;\\$2) +.\} +.el \{\ +. if \\n[.$]=0 \{\ +. nr pg*extra-footer-size 0 +. nr pg*extra-header-size 0 +. \} +. if \\n[.$]>0 .nr pg*extra-header-size (v;\\$1) +. if \\n[.$]>1 .nr pg*extra-footer-size (v;\\$2) +. if \\n[D]>2 \{\ +. tm extra top \\n[pg*extra-footer-size] +. tm extra bottom \\n[pg*extra-header-size] +. \} +.\} +.pg@move-trap +.. +.\"--------------------- +.\" multicolumn output. +.de pg@set-po +.if \\n[pg*cols-per-page]>1 \{\ +. ll \\n[pg*column-size]u +.\} +.. +.de pg@inc-po +.if \\n[pg*cols-per-page]>1 \{\ +. ie \\n+[pg*cur-column]>=\\n[pg*cols-per-page] \{\ +. nr pg*cur-column 0 1 +. nr pg*cur-po \\n[@po]u +. po \\n[@po]u +. ll \\n[@ll]u +. \} +. el \{\ +. nr pg*cur-po +(\\n[pg*column-size]u+\\n[pg*column-sep]u) +. po \\n[pg*cur-po]u +' sp |\\n[pg*head-mark]u +. tbl@top-hook +. \} +.\} +.. +.\" An argument disables the page-break. +.de 1C +.br +.if \\n[pg*cols-per-page]<=1 .@error "1C: multicolumn mode not active" +.nr pg*cols-per-page 1 +.nr pg*column-sep 0 +.nr pg*column-size \\n[@ll] +.nr pg*ncol-i \\n[pg*cur-column]\" temp variable +.nr pg*cur-column 0 1 +.nr pg*cur-po \\n[@po]u +.PGFORM +.ie !'\\$1'1' .SK +.el \{\ +. if d ft*div \{\ +. if \\n[pg*ncol-i]>0 \{\ +. @warning 1C: footnotes will be messy +. \} +. \} +. if \\n[pg*last-ncol]>0 \{\ +. sp |\\n[pg*last-ncol]u +. nr pg*last-ncol 0 +. \} +.\} +.. +.de 2C +.br +.nr pg*head-mark \\n[nl]u +.if \\n[pg*cols-per-page]>1 .@error "2C: multicolumn mode already active" +.nr pg*cols-per-page 2 +.nr pg*column-sep \\n[@ll]/15 +.nr pg*column-size (\\n[@ll]u*7)/15 +.nr pg*cur-column 0 1 +.nr pg*cur-po \\n[@po]u +.ll \\n[pg*column-size]u +.\" .lt \\n[pg*column-size]u +.. +.\" MC column-size [ column-separation ] +.de MC +.br +.nr pg*head-mark \\n[nl]u +.if \\n[pg*cols-per-page]>1 .@error "MC: multicolumn mode already active" +.ie ''\\$1' .nr pg*column-size \\n[.l] +.el .nr pg*column-size (n;\\$1) +.ie ''\\$2' .nr pg*column-sep \\n[pg*column-size]/15 +.el .nr pg*column-sep (n;\\$2) +.\" +.\" calculate the number of columns/page +.nr pg*cols-per-page 0 +.nr pg*i \\n[pg*column-size] +.while \\n[pg*i]<=\\n[.l] \{\ +. nr pg*cols-per-page \\n[pg*cols-per-page]+1 +. nr pg*i \\n[pg*i]+\\n[pg*column-sep]+\\n[pg*column-size] +.\} +.nr pg*cur-column 0 1 +.nr pg*cur-po \\n[@po]u +.ll \\n[pg*column-size]u +.\" .lt \\n[pg*column-size]u +.. +.\" begin a new column +.de NCOL +.br +.if \\n[nl]>\\n[pg*last-ncol] .nr pg*last-ncol \\n[nl] +.pg@footer +.. +.\" skip pages +.de SK +.br +.bp +.nr pg*i 0 1 +.\" force new page by writing something invisible. +.while \\n+[pg*i]<=(0\\$1) \{\ +\& +. bp +.\} +.. +.\"------------------------------- +.\" MULB width1 space1 width2 space2 width3 space3 ... +.de MULB +.br +.nr pg*i 0 1 +.nr pg*mul-x 0 1 +.nr pg*mul-ind 0 +.nr pg*mul-last 0 +.while \\n[.$] \{\ +. nr pg*mul!\\n+[pg*i] (n;0\\$1) +. nr pg*muls!\\n[pg*i] (n;0\\$2) +. shift 2 +.\} +.nr pg*mul-max-col \\n[pg*i] +.ds pg*mul-fam \\n[.fam] +.nr pg*mul-font \\n[.f] +.ev pg*mul-ev +.ps \\n[@ps]u +.vs \\n[@vs]u +.fam \\*[pg*mul-fam] +.ft \\n[pg*mul-font] +.fi +.hy 14 +.di pg*mul-div +.MULN +.. +.\"----------- +.de MULN +.if \\n[pg*mul-x]>=\\n[pg*mul-max-col] .@error "MULN: Undefined columnwidth" +.br +.if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d] +.rt +0 +.in \\n[pg*mul-ind]u +.ll (u;\\n[.i]+\\n[pg*mul!\\n+[pg*mul-x]])u +.nr pg*mul-ind +(u;\\n[pg*mul!\\n[pg*mul-x]]+\\n[pg*muls!\\n[pg*mul-x]]) +.. +.\"----------- +.\" MULE +.de MULE +.br +.if \\n[.d]>\\n[pg*mul-last] .nr pg*mul-last \\n[.d] +.di +.ev +.ne \\n[pg*mul-last]u +.nf +.mk +.pg*mul-div +.rt +.sp \\n[pg*mul-last]u +.fi +.. +.\"----------- +.de OP +.br +.ie o .if !\\n[pg*head-mark]=\\n[nl] \{\ +. bp +1 +. bp +1 +.\} +.el .bp +.. +.\"########### module footnotes ################### +.nr ft*note-size 0 +.nr ft*busy 0 +.nr ft*nr 0 1 +.nr ft*wide 0 +.nr ft*hyphen 0\" hyphenation value +.nr ft*adjust 1\" >0 if adjust true +.nr ft*indent 1\" >0 if text indent true (not imp. $$$) +.nr ft*just 0\" 0=left justification, 1=right (not imp. $$$) +.nr ft*exist 0\" not zero if there are any footnotes to be printed +.nr ft*clear-at-header 0\" >0 if footnotes should be reset at first level head. +.\" +.ds F \v'-.4m'\s-3\\n+[ft*nr]\s0\v'.4m' +.\" +.\"----------------- +.\" init footnote environment +.de ft@init +.\" indentcontrol not implemented $$$ +.\" label justification not implemented $$$ +'in 0 +'fi +.ie \\n[ft*adjust] 'ad +.el 'na +.ie \\n[ft*hyphen] 'hy 14 +.el 'hy 0 +.ll \\n[@cur-ll]u +.lt \\n[@cur-ll]u +.ps (p;\\n[@ps]u-2) +.vs (p;\\n[@vs]u-1) +.. +.\"----------------- +.\" set footnote format +.\" no support for two column processing (yet). $$$ +.de FD +.if \\n[.$]=0 .@error "FD: bad arg \\$1" +.ie \\n[.$]=2 .nr ft*clear-at-header 1 +.el .nr ft*clear-at-header 0 +.\" +.if !'\\$1'' \{\ +. ie \\$1>11 .nr ft*format 0 +. el .nr ft*format \\$1 +. \" +. nr ft*hyphen (\\n[ft*format]%2)*14 +. nr ft*format \\n[ft*format]/2 +. \" +. nr ft*adjust 1-(\\n[ft*format]%2) +. nr ft*format \\n[ft*format]/2 +. \" +. nr ft*indent 1-(\\n[ft*format]%2) +. nr ft*format \\n[ft*format]/2 +. \" +. nr ft*just \\n[ft*format]%2 +.\} +.. +.\"--------------- +.\" Footnote and display width control $$$ +.de WC +.nr ft*i 0 1 +.while \\n+[ft*i]<=\\n[.$] \{\ +. ds ft*x \\$[\\n[ft*i]] +. if '\\*[ft*x]'N' \{\ +. nr ft*wide 0 +. nr ft*first-fn 0 +. nr ds*wide 0 +. nr ds*float-break 1 +. \} +. if '\\*[ft*x]'-WF' .nr ft*wide 0 +. if '\\*[ft*x]'WF' .nr ft*wide 1 +. if '\\*[ft*x]'-FF' .nr ft*first-fn 0 +. if '\\*[ft*x]'FF' .nr ft*first-fn 1 +. if '\\*[ft*x]'-WD' \{\ +. nr ds*wide 0 +. if r ft*df-save \{\ +. nr Df \\n[ft*df-save] +. rm ft*df-save +. \} +. \} +. if '\\*[ft*x]'WD' \{\ +. nr ds*wide 1 +. nr ft*df-save \\n[Df] +. nr Df 4 +. \} +. if '\\*[ft*x]'-FB' .nr ds*float-break 0 +. if '\\*[ft*x]'FB' .nr ds*float-break 1 +. if \\n[D]>1 .tm WC WF=\\n[ft*wide] WD=\\n[ds*wide] +.\} +.. +.\"----------------- +.\" begin footnote +.\" Change environment, switch to diversion and print the foot-note mark. +.de FS +.if \\n[ft*busy] .@error "FS: missing FE" +.nr ft*busy 1 +.ev ft*ev +.ft@init +.if !\\n[ft*wide] .pg@set-po +.di ft*tmp-div +.nr ft*space (u;\\n[Fs]*\\n[Lsp]) +.sp \\n[ft*space]u +.\" print mark +.ie \\n[.$] .ds ft*mark \\$1 +.el .ds ft*mark \\n[ft*nr]. +\\*[ft*mark] +.in +.75c +.sp -1 +.nr ft*exist 1 +.. +.\"----------------- +.\" init footnote diversion +.de ft@init-footnote +.di ft*div +\l'20n' +.br +.di +.nr ft*note-size \\n[dn] +.. +.\"----------------- +.\" end footnote +.\" End the diversion, back to previous environment, and adjust +.\" the trap to the new foot-note size. +.de FE +.nr ft*busy 0 +.br +.di +'in 0 +'nf +.if \\n[@pl]u<\\n[dn]u .@error "FE: too big footnote" +.if !d ft*div .nr dn +1v +.if \\n[D]>3 .tm FE: foot-trap=\\n[pg*foot-trap] .d=\\n[.d] dn=\\n[dn] +.ie (\\n[pg*foot-trap]u-\\n[.d]u)<\\n[dn]u \{\ +. da ft*next-div +. ft*tmp-div +. br +. di +.\} +.el \{\ +. if !d ft*div .ft@init-footnote +. da ft*div +. ft*tmp-div +. di +. nr ft*note-size +\\n[dn] +.\} +.rm ft*tmp-div +.ev +.pg@move-trap +.. +.\"----------------- +.\" print footnotes, see pg@footer +.de ft@print +.ev ft*print-ev +'nf +'in 0 +.ll 100i +.ft*div +.br +.ev +.rm ft*div +.nr ft*note-size 0 +.pg@move-trap +.. +.\"----------------- +.\" check if any pending footnotes, see pg@header +.de ft@check-old +.if d ft*next-div \{\ +. ev ft*ev +. ft@init +. ft@init-footnote +. nf +. in 0 +. da ft*div +. ft*next-div +. di +. nr ft*note-size +\\n[dn] +. rm ft*next-div +. ev +. nr ft*exist 0 +. pg@move-trap +.\} +.. +.\"########### module display ################### +.nr ds*wide 0\" >0 if wide displays wanted +.nr df*fnr 0 1\" floating display counter +.nr df*o-fnr 1\" floating display counter, already printed +.nr ds*snr 0 1\" static display counter +.nr ds*lvl 0 1\" display level +.nr ds*float-busy 0\" >0 if printing float +.nr df*float 0 >0 if previous display was floating +.\"-------------------------------------------- +.de DE +.ie \\n[df*float] .df@end \\$@ +.el .ds@end \\$@ +.. +.\"-------------------------------------------- +.\" floating display start +.\" nested DF/DE is not allowed. +.de DF +.if \\n[df*float] .@error "DF:nested floating is not allowed. Use DS." +.ds@set-format \\$@ +.\" +.nr df*old-ll \\n[.l] +.nr ds*ftmp \\n[.f] +.misc@ev-keep df*ev +.ft \\n[ds*ftmp] +.\" +.init@reset +.di df*div +'in 0 +.\" +.ds@set-new-ev \\n[df*old-ll] +.SP \\n[Lsp]u +.nr df*float 1 +.. +.\"-------------------------------------------- +.de df@end +.br +.SP \\n[Lsp]u +.di +.nr df*width!\\n+[df*fnr] \\n[dl] +.nr df*height!\\n[df*fnr] \\n[dn] +.nr df*wide!\\n[df*fnr] \\n[ds*wide] +.nr df*format!\\n[df*fnr] \\n[ds*format] +.ev +.if \\n[D]>2 .tm DF:fnr=\\n[df*fnr] w=\\n[dl] h=\\n[dn] wide=\\n[ds*wide] \ + form=\\n[ds*format] +.\" move div to the floating display list +.rn df*div df*fdiv!\\n[df*fnr] +.\" +.nr par@ind-flag 0 +.\" print float if queue is empty and the display fits into +.\" the current page +.if ((\\n[df*fnr]>=\\n[df*o-fnr])&(\\n[dn]<\\n[.t])) .df@print-float 1 +.nr df*float 0 +.. +.\"------------- +.\" called by end-of-text +.de df@eot-print +.br +.if \\n[df*o-fnr]<=\\n[df*fnr] \{\ +. if \\n[D]>2 .tm Print remaining displays. +.\" still some floats left, make non-empty environment +. misc@ev-keep ne +. init@reset +\c +. df@print-float 3 +. ev +.\} +.. +.\"--------------- +.\" print according to Df and De. +.\" .df@print-float type +.\" type called from +.\" 1 .DE +.\" 2 end of section +.\" 3 end of document +.\" 4 beginning of new page +.\" +.de df@print-float +.if \\n[Df]>5 .@error "Df=\\n[Df], max value is 5" +.if !\\n[ds*float-busy] \{\ +. nr ds*float-busy 1 +.\" at .DE +. if \\n[D]>3 .tm print-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]] +. \" Df = 1 or 5 +. if (\\$1=1)&((\\n[Df]=1):(\\n[Df]=5)) \{\ +. if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\ +. \" Print only new displays. +. if \\n[df*o-fnr]=\\n[df*fnr] \{\ +. br +. ds@print-one-float +. \} +. \} +. \} +. \" Df = 3 +. if (\\$1=1)&(\\n[Df]=3) \{\ +. if \\n[.t]>\\n[df*height!\\n[df*o-fnr]] \{\ +. br +. ds@print-one-float +. \} +. \} +.\" print all if Df<2 and end of section +. if (\\$1=2)&(\\n[Sectp]>0)&(\\n[Df]<2) \{\ +. br +. ds@print-all-floats +. \} +.\" print all if end of document. Where should they go instead? +. if \\$1=3 \{\ +. br +. ds@print-all-floats +.\} +.\" new page +. if (\\$1=4)&(\\n[Df]>1) \{\ +. if \\n[Df]=2 .ds@print-one-float +. if \\n[Df]=3 .ds@print-one-float +. if \\n[Df]>3 \{\ +. ie \\n[De] .ds@print-all-floats +. el .ds@print-this-page +. \} +. \} +. nr ds*float-busy 0 +.\} +.. +.\"--------------- +.\" DF out +.\" print a floating diversion +.de ds@output-float +.nr df*old-ll \\n[.l] +.nr df*old-in \\n[.i] +.ev ds*fev +.nf +.nr df*i \\n[df*o-fnr] +.nr df*f \\n[df*format!\\n[df*i]] +.\" +.in \\n[df*old-in]u +.if \\n[df*f]=1 'in +\\n[Si]n +.if \\n[df*f]>=2 'in 0 +.if \\n[df*f]=2 'ce 9999 +.if \\n[df*f]=3 'in (u;(\\n[.l]-\\n[df*width!\\n[df*i]])/2) +.if \\n[df*f]=4 'rj 9999 +.if \\n[df*f]=5 'in (u;\\n[.l]-\\n[df*width!\\n[df*i]]) +.\" +.\" +.df*fdiv!\\n[df*o-fnr] +.\" +.if \\n[df*f]=2 'ce 0 +.if \\n[df*f]=4 'rj 0 +.ev +.rm df*fdiv!\\n[df*i] +.rm df*height!\\n[df*i] +.rm df*format!\\n[df*i] +.if \\n[df*wide!\\n[df*i]] .nr pg*head-mark \\n[nl]u +.nr df*o-fnr +1 +.. +.\"--------------- +.\" print one floating display if there is one. +.de ds@print-one-float +.if \\n[df*o-fnr]<=\\n[df*fnr] \{\ +. if \\n[D]>3 .tm print-one-float: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]] +. if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page +. ds@output-float +. if \\n[De] .pg@next-page +.\} +.. +.\"--------------- +.\" print all queued floats. +.\" if De>0 do a page eject between the floats. +.de ds@print-all-floats +.while \\n[df*o-fnr]<=\\n[df*fnr] \{\ +. if \\n[D]>3 .tm print-all-floats: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]] +. if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .pg@next-page +. br +\c +. ds@output-float +. if \\n[De] .pg@next-page +.\} +.. +.\"--------------- +.\" print as many floats as will fit on the current page +.de ds@print-this-page +.while \\n[df*o-fnr]<=\\n[df*fnr] \{\ +. if \\n[D]>3 .tm print-this-page: .t=\\n[.t], h=\\n[df*height!\\n[df*o-fnr]] +. if \\n[.t]<\\n[df*height!\\n[df*o-fnr]] .break +. ds@output-float +.\} +.. +.\"--------------------------------------------------- +.\" get format of the display +.de ds@set-format +.ie \\n[.$] \{\ +. ie r ds*format!\\$1 .nr ds*format \\n[ds*format!\\$1] +. el .@error "DS/DF:wrong format:\\$1" +.\} +.el .nr ds*format 0 +.if \\n[D]>2 .tm set format=\\n[ds*format] +.\" fill or not to fill, that is the... +.nr ds*fill 0 +.ie \\n[.$]>1 \{\ +. ie r ds*fill!\\$2 .nr ds*fill \\n[ds*fill!\\$2] +. el .@error "\\*[ds*type]:wrong fill:\\$2" +.\} +.if \\n[D]>2 .tm set fill=\\n[ds*fill] +.nr ds*rindent 0 +.if \\n[.$]>2 .nr ds*rindent \\$3 +.if \\n[D]>2 .tm set indent=\\n[ds*rindent] +.. +.\"----------------------------- +.\" .ds@set-new-ev previous-line-length +.de ds@set-new-ev +.ll \\$1u +.lt \\$1u +.if \\n[ds*rindent] \{\ +. ll -\\n[ds*rindent]n +. lt -\\n[ds*rindent]n +.\} +.if \\n[ds*wide] \{\ +. ll \\n[@ll]u +. lt \\n[@ll]u +.\} +.\" +.ie \\n[ds*fill] 'fi +.el 'nf +.. +.\"-------------------------------------------------------- +.nr ds*format 0\" dummy value for .En/.EQ +.nr ds*format! 0\" no indent +.nr ds*format!0 0\" no indent +.nr ds*format!L 0\" no indent +.nr ds*format!I 1\" indent +.nr ds*format!1 1\" indent +.nr ds*format!C 2\" center each line +.nr ds*format!2 2\" center each line +.nr ds*format!CB 3\" center as block +.nr ds*format!3 3\" center as block +.nr ds*format!R 4\" right justify each line +.nr ds*format!4 4\" right justify each line +.nr ds*format!RB 5\" right justify as block +.nr ds*format!5 5\" right justify as block +.\"--------------- +.nr ds*fill! 0\" no fill +.nr ds*fill!N 0\" no fill +.nr ds*fill!0 0\" no fill +.nr ds*fill!F 1\" fill on +.nr ds*fill!1 1\" fill on +.\"-------------------------------------------- +.\" static display start +.\" nested DS/DE is allowed. No limit on depth. +.de DS +.br +.nr XXX \\n[nl] +.nr ds*lvl +1 +.ds@set-format \\$@ +.\" +.nr ds*old-ll \\n[.l] +.nr ds*old-in \\n[.i] +.misc@push ds-ll \\n[.l] +.misc@push ds-form \\n[ds*format] +.nr ds*i \\n[.i] +.nr ds*ftmp \\n[.f] +.misc@ev-keep ds*ev!\\n+[ds*snr] +.ft \\n[ds*ftmp] +.\" +.init@reset +.\" indent in a diversion doesn't seem like a good idea. +'in 0 +.di ds*div!\\n[ds*snr] +.\" +.ds@set-new-ev \\n[ds*old-ll] +.nr df*float 0 +.. +.\"-------------------------------------------- +.de ds@end +.if \\n-[ds*lvl]<0 .@error "DE: no corresponding DS" +.br +.di +.\" ********** +.nr ds*width \\n[dl] +.nr ds*height \\n[dn] +.misc@pop-nr ds-ll ds*old-ll +.misc@pop-nr ds-form ds*format +.\" +.\" ********** +'nf +.\" calculate needed space +.nr ds*need \\n[ds*height] +.nr ds*i \\n[pg*foot-trap]-\\n[pg*header-size]u-\\n[pg*extra-header-size]u +.if (\\n[ds*height]>\\n[ds*i])&(\\n[.t]<(\\n[ds*i]/2)) .nr ds*need \\n[.t]u+1v +.if (\\n[ds*height]<\\n[ds*i])&(\\n[.t]<(\\n[ds*height])) .nr ds*need \\n[.t]u+1v +.\" Eject page if display will fit one page and +.\" there are less than half of the page left. +.if \\n[ds*need] .ne \\n[ds*need]u +.\" +.\" check if pending equation label +.eq@check \\n[ds*need] +'in \\n[ds*old-in]u +.if \\n[ds*format]=1 'in \\n[ds*old-in]u+\\n[Si]n +.if \\n[ds*format]>=2 'in 0 +.if \\n[ds*format]=2 'ce 9999 +.if \\n[ds*format]=3 'in (u;(\\n[.l]-\\n[ds*width])/2) +.if \\n[ds*format]=4 'rj 9999 +.if \\n[ds*format]=5 'in (u;\\n[.l]-\\n[ds*width]) +.\" ********** +.\" +.\" Print static display +.nr ds*i \\n[Lsp] +.if r Dsp .nr ds*i \\n[Dsp] +.\" +.if \\n[Ds] .sp \\n[ds*i]u +.ds*div!\\n[ds*snr] +.if \\n[Ds] .sp \\n[ds*i]u +.\" +.if \\n[ds*format]=2 'ce 0 +.if \\n[ds*format]=4 'rj 0 +.rm ds*div!\\n[ds*snr] +.nr ds*snr -1 +.nr par@ind-flag 0 +.ev +.. +.\"########### module list ################### +.\" .LI text-indent mark-indent pad type [mark [LI-space [LB-space] ] ] +.\" +.nr li*tind 0 +.nr li*mind 0 +.nr li*pad 0 +.nr li*type 0 +.ds li*mark 0 +.nr li*li-spc 0 +.nr li*lvl 0 1 +.aln :g li*lvl +.nr li*cur-vpos 0 +.\"-------------------------- +.\" the major list-begin macro. +.\" If type == -1 a 'break' will occur. +.de LB +.if \\n[.$]<4 .@error "LB: not enough arguments, min 4" +.misc@push cind \\n[.i] +.misc@push tind \\n[li*tind] +.misc@push mind \\n[li*mind] +.misc@push pad \\n[li*pad] +.misc@push type \\n[li*type] +.misc@push li-spc \\n[li*li-spc] +.ds li*mark-list!\\n[li*lvl] \\*[li*mark] +.nr li*lvl +1 +.\" +.nr li*tind (n;0\\$1)\" text-indent +.nr li*mind (n;0\\$2)\" mark-indent +.nr li*pad (n;0\\$3)\" pad +.nr li*type 0\\$4\" type +.ds li*mark \\$5\" mark +.ie !'\\$6'' .nr li*li-spc \\$6\" LI-space +.el .nr li*li-spc 1 +.ie !'\\$7'' .nr li*lb-spc \\$7\" LB-space +.el .nr li*lb-spc 0 +.\" init listcounter +.nr li*cnt!\\n[li*lvl] 0 1 +.\" assign format +.af li*cnt!\\n[li*lvl] 1 +.if \\n[li*type] .if !'\\*[li*mark]'' .af li*cnt!\\n[li*lvl] \\*[li*mark] +.\" +.if \\n[li*lb-spc] .SP (u;\\n[li*lb-spc]*\\n[Lsp]) +.in +\\n[li*tind]u +.. +.\"--------------- +.de LI +.if \\n[li*lvl]<1 .@error "LI:no lists active" +.if \\n[li*li-spc]&(\\n[Ls]>=\\n[li*lvl]) .SP (u;\\n[li*li-spc]*\\n[Lsp]) +.ne 2v +.\" +.ds li*c-mark \\*[li*mark] +.nr li*cnt!\\n[li*lvl] +1 +.if \\n[li*type]=1 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]]. +.if \\n[li*type]=2 .ds li*c-mark \\n[li*cnt!\\n[li*lvl]]) +.if \\n[li*type]=3 .ds li*c-mark (\\n[li*cnt!\\n[li*lvl]]) +.if \\n[li*type]=4 .ds li*c-mark [\\n[li*cnt!\\n[li*lvl]]] +.if \\n[li*type]=5 .ds li*c-mark <\\n[li*cnt!\\n[li*lvl]]> +.if \\n[li*type]=6 .ds li*c-mark {\\n[li*cnt!\\n[li*lvl]]} +.if \\n[.$]=1 .ds li*c-mark \\$1 +.ie \\n[.$]=2 \{\ +. ie (\\$2=2):(\\n[Limsp]=0) .ds li*c-mark \\$1\\*[li*c-mark] +. el .ds li*c-mark \\$1\ \\*[li*c-mark] +.\} +.\" +.\" determine where the text begins +.nr li*text-begin \\n[li*tind]>?\w@\\*[li*c-mark]\ @ +.nr x \w@\\*[li*c-mark]\ @ +.\" +.\" determine where the mark begin +.ie !\\n[li*pad] .nr li*in \\n[li*mind] +.el .nr li*in \\n[li*text-begin]-\\n[li*pad]-\w@\\*[li*c-mark]@ +.if !\\n[li*in] .nr li*in 0 +.\" +.ti -\\n[li*tind]u +.\" no indentation if hanging indent +.if (\w@\\*[li*c-mark]@=0)&((\\n[.$]=0):(\w@\\$1@=0)) .nr li*text-begin 0 +\Z'\&\h'\\n[li*in]u'\\*[li*c-mark]'\h'\\n[li*text-begin]u'\&\c +.if \\n[li*type]=-1 .br +.. +.\" +.\"------------- +.de li@pop +.nr li*lvl -1 +.misc@pop-nr cind li*tmp +.in \\n[li*tmp]u +.misc@pop-nr tind li*tind +.misc@pop-nr mind li*mind +.misc@pop-nr pad li*pad +.misc@pop-nr type li*type +.misc@pop-nr li-spc li*li-spc +.ds li*mark \\*[li*mark-list!\\n[li*lvl]] +.. +.de LE +.if \\n[li*lvl]<1 .@error "LE:mismatched" +.li@pop +.if '\\$1'1' .SP \\n[Lsp]u +.. +.\"------------- +.\" list status clear. +.\" terminate all lists to level i +.de LC +.ie \\n[.$]<1 .nr li*i 0 +.el .nr li*i \\$1 +.if \\n[li*i]>\\n[li*lvl] .@error "LC: incorrect argument: \\n[li*i] (too big)" +.while \\n[li*lvl]>\\n[li*i] .li@pop +.nr par@ind-flag 0 +.. +.\"------------- +.de AL +.if \\n[.$]>3 .@error "AL: too many arguments" +.if \\n[D]>2 .tm AL $* +.ie \\n[.$]<=1 .LB \\n[Li] 0 2 1 "\\$1" +.el \{\ +. ie \\n[.$]=2 .LB 0\\$2 0 2 1 "\\$1" +. el \{\ +. ie !'\\$2'' .LB \\$2 0 2 1 "\\$1" 0 1 +. el .LB \\n[Li] 0 2 1 "\\$1" 0 1 +. \} +.\} +.. +.de ML +.if \\n[.$]>3 .@error "ML: too many arguments" +.if \\n[D]>2 .tm ML $* +.nr li*ml-width \w@\\$1@u+1n +.if \\n[.$]<2 .LB \\n[li*ml-width]u 0 1 0 "\\$1" +.if \\n[.$]=2 .LB 0\\$2 0 1 0 "\\$1" +.if \\n[.$]=3 \{\ +. ie '\\$2'' .LB \\n[li*ml-width]u 0 1 0 "\\$1" 0 1 +. el .LB \\n[Li] 0 1 0 "\\$1" 0 1 +.\} +.. +.de VL +.if \\n[D]>2 .tm VL $* +.if \\n[.$]>3 .@error "VL: too many arguments" +.if \\n[.$]<1 .@error "VL: missing text-indent" +.ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 0 +.el .LB 0\\$1 0\\$2 0 0 \& 0 1 +.. +.\" Bullet (for .BL) +.de BL +.if \\n[D]>2 .tm BL $* +.ds BU \s-2\(bu\s0 +.if \\n[.$]>2 .@error "BL: too many arguments" +.if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \\*[BU] +.if \\n[.$]=1 .LB 0\\$1 0 1 0 \\*[BU] +.if \\n[.$]=2 \{\ +. ie '\\$1'' .LB \\n[Pi] 0 1 0 \\*[BU] 0 1 +. el .LB 0\\$1 0 1 0 \\*[BU] 0 1 +.\} +.. +.de DL +.if \\n[D]>2 .tm DL $* +.if \\n[.$]>2 .@error "DL: too many arguments" +.if \\n[.$]<1 .LB \\n[Pi] 0 1 0 \(em +.if \\n[.$]=1 .LB 0\\$1 0 1 0 \(em +.if \\n[.$]=2 \{\ +. ie '\\$1'' .LB \\n[Pi] 0 1 0 \(em 0 1 +. el .LB 0\\$1 0 1 0 \(em 0 1 +.\} +.. +.de RL +.if \\n[D]>2 .tm RL $* +.if \\n[.$]>2 .@error "RL: too many arguments" +.if \\n[.$]<1 .LB 6 0 2 4 +.if \\n[.$]=1 .LB 0\\$1 0 2 4 +.if \\n[.$]=2 \{\ +. ie '\\$1'' .LB 6 0 2 4 1 0 1 +. el .LB 0\\$1 0 2 4 1 0 1 +.\} +.. +.\" Broken Variable List. As .VL but text begin on the next line +.de BVL +.if \\n[D]>2 .tm BVL $* +.if \\n[.$]>3 .@error "BVL: too many arguments" +.if \\n[.$]<1 .@error "BVL: missing text-indent" +.ie \\n[.$]<3 .LB 0\\$1 0\\$2 0 -1 +.el .LB 0\\$1 0\\$2 0 -1 \& 0 1 +.. +.\" ####### module tbl ####################################### +.\" This module is copied from groff_ms and modified for mgm. +.\" Yes, it does not resemble the original anymore :-). +.\" Don't know if I missed something important. +.\" Groff_ms is written by James Clark. +.nr tbl*have-header 0 +.nr tbl*header-written 0 +.de TS +.br +.if ''\\n[.z]' .SP +.if '\\$1'H' .di tbl*header-div +.. +.de tbl@top-hook +.if \\n[tbl*have-header] \{\ +. ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl@print-header +. el .sp \\n[.t]u +.\} +.. +.de tbl@bottom-hook +.if \\n[tbl*have-header] \{\ +. nr T. 1 +.\" draw bottom and side lines of boxed tables. +. T# +.\} +.nr tbl*header-written 0 +.. +.de tbl@print-header +.ev tbl*ev +'nf +.tbl*header-div +.ev +.mk #T +.nr tbl*header-written 1 +.. +.de TH +.ie '\\n[.z]'tbl*header-div' \{\ +. nr T. 0 +. T# +. br +. di +. nr tbl*header-ht \\n[dn] +. ne \\n[dn]u+1v +. nr tbl*have-header 1 +. ie '\\$1'N' .if !\\n[tbl*header-written] .tbl@print-header +. el .tbl@print-header +.\} +.el .@error ".TH without .TS H" +.. +.de TE +.ie '\\n(.z'tbl*header-div' .@error ".TS H but no .TH before .TE" +.el \{\ +. nr tbl*have-header 0 +.\} +.\" reset tabs +.TAB +.. +.de T& +.. +.\" ####### module pic ####################################### +.de PS +.nr pic*in 0 +.br +.SP .5 +.ie \\n[.$]<2 .@error "PS: bad arguments. Probably not processed with pic." +.el \{\ +. if !\\n[ds*lvl] .ne (u;\\$1)+1v +.\" should be contained between .DS/.DE +.if r ds*format \{\ +. if \\n[ds*lvl]&((\\n[ds*format]=2):(\\n[ds*format]=3)) \{\ +. nr pic*in \\n[.i] +.\" . in +(u;\\n[.l]-\\n[.i]-\\$2/2) +. \} +. \} +.\} +.. +.de PE +.init@reset +.SP .5 +.. +.\" ####### module eq ####################################### +.\" +.nr eq*number 0 1 +.ds eq*label +.de EQ +.ds eq*label "\\$1 +.. +.de eq@check +.if !'\\*[eq*label]'' \{\ +. mk +. \" space down to middle of equation +' sp (u;\\$1/2) +. ie (\\n[Eq]%2) \{\ +. \" label to the left +\h'|0'\\*[eq*label] +. \} +. el \{\ +. \" label to the right +\h'|\\n[.l]u'\\*[eq*label] +. \} +. rt +.\} +.ds eq*label +.. +.de EN +.. +.\"########### module toc ################### +.\" table of contents +.nr toc*slevel 1 +.nr toc*spacing \n[Lsp]u +.nr toc*tlevel 2 +.nr toc*tab 0 +.\"----------- +.\" Table of contents with friends (module lix) +.de TC +.br +.\" print any pending displays and references +.df@print-float 3 +.if \\n[ref*flag] .RP 0 1 +.\" +.if \w@\\$1@>0 .nr toc*slevel \\$1 +.if \w@\\$2@>0 .nr toc*spacing (u;\\$2*\\n[Lsp]) +.if \w@\\$3@>0 .nr toc*tlevel \\$3 +.if \w@\\$4@>0 .nr toc*tab \\$4 +.if \\n[pg*cols-per-page]>1 .1C +.ds H1txt \\*[Licon] +.ds Tcst co +.pg@clear-hd +.EF "" +.OF "" +.pg@next-page +.\"------------- +.if d Ci .toc@read-Ci \\*[Ci] +.nf +.in 0 +.ie \\n[Oc] .hd@set-page 1 +.el \{\ +. nr toc*pn 1 1 +. af toc*pn i +. aln ;g toc*pn +. PF "''\\\\\\\\n[toc*pn]''" +. am pg@header +. nr toc*pn +1 +\\.. +.\} +.nr toc*i 4 1 +.while \\n+[toc*i]<10 \{\ +. if !'\\$\\n[toc*i]'' \{\ +. ce +\\$\\n[toc*i] +. br +. \} +.\} +.if \\n[.$]<=4 .if d TX .TX +.ie d TY .if \\n[.$]<=4 .TY +.el \{\ +. ce +\\*[Licon] +. br +. SP 3 +.\} +.if d toc*list .toc*list +.br +.\" print LIST OF XXX +.if d lix*dsfg .lix@print-ds fg FG "\\*[Lf]" \\n[.$] +.if d lix*dstb .lix@print-ds tb TB "\\*[Lt]" \\n[.$] +.if d lix*dsec .lix@print-ds ec EC "\\*[Le]" \\n[.$] +.if d lix*dsex .lix@print-ds ex EX "\\*[Lx]" \\n[.$] +.. +.\"----------- +.\" .toc@read-Ci lev1 lev2 lev3 lev4 ... lev7 +.de toc@read-Ci +.nr toc*i 0 1 +.while \\n+[toc*i]<15 \{\ +. nr toc*hl!\\n[toc*i] \\$[\\n[toc*i]] +.\} +.. +.\"----------- +.de toc@entry +.ie \\n[Sectp] \{\ +. toc@save \\$1 "\\*[hd*mark]" "\\$2" \\*[hd*sect-pg] +.\} +.el .toc@save \\$1 "\\*[hd*mark]" "\\$2" \\n[%] +.. +.als )E toc@entry +.\"----------- +.de toc@save +.\" collect maxsize of mark if string Ci don't exist. +.if !d Ci \{\ +. if !r toc*hl!\\$1 .nr toc*hl!\\$1 0 +. if \\n[toc*hl!\\$1]<=\w@\\$2@ \{\ +. nr toc*hl!\\$1 \w@\\$2@u +. \} +.\} +.am toc*list +.\" .toc@set level headernumber text pagenr +.toc@set \\$1 "\\$2" "\\$3" \\$4 +\\.. +.. +.\"----------- +.\" level mark text pagenumber +.de toc@set +.if \\$1<=\\n[toc*slevel] .SP \\n[toc*spacing]u +.na +.fi +.nr toc*ind 0 +.nr toc*i 0 1 +.ie d Ci \{\ +. nr toc*ind +\\n[toc*hl!\\$1]u +.\} +.el \{\ +. while \\n+[toc*i]<\\$1 \{\ +. nr toc*ind +\\n[toc*hl!\\n[toc*i]]u +. \} +.\} +.nr toc*text \\n[toc*ind]u+\\n[toc*hl!\\$1]u +.in \\n[toc*text]u +.ti -\\n[toc*hl!\\$1]u +.\" +.\" length of headernum space +.nr toc*i \\n[toc*hl!\\$1]-\w@\\$2@ +.\" +.ll \\n[@ll]u-\w@\\$4@u-2m +.ne 2v +.\" ragged right --------------------------------- +.ie \\$1>\\n[toc*tlevel] \{\ +\\$2 +. sp -1 +\\$3\ \ \ \\$4 +. br +.\} +.el \{\ +. \" unnumbered heading -------------------- +. ie '\\$2'' \{\ +. in \\n[toc*ind]u +\\$3\h'1m' +. \} +. \" normal heading ------------------------ +. el \{\ +\\$2 +. sp -1 +\\$3\h'1m' +. \} +. ll \\n[@ll]u +. sp -1 +. nr toc*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$4@)-1m +\h'|\\n[.n]u'\l'\\n[toc*sep]u.'\h'1m'\\$4 +.\} +.ll \\n[@ll]u +.. +.\"########################### module lix ############################ +.\" LIST OF figures, tables, exhibits and equations +.nr lix*fg-nr 0 1 +.nr lix*tb-nr 0 1 +.nr lix*ec-nr 0 1 +.nr lix*ex-nr 0 1 +.aln Fg lix*fg-nr +.aln Tb lix*tb-nr +.aln Ec lix*ec-nr +.aln Ex lix*ex-nr +.\"------------ +.de FG +.lix@print-line fg Lf \\n+[lix*fg-nr] "\\$1" "\\$2" "\\$3" "\\$4" +.. +.de TB +.lix@print-line tb Lt \\n+[lix*tb-nr] "\\$1" "\\$2" "\\$3" "\\$4" +.. +.de EC +.lix@print-line ec Le \\n+[lix*ec-nr] "\\$1" "\\$2" "\\$3" "\\$4" +.. +.de EX +.lix@print-line ex Lx \\n+[lix*ex-nr] "\\$1" "\\$2" "\\$3" "\\$4" +.. +.\"------------ +.\" print line with 'figure' in the text +.\" type stringvar number text override flag refname +.de lix@print-line +.ds lix*text "\\$4 +.\" +.ie \\n[Sectf] .ds lix*numb \\n[H1]-\\$3 +.el .ds lix*numb \\$3 +.\" +.ie !\\n[Of] .ds lix*ds-form .\ \ \" +.el .ds lix*ds-form "\ \(em\ \" +.nr lix*in \\n[.i] +.ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\*[lix*ds-form] +.if !'\\$5'' \{\ +. if !0\\$6 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*numb]\\*[lix*ds-form] +. if 0\\$6=1 .ds lix*label \\*[Li\\$1]\ \\*[lix*numb]\\$5\\*[lix*ds-form] +. if 0\\$6=2 .ds lix*label \\*[Li\\$1]\ \\$5\\*[lix*ds-form] +.\} +.\" print line if not between DS/DE +.ie \\n[ds*lvl]<1&\\n[df*float]=0 \{\ +. lix@print-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7 +.\} +.el \{\ +. lix@embedded-text "\\*[lix*label]" "\\*[lix*text]" \\$1 \\$2 \\$7 +.\} +.\" +.. +.\"----------- +.\" label text type stringvar refname +.de lix@print-text +.ie \\n[Sectp] .ds lix*pgnr \\*[hd*sect-pg] +.el .ds lix*pgnr \\n[%] +.SP \\n[Lsp]u +.misc@ev-keep lix +.init@reset +.br +.ie (\w@\\$1\\$2@)>(\\n[.l]-\\n[.i]) \{\ +. in +\w@\\$1@u +. ti 0 +.\} +.el .ce 1 +\fB\\$1\fP\\$2 +.br +.ev +.\" save line for LIST OF XXX, wth is the width of the label +.if !r lix*wth\\$3 .nr lix*wth\\$3 0 +.\" find the maximum width +.if \w@\\*[lix*label]@>\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@ +.if \\n[\\$4] .lix@ds-save \\$3 \\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]" +.\" save reference to the figure +.if !'\\$5'' .SETR \\$5 \\*[lix*numb] +.. +.\" hide printout until diversion is evaluated +.de lix@embedded-text +\!.ie \\\\n[Sectp] .ds lix*pgnr \\\\*[hd*sect-pg] +\!.el .ds lix*pgnr \\\\n[%] +\!.SP \\\\n[Lsp]u +\!.misc@ev-keep lix +\!.ll \\n[.l]u +\!.init@reset +\!.fi +\!.ie (\w@\\$1\\$2@)>(\\\\n[.l]-\\\\n[.i]) \{\ +. in +\w@\\$1@u +\!. ti 0 +\!\fB\\$1\fP\\$2 +\!.\} +\!.el \{\ +. ce 1 +\!\fB\\$1\fP\\$2 +\!.\} +\!.br +\!.ev +.\" save line for LIST OF XXX, wth is the width of the label +\!.if !r lix*wth\\$3 .nr lix*wth\\$3 0 +.\" find the maximum width +\!.if \w@\\*[lix*label]@>\\\\n[lix*wth\\$3] .nr lix*wth\\$3 \w@\\*[lix*label]@ +\!.if \\\\n[\\$4] .lix@ds-save \\$3 \\\\*[lix*pgnr] "\\*[lix*text]" "\\*[lix*label]" +.\" save reference to the figure +\!.if !'\\$5'' .SETR \\$5 \\*[lix*numb] +.. +.\"------------ +.\" print complete list of XXXX +.de lix@print-ds +.\" arg: fg,tb,ec,ex text +.ds H1txt \\$3 +.ds Tcst \\$1 +.if !\\n[Cp] .pg@next-page +.\" print LIST OF XXXX +.\" execute user-defined macros +.if \\$4<=4 .if d TX\\$2 .TX\\$2 +.ie d TY\\$2 .if \\$4<=4 .TY\\$2 +.el \{\ +. ce +\\$3 +. SP 3 +.\} +.in \\n[lix*wth\\$1]u +.fi +.lix*ds\\$1 +.. +.\"------------ +.\" save line of list in macro +.de lix@ds-save +.\" type pagenumber text +.am lix*ds\\$1 +.lix@dsln \\$1 \\$2 "\\$3" "\\$4" \\$5 +\\.. +.. +.\"------------ +.\" print appended macro +.\" lix@dsln type pagenumber text headernr +.de lix@dsln +.nr lix*i \\n[lix*wth\\$1]-\w@\\$4@ +.ne 4v +.ll \\n[@ll]u-\w@\\$4@u-\w@\\$2@u-2m +.ti -\\n[lix*wth\\$1]u +\\$4 +.sp -1 +\\$3\h'1m' +.sp -1 +.ll +.nr lix*sep (u;\\n[.l]-\\n[.n]-\\n[.i]-\w@\\$2@)-1m +\h'|\\n[.n]u'\l'\\n[lix*sep]u.'\h'1m'\\$2 +.SP \\n[toc*spacing]u +.. +.\"########################### module fnt ############################ +.\" some font macros. +.de R +.ft R +.ul 0 +.. +.\"----------- +.de fnt@switch +.ul 0 +.ds fnt*tmp +.nr fnt*prev \\n[.f] +.nr fnt*i 2 1 +.while \\n+[fnt*i]<=\\n[.$] \{\ +. if \\n[fnt*i]>3 .as fnt*tmp \, +. ie (\\n[fnt*i]%2)=1 .as fnt*tmp \\$1\\$[\\n[fnt*i]] +. el .as fnt*tmp \\$2\\$[\\n[fnt*i]] +. if \\n[fnt*i]<\\n[.$] .as fnt*tmp \/ +.\} +\&\\*[fnt*tmp]\f[\\n[fnt*prev]] +.. +.\"----------- +.de B +.ie \\n[.$] .fnt@switch \fB \f[\\n[.f]] \\$@ +.el .ft B +.. +.de I +.ie \\n[.$] .fnt@switch \fI \f[\\n[.f]] \\$@ +.el .ft I +.. +.de IB +.if \\n[.$] .fnt@switch \fI \fB \\$@ +.. +.de BI +.if \\n[.$] .fnt@switch \fB \fI \\$@ +.. +.de IR +.if \\n[.$] .fnt@switch \fI \fR \\$@ +.. +.de RI +.if \\n[.$] .fnt@switch \fR \fI \\$@ +.. +.de RB +.if \\n[.$] .fnt@switch \fR \fB \\$@ +.. +.de BR +.if \\n[.$] .fnt@switch \fB \fR \\$@ +.. +.\"########################### module box ############################ +.\" draw a box around some text. Text will be kept on the same page. +.\" +.nr box*ll 0 +.\" .B1 and .B2 works like .DS +.de B1 +.if \\n[box*ll] .@error "B1: missing B2" +.nr box*ll \\n[.l] +.nr box*ind \\n[.i] +.nr box*hyp \\n[.hy] +.nr box*wid \\n[.l]-\\n[.i] +.\" +.\" jump to new environment. +.ev box*ev +.di box*div +.ps \\n[@ps]u +.vs \\n[@vs]u +.in 1n +.ll (u;\\n[box*wid]-1n) +.hy \\n[.hy] +.. +.de B2 +.if !\\n[box*ll] .@error "B2: missing B1" +.br +.di +.nr box*height \\n[dn] +.ne \\n[dn]u+1v +.ll \\n[box*ll]u +.in \\n[box*ind]u +.nr box*y-pos \\n[.d]u +.nf +.box*div +.fi +\v'-1v+.25m'\ +\D'l \\n[box*wid]u 0'\ +\D'l 0 -\\n[box*height]u'\ +\D'l -\\n[box*wid]u 0'\ +\D'l 0 \\n[box*height]u' +.br +.sp -1 +.ev +.sp .20v +.in \\n[box*ind]u +.ll \\n[box*ll]u +.rm box*div +.nr box*ll 0 +.. +.\"########################### module ref ############################ +.nr ref*nr 0 1 +.aln :R ref*nr +.nr ref*nr-width 5n +.nr ref*flag 0 \" for end-of-text +.ds Rf \v'-.4m'\s-3[\\n+[ref*nr]]\s0\v'.4m' +.\" +.\" start reference +.\"------------ +.de RS +.if !''\\$1' .ds \\$1 \v'-.4m'\s-3[\\n[ref*nr]]\s0\v'.4m' +.nr ref*flag 1 +.am ref*mac +.ref@start-print \\n[ref*nr] +\\.. +.eo +.am ref*mac RF +.. +.\"------------ +.de RF +.ec +.am ref*mac +.ref@stop-print +\\.. +.. +.\"------------ +.de ref@start-print +.di ref*div +.in \\n[ref*nr-width]u +.ti -(\w@\\$1.@u+1n) +\\$1. +.sp -1 +.. +.de ref@stop-print +.br +.di +.ne \\n[dn]u +.ev ref*ev2 +.nf +.ref*div +.ev +.rm ref*div +.if \\n[Ls] .SP \\n[Lsp]u +.. +.\"----------- +.de RP +.if !d ref*mac .@error "RP: No references!" +.nr ref*i 0\\$2 +.if \\n[ref*i]<2 .SK +.SP 2 +.ref@print-refs +.if 0\\$1<1 .nr ref*nr 0 1 +.if ((\\n[ref*i]=0):(\\n[ref*i]=2)) .SK +.. +.\"----------- +.\" called by end-of-text! +.de ref@eot-print +.\".if \\n[ref*flag] \{ +.if d ref*mac \{\ +. if \\n[D]>2 .tm Print references, called by eot +. nr ref*flag 0 +. br +. misc@ev-keep ne +. init@reset +\c +' bp +. ev +. ref@print-refs +.\} +.. +.\"----------- +.\" prints the references +.de ref@print-refs +.toc@save 1 "" "\\*[Rp]" \\n[%] +.ce +\fI\\*[Rp]\fP +.sp +.nr ref*ll \\n[.l] +.misc@ev-keep ref*ev +.ll \\n[ref*ll]u +.in 0 +.ref*mac +.in +.rm ref*mac +.ev +.nr ref*flag 0 1 +.. +.\"########################### module app ############################ +.\" +.nr app*nr 0 1 +.af app*nr A +.nr app*dnr 0 1 +.nr app*flag 0 +.\"------------ +.\" .APP name text +.\" name == "" -> autonumber +.de APP +.\" .if \\n[.$]<2 .@error "APP: too few arguments" +.app@set-ind "\\$1" +.\" +.ds Tcst ap +.ds Apptxt \\$2 +.\" +.ie \\n[Aph] .app@header \\*[app*ind] "\\$2" +.el .bp +.app@index "\\*[app*ind]" "\\$2" +.. +.\"------------ +.\" .APPSK name pages text +.\" name == "" -> autonumber +.de APPSK +.if \\n[.$]<2 .@error "APPSK: too few arguments" +.app@set-ind "\\$1" +.\" +.ds Tcst ap +.ds Apptxt \\$3 +.\" +.ie \\n[Aph] .app@header \\*[app*ind] "\\$3" +.el .bp +.app@index "\\*[app*ind]" "\\$3" +.pn +\\$2 +.. +.\"------------ +.de app@set-ind +.ie \w@\\$1@ .ds app*ind \\$1 +.el \{\ +. if !\\n[app*flag] \{\ +. nr H1 0 1 +. af H1 A +. af H1h A +. nr app*flag 1 +. \} +. ds app*ind \\n+[app*nr] +. nr H1 \\n+[app*dnr] +. nr H1h \\n[app*dnr] +.\} +.\" clear lower counters +.nr app*i 1 1 +.while \\n+[app*i]<15 .nr H\\n[app*i] 0 1 +.. +.\"------------ +.de app@index +.toc@save 1 "" "\\*[App] \\$1: \\$2" \\n[%] +.. +.\"------------ +.\" app@heaer name text +.de app@header +.bp +.SP (u;\\n[Lsp]*4) +.ce 1 +\s+4\fB\\*[App]\ \\$1\fP\s0 +.SP (u;\\n[Lsp]*2) +.if \w@\\$2@<\\n[.l] .ce 1 +\fB\s+2\\$2\s0\fP +.SP (u;\\n[Lsp]*4) +.. +.als APPX app@header +.\"########################### module cov ############################ +.\" title stored in diversion cov*title +.\" abstract stored in diversion cov*abstract +.\" arg to abstract stored in cov*abs-arg +.\" indent stored in cov*abs-ind +.\" number of authors stored in cov*au +.\" author(s) stored in cov*au!x!y +.\" author(s) title stored in cov*at!x!y +.\" x is the author-index [1-cov*au], y is the argument-index [1-9]. +.\" author(s) firm stored in cov*firm +.\" new date (if .ND exists) is stored in cov*new-date +.\" +.\" +.ds cov*abs-name ABSTRACT +.\" +.nr cov*au 0 +.de TL +.rm IA IE WA WE LO LT +.if \\n[.$]>0 .ds cov*title-charge-case \\$1 +.if \\n[.$]>1 .ds cov*title-file-case \\$2 +.pg@disable-top-trap +.eo +.de cov*title AU +.. +.\"------------------- +.de cov@title-end +.ec +.. +.\"------------------- +.\" .AU name [initials [loc [dept [ext [room [arg [arg [arg]]]]]]]] +.de AU +.cov@title-end +.pg@disable-top-trap +.nr cov*au +1 +.nr cov*i 0 1 +.ds cov*au!\\n[cov*au]!1 +.while \\n[.$]>=\\n+[cov*i] \{\ +. ds cov*au!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]] +.\} +.if (\\n[.$]>=3)&(\w@\\$3@) \{\ +. if d cov*location-\\$3] \{\ +. ds cov*au!3!\\n[cov*au] \\*[cov*location-\\$3] +. \} +.\} +.. +.\"------------------- +.\" .AT title1 [title2 [... [title9] ]]]] +.\" Well, thats all that COVEND look for. +.\" Must appear directly after .AU +.de AT +.if \\n[.$]<1 .@error "AT: no arguments" +.nr cov*i 0 1 +.while \\n[.$]>=\\n+[cov*i] \{\ +. ds cov*at!\\n[cov*au]!\\n[cov*i] "\\$[\\n[cov*i]] +.\} +.. +.\"------------------- +.de AF +.cov@title-end +.if !''\\$1' .ds cov*firm \\$1 +.. +.de AST +.ds cov*abs-name \\$1 +.. +.de AS +.pg@disable-top-trap +.if d cov*abstract .@error "AS: only one abstract allowed" +.if !''\\n[.z]' .@error "AS: no diversion allowed (previous .AS?)" +.nr cov*abs-arg 0\\$1 +.nr cov*abs-ind (n;0\\$2) +.de cov*abstract AE +.. +.de AE +.. +.\" fixed for 2000, now uses \n[year]. +.de ISODATE +. \" support for ISO-date +. nr cov*mm \\n[mo] +. nr cov*dd \\n[dy] +. af cov*mm 01 +. af cov*dd 01 +. ie '0'\\$1' \{\ +. ds cov*new-date \\*[MO\\n[mo]] \\n[dy], \\n[year] +. \} +. el \{\ +. ds cov*new-date \\n[year]-\\n[cov*mm]-\\n[cov*dd] +. \} +.. +.ISODATE 0 +.als DT cov*new-date +.de ND +.ds cov*new-date \\$1 +.. +.\" switch to ISO-date if register Iso exist: YYYY-MM-DD +.if r Iso .ISODATE 1 +.\"------------------- +.\" save technical numbers. +.de TM +.nr cov*i 0 1 +.while \\n[.$]>=\\n+[cov*i] .ds cov*mt-tm!\\n[cov*i] \\$[\\n[cov*i]] +.nr cov*mt-tm-max \\n[.$] +.. +.\"----------------------- +.\" cover sheet +.\" the file must have the following last lines (somewhere): +.\" .pg@enable-top-trap +.\" .bp 1 +.\" .pg@enable-trap +.ds cov*mt-file!0 0.MT +.ds cov*mt-file!1 0.MT +.ds cov*mt-file!2 0.MT +.ds cov*mt-file!3 0.MT +.ds cov*mt-file!4 4.MT +.ds cov*mt-file!5 5.MT +.ds cov*mt-file!6 0.MT +.\"------------ +.de MT +.ie \\n[.$] \{\ +. ie d cov*mt-file!\\$1 .ds cov*mt-type \\$1 +. el .ds cov*mt-type 6 +.\} +.el .ds cov*mt-type 1 +.ds cov*mt-addresse "\\$2 +.ds cov*mt-type-text "\\$1 +.ie d @language .ds cov*str mm/\\*[@language]_ +.el .ds cov*str mm/ +.mso \\*[cov*str]\\*[cov*mt-file!\\*[cov*mt-type]] +.. +.de COVER +.ie !\\n[.$] .ds cov*cov-type ms +.el .ds cov*cov-type \\$1 +.pg@disable-top-trap +.ie d @language .ds cov*str mm/\\*[@language]_\\*[cov*cov-type].cov +.el .ds cov*str mm/\\*[cov*cov-type].cov +.mso \\*[cov*str] +.. +.\"########################### module qrf ############################ +.\" forward and backward reference thru special files. +.\" +.\" check if stderr-method is wanted +.\" This was needed when I discovered that groff was considered unsafe +.\" and groff -U didn't work. It's a workaround like the original +.\" index method, but not in my view elegant enough. +.\" +.\" init reference system +.de INITR +.ds qrf*file \\$1.qrf +.nr qrf*pass 2 +.if \\n[D]>1 .tm INITR: source \\*[qrf*file] +.ie \\n[Ref] \{\ +. tm .\\\\" Rfilename: \\*[qrf*file] +.\} +.el 'so \\*[qrf*file] +.. +.\"--------------- +.\" set a reference. +.de SETR +.if \\n[.$]<1 .@error "SETR:reference name missing" +.if !r qrf*pass .tm "SETR: No .INITR in this file" +.if \\n[Ref] \{\ +. ds qrf*name qrf*ref-\\$1 +. if \\n[D]>2 .tm SETR: ref \\*[qrf*name]=\\*[hd*mark],\\n[%] +. \" heading-number +. ds \\*[qrf*name]-hn \\*[hd*mark] +. \" page-number +. ds \\*[qrf*name]-pn \\n[%] +. \" +. if \\n[Ref] \{\ +. tm .ds \\*[qrf*name]-hn \\*[hd*mark] +. tm .ds \\*[qrf*name]-pn \\n[%] +. if !'\\$2'' .tm .ds \\*[qrf*name]-xx \\$2 +. \} +.\} +.. +.\"--------------- +.\" get misc-string +.\" If two arg -> set var. arg to misc-string. +.de GETST +.if \\n[.$]<1 .@error "GETST:reference name missing" +.if !r qrf*pass .tm "GETST: No .INITR in this file" +.ds qrf*name qrf*ref-\\$1 +. if d \\*[qrf*name]-xx \{\ +. ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-xx] +. el \\*[\\*[qrf*name]-xx]\c +. \} +.\} +.. +.\"--------------- +.\" get header-number +.\" If two arg -> set var. arg to header-number. +.de GETHN +.if \\n[.$]<1 .@error "GETHN:reference name missing" +.if !r qrf*pass .tm "GETHN: No .INITR in this file" +.ds qrf*name qrf*ref-\\$1 +.if d \\*[qrf*name]-hn \{\ +. ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-hn] +. el \\*[\\*[qrf*name]-hn]\c +.\} +.. +.\"--------------- +.\" get page-number +.\" If two arg -> set var. arg to page-number. +.de GETPN +.if \\n[.$]<1 .@error "GETPN:reference name missing" +.if !r qrf*pass .tm "GETPN: No .INITR in this file" +.ds qrf*name qrf*ref-\\$1 +.if d \\*[qrf*name]-pn \{\ +. ie \\n[.$]>1 .ds \\$2 \\*[\\*[qrf*name]-pn] +. el \\*[\\*[qrf*name]-pn]\c +.\} +.. +.\"---------- +.de GETR +.if \\n[.$]<1 .@error "GETR:reference name missing" +.ie !r qrf*pass \{\ +. tm "GETR: No .INITR in this file" +.\} +.el \{\ +. GETHN \\$1 Qrfh +. GETPN \\$1 Qrfp +\\*[Qrf] +.\} +.. +.\"########################### module ind ############################ +.\" Support for mgs-style indexing, borrowed from mgs. +.de IX +. tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[%] +.. +.\"-------------------- +.\" Another type of index system +.\" INITI type filename [macro] +.de INITI +.if \\n[.$]<1 .@error "INITI:type missing" +.\" ignore if INITI has already been used +.if \\n[.$]>1 \{\ +. if d ind*file .@error "INITI:file already set" +. ds ind*file \\$2.ind +. if \\n[D]>1 .tm INITI: source \\*[ind*file] +.\} +.if !d ind*file .@error "INITI:file not specified" +.ds ind*type \\$1 +.if \\n[Ref] \{\ +. if \\n[.$]>2 .tm .\\\\" Imacro: \\$3 +.\} +.. +.\"--------------- +.de IND +.if !d ind*file .@error "IND: No active INITI" +.if \\n[D]>1 .tm IND: type=\\*[ind*type] +.ds ind*ref +.if '\\*[ind*type]'N' .ds ind*ref \\n[%] +.if '\\*[ind*type]'H' .ds ind*ref \\*[hd*mark] +.if '\\*[ind*type]'B' .ds ind*ref \\*[hd*mark]\t\\n[%] +.if '\\*[ind*ref]'' .@error "IND:wrong index type: \\*[ind*ref]" +.\" +.ds ind*line \\$1 +.while \\n[.$]>0 \{\ +. shift +. as ind*line \t\\$1 +.\} +.as ind*line \\*[ind*ref] +.if \\n[Ref] .tm .\\\\" IND \\*[ind*line] +.. +.\" print index +.de INDP +.ie \\n[Ref] .tm .\\\\" Index: \\*[ind*file] +.el \{\ +. if !\\n[Cp] .pg@next-page +. \" print INDEX +. \" execute user-defined macros +. if d TXIND .TXIND +. ie d TYIND .TYIND +. el \{\ +. SK +. ce +\\*[Index] +. SP 3 +. 2C +. nf +. \} +' so \\*[ind*file] +. ie d TZIND .TZIND +. el \{\ +. fi +. 1C +. \} +.\} +.rm ind*file +.. +.\"########################### module let ############################ +.\" Letter macros +.\"------------------------ +.\" Formal closing +.de FC +.df@print-float 3 +.ie \\n[.$] .ds let*i \\$1 +.el .ds let*i \\*[Letfc] +.ie d let*type .let@fc_\\*[let*type] "\\*[let*i]" \\$@ +.el .let@mt-closing "\\*[let*i]" \\$@ +.. +.\"------- +.de let@mt-closing +.ne 5v +.in (u;\\n[.l]/2) +.sp +\\$1 +.in +.. +.\"------------------------ +.\" Signature line +.de SG +.ie d let*type .let*lt-sign \\$@ +.el .let*mt-sign \\$@ +.. +.\"------------------------ +.de let*lt-sign +.if !d let@sg_\\*[let*type] .@error "SG: letter type \\*[let*type] undefined" +.df@print-float 3 +.nr let*i 0 1 +.nr let*j 0 +.while \\n+[let*i]<=\\n[let*wa-n] \{\ +.if \\n[let*i]=\\n[let*wa-n] .nr let*j 1 +.let@sg_\\*[let*type] "\\*[let*wa-name!\\n[let*i]]" "\\*[let*wa-title!\\n[let*i]]" \\n[let*i] \\n[let*j] \\$@ +.\} +.. +.\"------------------------ +.\" Memorandum signature +.de let*mt-sign +.df@print-float 3 +.ne \\n[cov*au]u*4v +.ie \\n[.$]>1 .nr let*k 1 +.el .nr let*k \\n[cov*au] +.ds let*tmp \\*[cov*au!\\n[let*k]!3]-\\*[cov*au!\\n[let*k]!4]- +.nr let*i 0 1 +.while \\n+[let*i]<=\\n[cov*au] \{\ +. if \\n[let*i]>1 .as let*tmp / +. as let*tmp \\*[cov*au!\\n[let*k]!2] +.\} +.if !''\\$1' .as let*tmp -\\$1 +.in (u;\\n[.l]/2) +.nf +.nr let*i 0 1 +.while \\n+[let*i]<=\\n[cov*au] \{\ +. SP 3v +. if \\n[let*i]=\\n[let*k] \{\ +\Z'\h'-(u;\\n[.l]/2)'\\*[let*tmp]'\c +. \} +\\*[cov*au!\\n[let*i]!1] +.\} +.fi +.in +.. +.\"------------------------ +.\" Approval signature +.de AV +.ne 6v +.nf +.sp +.ie \\n[.$]<2 \\*[Letapp] +.el .sp +.sp 2 +.ie n ______________________________ ______________ +.el \D'l 25m 0'\h'4m'\D'l 12m 0' +\Z'\\$1'\h'29m'\f[\\*[@sdf_font]]\\*[Letdate]\fP +.fi +.. +.\"------------------------ +.\" Letter signature +.de AVL +.ne 6v +.nf +.sp 3 +.ie n ______________________________ +.el \D'l 25m 0' +\Z'\\$1' +.fi +.. +.\"------------------------ +.\" Letter type +.\" let@header is called from the header. It is supposed +.\" to remove the alias itself. +.de LT +.rm AF AS AE AT AU CS OK TL MT +.ds let*type BL +.nr Pi 5 +.nr Pt 0 +.if !''\\$1' .ds let*type \\$1 +.if !d let@head_\\*[let*type] .@error "LT: unknown letter type \\$1" +.shift +.als let@header let@head_\\*[let*type] +.let@init_\\*[let*type] \\$@ +.if \n[D]>1 .tm Letter type \\*[let*type] +.. +.\"----------- +.\" Blocked letter +.de let@init_BL +.. +.de let@head_BL +.rm let@header +.let@print-head 1 +.. +.de let@sg_BL +.ne 5v +.nf +.in (u;\\n[.l]/2) +.sp 3v +\\$1 +\\$2 +.in +.if \\$4 .sp +.if \w'\\$5'&\\$4 \\$5 +.fi +.. +.als let@fc_BL let@mt-closing +.\"----------- +.\" Semiblocked letter +.de let@init_SB +.nr Pt 1 +.. +.de let@head_SB +.rm let@header +.let@print-head 1 +.. +.als let@sg_SB let@sg_BL +.als let@fc_SB let@mt-closing +.\"----------- +.\" Full-blocked letter +.de let@init_FB +.. +.de let@head_FB +.rm let@header +.let@print-head +.. +.de let@sg_FB +.ne 5v +.nf +.sp 3v +\\$1 +\\$2 +.if \\$4 .sp +.if \w'\\$5'&\\$4 \\$5 +.fi +.. +.de let@fc_FB +.ne 5v +.sp +\\$1 +.. +.\"----------- +.\" Simplified letter +.de let@init_SP +.. +.de let@head_SP +.rm let@header +.let@print-head +.. +.de let@sg_SP +.nf +.if \\$3=1 .sp +.sp +.misc@toupper "\\$1, \\$2" +.if \\$4 .sp +.if \w'\\$5'&\\$4 \\$5 +.fi +.. +.de let@fc_SP +.sp 2 +.. +.\"-------------------------------------- +.\" Print the letter-head +.de let@print-head +.nf +.sp |11 +.if '1'\\$1' .in (u;\\n[.l]/2) +.\" ---- WA +.ie d let@wa-div .let@wa-div +.el .sp 3 +.\" ---- datum +\\*[cov*new-date] +.sp +.if '1'\\$1' .if !d let*lo-CN .if !d let*lo-RN .sp 2 +.\" ---- Confidential +.if d let*lo-CN \{\ +. ti 0 +. ie !''\\*[let*lo-CN]' \\*[let*lo-CN] +. el \\*[LetCN] +. sp +.\} +.\" ---- Reference +.if d let*lo-RN \{\ +\\*[LetRN] \\*[let*lo-RN] +. sp +.\} +.\" ---- IA +.sp +.in 0 +.nr let*i 0 1 +.while \\n+[let*i]<=\\n[let*ia-n] \{\ +\\*[let*ia-name!\\n[let*i]] +\\*[let*ia-title!\\n[let*i]] +.\} +.if d let@ia-div .let@ia-div +.\" ---- Attention +.if d let*lo-AT \{\ +. sp +\\*[LetAT] \\*[let*lo-AT] +.\} +.\" ---- Salutation +.if !'\\*[let*type]'SP' .if d let*lo-SA \{\ +. sp +. ti 0 +. ie !''\\*[let*lo-SA]' \\*[let*lo-SA] +. el \\*[LetSA] +.\} +.\" ---- Subject +.if d let*lo-SJ \{\ +. ie '\\*[let*type]'SP' \{\ +. sp 2 +. misc@toupper \\*[let*lo-SJ] +. sp +. \} +. el \{\ +. sp +. if '\\*[let*type]'SB' .ti +5m +\\*[LetSJ] \f[\\*[@sdf_font]]\\*[let*lo-SJ]\fP +. \} +.\} +.. +.\"------------------- +.\" .IA [name [title]] +.nr let*ia-n 0 1 +.de IA +.if \\n[.$] .ds let*ia-name!\\n+[let*ia-n] \\$1 +.if \\n[.$]>1 .ds let*ia-title!\\n[let*ia-n] \\$2 +.ev let@ev +.init@reset +'nf +.di let@ia-div +.eo +.. +.de IE +.di +.ec +.ev +.. +.\"------------------- +.\" .WA [name [title]] +.nr let*wa-n 0 1 +.de WA +.if \\n[.$] .ds let*wa-name!\\n+[let*wa-n] \\$1 +.if \\n[.$]>1 .ds let*wa-title!\\n[let*wa-n] \\$2 +.ev let@ev +.init@reset +'nf +.di let@wa-div +.it \\n[Letwam] let@wa-drain +.eo +.. +.\"------ +.de let@wa-drain +.it +.di +.di let@wa-junk +.. +.\"------ +.de WE +.it +.ec +.di +.ev +.if d let@wa-junk .rm let@wa-junk +.. +.\"------------------- +.\" Copy to +.de NS +.sp +.ie !''\\$2' .ds let*str \\$1 +.el \{\ +. ie \\n[.$]>0 \{\ +. ie !\w'\\$1' .ds let*str \\*[Letns!\\*[Letnsdef]] +. el \{\ +. ie d Letns!\\$1 .ds let*str \\*[Letns!\\$1] +. el .ds let*str \\*[Letns!copy](\\$1)\\*[Letns!to] +. \} +. \} +. el .ds let*str \\*[Letns!\\*[Letnsdef]] +.\} +.ne 2 +.nf +\\*[let*str] +.. +.de NE +.fi +.. +.\"------------------- +.\" Letter options +.de LO +.rm AF AS AE AT AU CS OK TL MT +.if ''\\$1' .@error "LO: missing option" +.if !d Let\\$1 .@error "LO: unknown option (\\$1)" +.ds let*lo-\\$1 \\$2 +.if \n[D]>1 .tm Letter option \\$1 \\$2 +.. +.\"-------------------- +.\" Start with a clean slate +.init@reset diff --git a/contrib/mm/mm.tmac b/contrib/mm/mm.tmac new file mode 100644 index 0000000..9ed09b7 --- /dev/null +++ b/contrib/mm/mm.tmac @@ -0,0 +1,3 @@ +.\" mm.tmac +.\" +.do mso m.tmac diff --git a/contrib/mm/mm/0.MT b/contrib/mm/mm/0.MT new file mode 100644 index 0000000..61f1a96 --- /dev/null +++ b/contrib/mm/mm/0.MT @@ -0,0 +1,146 @@ +.\"------------ +.\" $Id: 0.MT,v 2.0 2000/09/14 03:40:25 jhaegg Exp $ +.\" Cover sheet. Memorandum type 0-3 and "string". +.\"------------ +.if !r Au .nr Au 1 +.nr cov*mt0-ind 1.1c +.de cov@print-title +.MOVE 4.8c 1.5c +.S 8 +subject: +.sp -1.1 +.S +.PGFORM +.ft \\*[@sdf_font] +.ll 9c +.fi +.cov*title +.ft +.ll +.nf +.if d cov*title-charge-case \fBCharge Case \\*[cov*title-charge-case]\fP +.if d cov*title-file-case \fBFile Case \\*[cov*title-file-case]\fP +.fi +.. +.\"------------ +.de cov@print-authors +.MOVE 5.7c 13.3c +.nf +.S 8 +\\$1: +.br +.S +.sp -1 +.in 0.8c +.ft \\*[@sdf_font] +.nr cov*i 0 1 +.while \\n+[cov*i]<=\\n[cov*au] \{\ +. cov@print-au1 \\n[cov*i] 1 +. if \\n[Au] \{\ +. cov@print-au2 \\n[cov*i] 3 4 +. cov@print-au2 \\n[cov*i] 6 5 +. cov@print-au1 \\n[cov*i] 7 +. cov@print-au1 \\n[cov*i] 8 +. cov@print-au1 \\n[cov*i] 9 +. \} +. if \\n[cov*i]<\\n[cov*au] .SP 1 +.\} +.ft +.if r cov*mt-tm-max \{\ +. SP 1 +. nr cov*i 0 1 +. ft \\*[@sdf_font] +TM +. in 1.5c +. sp -1 +. while \\n+[cov*i]<\\n[cov*mt-tm-max] \\*[cov*mt-tm!\\n[cov*i]] +. in +. ft +.\} +.fi +.PGFORM +.. +.\"------------ +.\" index arg1 +.de cov@print-au1 +.if d cov*au!\\$1!\\$2 \\*[cov*au!\\$1!\\$2] +.. +.\"------------ +.de cov@print-au2 +.\" index arg1 arg2 +.if d cov*au!\\$1!\\$2 \\*[cov*au!\\$1!\\$2] \c +.if \\$3=5 .if d cov*au!\\$1!\\$3 x\c +.if d cov*au!\\$1!\\$3 \\*[cov*au!\\$1!\\$3]\c +.br +.. +.\"------------ +.de cov@print-date +.MOVE 4.8c 13.3c +.S 8 +.nf +\\$1: +.br +.S +.sp -1 +.in 0.8c +\f[\\*[@sdf_font]]\\*[cov*new-date]\fP +.br +.fi +.PGFORM +.. +.\"------------ +.de cov@print-firm +.if d cov*firm \{\ +. MOVE 2.8c 0 17.7c +. S 18 +. rj 1 +\fB\\*[cov*firm]\fP +. S +. PGFORM +.\} +.. +.\"------------ +.de cov@print-abstract +.SP 3 +.if d cov*abstract \{\ +. misc@ev-keep cov*ev +. if \\n[cov*abs-ind]>0 \{\ +. in +\\n[cov*abs-ind]u +. ll -\\n[cov*abs-ind]u +. \} +. ce +\fI\\$1\fP +. SP 1.5 +. fi +. cov*abstract +. br +. ev +.\} +.. +.\"----------------- +.ds cov*mt0-txt!1 MEMORANDUM FOR FILE +.ds cov*mt0-txt!2 PROGRAMMER'S NOTES +.ds cov*mt0-txt!3 ENGINEER'S NOTES +.if d cov*default-firm .if !d cov*firm .ds cov*firm \\*[cov*default-firm] +.\" +.if !d cov*mt-printed \{\ +. cov@print-firm +. cov@print-title subject +. cov@print-date date +. cov@print-authors from +. cov@print-abstract \\*[cov*abs-name] +. SP 3 +. if (\*[cov*mt-type]>=1)&(\*[cov*mt-type]<=3) \{\ +. ce +\fI\*[cov*mt0-txt!\*[cov*mt-type]]\fP +. SP 1.5 +. \} +. if \*[cov*mt-type]=6 \{\ +. ce +\fI\*[cov*mt-type-text]\fP +. SP 1.5 +. \} +. pg@enable-top-trap +. pg@enable-trap +. ds cov*mt-printed +.\} diff --git a/contrib/mm/mm/4.MT b/contrib/mm/mm/4.MT new file mode 100644 index 0000000..78c7766 --- /dev/null +++ b/contrib/mm/mm/4.MT @@ -0,0 +1,82 @@ +.\"------------ +.\" $Id: 4.MT,v 2.2 2003/04/02 04:06:40 jhaegg Exp $ +.\" Cover sheet. Memorandum type 4 +.\"------------ +.de cov@print-title +.if !d cov*title .@error title (.TL) not defined! +.MOVE 2.8c +.S +2 +.ad c +.fi +.B +.cov*title +.br +.S +.R +.ad b +.. +.\"------------ +.de cov@print-authors +.SP 0.5 +.I +.S +1 +.nr cov*i 0 1 +.while \\n+[cov*i]<=\\n[cov*au] \{\ +.ce +\\*[cov*au!\\n[cov*i]!1] +.br +.\} +.S +.R +.. +.\"------------ +.de cov@print-firm +.if d cov*firm \{\ +. SP 0.5 +. ce +\\*[cov*firm] +.\} +.. +.\"------------ +.de cov@print-abstract +.SP 2 +.if d cov*abstract \{\ +. misc@ev-keep cov*ev +. init@reset +. if \\n[cov*abs-ind]>0 \{\ +. in +\\n[cov*abs-ind]u +. ll -\\n[cov*abs-ind]u +. \} +. ce +\fI\\*[cov*abs-name]\fP +. SP 2 +. fi +. cov*abstract +. br +. ev +.\} +.. +.\"----------------- +.if d cov*default-firm .if !d cov*firm .ds cov*firm \\*[cov*default-firm] +.if !d cov*mt-printed \{\ +. cov@print-title +. cov@print-authors +. cov@print-firm +. if d cov*abstract \{\ +. if !\n[cov*abs-arg] .cov@print-abstract +. \} +. SP 2 +. nr hd*cur-bline \n[nl] +. ds cov*mt-printed +. pg@enable-top-trap +. pg@enable-trap +.\} +.de CS +.pg@disable-top-trap +.SK +.cov@print-title +.cov@print-authors +.cov@print-firm +.cov@print-abstract +.. + diff --git a/contrib/mm/mm/5.MT b/contrib/mm/mm/5.MT new file mode 100644 index 0000000..a274d23 --- /dev/null +++ b/contrib/mm/mm/5.MT @@ -0,0 +1,34 @@ +.\"------------ +.\" $Id: 5.MT,v 2.0 2000/09/14 03:40:25 jhaegg Exp $ +.\" Cover sheet. Memorandum type 5 +.\"------------ +.nr cov*mt0-ind 1.1c +.de cov@print-title +.B +.ll 9c +.fi +.cov*title +.R +.ll +.nf +.if d cov*title-charge-case \fBCharge Case \\*[cov*title-charge-case]\fP +.if d cov*title-file-case \fBFile Case \\*[cov*title-file-case]\fP +.fi +.. +.\"------------ +.de cov@print-date +.rj 1 +\f[\\*[@sdf_font]]\\*[cov*new-date]\fP +.br +.. +.\"------------ +.if !d cov*mt-printed \{\ +. SP 1.9c +. cov@print-title +. SP 1.2c +. cov@print-date +. SP 3 +. pg@enable-top-trap +. pg@enable-trap +. ds cov*mt-printed +.\} diff --git a/contrib/mm/mm/ms.cov b/contrib/mm/mm/ms.cov new file mode 100644 index 0000000..25d4579 --- /dev/null +++ b/contrib/mm/mm/ms.cov @@ -0,0 +1,84 @@ +.\"------------ +.\" $Id: ms.cov,v 2.0 2000/09/14 03:40:25 jhaegg Exp $ +.\" Cover sheet. Mostly like ms cover. +.\"------------ +.de cov@print-title +.in 0 +.misc@ev-keep cov*ev +.init@reset +.ad c +.hy 0 +.fi +.B +.cov*title +.br +.ad b +.R +.ev +.. +.\"------------ +.de cov@print-authors +.SP +.nr cov*i 0 1 +.while \\n+[cov*i]<=\\n[cov*au] \{\ +. ce +\fI\\*[cov*au!\\n[cov*i]!1]\fP +. nr cov*j 0 1 +. while \\n+[cov*j]<=9 \{\ +. if d cov*at!\\n[cov*i]!\\n[cov*j] \{\ +. if \w'\\*[cov*at!\\n[cov*i]!\\n[cov*j]]' \{\ +. ce +\s-1\\*[cov*at!\\n[cov*i]!\\n[cov*j]]\s0 +. .\} +. \} +. \} +.\} +.. +.\"------------ +.de cov@print-firm +.SP .5 +.ce +\\*[cov*firm] +.. +.\"------------ +.de cov@print-abstract +.SP 2 +.if d cov*abstract \{\ +. misc@ev-keep cov*ev +. init@reset +. if \\n[cov*abs-ind]>0 \{\ +. in +\\n[cov*abs-ind]u +. ll -\\n[cov*abs-ind]u +. \} +. ce +\fI\\$1\fP +. SP 1.5 +. fi +. cov*abstract +. br +. ev +.\} +.. +.\"------------ +.de cov@print-date +.SP 2 +\f[\\*[@sdf_font]]\\*[cov*new-date]\fP +.. +.\"----------------- +.de COVEND +.br +.if d cov*default-firm .if !d cov*firm .ds cov*firm \\*[cov*default-firm] +.sp |4.2c +.cov@print-title +.cov@print-authors +.cov@print-firm +.cov@print-abstract \\*[cov*abs-name] +.cov@print-date +.pg@enable-top-trap +.bp 1 +.pg@enable-trap +.if d cov*abs-arg .if \\n[cov*abs-arg] \{\ +. cov@print-abstract ABSTRACT +. SP 2 +.\} +.. diff --git a/contrib/mm/mm/se_ms.cov b/contrib/mm/mm/se_ms.cov new file mode 100644 index 0000000..2d16d48 --- /dev/null +++ b/contrib/mm/mm/se_ms.cov @@ -0,0 +1,3 @@ +.\" $Id: se_ms.cov,v 2.0 2000/09/14 03:40:25 jhaegg Exp $ +.mso mm/ms.cov +.nr cur*abstract-ll 11c diff --git a/contrib/mm/mmroff.man b/contrib/mm/mmroff.man new file mode 100644 index 0000000..f6da374 --- /dev/null +++ b/contrib/mm/mmroff.man @@ -0,0 +1,49 @@ +.\" +.\" $Id: mmroff.man,v 2.2 2001/12/09 12:15:09 wlemb Exp $ +.\" +.TH MMROFF @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +.SH NAME +mmroff \- reference preprocessor +.SH SYNOPSIS +.B mmroff +[ +.I -x +] +.I groff_arguments +.SH DESCRIPTION +\fBmmroff\fP is a simple preprocessor for \fBgroff\fP, it is +used for expanding references in \fBm@TMAC_M_PREFIX@m\fP, see +\fBgroff_mm(@MAN7EXT@)\fP. +\fBgroff\fP is executed twice, first with \fB-z\fP and \fB-rRef=1\fR +to collect all references and then to do the real processing +when the reference file is up to date. +.TP +\fB\-x\fR +Just create the reference file. This can be used to refresh +the reference file, it isn't always needed to have accurate +references and by using this option \fBgroff\fP will only +be run once. +.\".SH BUGS +.SH AUTHOR +Jörgen Hägg, Lund, Sweden . +.SH FILES +.TP +.B @MACRODIR@/tmac.@TMAC_M_PREFIX@m +.TP +.B @TMAC_MDIR@/*.cov +.TP +.B @TMAC_MDIR@/*.MT +.TP +.B @TMAC_MDIR@/locale +.SH "SEE ALSO" +.BR groff_mm(@MAN7EXT@), +.BR groff_mmse(@MAN7EXT@), +.BR groff (@MAN1EXT@), +.BR @g@troff (@MAN1EXT@), +.BR @g@tbl (@MAN1EXT@), +.BR @g@pic (@MAN1EXT@), +.BR @g@eqn (@MAN1EXT@) +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/mm/mmroff.pl b/contrib/mm/mmroff.pl new file mode 100644 index 0000000..f61daa1 --- /dev/null +++ b/contrib/mm/mmroff.pl @@ -0,0 +1,137 @@ +#! /usr/bin/perl + +use strict; +# runs groff in safe mode, that seems to be the default +# installation now. That means that I have to fix all nice +# features outside groff. Sigh. +# I do agree however that the previous way opened a whole bunch +# of security holes. + +my $no_exec; +# check for -x and remove it +if (grep(/^-x$/, @ARGV)) { + $no_exec++; + @ARGV = grep(!/^-x$/, @ARGV); +} + +# mmroff should always have -mm, but not twice +@ARGV = grep(!/^-mm$/, @ARGV); +my $check_macro = "groff -rRef=1 -z -mm @ARGV"; +my $run_macro = "groff -mm @ARGV"; + +my (%cur, $rfilename, $max_height, $imacro, $max_width, @out, @indi); +open(MACRO, "$check_macro 2>&1 |") || die "run $check_macro:$!"; +while() { + if (m#^\.\\" Rfilename: (\S+)#) { + # remove all directories just to be more secure + ($rfilename = $1) =~ s#.*/##; + next; + } + if (m#^\.\\" Imacro: (\S+)#) { + # remove all directories just to be more secure + ($imacro = $1) =~ s#.*/##; + next; + } + if (m#^\.\\" Index: (\S+)#) { + # remove all directories just to be more secure + my $f; + ($f = $1) =~ s#.*/##; + &print_index($f, \@indi, $imacro); + @indi = (); + $imacro = ''; + next; + } + my $x; + if (($x) = m#^\.\\" IND (.+)#) { + $x =~ s#\\##g; + my @x = split(/\t/, $x); + grep(s/\s+$//, @x); + push(@indi, join("\t", @x)); + next; + } + if (m#^\.\\" PIC id (\d+)#) { + %cur = ('id', $1); + next; + } + if (m#^\.\\" PIC file (\S+)#) { + &psbb($1); + &ps_calc($1); + next; + } + if (m#^\.\\" PIC (\w+)\s+(\S+)#) { + eval "\$cur{'$1'} = '$2'"; + next; + } + s#\\ \\ $##; + push(@out, $_); +} +close(MACRO); + + +if ($rfilename) { + push(@out, ".nr pict*max-height $max_height\n") if defined $max_height; + push(@out, ".nr pict*max-width $max_width\n") if defined $max_width; + + open(OUT, ">$rfilename") || "create $rfilename:$!"; + print OUT '.\" references', "\n"; + my $i; + for $i (@out) { + print OUT $i; + } + close(OUT); +} + +exit 0 if $no_exec; +exit system($run_macro); + +sub print_index { + my ($f, $ind, $macro) = @_; + + open(OUT, ">$f") || "create $f:$!"; + my $i; + for $i (sort @$ind) { + if ($macro) { + $i = '.'.$macro.' "'.join('" "', split(/\t/, $i)).'"'; + } + print OUT "$i\n"; + } + close(OUT); +} + +sub ps_calc { + my ($f) = @_; + + my $w = abs($cur{'llx'}-$cur{'urx'}); + my $h = abs($cur{'lly'}-$cur{'ury'}); + $max_width = $w if $w > $max_width; + $max_height = $h if $h > $max_height; + + my $id = $cur{'id'}; + push(@out, ".ds pict*file!$id $f\n"); + push(@out, ".ds pict*id!$f $id\n"); + push(@out, ".nr pict*llx!$id $cur{'llx'}\n"); + push(@out, ".nr pict*lly!$id $cur{'lly'}\n"); + push(@out, ".nr pict*urx!$id $cur{'urx'}\n"); + push(@out, ".nr pict*ury!$id $cur{'ury'}\n"); + push(@out, ".nr pict*w!$id $w\n"); + push(@out, ".nr pict*h!$id $h\n"); +} + + +sub psbb { + my ($f) = @_; + + unless (open(IN, $f)) { + print STDERR "Warning: Postscript file $f:$!"; + next; + } + while() { + if (/^%%BoundingBox:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) { + $cur{'llx'} = $1; + $cur{'lly'} = $2; + $cur{'urx'} = $3; + $cur{'ury'} = $4; + } + } + close(IN); +} diff --git a/contrib/mm/mmse.tmac b/contrib/mm/mmse.tmac new file mode 100644 index 0000000..8198666 --- /dev/null +++ b/contrib/mm/mmse.tmac @@ -0,0 +1,3 @@ +.\" mmse.tmac +.\" +.do mso mse.tmac diff --git a/contrib/mm/mse.tmac b/contrib/mm/mse.tmac new file mode 100644 index 0000000..6a73e3c --- /dev/null +++ b/contrib/mm/mse.tmac @@ -0,0 +1,184 @@ +.\" $Id: mse.tmac,v 2.1 2000/11/17 04:26:02 jhaegg Exp $ +.\" +.\" swedish version of mm +.\" See m.tmac for version-information. +.ds @language se +.mso m.tmac +.ISODATE +.\" +.ds App Bilaga +.ds Lf Figurer +.ds Lt Tabeller +.ds Lx Uppställningar +.ds Le Ekvationer +.\" Page length +.if !r L .nr @pl 28.5c +.\" page width +.if !r W .nr @ll 13c +.\" page offset +.if !r O .nr @po 3.5c +.\" set the above parameters +.ll \n[@ll]u +.po \n[@po]u +.pl \n[@pl]u +.ds Lifg Figur +.ds Litb Tabell +.ds Liex Uppställning +.ds Liec Ekvation +.ds Licon Innehållsförteckning +.ds Qrf Se kapitel \\*[Qrfh], sidan \\*[Qrfp]. +.ds Rp Referenser +.ds Letfc Vänliga hälsningar +.ds Letapp Godkänd av: +.ds Letdate datum +.ds Letconf KONFIDENTIELLT +.ds Letsal Till vederbörande: +.ds Letatt ATTENTION: +.ds Letsubj Innehåll: +.ds Letref Refererande till: +.\" +.ds Letns!copy Kopia \" space! +.ds Letns!to " till +.ds Letns!0 Kopia till +.ds Letns!1 Kopia (med att.) till +.ds Letns!2 Kopia (utan att.) till +.ds Letns!3 Att. +.ds Letns!4 Atts. +.ds Letns!5 Enc. +.ds Letns!6 Encs. +.ds Letns!7 Annat försättsblad +.ds Letns!8 Brev till +.ds Letns!9 Dokument till +.ds Letns!10 Kopia (med atts.) till +.ds Letns!11 Kopia (utan atts.) till +.ds Letns!12 Endast abstract till +.ds Letns!13 Hela dokumentet till +.ds Letns!14 CC: +.\" +.ds MO1 januari +.ds MO2 februari +.ds MO3 mars +.ds MO4 april +.ds MO5 maj +.ds MO6 juni +.ds MO7 juli +.ds MO8 augusti +.ds MO9 september +.ds MO10 oktober +.ds MO11 november +.ds MO12 december +.nr pg*footer-size 4\" 1v+footer+even/odd footer+1v +.\"------------------------------------------------ +.\" Dokumentnamn +.ds LetDNAMN +.\" Mottagarens datum +.ds LetMDAT Ert datum: +.\" Bilaga +.ds LetBIL Bilaga \" +.\" Kompletteringsuppgift +.ds LetKOMP +.\" Dokumentbeteckning eller dokumentnummer +.ds LetDBET +.\" Beteckning (ärendebeteckning i form av diarienummer e.d. +.ds LetBET Beteckning: +.\" Mottagarens beteckning. +.ds LetMBET Er beteckning: +.\" Antal sidor +.ds LetSIDOR +.\" Svensk standard med högerställd löptext. --------------------- +.de let@init_SVH +.in 4.57c +.ll 17.57c +.. +.de let@head_SVH +.rm let@header +.let@print_SV H +.. +.de let@sg_SVH +.. +.de let@fc_SVH +.. +.\" Svensk standard med vänsterställd löptext. --------------------- +.de let@init_SVV +.. +.de let@head_SVV +.rm let@header +.let@print_SV V +.. +.de let@sg_SVV +.. +.de let@fc_SVV +.. +.\"-------------------------------- +.de let@print_SV +.nf +.\" pos T0 ----------------------------------- +.in 0 +.sp |3 +.if d let@wa-div .let@wa-div +.\"----- addressat +.if '\\$1'V' .if d let@ia-div \{\ +. sp |10 +. let@ia-div +.\} +.\" pos T4 ----------------------------------- +.in 9.14c +.\"----- kompletteringsuppgift +.if d let*lo-KOMP \{\ +. sp |2 +\\*[let*lo-KOMP] +.\} +.\"----- dokumentnamn +.if d let*lo-DNAMN \{\ +. sp |3 +\\*[let*lo-DNAMN] +.\} +.\"----- datum +.if d cov*new-date \{\ +. sp |5 +Datum: +\\*[cov*new-date] +.\} +.\"----- mottagarens datum +.if d let*lo-MDAT \{\ +. sp |7 +\\*[LetMDAT] +\\*[let*lo-MDAT] +.\} +.\"----- addressat +.if '\\$1'H' .if d let@ia-div \{\ +. sp |10 +. let@ia-div +.\} +.\" pos T6 ----------------------------------- +.in 13.72c +.\"----- mottagarens beteck. +.if d let*lo-MBET \{\ +. sp |7 +\\*[LetMBET] +\\*[let*lo-MBET] +.\} +.\"----- dokumentbeteck. +.if d let*lo-BET \{\ +. sp |3 +\\*[LetBET] +\\*[let*lo-BET] +.\} +.\" pos T7 ----------------------------------- +.in 16c +.\"----- bilaga +.if d let*lo-BIL \{\ +. sp |2 +\\*[LetBIL]\\*[let*lo-BIL] +.\} +.\" +.\"----- sidnummer +.sp |3 +.ie d let*lo-SIDOR \\n[%] (\\*[let*lo-SIDOR]) +.el \\n[%] +.\" +.\" Ta hand om special +.if d TP .TP +.sp |17 +.. +.\" ----------------------------------- diff --git a/contrib/mom/BUGS b/contrib/mom/BUGS new file mode 100644 index 0000000..33765ba --- /dev/null +++ b/contrib/mom/BUGS @@ -0,0 +1,317 @@ +Assume that anything that doesn't work or behaves oddly is a bug. +The documentation should be taken as the authoritative source for +how things ought to be. + +Post to the groff mailing list with bug reports, questions and +suggestions, or contact me directly at: + + peter@faustus.dyn.ca + or + ptpi@golden.net + +If writing me directly, please include the word "groff" or "mom" in +the Subject line or you risk my spam filters nuking your message. +Also, please--no html email. That, too, gets nuked. + +--Peter Schaffter + +======================================================================== + +Version 1.3 +=========== + +Persistent error in html coding of docs ( tag). +---Fixed--- + +Version 1.2-f +============ + +Multiple line subheads near page bottom sometimes printing one line +of subhead at page bottom, and subsequent lines on next page. +---Fixed--- + +Post-quote spacing still wonky when paragraph spacing is turned on. +---Fixed--- (for good would be nice) + +RULE not always resetting quad and quad value. +---Fixed--- + +Version 1.2-e +============= + +Some string definitions in om.tmac had superfluous spaces after +them (e.g. $COVERTITLE). +---Fixed--- + +Spacing under quotes not correct when paragraph spacing is turned +on. +---Fixed--- + + +First word of last line before footnotes is getting chopped. +---Fixed--- + +Version 1.2-d +============= + +HEADER_FAMILY not changing header family. +---Fixed--- + +FAMILY, after COLLATE, not changing the family of all and every +page element or tag. +---Fixed--- + +Heads and subheads at the start of docs are printing one line lower +than they should. +---Fixed--- + +Gaps are appearing at the bottom of pages when there's a linebreak +followed by a subhead. +---Fixed--- + +When LS is invoked after a single text line at the top of a page +containing a T_MARGIN (set with T_MARGIN or PAGE), mom is performing +spacing adjustments as if the first line doesn't exist. +---Fixed--- + +Changes made to ALD and LS in version 1.2-c should not apply when +the document processing macros are used. There is a significant +conflict with the internal use of ALD when the docheader is only +one line long (as, for example, when DOCTYPE is CHAPTER). +---Fixed, pending discovery of further conflicts--- + +Version 1.2-c +============= + +Deferred footnotes not always being output, and groff complains +"ending diversion FN_OVERFLOW on exit." +---Fixed--- + +First .LS call after a top margin has been set (with .T_MARGIN +or .PAGE) causing mom to move off the top margin baseline. Also, +there are conflicts between ALD, LS and T_MARGIN. +---Fixed--- + +DROPCAP not properly restoring a running \*[COND] or \*[EXT] after +COND or EXT are given as arguments to DROPCAP. +---Fixed--- + +Version 1.2 +=========== + +.PAD not co-operating with mom's fontstyles, esp. when a full +family+fontstyle is given to .FT. +---Fixed--- + +.DROPCAP -- ditto the above. +---Fixed--- + +Version 1.1.9 +============= + +Footnote markers not resetting properly on new pages when COLUMNS +is enabled. +---Fixed--- + +When overflowed footnote material is the only footnote material on +the page or in the column, no footnotes are output. +---Fixed--- + +The AUTOLEAD used in FOOTNOTE not being disabled after FOOTNOTES +are output, or after PROCESS_FN_LEFTOVER/PROCESS_FN_IN_DIVER. +---Fixed--- + +COL_NEXT and COL_BREAK, when invoked during the last column on a +page, are overprinting the last column instead of breaking to a new +page when there are footnotes in the column. +---Fixed--- + +BR_AT_LINE_KERN not "break-and-spreading" text when used in +justified copy. +---Fixed--- + +Version 1.1.8 +============= + +BLOCKQUOTE_FAMILY not changing blockquote family. +---Fixed--- + +FOOTNOTE, whether in column mode or not, was using +#FN_COUNT_FOR_COLS for all footnote markers and handling. +---Fixed--- + +Deferred footnotes that occured on the second to last page of +documents not printing. +---Fixed--- + +Version 1.1.7-a +=============== + +Suite number in DOCTYPE LETTER not printing. +---Fixed--- + +Footer elements not always vertically aligning. +---Fixed--- + +Footer rule gap not always correctly observed. +---Fixed--- + +Page numbering, when at top of page, not always falling on +HDRFTR_MARGIN. +---Fixed--- + +Default page numbering style for COPYSTYLE draft is DIGIT instead +of roman. +---Fixed--- + +Hyphens around page numbering when style is DIGIT, ROMAN or ALPHA +not vertically centered. +---Fixed--- + +EXT arg not working with DROPCAP. +---Fixed--- + +DOC_QUAD not automatically set immediately after START +---Fixed-- + +Tabs behaving erratically during document processing. +---Fixed--- + +Version 1.1.7 +============= + +When DOCHEADER OFF is given, if falls short +of the top margin of running text, is not respected and +bottom margin falls low. +---Fixed--- + + +Version 1.1.6-e +=============== + +The " mark (doublequote), when entered while not in document +processing mode (i.e. just straightforward typesetting), outputs +nothing unless SMARTQUOTES is invoked explicitly. +---Fixed--- + +Version 1.1.6-c +=============== + +In document processing mode, docs that use *none* of the +docprocessing tags being ignored. +---Fixed--- + +Version 1.1.6-b +=============== + +String tabs not picking up #L_MARGIN when #L_MARGIN not explicitly +set with L_MARGIN, PAPER or PAGE. +---Fixed--- + +Infinite loop when B_MARGIN is set lower than FOOTER_MARGIN during +doc processing. +---Fixed--- + +Version 1.1.6-a +=============== + +Mom partially broken when run with groff 1.19.1. Don't know yet +what this is, whether bad coding in mom, or a problem with 1.19.1. +Only solution for now: run mom 1.1.6 with groff 1.18. +----Fixed--- + +Top margin of endnotes pages after the first endnotes page when +PRINTSTYLE is TYPEWRITE and endnotes single-spacing is turned on +falling one line too high. +---Fixed--- + +Version 1.1.6 +============= + +DOCHEADER OFF (distance) not being respected. +---Fixed--- + +FINIS killing ENDNOTES page numbering and heads. +---Fixed--- + +Version 1.1.5 +============= + +Draft and revision not appearing in page headers. +---Fixed--- + +\*[RULE] not working properly with indents and justified copy. +---Fixed--- + +Post-epigraph spacing in TYPEWRITE causing some first pages to run too +deep. +---Fixed--- + +Spacing of docheaders in TYPEWRITE not always consistent. +---Fixed--- + +Version 1.1.4 +============= + +Blockquotes that span pages running too deep. +---Fixed--- + +Version 1.1.3 +============= + +Footnotes not outputting on final page of document body when ENDNOTES +is invoked. +---Fixed--- + +Pad not working properly and/or spitting out warnings when fill mode is +on. +---Fixed--- + +Version 1.1.2 +============= + +PAGENUM_STYLE being ignored unless entered after START. +---Fixed--- + +Version 1.1 +=========== + +String tabs not working as advertised when set from within other tabs. +---Fixed--- + +.COLLATE sometimes depositing a header on the first page of a subsequent doc. +---Fixed with workaround BREAK_QUOTE--- + +.UNDERLINE_QUOTES in PRINTSTYLE TYPEWRITE not on by default as advertised. +---Fixed--- + +.TI not cooperating with other indent styles. +---Fixed--- + +.WS and .SS not cooperating. +---Fixed--- + +.RW and .EW not working. +---Fixed--- + +======================================================================== + +KNOWN PROBLEMS +-------------- + +The indent macros from the typesetting macro set may not always +perform well in conjunction with the document processing macros, +especially when documents are set in columns. Mostly, this is the +result of inadequate testing. There are only so many "who'd want to +do this anyway?" scenarios I can think of on my own. + +Epigraphs at the bottoms of page may sometimes run exactly one line +deeper than they should. The alternative (from my point of view) is +to have them run 1 line shorter than they should. The problem stems +from the fact the epigraphs are leaded differently than all other text, +and there's only so much adjusting that can be done with the whitespace +surrounding them to get them to bottom align. Since stylistically, +epigraphs should never appear at the bottom of a page/column without at +least some running text beneath them in order to make sense of the role +they play in page layout, this not likely to be fixed for some time. + diff --git a/contrib/mom/ChangeLog b/contrib/mom/ChangeLog new file mode 100644 index 0000000..ec27f8b --- /dev/null +++ b/contrib/mom/ChangeLog @@ -0,0 +1,812 @@ +*Thu Aug 11 2005 + +o Makefile.sub (HTMLDOCFILES): Add `refer.html' + +*Mon Jun 20 2005 + +o Makefile.sub (HTMLDOCFILES_, EXAMPLEFILES_, PROCESSEDEXAMPLEFILES_): New + variables. + (install_data): Install files in `mom' subdirectories. + Make it work actually. + (uninstall_sub): Updated. + +*Thu Jun 16 2005 + +o Makefile.sub (install_data, uninstall_sub): Use $(exampledir) for example +files. Reported by Keith Marshall. + +*Mon May 16 2005 + +o Update groff_mom.man. + +*Thu May 12 2005 + +o Added margin notes capability + +o Added mom-specific refer support; refer calls can be embedded in + running text, sent to footnotes or endnotes, or collected for + output on a bibliography page; also added mom-specific refer + control macros + +o Added bibliography page capability, with full suite of control + macros + +o Added referencing of footnotes and endnotes by line number + +o Added capability to have footnotes run on when footnotes are + being referenced by line number + +o Added a post footnote space option, in case users want a little + space between their footnotes + +o Added ENDNOTE_MARKER_STYLE, so user can choose between endnotes + identified by a numerical marker in the text, or by line number + +o Added control macros to accommodate differing needs for endnotes + identified by line number + +o Added ENDNOTE_TITLE_SPACE, so user can control starting position + of the endnotes page title + +o Extended LIST so that it accepts lowercase alpha, uppercase roman + numeral and lowercase roman numeral enumerators; also added a + "prefix" argument (which comes *after* the separator argument) + +o Changed RESET_LIST so that it can reset a list to any number, + letter, or roman numeral, instead of just 1, a, A, I and i + +o Change to handling of footnote/endnote markers in text; input + lines before FOOTNOTE still require \c, but input line after + FOOTNOTE OFF must be entered as a literal continuation of the + line before FOOTNOTE, including any required word space or + punctuation (this so users can get the footnote marker in text + either before or after the punctuation without hassle) + +o Added QUOTE_AUTOLEAD and BLOCKQUOTE_AUTOLEAD, so user can have + quotes and blockquotes leaded differently from running text + +o Reworked QUOTE and BLOCKQUOTE to accommodate _AUTOLEAD control; + spacing above and below quotes is equalized *on a per quote + basis* (not completely happy with this, but at least it gives + users some flexibility in designing (block)quotes) + +*Fri Mar 18 2005 + +o Added mom.vim to /examples + +*Thu Jan 20 2005 + +o Added \*[TB+] and \*[B] to give inline functionality of .TN and + .EL, respectively. + +o Added SECTION and SECTION_CHAR as aliases of LINEBREAK and + LINEBREAK_CHAR + +o Added a NOBREAK option to PAD, so when PAD is called, it's possible + to instruct mom not to advance on the page. + +*Wed Jan 19 2005 + +o New macro, ADD_SPACE, so that extra space can be added at the + top of a new page in document processing; the .ns call in HEADER + was making additional space impossible + +o Reworked handling of ALD/SPACE/SP and LS when they're used at + the tops of pages during pure (i.e. non-docprocessing) + typesetting. First lines were still wandering. Should also be + more intuitive: ALD after LS advances the specified distance from + the top baseline; LS after ALD doesn't change the position of the + first baseline (i.e. merely sets the lead for the text that + follows). + +*Tue Dec 14 2004 + +o Fixed a small problem with spacing under quotes when paragraph + spacing is turned on. + +*Fri Dec 10 2004 + +o Put all calls in VFP_CHECK inside their own environment. Without + the .ev call, the trap invoked VFP_CHECK was chopping off the + first word of the last line before footnotes. + +*Dec 6 2004 + +o Small fixes to elvis_syntax.new (dealing with strings, \{\ and \} + +o Changed + . ie \\n[#START] \{\ + . if \\n[#DOC_HEADER]=0 \{ . \} + . \} + in HEAD to + . ie \\n[#START] \{\ + . if \\n[#DOC_HEADER]=0 \{ .RLD 1v \} + . \} + so that HEADs at the start of docs with no docheaders falls on + the correct baseline. + +*Dec 3 2004 + +o Removed spurious parens from if ( \\n[#TRAP_DISTANCE] < \\n[#DOC_LEAD]*2 ) + in SUBHEAD. + +*Oct 14 2004 + +o Reworked the LL macro so that the argument can take a prepended + + or - sign (i.e. the argument is relative to the current line + length). + +*Oct 13 2004 + +o Added an .if \\n(.n=0 if to the ie clause in LS that controls how mom + responds to initial LS invocation at page top if T_MARGIN has + been set. Now, if there's text on the "top" baseline, LS behaves + as expected when invoked afterwards. + +*Oct 11 2004 + +o Added an ie !r#DOCS clause to the processing of "top baseline" + ALDs. ALD is used extensively (internally) in the document + processing macros, and does not need to check--indeed, should not + check--for top baseline placement prior to execution. + +*Sep 29 2004 + +o Additions to elvis_syntax.new + +*Sep 12 2004 + +o Small fixes to the documentation. + +*Aug 21 2004 + +o Removed superfluous second arguments from strings UP, DOWN, FWD + and BCK + +*Aug 8 2004 + +o Version changed from the 1.1.x series to 1.2. All of the + features I originally wanted mom to have originally have been + implemented, and appear to be stable. + +o Major overhaul to the setting of page traps and the handling of + footnotes, both "normal" footnotes and footnotes that occur + inside QUOTE, BLOCKQUOTE and EPIGRAPH. + +o Addtion of font "styles" to om.tmac, plus changes to the FAMILY + and FT macros to manage them. New section in the doc appendices + on adding fonts and managing the new font styles. + +o Mom now uses a "fallback font" whenever there's an illegal call + to FAMILY. + +o RW and EW now affect only the font in effect. A change of family + or font disables them. + +o BR_AT_LINE_KERN now properly does a .brp (spread and break) when + used in justified text. + +o NEWPAGE, which used to be an alias for .bp, has been moved into + its own macro, in order to make it more responsive to some unusal + situations. + +o Some changes to elvis_syn.new, including that the file extensions + recognized by elvis now include both .mom and .tmac. This makes + om.tmac much easier to read. + +*Jul 6 2004 + +o FT and FAM(ILY) reworked to take advantage of if S, if F and + \n[.sty] additions to groff (1.19.2). Warnings are emitted if a + style hasn't been registered, or if a font style doesn't exist in + the current family. Invalid .FAM(ILY) calls now use a "fallback" + font" (although no warning is issued); fallback is user-settable + +o New macro, FALLBACK_FONT. Not only controls the fallback font + for invalid family calls, but also controls whether mom aborts on + invalid .FT calls after issuing a warning. + +o RW/EW now affect only the current font (or font style) + +o BR_AT_LINE_KERN now (properly) does a break-and-spread when text + is justified. + +o Fairly extensive list of .sty's added to om.tmac. Hopefully, + this will make life easier for users wishing to add new fonts + and/or entire new families to their groff site-font/devps + directory. + +*Jun 6 2004 + +o Altered kerning slightly for footnote markers in text. Daggers + and double-daggers were getting a bit jammed + +*Fri Jun 4 2004 + +o Makefile.sub (HTMLDOCFILES, EXAMPLEFILES, PROCESSEDEXAMPLEFILES): Updated. + +*Thu Jun 3 2004 + +o Rewrote the routines dealing with _FAMILY, _FONT, _SIZE, _COLOR + and _QUAD. A single macro for each checks for the calling alias + (e.g. TITLE_FAMILY in _FAMILY), and performs the appropriate + action. + +o All "COLOUR" aliases of "COLOR", no matter where, have been + removed. + +o Added cover and doc cover page generation. + +o Added reference macros COVERTITLE, DOC_COVERTITLE, MISC and + COPYRIGHT (for use with covers only) + +o Fixed EL and TN so they don't spring page traps; in nofill modes + the preceding input line must be terminated by \c. + +o Added #T_MARGIN_LEAD_ADJ to DO_B_MARGIN, DO_T_MARGIN and NEWPAGE + to ensure accurate placement of first lines on new pages when + docprocessing is not taking place. + +o Made NEWPAGE it's own macro; formerly just an alias of .bp. + +o Made BREAKQUOTE obsolete; rewrote sections of footnote handling, + including adding support macros to deal with processing of + footnotes that were started inside quotes, blockquotes and + epigraphs. + +o Added a TERMINATE .em to docprocessing (except letters) to ensure + that deferred footnotes print on the last page of a doc. + + +*Mar 15 2004 + +o Added color support + +o Adjusted vertical placement of hyphens around page numbering + so that they are better centered on the height of the page + number. + +o Re-wrote portions of the document processing macros so that tabs + behave in a consistent and intuitive manner. Tab structures are + now properly preserved from page to page and column to column. + +*Feb 20 2004 + +o Rewrote the macros associated with DOCTYPE LETTER so that the + user can enter DATE, TO and FROM in any order s/he likes. For + backward compatibility, if the older, fixed order (DATE-TO-FROM) + is used, the date goes flush right with two linespaces after + it, while the other fields go flush left with a single linespace + separating them. + +o Fixed handling of DOCHEADER OFF when fell + short of the top margin of running text (the change is actually + in the SHIM macro, which is called by DOCHEADER). + +o Added a selection of iso 639 two-letter language codes as + optional arguments to SMARTQUOTES, so that the use can enter + her/his language code to get language specific quoting styles + +o Changed the way the strings for \*[ST], \*[STX], \*[FU] + and \*[BU] are read. Formerly, they were entered literally. + Now they're entered as an array. + +*Jan 24 2004 + +o Added lists and associated macros. Mom now does (nested) lists. + +o Added German-style lowered double quotes and two styles of + guillemets to SMARTQUOTES. + +o Added macro SIZE, intended to be called inline as \*[SIZE ]. + This is to bring mom's inline size change syntax into line with + her other inlines. + +o Added ESC_CHAR as an alias of .ec + +o Added doc entries for lists. + +o Updated SMARTQUOTES entry in docs. + +o Updated reserved words in docs. + +o Fixed a few more typos in docs. + +*Tue Oct 21 2003 + +o Changed \n[#DRAFT] and \n[#REVISION] to strings \*[$DRAFT] and + \*[$REVISION], allowing for the possibility of blank entries that + don't mess up headers/footers with zeros if user doesn't want any + numbers. + +o Extended handling of draft and revision numbers and strings in + headers/footers for increased flexibility. It's possible now to + have just about any combo of DRAFT_STRING, DRAFT, REVISION_STRING + and REVISION, and have them come out in headers/footers as one + intuitively expects/wants. + +*Fri Jul 25 2003 + +o Added a .bp after .if \\n[#START]=1 in FOOTER. Without it, + in document processing mode, documents that use *none* of the + docprocessing tags (yes, there are times when users want to do + this) ignored the footer trap. + +*Fri Jun 6 2003 + +o Changed register #DOCHEADER_LEAD_ADJ to string + +*Wed May 21 2003 + +o DOC_TITLE changed to be used exclusively with DOCTYPE DEFAULT + +o Fixed problem with restoration of previous doc pagenum + style when endnotes use a different pagenum style (set with + ENDNOTES_PAGENUM_STYLE) + +o Fixed handling of headers/footers with respect to endnotes. Now, + when either headers or footers are on, mom picks up the correct + page header/footer on the last page prior to ENDNOTES, gets the + pageheaders correct for endnotes pages *including the last one*, + and picks up correct page headers/footers for the subsequent docs + after COLLATE + +*Sat May 17 2003 + +o Added TOC (finally) and a nearly complete set of associated + control macros + +o Added new control macros to endnotes: + + ENDNOTES_STRING_CAPS - capitalize the endnotes string + ENDNOTES_NO_COLUMNS - allows docs in columns and endnotes not + ENDNOTES_PAGENUM_STYLE - set page numbering style for endnotes + ENDNOTES_FIRST_PAGENUMBER - set first pagenumber for endnotes + ENDNOTES_ALLOWS_HEADERS - page headers on endnotes pages off or on + ENDNOTES_NO_FIRST_PAGENUM - allows non-printing first page number when page footers are being used instead of headers + ENDNOTES_SINGLE_SPACE - for TYPEWRITE, if doc double-spaced + SUSPEND/RESTORE_PAGINATION - turns page numbering off for endnotes + +o Added an ADJUST option to ENDNOTE_LEAD + +o Added DOC_TITLE (like TITLE, but sets document-wide title for collated docs) + +o Added HDRFTR_CENTER_PAD, to allow adjustments to placement of + HDRFTR_CENTER_STRING + +o Added BLANKPAGE macro, to output blank pages (silently numbered) + +o Extensive changes to DEFAULTS, START, COLLATE, HEAD, SUBHEAD and + PARAHEAD because of new TOC and extended flexibility of ENDNOTES + page design + +o Fixed DOCHEADER OFF (distance), FINIS + +----------------------------------------------------------------------- + +*Sat Feb 22 2003 + +o (Re)-fixed handling of post epigraph spacing after #START for + TYPEWRITE double-spaced. + +------------------------------------------------------------------------ + +*Sun Feb 16 2003 + +o Added James Ramsey's proposed CHAPTER_TITLE macro, along with his + rewritten START macro and his utility macros to make START easier + to read. + +o Expanded handling of CHAPTER_TITLE to encompass TYPEWRITE, as well as + plugging it into the docheaders. Made CHAPTER_TITLE backwardly + compatible so that pre-1.1.5 docs using CHAPTER_STRING to create a + chapter title remain unaffected when groffed with 1.1.5. + +o Created control macros for CHAPTER_TITLE FAMILY, FONT and SIZE. + Added defaults for handling of CHAPTER title to DEFAULTS. Documented + CHAPTER_TITLE and everything that goes along with it. + +o Fixed broken draft and revision in headers/footers. + +o Fixed \*[RULE] so that it behaves properly with indents and justified + copy. + +o Fixed/tweaked handling of epigraph spacing in TYPEWRITE. + +o Fixed broken spacing of docheaders in TYPEWRITE. + +*Mon Feb 3 2003 + +o Fixed an oversight in CLOSING for DOCTYPE LETTER (closing wasn't + being set flush left) + +*Sun Sep 29 2002 + +o Changed .ne in .HEAD when PRINTSTYLE TYPESET from 5 to 4. With 5, + heads required at least 2 lines of text underneath or they'd be + defered to the next page, which created too much whitespace at the + end of the page. Heads will now be processed on the same page if the + head plus at least one line of text underneath fits. I figure it's + easier for the user to break to a new page manually if this behaviour + is unsatisfactory than to massage the page to fix the excess + whitespace. + +*Sun Aug 25 2002 + +o Changed .IX to .IQ. The older form still works, but emits a message + advising the user to update to the newer. (The macro in om.tmac + still remains IX; IQ is an alias.) Docs updated to reflect the + change. + +*Tue Aug 20 2002 + +o Added new (better) way to handle inline kerning. \*[BU #] and + \*[FU #] allow passing an argument to the inline string. The older + forms \*[BU#] and \*[FU#] still work, though. + +o Changed handling of inline horizontal and vertical movements. + Horizontal movements are now done with \*[BCK #] and + \*[FWD #]; verticals with \*[UP #] and \*[DOWN #]. + The older forms \*[FP#] and \*[BP#] still work (horizontals), as do + \*[ALD#] and \*[RLD#] (verticals). + +------------------------------------------------------------------------ + +*Mon Aug 19 2002 + +o Fixed ENDNOTES so footnotes output properly when ENDNOTES is called + +o Added ENDNOTES_HDRFTR_CENTER so that default no-print of header + center string on endnotes page(s) when DOCTYPE is CHAPTER can + be disabled (i.e. header center will be printed). + +*Sat Aug 10 2002 + +o Added .nf to top of PAD, with a test beforehand for current fill + mode. If fill mode was on, it's restored after PAD completes + processing. Updated reserved.html to include number register + #FILL_MODE. + +*Fri Jul 12 2002 + +o More fixes to underlining. + +*Fri Jul 5 2002 + +o Added capability of endnotes and pertinent control macros to om.tmac. + +o Added document entries pertaining to endnote macros. + +o Incorporated endnote macros into elvis_syntax. + +o Small doc fixes. + +o Tidied up indenting of om.tmac. + +o Fixed handling of underlining of italics in PRINTSTYLE TYPEWRITE + (there was a problem with footnotes getting underlined when they + shouldn't have been). + +o Removed ENDNOTES from TODO + +o Fixed the character translations for UNDERLINE so they work properly + with digraphs. + +*Mon Jul 1 2002 + +o Expanded docprocessing.html entry "Special Note on Chapters". Tidied + up html a bit. + +*Sat Jun 15 2002 + +o Small fix to PAD to make the use of inlines within the pad string + more intuitive. + +o Added \*[RULE] ( = \l'\n(.lu' ) so that full measure rules (either to + full line length or within tabs) are easier to set. + +*Sat Jun 8 2002 + +o Macro .PS renamed to .PT_SIZE. Alias .TS removed. + +o .tr bits in .CAPS rewritten in the form .tr é\[`E]. + +o General cleanup of docs to reflect changes + +o Small changes/additions to elvis_syn + +*Thu Jun 6 2002 + +o In DOCTYPE, in .if '\\$1'LETTER', added .FOOTER_RIGHT_SIZE +0. + Without it, the suite page was printing at the default + FOOTER_RIGHT_SIZE of -.5, which didn't look good. + +*Wed Jun 5 2002 + +o Makefile.sub (TFLAG): Add `$(top_builddir)/tmac'. + +*Tue Jun 4 2002 + +o Makefile.sub (groff_bin_dirs): Fix typo (forgotten `src' element). + +*Mon Jun 3 2002 + +o Makefile.sub (uninstall_sub): Don't use `momdocdir' but `htmldocdir'. + Add missing backslash. + +*Sat Jun 1 2002 + +o Makefile.in (prepare_make_examples): Test for `penguin.ps', not + `examples/penguin.ps'. + +*Wed May 29 2002 + +o Rewrote portions of PAGENUM_STYLE and COPYSTYLE so that PAGENUM_STYLE + behaves as advertised. + +*Fri May 24 2002 + +o /Makefile.sub (momdocdir): Removed. + (HTMLDOCFILES): Prepend `momdoc/'. + (EXTRAEXAMPLEFILES): Removed. Added entries to... + (EXAMPLEFILES): This. + (.SUFFIXES, .mom.ps): New. + (prepare_make_examples): Updated. + (examples/*.ps): Removed; .mom.ps will handle this. + (install_data): Updated. + +*Thu May 23 2002 + +o Applied two small bug fixes to om.tmac (patches 1.1.1a and 1.1.1b). + +o mom is now part of groff. + +o Some renaming to avoid problems with 8+3 filesystems: + + examples/docprocessing_typeset.mom -> examples/typeset.mom + examples/docprocessing_typewrite.mom -> examples/typewrite.mom + examples/typesetting_macros.mom -> examples/macros.mom + examples/penguin_small2_bw.ps -> examples/penguin.ps + +o Removed `INSTALL' and `README' since groff takes care of installation + now. + +o Added Makefile.sub. + +o Added mom.tmac (which simply calls om.tmac). + +o Added groff_mom.man for orthogonality; it simply points to the HTML + documentation. + +*Thu May 16 2002 + +o Added macro DRAFT_WITH_PAGENUMBER so user can have draft/revision + info attached to the pagenumber in COPYSTYLE DRAFT, instead of having + it HEADER center. Always having it HEADER center was creating problems + with long doc titles, esp. with PRINTSTYLE TYPEWRITE (which is when + COPYSTYLE DRAFT is most likely to be used). Now user has the choice, + in these circumstances, either to reduce HEADER_SIZE, or to displace + the draft/revision info. Also rewrote portions of COPYSTYLE so that + if no revision number is given in the reference macros, "Rev. #" + doesn't appear when COPYSTYLE DRAFT. + +*Fri May 10 2002 + +o Added capability of user-defined, single string recto/verso + headers/footers. + +o Added new entries to docs about the above. Made some additional + small changes to toc.html, rectoverso.html, and headfootpage.html + to supplement the new entries. + +o Small fix to handling of footer separator rule -- was 1 point too low + owing to fuzziness of #CAP_HEIGHT as returned by SIZESPECS. + +o Added some more useful stuff to elvis_syntax. + +*Sun May 05 2002 + +o Fix to DEFAULTS so that L_MARGIN and R_MARGIN are reprocessed if + DOCTYPE LETTER. R_MARGIN, as set by DOCTYPE LETTER had no preceding + PAGEWIDTH or PAPER from which to get #PAGE_WIDTH for figuring out + line length. + +o Additional fix to DEFAULTS in handling DOCTYPE LETTER so that if user + sets line length prior to START, no reprocessing of R_MARGIN occurs. + This necessitated adding a new number register: #USER_SET_L_LENGTH + +*Sat May 04 23:48:05 EDT 2002 + +o Added .cflags 4 /\(en -- was driving me nuts that lines wouldn't + break after these characters; I'm assuming others feel the same way + +* Fri May 03 2002 + +o Made some small fixes to space handling around quotes, mostly to do + with quotes immediately after START and quotes after (sub)heads. + +* Wed May 01 2002 + +o Fixed a small bug that was causing the first .PP after START to begin + at the top margin of the page regardless of any type that preceded + .PP when docheaders were off. + +o Fixed HEADER so that when HEADERS are off the first line of type on + pages after the first falls properly at the top margin + +*Sat Apr 27 2002 + +o Renamed docprocessing_macros.mom in /examples to + docprocessing_typeset.mom. Added docprocessing_typewrite.mom, as + well as a README file. + +o Fixed UNDERLINE_QUOTES (for PRINTSTYLE TYPEWRITE) so they really are + on by default as the docs say. + +o Changes to doc entry on COLLATE: + + - removed bit about using COLLATE after a cover page (I wrote the + entry *before* I wrote the macro!). Cover pages should be + followed by NEWPAGE, not COLLATE. + + - added caution about mixing PRINTSTYLEs + + - added caution about using DOC_FAMILY to change family of all + document elements after COLLATE + +o Made HEADER_SIZE (and, by extension, FOOTER_SIZE) available to + PRINTSTYLE TYPEWRITE. Changed appropriate doc entries to reflect + this. + +*Wed Apr 24 2002 + +o Small change to DO_QUOTE to correct a problem with quotes and + blockquotes that fall in the middle of paragraphs (i.e. text after + the quote is not a new para). Basically, added a bit that stores the + current para indent, sets para indent to 0, invokes a PP, then + restores the original para indent. + +o Added new macro, BREAK_QUOTE, to deal with the problem of + footnotes in quotes and blockquotes that cross pages or columns. + + Quotes and blockquotes are read into diversions, which means they + get their footnote information from the page/column on which they + were started. If a footnoted quote crosses a page/column, what + sometimes happens is that the footnote itself is output at the + bottom of page/column where the quote started, whereas the text + marker for the footnote appears on the next page/column where the + quote ends. Furthermore, the text marker is the one appropriate + to the previous page. BREAK_QUOTE is a workaround. + +o Added directory /examples to archive. + +o Added typesetting_macros.mom, docprocessing_macros.mom, elvis_syntax + and penguin_small2_bw.ps to /examples. + +o Added BREAK_QUOTE to docs, made some additions to reserved words + list, and corrected a few little doc errors. + +*Mon Apr 22 2002 + +o Added default .L_MARGIN 1i and .R_MARGIN 1i to PAPER, PAGE, and + PAGEWIDTH. L_MARGIN is essential otherwise left indents and tabs + don't have a register #L_MARGIN to work with. The default right + margin is a convenience only. Updated the doc entries for L_MARGIN + and R_MARGIN to reflect the change. + +*Sun Apr 21 2002 + +o Changes to COLLATE: + + - added some "resets" (LL, LS, QUAD) + - added a check for whether pagination is at page top (either + because FOOTERS are on or because PAGENUM_POS was user set). + If pagination is on, and PAGENUM_POS is TOP, it's turned off + for next page (start of next collated document) and restored + for subsequent pages unless PAGENUM_ON_FIRST_PAGE is on, in + which case the page number appears at page top. + +o The macro TRAPS is always invoked at the end of DEFAULTS (which is + called by START). Formerly, TRAPS was only invoked at the start + of a doc, not after COLLATE. Now runs after COLLATE as well. + +o Distance from $DOC_TYPE in DOCTYPE NAMED "" to start of + running text was one linespace too deep. Fixed (in START). + +o When 1st arg to PAGENUM_POS was user set to TOP, running text was + printing 1 linespace too high, even when PAGINATION was OFF. Same + problem when HEADERS were OFF (i.e. nothing in the header margin at + all). Fixed by removing -\\n[#DOC_LEAD]u from all .sp |\\n[#T_MARGIN]u + calls of .el portion after .ie \\n[#HEADERS_ON]. + +o Added new macro: PAGENUM_ON_FIRST_PAGE. Normally, when FOOTERS are + being used instead of HEADERS, mom doesn't print the page number at + the top of the first page of a doc, or the first page of collated + docs. New macro allows user to get mom to put the page number on + "first" pages if that's desired. Updated docs to include the macro. + +o More little fixes to docs. + +*Thu Apr 18 2002 + +o Fixed TI (temporary indent) so that it continues to work as expected, + even when called while another type of indent is in effect. + +*Tue Apr 16 2002 + +o String tabs weren't working as advertised when set from within + a tab. Fixed. Two new registers added: #ST_OFFSET and #IN_TAB. + String tabs now behave poperly and intuitively when set within tabs. + +o Added a note to docs about surrounding \w'...' escape with double- + quotes when it's used as an argument to macros + +o Added a note to docs that SILENT does not deposit a .br + +*Mon Apr 15 2002 + +o Added new macro BR_AT_LINE_KERN if user wants mom to deposit .br's + before .RW and/or .EW. + +o Added 1/4 points to inline escapes \*[ALD] and \*[RLD]. + +o Added 1/4 points to inline escapes \*[FP] and \*[BP] + +o Updated docs to reflect the above changes. + +*Fri Apr 12 2002 + +o Fixed .RW and .EW which weren't working because of a missing \ in + \\n(.f register. Also made it so that .RW and .EW affect all fonts + in positions 1, 2, 3, and 4 at once, hence line kerning now affects + all fonts that appear after it, not just the font that was current at + the time of the macros' invocation. + +o .SS and .WS now working properly. .WS no longer has any effect on + .SS, which remains constant regardless of .WS. Furthermore, .SS no + longer gets its value by adding \*[$SS_VAR] + \n[.ss]. Instead, + it remains constant. Don't know what I was thinking when I wrote + the routine in the first place. + +o Updated and rewrote doc entry pertaining to SS + +*Wed Apr 10 2002 + +o Renamed tmac.om to om.tmac to bring macro file's name into line + with current groff policy + +o Added more standard paper sizes to PAPER. + +o Fixed T_MARGIN, LS, and AUTOLEAD so that if T_MARGIN is set before LS + or AUTOLEAD at the top of a file, the first line of type falls + properly on the baseline set by T_MARGIN. Previously, LS and + AUTOLEAD automatically advanced by the value passed to them before + setting the first line of type, meaning that the first line of type + fell at T_MARGINu+1v instead of T_MARGIN. + +o Updated docs to reflect changes. + +o Removed #TEST_FOR_NUMERIC from list of reserved words. + +o Added "t" and #T_MARGIN_SET to list of reserved words. + +*Sat Apr 6 2002 + +o Added FACTOR arg to AUTOLEAD, so if user wants autolead to be a factor + of point size, instead of being the sum of pointsize + autolead, s/he + has the choice. Incorporated appropriate changes to PS and LS. + +o Added new register #AUTOLEAD_FACTOR to reserved words. Modified + comments for AUTOLEAD, PS, and LS to reflect changes. Also + corrected an error where #AUTOLEAD_VALUE had mistakenly been written + $AUTOLEAD_VALUE in comments in the macro file, and removed erroneous + | . Updated AUTOLEAD entry in momdoc/typesetting.html + to reflect the changes. + +*Wed Apr 3 2002 + +o Cleaned up html errors in the docs. + +o Added "Next," "Prev" and "Top" links to top and bottom of doc files. + +o Fixed some typos in the docs. diff --git a/contrib/mom/Makefile.sub b/contrib/mom/Makefile.sub new file mode 100644 index 0000000..b71ccda --- /dev/null +++ b/contrib/mom/Makefile.sub @@ -0,0 +1,138 @@ +# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# Written by Werner Lemberg (wl@gnu.org) +# +# This file is part of groff. +# +# groff is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2, or (at your option) any later +# version. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +# These may be overridden if cross-compiling. +GROFFBIN=$(top_builddir)/src/roff/groff/groff +GROFF_BIN_PATH=`echo $(groff_bin_dirs) | sed -e 's| *|$(SH_SEP)|g'` + +groff_bin_dirs=\ + $(top_builddir)/src/roff/groff \ + $(top_builddir)/src/roff/troff \ + $(top_builddir)/src/devices/grops + +FFLAG=-F$(top_builddir)/font -F$(top_srcdir)/font +TFLAG=-M$(top_builddir)/tmac -M$(top_srcdir)/tmac -M$(srcdir) + +GROFF=GROFF_COMMAND_PREFIX=''; \ + export GROFF_COMMAND_PREFIX; \ + GROFF_BIN_PATH=$(GROFF_BIN_PATH); \ + export GROFF_BIN_PATH; \ + $(GROFFBIN) $(FFLAG) $(TFLAG) + +MAN7=\ + groff_mom.n + +NORMALFILES=\ + mom.tmac \ + om.tmac + +HTMLDOCFILES=\ + momdoc/appendices.html \ + momdoc/color.html \ + momdoc/cover.html \ + momdoc/definitions.html \ + momdoc/docelement.html \ + momdoc/docprocessing.html \ + momdoc/goodies.html \ + momdoc/headfootpage.html \ + momdoc/inlines.html \ + momdoc/intro.html \ + momdoc/letters.html \ + momdoc/macrolist.html \ + momdoc/rectoverso.html \ + momdoc/refer.html \ + momdoc/reserved.html \ + momdoc/toc.html \ + momdoc/typemacdoc.html \ + momdoc/typesetting.html \ + momdoc/using.html + +EXAMPLEFILES=\ + examples/letter.mom \ + examples/sample_docs.mom \ + examples/typesetting.mom \ + examples/README.txt \ + examples/elvis_syntax \ + examples/elvis_syntax.new \ + examples/penguin.ps + +PROCESSEDEXAMPLEFILES=\ + examples/letter.ps \ + examples/sample_docs.ps \ + examples/typesetting.ps + +HTMLDOCFILES_=`echo $(HTMLDOCFILES) | sed 's|momdoc/||g'` +EXAMPLEFILES_=`echo $(EXAMPLEFILES) | sed 's|examples/||g'` +PROCESSEDEXAMPLEFILES_=`echo $(PROCESSEDEXAMPLEFILES) | sed 's|examples/||g'` + +CLEANADD=\ + penguin.ps \ + $(PROCESSEDEXAMPLEFILES) \ + examples/stamp + +.SUFFIXES: .mom .ps +.mom.ps: + $(GROFF) -Tps -mom $< >$@ + + +all: $(PROCESSEDEXAMPLEFILES) + +$(PROCESSEDEXAMPLEFILES): penguin.ps examples/stamp + +penguin.ps: + cp $(srcdir)/examples/penguin.ps . + +examples/stamp: + test -d examples || $(mkinstalldirs) examples + touch $@ + +install_data: $(NORMALFILES) $(HTMLDOCFILES) \ + $(EXAMPLEFILES) $(PROCESSEDEXAMPLEFILES) + -test -d $(tmacdir) || $(mkinstalldirs) $(tmacdir) + for f in $(NORMALFILES); do \ + rm -f $(tmacdir)/$$f; \ + $(INSTALL_DATA) $(srcdir)/$$f $(tmacdir)/$$f; \ + done + -test -d $(htmldocdir)/mom || $(mkinstalldirs) $(htmldocdir)/mom + for f in $(HTMLDOCFILES_); do \ + rm -f $(htmldocdir)/mom/$$f; \ + $(INSTALL_DATA) $(srcdir)/momdoc/$$f $(htmldocdir)/mom/$$f; \ + done + -test -d $(exampledir)/mom || $(mkinstalldirs) $(exampledir)/mom + for f in $(EXAMPLEFILES_); do \ + rm -f $(exampledir)/mom/$$f; \ + $(INSTALL_DATA) $(srcdir)/examples/$$f $(exampledir)/mom/$$f; \ + done + for f in $(PROCESSEDEXAMPLEFILES_); do \ + rm -f $(exampledir)/mom/$$f; \ + $(INSTALL_DATA) examples/$$f $(exampledir)/mom/$$f; \ + done + +uninstall_sub: + -for f in $(NORMALFILES); do \ + rm -f $(tmacdir)/$$f; \ + done + -for f in $(HTMLDOCFILES_); do \ + rm -f $(htmldocdir)/mom/$$f; \ + done + -rmdir $(htmldocdir)/mom + -for f in $(EXAMPLEFILES_) $(PROCESSEDEXAMPLEFILES_); do \ + rm -f $(exampledir)/mom/$$f; \ + done + -rmdir $(exampledir)/mom diff --git a/contrib/mom/NEWS b/contrib/mom/NEWS new file mode 100644 index 0000000..2433eb0 --- /dev/null +++ b/contrib/mom/NEWS @@ -0,0 +1,446 @@ +Release 1.3 +----------- + +Added line numbering capabilities, with controls. + +Footnotes and endnotes can now be referenced by line number. + +Added ability to adjust vertical position of the title that appears +on the first endnotes page. + +Footnotes can run on when being referenced by line number. + +Footnotes now have a post-footnote spacing option, for adding +a little space between footnotes. + +Extended LIST so it accepts alpha, ROMAN and roman enumerators. + +Added margin notes capability. + +Added refer support. + +Added bibliography page support. + +Added QUOTE_AUTOLEAD and BLOCKQUOTE_AUTOLEAD, so user can have +quotes and blockquotes leaded differently from running text. + +Change: the input line immediately after FOOTNOTE OFF must be +entered as a literal continuation of the line prior to FOOTNOTE, +including any initial spaces or punctuation marks. This allows +for hassle-free placing of footnote markers in running text either +before or after punctuation marks. + +Release 1.2-f +------------- + +Added ADD_SPACE, to permit users to insert space at the top of +running text (after the first page) when using the docprocessing +macros. + +Releases 1.2-a and 1.2-b +------------------------ + +My personal email address has changed. 1.2-a and -b have been +updated to reflect that. Additionally, I made some small changes +to the documentation. + +Release 1.2 +----------- + +As of 1.2, the recommended version of groff to use with mom has +been bumped up from groff, 1.18 to groff, 1.19.2. Although mom will +continue to work with groff, 1.18, her handling of .FAM(ILY) and .FT +is now slightly different, therefore users of groff 1.18 may have to +update documents created with mom so that every .FAM(ILY) request is +followed by a .FT request before any text is input, otherwise mom +will set the text after .FAM(ILY) in Courier (until she encounters a +.FT request). People running groff, >= 1.19.2 don't have to worry +about this, but I recommend that, regardless of which version you're +running, you have a look at the document entries for FAMILY and FT +in order to see how mom will be handling .FAMILY and .FT from now +on. + +When used with groff >=1.19.2, mom now emits warnings if a style +hasn't been registered, or if a font style doesn't exist in the +current family. Invalid .FAM(ILY) calls now use a "fallback" font" +(although no warning is issued). The fallback is user-settable. + +Mom's macro file, om.tmac, now sets up a fairly extensive list of +font "styles," thus expanding the range of arguments that can be +passed to .FT (formerly, just R, I, B and BI, unless users had +already rolled their own solution to the problem of extensive type +families containing fonts like condensed, demibold, black, light, etc). +Users are advised to read the documentation sections on FAM(ILY), +FT and FALLBACK_FONT, as well as the new appendix section, "Adding +PostScript fonts to groff", for information on using mom's style +extensions (and how to disable them, should they conflict with a +user's present groff site-font/devps setup). + +A new macro, FALLBACK_FONT, has been added. It controls not only +the fallback font for invalid .FAMILY calls, but also whether mom +aborts on invalid .FT calls after issuing a warning, or continues +processing using the fallback. + +Release 1.1.9 +------------- + +Added the (optional) generation of cover pages and document cover +pages, plus a full suite of control macros for all cover page +elements. + +Added new reference macros that apply to covers: COVERTITLE, +DOC_COVERTITLE, COPYRIGHT and MISC. + +The need for TRAP OFF/TRAP to deal with ELs and TNs that fall at +the bottom page has been obsoleted. However, both EL and TN, when +invoked in any "nofill" mode (LEFT, RIGHT, CENTER, or the L | R | C +arguments to TAB_SET or ST when no QUAD argument is given), must now +have the input line preceding the EL or TN terminated by \c. Fill +modes do not have this requirement, i.e. no \c is required. + +Footnotes that occur inside quotes, blockquotes and epigraphs now +work just like regular footnotes, with no user intervention +required. This obsoletes the macro BREAK_QUOTE. + +Removed all aliases that used the word COLOUR. Users must use +COLOR wherever COLOR is needed. COLOUR, as a replacement/alias, is +no longer supported. + +NEWPAGE, which used to be an alias of .bp, is now its own macro. + +Release 1.1.8 +------------- + +Added text color support. Users can now define or initialize a color, +and afterwards change text color with an inline of the form +\*[], or with the macro .COLOR. In document processing, +the docelement tag control macros have been expanded to include +_COLOR, e.g. .HEAD_COLOR will colorize +heads, PAGENUM_COLOR ]. +This brings mom's inline size change syntax into line with her other +inlines. \*S[] can still be used for the same thing. + +The file elvis_syntax (for elvis prior to 2.2h) is no longer being +maintained. It was getting messy and long in the tooth. The +official elvis syntax file is elvis_syntax.new, which works for +2.2h of elvis (and higher, one hopes). elvis users are encouraged +to update to 2.2h or higher. + +Release 1.1.6-e +--------------- + +Extended handling of draft and revision numbers and strings in +headers/footers for increased flexibility. It's possible now to +have just about any combo of DRAFT_STRING, DRAFT, REVISION_STRING +and REVISION, and have them come out in headers/footers as one +intuitively expects/wants. + +Also added a new set of syntax highlighting rules for the vi clone, +elvis. Version 2-2h-beta of elvis finally made possible the +highlighting of \*[...] inline escapes, whether or not they're +separated from surrounding text by spaces. This is a terrific +improvement in elvis, and makes for greatly improved readability of +mom files. + +Release 1.1.6-b - 1.1.6d +------------------------ + +Trivial changes to documentation and some cleanups of the main +om.tmac file, including: + +Added a .bp after .if \\n[#START]=1 in FOOTER. Without it, +in document processing mode, documents that use *none* of the +docprocessing tags (yes, there are times when users want to do +this) ignored the footer trap. + +Changed register #DOCHEADER_LEAD_ADJ to string +$DOCHEADER_LEAD_ADJ. This means that .DOCHEADER_LEAD no longer +requires a unit of measure; points is assumed. + +Release 1.1.6-b +--------------- + +Added a SHIM macro that calculates and moves to the next "legal" +baseline during document processing (useful if user starts playing +around with spacing/leading on a page and needs to get the leading +back on track). + +Fixed handling of DOCHEADER OFF so that the first line of +running text falls on a "legal" baseline when is given. + +Release 1.1.6-a +--------------- + +Problem with groff 1.19.1 fixed by Werner (.return handled arguments +incorrectly). + +Fixed handling of page numbering style restoration in endnotes, so +that (collated) docs have the correct page numbering style when the +style has been changed for endnotes (with ENDNOTES_PAGENUM_STYLE). + +DOC_TITLE has been made for use exclusively with DOCTYPE DEFAULT. + +Fixed handling of headers/footers with respect to endnotes. Now, +when either headers or footers are on, mom picks up the correct +page header/footer on the last page prior to ENDNOTES, gets the +pageheaders correct for endnotes pages *including the last one*, and +picks up correct page headers/footers for the subsequent docs after +COLLATE. + + +Release 1.1.6 +------------- + +BAD NEWS: mom appears to be crippled in some areas when run with +groff 1.19.1. Pending a solution, mom must be run with groff 1.18 + +***NEW*** + +Added TOC capabilities. + +Extended range of endnotes control macros. See the documentation +on endnotes control macros. + +Added a new DOC_TITLE macro, to deal with collated documents that +have an overall title, while each doc has its own separate doc +title (from TITLE). + + +Release 1.1.5 +------------- + +***NEW*** + +Added James Ramsey's CHAPTER_TITLE macro as well as control macros to +go with it. Thanks James. Also from James came a patch to handle +START differenty which has been incorporated into om.tmac. Thanks +again, James. + +Some bits and pieces of the docs have been tweaked, but nothing +changed. Hopefully, the changes will make parts of the docs easier to +read and navigate. + +***FIXES*** + +o \*[RULE] + +o broken draft and revision in docheaders + +o post-epigraph spacing in TYPEWRITE + +o header spacing in TYPEWRITE + +------------------------------------------------------------------------ + +Release 1.1.4 +------------- + +***SIGNIFICANT CHANGE*** +.IX is now deprecated, although it will continue to work as before. +The new form is .IQ (Indent Quit). Groff will emit a message advising +users to update their docs. + +***NEW*** +Four new inlines to deal with horizontal and vertical movements: + + o \*[FWD n] + o \*[BCK n] + o \*[UP n] + o \*[DOWN n] + +All four require a unit of measure after n. These inlines are similar +to the older \*[FPn], \*[BPn], \*[ALDn] and \*[RLDn], however they're +not restricted to points, and any value can be entered for n (the older +forms -- which still work -- were restricted to 1 - 36). + +***CHANGED*** +Inline kerning can now be accomplished with \*[BU n] and \*[FU n], where +n, after the space, is the desired number of kern units. The older +forms \*[BUn] and \*[FUn] still work, up to 36 units. + +------------------------------------------------------------------------ + +Release 1.1.3c +-------------- + +***NEW*** +A new macro -- ENDNOTES_HDRFTR_CENTER -- added so that mom's default +behaviour of not printing the header center string when DOCTYPE is +CHAPTER can be disabled (i.e. she will print the center string). The +macro is user-called with ENDNOTES_HEADER_CENTER or +ENDNOTES_FOOTER_CENTER. + +***FIXES*** +PAD now works as advertised when fill mode is on. + +ENDNOTES no longer disables printing of footnotes on last page of +document body. + +Release 1.1.3 +------------- + +***SIGNIFICANT CHANGE -- PLEASE TAKE NOTE*** +As of 1.1.3, groff must be >= 1.18. + +***NEW*** +Added endnotes functionality to mom, along with a slew of macros to +control how mom prints endnotes pages. See the html documentation. + +***NEW*** +Added inline \*[RULE], which draws a rule to the full measure of the +current line length ( to be used in place of \h'\n(.lu' ). Weight of the +rule is dependent on the point size of type when \#[RULE] is called. + +***FIXES*** +PAD -- works more intuitively now when the pad string contains inline +escapes for font, point size, etc. + +UNDERLINE -- fixed character translations of digraphs so they get +underlined properly. Also fixed a bug that was causing some footnotes +to get underlined when UNDERLINE was on in the body of the document. + +***UPDATES*** +Html documentation +elvis_syn + +Release 1.1.2a +-------------- + +***SIGNIFICANT CHANGE -- PLEASE TAKE NOTE*** +In order to help mom toward full groffship, the macro .PS has been +renamed to .PT_SIZE, and the alias .TS (for .TAB_SET) has been removed. +.PS and .TS are keywords used by pic and tbl respectively, and the mom +macros of the same name were in conflict. + +Release 1.1.2 +------------- + +***IT'S OFFICIAL!*** +mom is now an official part of the groff. New releases will be +incorporated into the groff package. I'll still be posting each new +release on the mom homepage, so there's no need to download all of the +most recent version of groff just to get a newer mom. :) + +***CHANGES*** +Fixed default footer separator rule adjustment so that it's closer to +the advertised "4 points above the tallest ascender in the footer." + +Added more stuff to the elvis_syn file. Still wouldn't mind someone +contributing some vim/emacs syntax highlighting. + +Added .cflags 4 /\(em to om.tmac. By default, mom now obligingly +breaks after / and \(en. + +***NEW*** +Macro(s): HEADER_RECTO + HEADER_VERSO +With these macros, users can now define single-string recto/verso +headers/footers. HEADER_RECTO (or FOOTER_RECTO) can be used to create +a one-part header/footer (instead of mom's default three-parters) that +appears on every page if RECTO_VERSO is OFF or, if RECTO_VERSO is on, if +no HEADER_VERSO (or FOOTER_VERSO) has been defined. If a HEADER_VERSO +(or FOOTER_VERSO) is defined and RECTO_VERSO is on, _RECTO prints on +even pages and _VERSO on odd pages. + +Added macro DRAFT_WITH_PAGENUMBER so user can have draft/revision +info attached to the pagenumber in COPYSTYLE DRAFT, instead of having +it HEADER center. Always having it HEADER center was creating problems +with long doc titles, esp. with PRINTSTYLE TYPEWRITE (which is when +COPYSTYLE DRAFT is most likely to be used). + +***FIXES*** +No more "can't break line" warnings in DOCTYPE LETTER. + +If no REVISION number is given, Rev. 0 no longer appears HEADER_CENTER +in COPYSTYLE DRAFT + +PAGENUM_STYLE now works as advertised. + +Release 1.1.1 +------------- + +***CHANGES*** +Main macro file renamed to om.tmac, in keeping with current groff +policy. + +Now okay to use groff mailing list for mom-related posts + +***NEW*** +Toggle macro -- BR_AT_LINE_KERN. When on, automatically deposits +a break whenever .RW or .EW are invoked. Very useful when kerning +whole lines of rag copy. + +***NEW*** +Toggle macro -- PAGENUM_ON_FIRST_PAGE. Normally, when FOOTERS are +being used instead of HEADERS, mom doesn't print the page number at +the top of the first page of a doc, or the first page of collated docs. +PAGENUM_ON_FIRST_PAGE allows user to get mom to put the page number on +"first" pages if that's desired. + +***NEW*** +Macro -- BREAK_QUOTE -- to deal with problem of footnoted quotes and +blockquotes that cross a page or column. + +***NEW*** +New argument to AUTOLEAD -- FACTOR. With FACTOR, you can, if you +wish, enter a factor by which AUTOLEAD multiplies the point size when +calculating lead automatically. + +Improvements +------------ + +PAPER now has a much larger selection of common paper sizes. + +\*[ALD], \*[RLD], \*[FP] and \*[BP] now accept increments of quarter +points (expressed as decimal fractions). \*[RLD1.75], for example, +reverses 1-3/4 points up on the line. + +HEADER_SIZE now available to PRINTSTYLE TYPEWRITE. This was necessary +to deal with the problem of excessively long HEADER_LEFT, _CENTER or +_RIGHT strings. + +Fixes +----- + +T_MARGIN -- can be set before or after LS or AUTOLEAD +SS -- remains constant regardless of WS +WS -- no longer affects SS +TI -- now works as expected even when called while another indent + type is in effect +COLLATE -- small fixes + +Broken .RW and .EW fixed. + +String tabs now behave properly when set from within tabs. + +UNDERLINE_QUOTES (for PRINTSTYLE TYPEWRITE) are now, in fact, on by +default as the docs state. diff --git a/contrib/mom/TODO b/contrib/mom/TODO new file mode 100644 index 0000000..1297bbd --- /dev/null +++ b/contrib/mom/TODO @@ -0,0 +1,25 @@ +As of version 1.2, the items on this TODO list will only be dealt +with if users request they be implemented. + +UNDERLINING +----------- +Explore "the ultimative underline macro" for possible inclusion +into mom. + +NUMBERED HEADS, SUBHEADS and PARAHEADS +-------------------------------------- +Macros to set numbering style (roman, arabic, alpha, etc)? + +FOOTNOTES +--------- +In columnar docs, maybe give user the choice of gathering all +footnotes at the bottom of the last column? + +CONTROL MACROS -- _INDENT +-------------- +Let user be able to enter decimal fractions as the argument to _INDENT +control macros, or, instead, let user be able to enter absolute +values with a unit of measure in addition to current behaviour, +which is relative. + +------------------------------------------------------------------------ diff --git a/contrib/mom/copyright b/contrib/mom/copyright new file mode 100644 index 0000000..51756d0 --- /dev/null +++ b/contrib/mom/copyright @@ -0,0 +1,24 @@ +AUTHOR +------ +Peter Schaffter (peter@faustus.dyn.ca) (ptpi@golden.net) +320 Gordon St. +Fergus, Ontario +CANADA +N1M 2W3 + +======================================================================== + +The groff macro file om.tmac and the html documentation pertaining +to it are copyright (c) 2004, 2005 Peter Schaffter. + +om.tmac is issued under the GNU General Public License, a full copy of +which can be had at + + http://www.gnu.org/licenses/gpl.html + +The html documentation pertaining to om.tmac is issued under the GNU +Free Documentation License, a full copy of which can be had at + + http://www.gnu.org/copyleft/fdl.html + +======================================================================== diff --git a/contrib/mom/examples/README.txt b/contrib/mom/examples/README.txt new file mode 100644 index 0000000..6150958 --- /dev/null +++ b/contrib/mom/examples/README.txt @@ -0,0 +1,115 @@ +The files in this directory show mom in action. + +If you have downloaded and untarrred a version of mom from her +homepage, you'll see that none of the example files come with +corresponding PostScript (.ps) files, as they do with pre-compiled +versions of groff, or groff built from source. + +I haven't included the PostScript output because I want to +keep the mom archive as lean as possible. To view the PostScript +output, process the files with groff and either + + a) send the output to a separate file for previewing with a + PostScript viewer such as gv (ghostview), or + + b) to your printer. + +Using the file sample_docs.mom as an example, you would +accomplish a) like this: + + groff -mom -Tps sample_docs.mom > sample_docs.ps + gv sample_docs.ps + +Accomplishing b) depends on your printer setup, but a fairly +standard way to do it would be + + groff -mom -Tps sample_docs.mom | lpr + + or + + groff -mom -Tps -l sample_docs.mom + +Note: I don't recommend previewing with gxditview because it doesn't +render some of mom's effects properly. + +The files themselves +-------------------- + +All are set up for 8.5x11 inch paper (US letter). + +***typesetting.mom** + +The file, typesetting.mom, demonstrates the use of typesetting tabs, +string tabs, line padding, multi-columns and various indent styles, +as well as some of the refinements and fine-tuning available via +macros and inline escapes. + +Because the file also demonstrates a "cutaround" using a small +picture (of everybody's favourite mascot, Tux), the PostScript file, +penguin.ps has been included in the directory. + +***sample_docs.mom*** + +The file, sample_docs.mom, shows examples of three of the document +styles available with the mom's document processing macros, as well +as demonstrating the use of COLLATE. + +The PRINTSTYLE of this file is TYPESET, to give you an idea of mom's +default behaviour when typesetting a document. + +The last sample, set in 2 columns, shows off mom's flexibility +when it comes to designing documents. + +If you'd like to see how mom handles exactly the same file when the +PRINTSTYLE is TYPEWRITE (i.e. typewritten, double-spaced), simply +change + + .PRINTSTYLE TYPESET + +to + + .PRINTSTYLE TYPEWRITE + +near the top of the file. + +***letter.mom*** + +This is just the tutorial example from the momdocs, ready for +previewing. + +***elvis_syntax.new*** + +For those who use the vi clone, elvis, you can paste this file into +your elvis.syn. Provided your mom documents have the extension +.mom, they'll come out with colorized syntax highlighting. The +rules in elvis_syntax aren't exhaustive, but they go a LONG way to +making mom files more readable. + +The file elvis_syntax (for pre-2.2h versions of elvis) is no longer +being maintained. Users are encouraged to update to elvis 2.2h or +higher, and to use elvis_syntax.new for mom highlighting. + +I'll be very happy if someone decides to send me syntax highlighting +rules for emacs. :) + +***mom.vim*** + +Christian V. J. Brüssow has kindly contributed a set of mom syntax +highlighting rules for use with vim. Copy the file to your +~/.vim/syntax directory, then, if your vim isn't already set up to +do so, enable mom syntax highlighting with + + :syntax enable + +or + + :syntax on + +Please note: I don't use vim, so I won't be making changes to this +file myself. Christian Brüssow is the maintainer of the ruleset, +which is available on the Web at + + http://www.cvjb.de/comp/vim/mom.vim + +Contact Christian (cvjb@cvjb.de) if you have any suggestions or +requests. diff --git a/contrib/mom/examples/elvis_syntax b/contrib/mom/examples/elvis_syntax new file mode 100644 index 0000000..64fbb3b --- /dev/null +++ b/contrib/mom/examples/elvis_syntax @@ -0,0 +1,90 @@ +#Mom +language mom +extension .mom .tmac + +startword . +color startword normal + +inword _.' +color inword normal + +other initialpunct +mostly normal + +backslash none + +color args like fixed +color braces like char +color brackets like underlined +color chars like emphasized +color decimals like number +color ellipsis normal +color escapes like keyword +color math like cursor +color misc like string +color operators like string +color parens like comment +color reg_string like math +color tmac_escapes like keyword +color single_slash like char + +font args DA DE EN ES FR IT NL NO PT SV +font args DEFAULT CHAPTER NAMED LETTER +font args TYPESET TYPEWRITE +font args FINAL DRAFT +font args BLOCK QUAD +font args LEFT RIGHT CENTER CENTRE JUSTIFY TOP BOTTOM L R C J +font args OFF QUIT END EXIT DONE NO ALL +font args PAGE NUMBER STAR +font args LETTER LEGAL EXECUTIVE LEDGER TABLOID QUARTO FOLIO +font args 10x14 A3 A4 A5 B4 B5 +font args SINGLESPACE +font args FACTOR +font args DASH BULLET ALPHA DIGIT USER +font args RGB CYM CMYK GRAY GREY +font args COND CONDX EXT EXTX SUP SUPX CONDSUP CONDSUPX EXTSUP EXTSUPX +font args BOLDER BOLDERX SLANT SLANTX +font args UP DOWN BCK FWD BU BP FU FP +font args ROM IT BD BDI PREV +font args ST +font args SUSPEND RESUME + +prefix { \{ \{\ +font braces { \{ \{\ +prefix [ ] +font brackets [ ] +prefix \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +font chars \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +prefix \(14 \(12 \(34 \(+- +font chars \(14 \(12 \(34 \(+- +prefix \fR \fB \fI \fP \f0 \f1 \f2 \f3 +font chars \fR \fB \fI \fP \f0 \f1 \f2 \f3 +prefix .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +font decimals . .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +prefix \/ \/. \/? \/! \/, \/; \/: +font escapes \/ \/. \/? \/! \/, \/; \/: +prefix \, \,. \,? \,! \,, \,; \,: +font escapes \, \,. \,? \,! \,, \,; \,: +prefix \~ \0 \: \| \^ \& \% \! +font escapes \~ \0 \: \| \^ \& \% \! +prefix \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +font escapes \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +prefix ... +font ellipsis ... +prefix + - * / = == < > <= >= ? % +font math + - * / = == < > <= >= ? % +prefix | +font misc | +prefix ! : & +font operators ! : & +prefix ( ) +font parens ( ) +prefix # * $ +font reg_string # * $ +prefix \n \* \[ +font single_slash \n \* \[ +prefix \\n \\* \\$ +font tmac_escapes \\n \\* \\$ + +comment \# +comment \" diff --git a/contrib/mom/examples/elvis_syntax.new b/contrib/mom/examples/elvis_syntax.new new file mode 100644 index 0000000..d31e0c2 --- /dev/null +++ b/contrib/mom/examples/elvis_syntax.new @@ -0,0 +1,106 @@ +" Steve Kirkendall has thoughtfully reworked elvis's syntax +" highlighting so that it now supports nroff constructs like \fBword +" and \(emword, with \fB and \(em being highlighted while "word" is +" not. +" +" There are some other enhancements as well, making it possible +" to have any word beginning with punctuation (i.e. groff +" requests) highlighted. I've decided to take advantage of these +" improvements, which apply to elvis-2.2h onwards, and write a new +" simplified set of syntax highlighting rules for mom. Just plug +" this file at the end of /etc/elvis/elvis.syn to use them. +" +" If you're using an older version of elvis, stick with the +" highlighting rules in the files elvis_syntax. + +#Mom +language mom +extension .mom .tmac + +startword . +color startword normal + +inword _.' +color inword normal + +other initialpunct +mostly normal + +backslash none + +color args like fixed +color braces like char +color brackets like underlined +color chars like emphasized +color decimals normal +color ellipsis normal +color escapes like keyword +color math like cursor +color misc like string +color operators like string +color parens like comment +color reg_string like math +color tmac_escapes like keyword +color single_slash like char + +font args DA DE EN ES FR IT NL NO PT SV +font args DEFAULT CHAPTER NAMED LETTER +font args TYPESET TYPEWRITE +font args FINAL DRAFT +font args BLOCK QUAD +font args LEFT RIGHT CENTER CENTRE JUSTIFY TOP BOTTOM L R C J +font args OFF QUIT END EXIT DONE NO ALL +font args PAGE NUMBER STAR LINE +font args LETTER LEGAL EXECUTIVE LEDGER TABLOID QUARTO FOLIO +font args 10x14 A3 A4 A5 B4 B5 +font args SINGLESPACE +font args FACTOR +font args DASH BULLET ALPHA DIGIT USER ROMAN roman alpha +font args SUSPEND RESUME +font args RGB CYM CMYK GRAY GREY +font args COND CONDX EXT EXTX SUP SUPX CONDSUP CONDSUPX EXTSUP EXTSUPX +font args BOLDER BOLDERX SLANT SLANTX +font args UP DOWN BCK FWD BU BP FU FP FN_MARK EN_MARK +font args ROM IT BD BDI PREV +font args ST + +prefix { \{ \} \{\ } +font braces { \{ \} \{\ } +prefix [ ] +font brackets [ ] +prefix \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +font chars \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +prefix \(14 \(12 \(34 \(+- +font chars \(14 \(12 \(34 \(+- +prefix \fR \fB \fI \fP \f0 \f1 \f2 \f3 +font chars \fR \fB \fI \fP \f0 \f1 \f2 \f3 +prefix .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +font decimals . .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +prefix \/ \/. \/? \/! \/, \/; \/: +font escapes \/ \/. \/? \/! \/, \/; \/: +prefix \, \,. \,? \,! \,, \,; \,: +font escapes \, \,. \,? \,! \,, \,; \,: +prefix \~ \0 \: \| \^ \& \% \! +font escapes \~ \0 \: \| \^ \& \% \! +prefix \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +font escapes \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +prefix ... +font ellipsis ... +prefix + - * / = == < > <= >= ? % +font math + - * / = == < > <= >= ? % +prefix | +font misc | +prefix ! : & +font operators ! : & +prefix ( ) +font parens ( ) +prefix # * $ +font reg_string # * $ +prefix \n \* +font single_slash \n \* +prefix \\n \\* \\$ +font tmac_escapes \\n \\* \\$ + +character \]' +comment \# +comment \" diff --git a/contrib/mom/examples/letter.mom b/contrib/mom/examples/letter.mom new file mode 100644 index 0000000..20827c8 --- /dev/null +++ b/contrib/mom/examples/letter.mom @@ -0,0 +1,34 @@ +.AUTHOR "Yannick P. Guique" +.DOCTYPE LETTER +.PRINTSTYLE TYPESET +.START +.DATE +August 25, 2004 +.TO +GUILLAUME BARRIÈRES +Minidoux Corporation +5000 Pannes Drive +Redmond, Virginia +USA +.FROM +Y.P. GUIQUE +022 Umask Road +St-Sauveur-en-dehors-de-la-mappe, Québec +CANADA +.GREETING +Dear Mr. Barrières, +.PP +It has come to my attention that you have been lobbying the +US government to prohibit the use of open source software by +endeavouring to outlaw so-called "warranty free" applications. +.PP +I feel it is my duty to inform you that the success of your +operating system with its embedded web browser relies heavily +on open source programs and protocols, most notably TCP/IP. +.PP +Therefore, in the interests of your corporation's fiscal health, +I strongly advise that you withdraw support for any US +legislation that would cripple or render illegal open source +development. +.CLOSING +Sincerely, diff --git a/contrib/mom/examples/penguin.ps b/contrib/mom/examples/penguin.ps new file mode 100644 index 0000000..2728930 --- /dev/null +++ b/contrib/mom/examples/penguin.ps @@ -0,0 +1,461 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.06 by Peter Kirchgessner +%%Title: /home/peter/Pics/penguin_small2_bw.ps +%%CreationDate: Wed Apr 17 19:49:51 2002 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 81 96 +%%EndComments +%%BeginPreview: 90 107 1 107 +% aaaaaaaaabff555555555540 +% 5b6db6db5edbf6b6b6b6b680 +% aaaaaaaab7ff7ad555555540 +% b55555557eddeeaadadadac0 +% 56db6db6dbffdf56ab555540 +% aaaaaaaaffb755dab556ab40 +% 5b555b55f77ed7d556b56d40 +% aab6d56dbfffaaeb6ad5aa80 +% 6d555aabf6edd5daad56ab40 +% aadaab56ffdfaff555aab540 +% 5555b56bddfdff76dab55680 +% b6aaaaaffbbbbbed5556dac0 +% 55b6d6d5bff7f77aab6aaa80 +% aaaaaaaff77f6ffd6d555540 +% 5b555b576defeedaaaadb680 +% aab6d56dfbfd3bfdb56aaac0 +% 55555aab8eda4fb556ab5540 +% b6daab5743f40b7eaad56d80 +% 5555b56f037007fadaad5540 +% aaaaaaab11e0c6ed55b5aa80 +% 5b6d6db731b1a3feaaaab6c0 +% aaab55566963a3badb555540 +% 6d556aaf35d2e37d556daa80 +% aadaadb57959f3f6aaaab6c0 +% 5555aaab3403c37d6dab5540 +% 6daab5571428c3eeaab56a80 +% aab6d6db908007fd5556ad80 +% ad5555574000176edb6ad540 +% 55aaadab920003fd55555a80 +% b56db55b2000136eaaadab40 +% 56aaaaab400047fdb6d55540 +% aad556d7040112df555ab680 +% 6d5b6ab5d00447bb55ab5540 +% aaaaad57402915cf6d556a80 +% adb555ab9a9243a7aab6ad80 +% 5556dab6902485ead5aad540 +% b5aaab57854901d7daad5a80 +% 56b5556d929201bfab55ab40 +% aaab6d57004400fb756ab540 +% 6d6d55af0a1000efeaad5680 +% aaaaaaba0080005ef6d5aac0 +% adb5b6d60220003fdaaab540 +% 5556aabc0000003bfd5b5680 +% b5aab57c0000003f76d56ac0 +% 56b556e80000001beeaaad40 +% aaab6bf80000001f7f5b5580 +% 6d6d55b00000001dfbaab540 +% aaaaaff00000001bdf6d5680 +% 55b5b5b00000000ffbd5aac0 +% b6aaafe40000000f6ff55a80 +% aad6df7000000246fedaab40 +% 555ab6d000000003aff5b540 +% b6aaafe000000013edbaaa80 +% 556b7d8000000001b7f6d6c0 +% aaad5bc000000001fbbd5a80 +% 6db57f0000000000d77aaac0 +% aaaab58000000000edf6d540 +% 5556f7000000000056fead80 +% b6dab600000000006edb5540 +% aaaaee00000000007ffeb680 +% 5555ee000000000076bb5540 +% b6dabc00000000003f7f6a80 +% 5555d800000000003b7756c0 +% aaabfc00000000003f7eda80 +% 6db6b0000000000036f7aac0 +% aaabd800000000003ffeab40 +% ad57b800000000003d6fda80 +% 55b7d8000000000037fdaac0 +% b55eb800000000003edfab40 +% 56afb000000000003bfbb540 +% aaddb000000000003edf5680 +% 6d5bd8000000000035fdaac0 +% aaafe800000000003b5bb540 +% 55ba5000000000006fef5680 +% b6a83800000000005f736ac0 +% aaa00c00000000003dfdad40 +% 55680e00000000003bd65580 +% b6a107000000000077bc5a80 +% 55a013c0000000023ff82b40 +% a80401a0000000005db45540 +% 429021f0000000043ff02d40 +% 900000f80000000096c4aa80 +% a00080be000000082a902d80 +% 004204770000000244401540 +% a200003e8000001411001540 +% 4004105fc000000044444b40 +% 8800001b8000000a00800540 +% 5040411f4000001012000280 +% 80040007c000001440044080 +% 5080040d0000003100100040 +% 800040200000007400400400 +% 51080002000000e804008040 +% 80008440000003f210000080 +% 50000005000007d400080940 +% 0111000080001ef020808280 +% a00008894000ffd480001540 +% 02000000fa57bb680108aa80 +% a0222002bfffffe900012b40 +% 0a4001115ffdedd20824d540 +% d0888004bb6fbfb4008b5a80 +% ad251202bffdfbe921255580 +% b554a05576ab576a045aaa80 +% aaaa950aaaad5aaaa955b6c0 +% 56d56a556d6aaad48556aa80 +% b55b5555aaab6b5ab55aad40 +% 55aaaaaab5b555554aaad580 +% ad556d5b56aaad6b556b5a80 +%%EndPreview +%%BeginProlog +% Use own dictionary to avoid conflicts +5 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +0.000000 0.000000 translate +% Translate to begin of first scanline +0.000000 95.872000 translate +80.640000 -95.872000 scale +% Variable to keep one line of raster data +/scanline 90 1 mul string def +% Image geometry +90 107 8 +% Transformation matrix +[ 90 0 0 107 0 0 ] +{ currentfile scanline readhexstring pop } +image +72727272717171717171717172717171717171717171717172717171727271717171727273736f +675852524e4653535a676b73737272727272727272727272727272727272727272727272727272 +727272727272727272727272 +7172717271717171717171717271717171717171717171717271717171717172727272726d5d4a +4039393939373a3a3c3f4653637172727272727272727272727272727272727272727272727272 +727272727272727272727272 +7171717271717171717171717271717171717171717171717271717171717173747271644b3f3a +3a393a3a3a393b3b3b38393b3d4d64707272727272727272727272727272727272727272727272 +727272727272727272727272 +727272727171717171717171727171717172717171717171727171717171727372705b3b3d3b3a +3939393939393938393939383a3c3f546d71747272727272727272727272727272727272727272 +727272727272727272727272 +727271727171717171717171727171717171717171717171727171717171727173553e3d383a39 +393a383838383838393940564d3f38394668727272727272727272727272727272727272727272 +727272727272727272727272 +71717171717171717171717172717171717171717171717172717171717172715f3d38393b3b39 +3a393939393939393a3c5574807252403742627272727272727272727272727272727272727272 +727272727272727272727272 +727271727171717171717171727171717171717171717171727171717172726c403c373a3a3a3a +3a3a3a3a3a3a3a3a393e5e82958c72543a38416a72737272727272727272727272727272727272 +727272727272727272727272 +727171727171717171717171727171717171717171717171727171717271735a3d383b3a3a3a3a +3a3a3a3a3a3a3a3a383c5f87978e7c65493a3c5070737272727272727272727272727272727272 +727272727272727272727272 +7171717271717171717171717271717171717171717171717271717172736c4638373b3a3a3a3a +3a3a3a3a3a3a3a3a3a436384897d6d644f3a3b3e60727472727272727272727272727272727272 +727272727272727272727272 +727171727171717171717171727171717171717171717171727171717273603a3839393a3a3a3a +3a3a3a3a3a3a3a3b39425c6f68574745403b3c3848707472727272727272727272727272727272 +727272727272727272727272 +7271727271717171717171717271717171717171717171717271717172724d373938393a3a3a3a +3a3a3a3a3a3a3a393a3d494e3e3e3c3b393c3a393b617272727272727272727272727272727272 +727272727272727272727272 +71717171717171717171717171717171717171717171717172717171727241393839393c3a3a3a +3a3a3a3a3a3a3a393b3a3a3d3b3a3d393c3b393b3a4b7374717272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171717271717172703a3b3937393b393a3a +3a3a3a3a3a3a3a3a3a3b3a3a393d3a3b3b3b393a393e6d74727272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171717271717171633c3a3a38383d413c3a +3a3a3a3a3a3a3a3a3a3b3e4142393c3c3b3b3939393c6074707272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171717271717171623b373b3e40475d5a3f +3b3b3a3a393b3b3b373839486b6d3d393b3b3a38393b5c73717272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717271717171717271717172623b373c3a3d3f425d65 +3f393a3a3d393b3e5b75795a3e6562393b3b3b39393d4f71727272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717272717171717271717171717271717172623c3838538a9e7e4960 +4e3c3a3a3c3a57879ea9b0b68e445b463b3b3b3a3b3d4a72727272727272727272727272727272 +727272727272727272727272 +7272727271717171727171717272717171727171717271717271717172613c374d96b6cabb8e48 +463b3a3a3a5291abb6c0c7d1be7f3f473b3b3a38393a4672727272727272727272727272727272 +727272727272727272727272 +7272727271717171717271717271717171717171717171717271717172603c3770acd1e3dfcc84 +3a3b3a3a3d85c0e7f4f7f7f2d9a4593a3b3b393839393f6b727272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171717271717172603c3c9aebdbc5eefdda +45393a3a45b8f7fcda8386d1faec8b373b3b3a3938383e6b727272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717172717271717172613946c8db4e7188eaf9 +60443c3e4dc7fbe953468a7fcdfdc7433b3b3a3839383c6a727272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171717271717172603a4bd59a387184a5fb +755363655bc9fb9c3d3a5c907ffbe7543b3b3a3939383c6a717272727272727272727272727272 +727272727272727272727272 +7171717171717171717171717171717171717171717171717171717171673b4ad5833e4a7f75f8 +6f484b575cb3f67b363c445b68f4ed553a3a3a3939393b6a717272727272727272727272727272 +727272727272727272727272 +7272727272717171717171717271717171717171717272717271717171714245cc953c3d5667ce +666e6f6c6282e97a3b3a3a3b5bf5ea58393a393a393c386a737272727272727272727272727272 +727272727272727272727272 +727272727171717171717171727171717171717171717171727171717171413eb7c4453b416fa6 +c3c9c6c2bcb1c19d3a3c3b3e8cfbdc4c3939393a39393969727272727272727272727272727272 +727272727272727272727272 +727272727171717171717171727171717171727171717171727171717171413a8df18e477da2af +cdcecbbfa6b2cfc289534273ebf9ac3f3939393939383b62727272727272727272727272727272 +727272727272727272727272 +72727272717171717171717172717171717172717171717172717171717142385bdae697a9c1cd +cfcecfd3d4d7dcd9d5c5a8c5e4dc633838393a39393a365b727272727272727272727272727272 +727272727272727272727272 +72727272717171717171717172717171717171717171717172717171717142363e99a4a8b9cacf +cecfd2d8dcdfe2dfdedad6cdc3ac693f39393939393a375b727272727272727272727272727272 +727272727272727272727272 +7272727271717171717271717271717171717171727171717271717171714137538fa4b4c2cbcf +cfd1d5dadee2e1dfdedededfdcdab5553a3a39393a3c3859727272727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717271717171717271717171714b43839facbdc8cfcf +d0d3d7dae2e2dfdedededed1b1c5c05e3c3b393a3c393c4c717272727272727272727272727272 +727272727272727272727272 +727272727171717171717171727271717171717171717171727171717172524c94a0b2c1cbcfcf +d1d5d9dee1dfdedededabea8aebbad4f3b3c3a393a3a3d426b7273727272727272727272727272 +727272727272727272727272 +72727272727171717271717172727171717171717172717172727171717254478ea5b9c3ced0d1 +d3d6dbe0dededddccfabaab7bbbaaa4b3c3b393a37393f3b597174727272727272727272727272 +727272727272727272727272 +727272727171717171727171727171717171717171717171727171717171503b5c84aec9d0d1d1 +d6d9dddcded9d1b0a0b1b8bbbab387403a3b6c7446333938477173727272727272727272727272 +727272727272727272727272 +7272727271717171717171717271727171717171717171717271717171714f3d457986a3c5d1d6 +d8d9d8d1bfa795a2b4b7bab7adac8642383863978e6f413c3c6973727272727272727272727272 +727272727272727272727272 +727272727171717171717171727171717171717171717271727172717272523b4390a58a8e9da8 +aba4a29d9ca5aeb3b2afabb7c4c2bb5d3b3645849b99663a3c4e72727272727272727272727272 +727272727272727272727272 +727272727171717171717171727171727171717171717271727171717273543c49adbfa29097b4 +c0b9b5b3b4b0afada5aabec7cfcac3763a3b3c5e999a8745393d65727272727272727272727272 +727272727272727272727272 +727272727271717171717171727271717172717171717171727172727171483856aac1bfa18e9e +b1b4b2afa9a3a0a4b3c1c1c5d3ded4ac413a3b4079895a38353948707472727272727272727272 +727272727272727272727272 +7272727271727171717171717272727171717171717171717272737272633f3c4ea8c5c1c0a790 +919698959193a7bac2c1c9e1f4fbfbde6c3b3c3a39423c3b3a393e617473727272727272727272 +727272727272727272727272 +7272727271717171717171717271727171717171717172717272717270453b394dc1d9c8c2c2bc +a79b9b9dabbac0c1c2cde3f8fdfdfdfabf453b3b3b3b3b3b3a393d4c7071727272727272727272 +727272727272727272727272 +727272727171717171717172727171717171717171717171727270715b3d3b398ff5e7cec3c3c1 +c3c1c2c2c3c2c2c8d4e4f5fdfdfdfdfdf9723f3b3b3b3b3b3b3a39435a74747272727272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171717271726750463658e0fbf7e4c6c2c3 +c3c2c3c2c2c4ceddedf7fdfdfdfdfcfdfccb4a3b3d383b3b3a3a3a3e4a6b727271727272727272 +727272727272727272727272 +72727272717171717171717172717271717171717171717172716d4b544340b1f7fcfdf7d5c2c2 +c2c2c2c2c6d5e7f5fcfdfdfdfdfdfdfcfbf7833d3d3b3b3b393b393a3b4e717272717272727272 +727272727272727272727272 +7272727271717171717271727271727171717171717171727371483a3a3673f4fdfcfbfceccfc5 +c2c1c2cde3f3fafdfdfdfcfdfdfdfdfcfdfccb40393a3b3b39393a393b3c607271727272727272 +727272727272727272727272 +727272727171717171727171727171717171717171717171705a3e3f3c45d0fcfdfdfcfdfcf5e6 +d9dce5f1fafcfcfcfdfdfcfdfdfdfdfdfdfdf66937393b3b393939393a3a486a72717272727272 +727272727272727272727272 +7272727271717171717171717271717171717171717171725f3e3a3c3985fbfcfdfcfdfdfdfdf9 +f1f8fcfdfdfcfcfcfcfdfdfdfdfdfdfdfdfdfd933b3a3b3b3a3a3a3a393a3d4a6b717272727272 +727272727272727272727272 +717171717171717171717171717171717171717172727267443b3b394cd2fafcfdfdfdfdfdfdfb +fafcfdfdfdfcfcfcfcfcfdfdfdfdfdfdfdfdfbc73b3b3a3a3a393a3a3a393c3e52727272727271 +727272717171717172717271 +727172727171717171717171727171717172727175736d423a3a383c7de7f9fefefdfdfdfdfdfc +fbfcfdfdfdfcfdfdfcfdfdfdfdfdfdfdfdfcf8e24d3c3b3b3a3a3a3a3b3b393a3b537173727272 +727272727272727272727272 +7272727271717171717171717271727171727271726e4d3b3b3a3646a0e2f8fdfefdfcfcfdfdfc +f8f8fcfdfdfdfdfdfdfdfcfdfdfdfcfbf4f0efeb653f3b3b3b3b3b3b3b3b3938393f5772727272 +727272727272727272727272 +727172727171717171717171727171717171727171533f3b3b3a364aa5cef0f9fbfdfdfcf9f5f1 +ecebf3f8fafbfbfafcfaf8f7f5f5efeae3dbdfe687473b3b3a3b3a393a3a3b393a393f5c727272 +727272727272727272727272 +7272727271717171717171717272717171717271623d3d3a3b3a3a5ba9b8d0e7edf5f9f9f5ede3 +e1e5e7f2fbf9fafaf7eee2dad3d0cececcc8c9d8c5513a3b3a373c393d3b3a3939383d3e637272 +727272727272727272727272 +727272727171717171717171727171717172726e4a3d383a3b3a456fadb5cbddebf8fbfcfdfced +e4f5fbfdfcfdfdfdfcf7ede3d5cecac8c7c6c6c7deb844393e644e3a393b3a3a3939383c4b6f72 +727272727272727272727272 +72727272717171717172727272727271717272603e3a3b3b393a4b7cbbd3ebf7fdfcfcfbfdfcee +f1fcfcfcfcfbfbfdfcfcfdfbf8f2e8ded3cbc7c6ceee993d34556f5f463c3d393b393a3a3e6272 +727272727272727272727272 +717171727171717172717171727171717173704b3b3d39473c3c5fb0dcf1fbfcfcfcfdfcfcfcf5 +f5fbfcfbfdfcfcfcfcfcfbfbfdfcfcfbf5e9d9cdc7d8ea683b3d3d58724b3b3d3b3a3a3a3c5173 +737272727272727272727272 +7272727271717171717271717271717171736e433e385e603e4090dff5fcfdfcfcfbfcfcfbfcfa +fbfbfcfcfcfbfcfdfcfcfcfcfdfcfcfcfbfcf6e6d3c9e3c3403a3d394d7342353e3a3b3a39416b +727372727272727272727272 +727171727171717171717171727171717172673d374a6b3b3d4cd9f8fdfcfcfcfbfdfbfcfbfcfc +fbfcfcfbfcfcfcfcfdfcfcfcfbfcfbfcfcfdfdfaedd4ceeb6c3c3d3d3e51663a3e383b3a393c56 +717472727272727272727272 +727271727171717171717171727171717173573c3c604d3b3c8ffbfdfbfcfdfcfcfcfcfcfcfbfb +fdfbfdfcfdfbfcfcfcfbfcfcfdfbfdfcfcfcfcfdfcedd3dac43d384e5b5064583a3c3b3a363c40 +6f7272727272727272727272 +727271727171717171717171727171717170483f476f373851e9fdfdfdfbfcfcfcfcfcfcfbfcfd +fcfcfcfbfcfcfbfbfcfcfdfcfdfcfcfcfcfcfcfdfcfdf1e6f1583f5e7770546d42393b3a3b3a3d +637272727272727272727272 +7272727271717172717171717271727372643f3c6a52373da0fbfcfcfcfcfbfcfcfcfdfcfcfbfb +fcfbfcfbfbfcfdfcfcfcfcfcfcfcfcfbfcfcfdfcfdfbfcfcfd9545657c735259613d3c393a393b +4e7172727272727272727272 +7272727271717171717171717271727471513a456a393a5ae6fafcfbfcfbfcfbfcfcfcfcfbf8fa +fbfcfcfcfcfdfbfcfdfcfcfdfcfdfcfbfdfcfbfcfcfcfcfcfdc64f5e6456434078433b3d393b3d +436c72727272727272727272 +727272727171727171717171727272726e47385c53333e98fbfbfcfcfcfcfcfcfcfcfcfcf9eafb +fbfbfbfbfcfcfbfdfcfcfbfcfcfcfcfcfbfdfcfcfdfdfcfdfce7473d3f3b3b375e57393d383939 +3b6171727272727272727272 +72727272717171717171717172717272633c3b703f3451dafcfcfbfbfcfcfbfcfcfdfdfbf4e8fa +fcfdfcfcfcfbfcfbfcfcfcfcfbfdfcfcfcfcfcfcfcfbfbfcfcfa623c3a3a3b374b66373d393939 +3b5072727272727272727272 +727272727171717171717171727272714e3b52613b388af8fcfbfcfbfcfcfcfcfcfdfcfcf2edfc +fdfcfcfcfcfdfcfbfcfcfcfcfcfdfcfdfdfcfcfcfcfdfcfbfcfc84383b3b393a3f774138383938 +3a416f727272727272727272 +727271727171717171717171727272663c3c68453b40c5fbfbfbfdfdfcfcfdfbfcfcfcfcededfb +fcfcfcfcfbfcfcfcfcfbfbfcfcfcfcfcfafcfcfcfcfbfcfdfcfda23c3b3b3b3b3d7437383b3a39 +3b3f68727272727272727272 +7272727271717171717171717174714b3a3a6b373b57eefcfcfcfcfbfcfcfbfcfcfbfdfbe9e9fb +fbfcfcfcfbfcfcfbfbfcfcfbfbfcfbfcfcfcfcfcfbfcfcfcfdfcaf3b3b3b3c3a406f37373a3a39 +393d5f727272727272727272 +7171717272717171727171717271623e3d4a60373b82fbfcfcfdfbfdfcfcfcfcfbfcfcfbe6eafb +fcfdfcfcfcfcfcfbfdfcfcfcfdfcfcfcfcfdfcfcfcfbfcfcfcfdbd3a3b3b3a3843633836393a38 +3a3c54727272727272727272 +727272727272717171717272736d463a37535c3839aafcfcfcfdfdfcfcfcfbfcfdfcfbfbe6eaf9 +fbfbfcfbfcfbfcfcfbfdfcfcfbfcfcfcfcfdfcfcfcfcfbfdfcfcce3c3b3b393c4e533937383939 +383c4f727272727272727272 +71717272717171717171717371593d3b3952603947cdfcfbfcfcfcfcfcfdfdfcfcfcfdfae2e9fa +fbfbfcfdfbfcfcfcfcfcfcfcfcfcfcfbfbfcfbfdfcfcfdfafcfcd4423b3b3b3a5a4e393a39383a +3a3940727272727272727272 +7272727271717171717271726c41393c3656683b47d6fdfbfcfcfcfcfcfcfbfcfdfcfcfae1e9fb +fbfcfdfcfcfcfbfcfcfcfcfbfcfcfbfcfcfcfbfbfdfcfbfcfcfdda413b3b3c3b6644393a3a3938 +3b3a3f727272727272727272 +727271727171717171717171553c3b3b405f6d394ce1fcfcfcfcfcfcfbfdfcfcfcfcfcf9e1ecfb +fcfcfcfcfcfbfbfcfdfcfcfdfbfcfcfcfcfbfcfbfbfdfcfdfcfcdd423b3b3b39643f393a393939 +3a3a3e727272727272727272 +7272727271727171717171724f3e363d4f767e3b5be9fcfdfcfdfbfbfbfcfcfbfafcfcf8e2eefb +fbfcfcfcfcfcfcfcfcfcfcfcfcfcfcfbfdfcfbfcfdfcfcfcfbfdde433b3b3b455f3a3b3b3a3a39 +39393e727272727272727272 +72727272717171717171716e46393938466b863e69edfcfdfcfcfcfcfbfcfcfcfcfcfcf7e2eefc +fbfcfcfdfbfdfcfbfdfcfdfdfdfcfcfcfcfdfbfcfcfbfcfcfbfddc443b3b385a463b3b3b3a3839 +393940727272727272727272 +72727272717171727171716f413a3a3a3945724869effcfcfcfcfbfcfcfbfcfcfcfcfbf8e2f1fc +fcfcfcfbfcfcfcfcfcfcfcfcfcfcfcfbfcfcfcfcfcfcfbfcfdfccc3f383a41683b3d3d3a3b3a3a +3a3b42727272727272727272 +72727272727171717171716e443938393c3c49626eeefcfbfcfcfcfcfcfcfcfcfcfcfcf8e2f1fc +fbfcfdfcfcfdfdfcfcfcfcfcfbfcfbfcfcfcfcfcfcfcfcfcfcfcb83b3f5a685d455b6054463f3a +3c3a51727272727272727272 +727272727271717172717171524a728f8d5e424d80e3fbfcfcfbfcfcfdfcfbfcfcfcfcf7e1f2fb +fcfcfcfcfcfcfcfbfcfdfbfcfcfcfcfcfcfcfcfcfcfdfcfcfcfc9c405b503d3b3c3c455368755c +3d3a5a727272727272727272 +72727172717171727271727174a3c9d4d6c87b3b50b0f9fcfcfdfcfcfcfbfdfcfcfcfcf8e2f3fb +fcfcfdfcfcfcfcfcfcfcfbfbfbfcfbfcfbfcfcfcfcfcfbf9fbf66956403b3a3a39393b3a3a608d +654567717273727272727272 +7272727271717172717371739bc1d1d4d4d4cc7f3f55a9f5fbfbfcfbfdfbfbfcfbfbfcf8e1f3fc +fbfcfcfcfbfcfbfcfcfdfdfcfcfcfcfcfcfcfcfcfbf6d5d3d3d29c59393a393b3b3b3b3a3c5d76 +61486b737272727272727272 +727272727171727171737288b1c7d1d4d4d5d4cc803f4ea1f0fbfcfcfcfbfcfcfcfdfcf6e3f4fc +fdfbfbfcfcfcfcfcfcfcfcfcfdfbfcfcfcfbfcfcfcdccfdbdddccd5b3e3a393b3b3b3b3a3e655e +519c89727373727272727272 +7171717272727171717276a3b8c8d2d4d5d4d5d5c66d3a4892e9fcfbfcfdfcfbfbfbfcf8e1effb +fcfbfcfcfcfcfbfcfcfbfcfbfcfcfcfcfbfcfcfcfcd5c7d4d7dabb50383c393b3b3b3b3a414f40 +76cfda8f7374727272727272 +7172717372727271707e9db3c0cdd4d4d5d4d4d5d4b6543b4673d6fbfbfcfcfdfdfcfbfaeaedfc +fbfdfcfcfcfdfdfcfcfcfcfcfbfbfcfbfcfdfcfcfcd7c5d3d4d1a9513a393a3b3b3b3b3a3a3653 +bad5d7b87371727272727272 +7170778c9baaa8a5a3a7b4bdc9d1d4d4d4d4d4d4d5d2a04435405bc1f7fcfcfdfbfcfcfdfbf9fc +fdfcfbfcfcfcfbfcfcfcfcfbfcfcfcfdfcfcfbfbf8d8c4d3d2c9a85c3a3b383b3b3b3b3a3a4196 +cfd1d4c47370727272727272 +73779fb2bcc1bfbbbbbdc4cad1d4d4d4d5d4d4d4d5d4cb7c3d373c469ef3fbfcfcfcfdfcfcfcfc +fcfbfcfcfbfcfcfcfcfcfcfcfcfcfcfcfbfcfbe8d3c7c4d2cec3ae78463c36383836373b477dbf +cccfd1c07671727272727272 +738ab0bec9cdccc9c7ccd1d2d4d4d4d4d4d4d4d4d4d5d5b758383b3a4387e5fdfcfcfcfbfcfcfc +fdfdfbfcfcfcfcfcfbfcfcfdfcfcfbfbfdfceecdc7c3c2cecbc1ae997146403e393d426189b2c3 +cccfd2c27572727272727272 +7193b7c7ced1d2d3d2d3d4d4d4d4d4d4d5d4d4d4d4d3d4cf953d383a353a68d0fbfbfbfbfdfcfc +fbfbfbfdfcfdfcfbfcfcfbfcfcfcfdfcfbfde3c7c8c2bfc9cac4b5a69c8e7d77767e929eacc0ca +d0d3d4d07f72727272727272 +729eb8c8d0d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d5d3d3d5c065383b38343f57bffbfbfcfcfbfc +fcfcfcfcfbfbfcfdfcfcfcfcfbfbfbfcfcfbdfc9c8bdb9c8cac6bbb0a8a5a1a0a1a3a7b1bfccd1 +d4d4d4d3af77717372727272 +7192b7c6d0d4d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d3d4d4a64639383c3a3852c7fcfcfdfdfd +fcfcfcfcfcfcfdfdfcfcfdfcfdfcfbfcfcfbe0c8c8b8b4c6cacac1b9b5b1b0afafb2b7c0cbd4d4 +d4d5d4d2cf9c727272727272 +728cb5c3ced4d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d4d4c97d3b363a3737396ef0fcfcfcfc +fdfcfcfcfbfcfcfcfcfcfcfcfdfcfcfbfcfde7cbc9b3aebfc9cbc8c2bcbbb9b9b9bcc3c9d1d5d5 +d5d5d5d3d1c88f7272727272 +718bb2c0cdd3d4d4d4d4d4d5d5d5d4d4d5d4d4d4d5d4d4d4d4d5b6573a3939393742d8fcfcfcfc +fcfbfcfbfcfcfcfdfcfcfcfcfbfbfcfcfdfbeed0c8adaabcc9d0cecbc5c3c2c1c3c5c8ced2d5d5 +d5d5d5d5d4d1c29071727372 +727fafbdccd3d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d4d4d4ce974038393b393fd1fcfcfcfb +fcfbfcfdfcfcfbfcfcfcfcfcfbfcfcfbfcfcf3d3b588aabdc9d0d2d1cdcbc9c8caccced1d4d5d5 +d5d5d5d5d4d3d0cb99767372 +727aadbccbd3d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d4d5d3d5c57a3a3a383a59ecfdfcfcfc +fbfcfcfcfcfcfcfbfcfbfcfcfbfcfcfcfbfcf2c46785aabdc9d1d3d3d2d2d0d1d1d2d2d3d4d5d5 +d5d5d5d5d5d5d4d4d4b88872 +727bacbacbd3d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d4d5d4d3d5b15441467bd7fcfcfcfbfc +fcfdfdfcfcfcfbfcfcfcfdfdfcfcfcfcfbfccd5d4484abbecad1d2d4d4d5d4d5d4d4d4d4d5d5d5 +d5d5d5d5d5d4d5d4d4d5cea5 +727caebac9d3d4d4d4d4d5d5d5d5d4d4d4d4d4d4d4d4d4d4d5d5d3d3ce99a7dcf8fcfcfcfcfcfc +fbfbfcfcfbfcfcfdfcfcfcfcfbfcfcfcf8c2523a4789aabecad1d3d4d5d5d5d5d5d5d5d5d5d5d5 +d5d5d5d5d5d5d5d5d5d5d2c6 +7084aebacbd2d3d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d3d1d1bfa4f4fafbfbfcfcfbfc +fcfcfbfbfcfcfcfcfcfcfcfcfcfbfbf6a44538364e8aaabecbd2d4d4d4d4d4d4d4d4d4d4d4d4d4 +d4d4d4d4d4d4d5d5d4d3cec1 +718eacbbcdd3d3d4d4d4d5d4d5d4d4d4d5d4d4d5d4d4d5d4d5d4d4d3cfceadbdfbfcfbfcfcfcfc +fbfdfdfcfbfdfbfbfcfcfbfbfcfce87f42353834578aa9c0cbd2d5d5d5d5d5d5d5d5d5d5d5d5d5 +d5d5d5d5d5d5d5d4d0c9c19f +739daec0d0d4d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d4d5d4d4d4cfd0bc95d1fbfbfbfcfcfc +fcfcfcfcfcfcfbfcfcfcfcfcefa84c3b383c39385e88a7c1ccd2d4d5d5d5d5d5d5d5d5d5d5d5d5 +d5d5d5d5d4d4d4d1c6bca676 +81a6b6cbd2d3d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d4d5d4d4d4cfcabf9f80cbfafbfcfcfc +fbfcfcfcfcfbfcfcfcfcf0b45b3c3a3b3a3738396488a6bfccd3d4d5d5d5d5d5d5d5d5d5d5d5d5 +d4d4d4d4d3d1ccc1b5947871 +94aebfcdd2d3d4d4d4d4d4d4d5d4d4d4d4d4d4d4d4d4d4d5d5d4d4d4d0c6bda6835a8ad1eff7fb +fcfbfcfcfbfaf3e7c5935a3f373a3b3b3b3b3b3d6b8ba7becbd2d5d5d5d5d5d5d5d5d5d5d5d4d4 +d5d4d4cec7c0b5a280727373 +a4afbdc8d1d2d2d3d4d3d4d4d5d4d4d4d4d4d4d4d4d4d4d4d5d4d4d4d1c8bca98d693b3d5c7e93 +a7aea0988f7c5e4b3d3b3a38383b3b3b3b3b3a43708ea7bdcad2d5d5d5d5d5d5d5d5d5d5d4d2d1 +d2d1c8bbb09a7f7372727272 +a3abb7bfc8cbcdcecfd0d2d4d3d4d4d4d4d4d4d4d4d4d4d5d5d4d5d4d0c8bca78f75473839383d +3d3a39373836353a383b37373b3a3a393a3a38477590a6bac9d2d4d5d5d5d4d4d4d5d4d4d0ccca +c6bdb1947971727272737272 +9aa5aaafb7bcbfc0c3c5c6cacccfd0d1d2d3d3d4d4d4d4d5d5d4d4d3cec3b6a28b7b553939393a +393939393939393939393939393a393a3a393947768fa3b5c3cfd4d4d4d4d4d4d2d2d1cbc5bfbb +b19b80737172727272727272 +7a91989da0a2a7abafb2b6b7bcc0c4c6c9cdd0d2d4d4d4d4d4d4d4d1c8bba9988a7c593a3a3a3a +3a393a3a3a3a3a3a3a3a3a3a3a3938393a3a3a4a768a9daebdc9d0d2d3d3d2d2d0cdc7bfb8b2a6 +8a7371717171727272727272 +7172757a838c91979c9fa4a4a6a9aeb1b6bac1c7cdcfd1d2d1d1d1cbbfb09e8f857958383a3839 +3b3b3b3b3c3b3b3c3b3b3b3b3b3a3837383a394c738596a5b5bfc9ced0d1d0cdc7bfbbafa49a7b +727172727272727272727272 +727273727272747c858b90949496999b9fa4acb3b9bec3c8cbcac4bbafa393867d734e3c404141 +4b555858585858585858585857554d454543404d7082909daab6c0c5c7c8c6beb8b2a89b8a7571 +727272727272727272727272 +7372727272727171727274797d8185898d90959ba2a6abb0b6b6b0a89c92867e776547656f7372 +707172727272727272727272727174736f6f66656c7e8a959fa6aeb3b4b4b1aaa49d9382727272 +727272727272727272727272 +727271717271717171727271717273767b7d82898e9195989b9b98928a837e7972616470727172 +72727171717171717172727272727272727171706d76828e979b9da0a1a19f9b968d7c73727271 +717272727272727272727272 +72727272717171717171717172717170717172767d81868788878683807c776f6e727271717171 +7171717171717171717272727272727272727271706f79838c9192959595938d84787171717272 +727272727272727272727272 +7272727271717171717171717271717171737372727375767a7c7d7b79746e6d72737271717171 +7171717171717171717272727272727272727271726e6f737c8285888786837974727172717272 +727272727272727272727272 +7272727271717171717171717271717171727272727272707273706f6f71707272727271717171 +71717271717171717172727272727272727272727272716e6f6f72757372727172717172727272 +727272727272727272727272 +showpage +%%Trailer +end +%%EOF diff --git a/contrib/mom/examples/sample_docs.mom b/contrib/mom/examples/sample_docs.mom new file mode 100644 index 0000000..592c75e --- /dev/null +++ b/contrib/mom/examples/sample_docs.mom @@ -0,0 +1,574 @@ +\# This file contains three greeked documents collated together: +\# +\# i) two pages of a novelist's outline +\# ii) two pages of a chapter using COPYSTYLE DRAFT +\# iii) three pages of an academic paper, set in two columns +\# +\# Mom's defaults are used throughout, except for iii), which +\# demonstrates some of the ways you can design your own documents. +\# +\# Since the text throughout is greeked, and groff doesn't know how +\# to hyphenate all that pseudo-latinate nonsense, I've inserted +\# discretionary hyphens (\%) into a large number of the the words. +\# Normally, this isn't necessary. +\# +\# The PRINTSTYLE is TYPESET. If you'd like to see what mom does +\# with the documents when the PRINTSTYLE is TYPEWRITE, change +\# PRINTSTYLE TYPESET, below, to PRINTSTYLE TYPEWRITE. Also, in the +\# third example, comment out PARA_INDENT and QUOTE_INDENT (lines +\# 332 and 333). +\# +\# =================================================================== +\# +\# First, a sample "NAMED" document--in this case, an outline. +\# A novelist wouldn't normally write an outline with numbered heads, +\# subheads and paraheads. I've turned the feature on merely to +\# demonstrate it. +\# +\# Reference macros +\# +.TITLE "Lake Attica's Shores" +.SUBTITLE "A Romance Novel" +.AUTHOR "Rosemary Winspeare" +.DRAFT 1 \" Ignored because COPYSTYLE is FINAL +.REVISION 2 \" Ignored because COPYSTYLE is FINAL +.COPYRIGHT "2004 Alma Podborski +\# +\# Reference macros for the document cover +\# +.DOC_COVERTITLE "Sample mom Documents" +.MISC "Three types of mom documents" "assembled and collated by mom's author" +\# +\# Docstyle macros +\# +.DOCTYPE NAMED "Outline" +.PRINTSTYLE TYPESET \" Or TYPEWRITE to preview "typewritten, double-spaced" +\# +.DOC_COVER COVERTITLE MISC +.COVER TITLE AUTHOR DOCTYPE COPYRIGHT +\# +\# Additional setup macros +\# +.NUMBER_PARAHEADS +\# +.START +.PP +.PARAHEAD "A note on the setting" +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. Stet clita kasd gubergren, no sea takimata sanctus est. +At vero eos et accusam et justo duo do\%lo\%re et ea rebum. +.PP +Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At +vero, eos et accusam et justo duo do\%lo\%res et ea rebum. Consetetur +sadipscing elitr, sed diam nonumy. +.LINEBREAK +.PP +.PARAHEAD "About historical personnages" +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est. Tempor invidunt ut +labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy +eirmod tempor invidunt ut labore et do\%lo\%re magna. Tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.NUMBER_HEADS +.NUMBER_SUBHEADS +.HEAD "Part One" +.SUBHEAD "Chapter 1" +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit +amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor +invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +Stet clita kasd gubergren, no sea takimata sanctus est. +.SUBHEAD "Chapter 2" +.PP +Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua at vero. +.SUBHEAD "Chapter 3" +.PP +Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et +ea rebum. +.HEAD "Part Two" +.SUBHEAD "Chapter 4" +.PP +Stet clita kasd gubergren, no sea takimata sanctus est +lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. +.PP +Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et +ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo +duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est lorem ipsum dolor sit amet. Consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt. +.SUBHEAD "Chapter 5" +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed +diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, +no sea takimata sanctus est lorem ipsum dolor sit amet. +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero +eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren. Sea takimata sanctus est lorem ipsum dolor +sit amet. Accusam et justo duo do\%lo\%res et ea rebum +.SPREAD +.RIGHT +\*[BD]\&...end of sample outline\c +.EL +.COLLATE +\# +\# The .EL after the line "...end of sample outline" ensures that +\# mom doesn't spring the page trap, which would deposit a header at +\# the top of the next page. COLLATE doesn't print a page header +\# on the first page of a collated document, but if the page trap +\# has already deposited one there, COLLATE can't undo it. +\# +\# Normally, this isn't necessary; here we require it because the +\# line falls right at the bottom of the page, and would therefore +\# normally spring the page trap. Sorry for the fussiness, but at +\# least now you know what to do if you ever encounter the problem +\# of a page header printing at the top of a collated document. +\# +\# Please notice, too, the use of "\&" before "..." Whenever an +\# input line begins with either a period, an apostrophe or a space, +\# you must precede it with \&, otherwise the line will disappear, +\# even when, as here, there's an inline escape that starts the +\# line. +\# +\# ===================================================================== +\# +\# Next, two pages of a chapter, set in DRAFT style, showing +\# the use of the EPIGRAPH BLOCK macro and the QUOTE macro. +\# +\# You'll notice that the starting page number of this "draft" is 1 (in +\# roman numerals). COPYSTYLE DRAFT always numbers the first page of a +\# document 1. +\# +\# Reference macros +\# +.TITLE "Lake Attica's Shores" +.SUBTITLE "A Romance Novel" +.AUTHOR "Rosemary Winspeare" +.CHAPTER 1 +.CHAPTER_TITLE "The Bonny Blue Yonder" +.DRAFT 1 +.REVISION 2 +.MISC "Draft 1, 2nd revision" +\# +\# Docstyle macros +\# +.DOCTYPE CHAPTER +.COPYSTYLE DRAFT +\# +\# Additional style macros +\# +.EPIGRAPH_FONT I \" Epigraphs are normally set in roman +.DRAFT_WITH_PAGENUMBER \" Draft/revision info usually goes in the header +.COVER_MISC_QUAD RIGHT \" Change default position of the cover "misc" line +\# +.COVER CHAPTER+TITLE MISC +\# +.START +.EPIGRAPH BLOCK +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. +.RIGHT +\*[ROM]\(emJoseph E. Blough +.EPIGRAPH OFF +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et +ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +Stet clita kasd gubergren, no sea takimata sanctus est. At vero eos +et accusam et justo duo do\%lo\%res et ea rebum. +.PP +Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt. +.PP +"Consetetur sadipscing elitr," dixit ea. +.PP +"Sed diam nonumy eirmod tempor invidunt ut labore," dixit eum. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy +eirmod tempor invidunt ut labore et do\%lo\%re magna. +.PP +"Lorem ipsum dolor sit amet," dixit ea. +.PP +"At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est," dixit eum. "Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua." +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor: +.QUOTE +Invidunt ut labore et do\%lo\%re +Magna ali\%quyam erat sed diam +Voluptua stet clita kasd gubergren +No sea takimata sanctus est. +.QUOTE OFF +.PP +Justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no +sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.PP +"Stet clita kasd gubergren," dixit ea. +.PP +"No sea takimata sanctus est," dixit eum. +.PP +Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Aliquyam erat +sed diam voluptua. At vero eos et accusam et justo, duo do\%lo\%res et +ea rebum. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam +erat, sed diam voluptua at vero. Stet clita kasd gubergren, no sea +takimata sanctus est. Consetetur sadipscing elitr, sed diam nonumy +eirmod tempor invidunt ut labore et do\%lo\%re magna. +.PP +Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, +no sea takimata sanctus est. At vero eos et accusam et justo duo +do\%lo\%res et ea rebum. +.RIGHT +\*[BD]\&...end of sample chapter +.COLLATE +\# +\# ===================================================================== +\# +\# Finally, a sample academic article, set in two columns with a +\# 1.5-pica gutter between them. This example also uses QUOTES, +\# BLOCKQUOTES and FOOTNOTES. In addition, it's set RECTO_VERSO, +\# with differing left and right margins that alternate from page to +\# page. (The header also flips from right to left, which you can +\# see on the 2nd and 3rd pages). +\# +\# In order to accomodate the narrow measure of the columns, there's also +\# a demonstration of things you can change with both the typesetting +\# macros and the document processing "control" macros. +\# +\# Reference macros +\# +.TITLE "CONTROL EQUALS CHAOS" +.SUBTITLE "\*[ALD1]The Psychological and Auditory \ +Impact of Serial vs. Aleatoric Music\*[RLD1]" +.AUTHOR "Joe Chang" "and" "Brad Hegel Connors" +.COPYRIGHT "2004 J. Chang, B.H. Connors +.MISC "Submitted June 3, 2004" "\*[IT]Piano Quarterly\*[PREV]" +\# +\# Docstyle macros +\# +.DOCTYPE DEFAULT +.COPYSTYLE FINAL +\# +\# Additional style macros -- general type parameters +\# +.L_MARGIN 6P +.R_MARGIN 4P+6p +.PT_SIZE 10 +.AUTOLEAD 1.5 +\# +\# Additional style macros -- change mom's default behaviour +\# +.RECTO_VERSO +.PAGENUM 1 +.HEADER_LEFT "Chang, Connors" \" Because we have two authors +.COLUMNS 2 1P+6p +.SUBTITLE_SIZE +1.5 +.AUTHOR_SIZE +.5 +.DOCHEADER_LEAD +2p +.HEADER_SIZE +1 +.PARA_INDENT 1P \" Comment this out if previewing PRINTSTYLE TYPEWRITE +.QUOTE_INDENT 2 \" Comment this out if previewing PRINTSTYLE TYPEWRITE +.SUBHEAD_SIZE +0 +.BLOCKQUOTE_FAMILY H +.BLOCKQUOTE_SIZE -2 +.NUMBER_HEADS OFF \" Because we turned them on in the first example +.NUMBER_SUBHEADS OFF \" Ibid +\# +.COVER TITLE AUTHOR COPYRIGHT MISC +\# +.START +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam +erat, sed diam voluptua. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren no sea takimata. Sanctus est, lorem ipsum dolor sit +amet. Consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor +invidunt ut labore et do\%lo\%re magna ali\%quyam erat. Sed diam voluptua +at vero eos et accusam et justo. +\# +.BLOCKQUOTE +Stet clita kasd gubergren, no sea takimata sanctus est lorem. +Ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy +eirmod tempor. Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua at vero. Eos et accusam et justo duo do\%lo\%res et +ea rebum stet clita.\c +.FOOTNOTE \" Note the use of \c, above, to keep the word and footnote marker together. +Clita ipsum dolor sit amet, consetetur sadipscing elitr. +.FOOTNOTE OFF +.BLOCKQUOTE OFF +\# +.PP +Duo do\%lo\%res et ea rebum, stet clita kasd gubergren. No sea takimata +sanctus est lorem ipsum dolor sit amet, consetetur sadipscing elitr. +Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam. Erat sed diam voluptua at. Vero eos et accusam et justo +duo do\%lo\%res et ea rebum stet. Clita kasd gubergren no sea takimata +sanctus est. +.PP +Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam +erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet +clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor +sit amet. Sadipscing\c +.FOOTNOTE +Sadipscing diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. +.FOOTNOTE OFF + elitr sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re +magna ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren no sea. +\# +.SUBHEAD "Schoenberg\(em" "The Origins of Serial Pitch Organization" +\# +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea +rebum. Stet clita kasd gubergren, no sea takimata sanctus est lorem. +Ipsum dolor sit amet consetetur sadipscing. Elitr, sed diam nonumy, +eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam erat sed +diam voluptua, at vero eos. Et accusam et justo duo do\%lo\%res et ea +rebum stet clita kasd gubergren lorem ipsum. Dolor sit amet +consetetur, sadipscing elitr, sed diam. Nonumy eirmod tempor invidunt +ut labore et do\%lo\%re. Magna ali\%quyam erat sed diam voluptua at vero. +Eos et accusam et justo duo do\%lo\%res et ea rebum stet clita kasd. +Gubergren no sea takimata sanctus est. +.PP +Amet consetetur sadipscing elitr sed diam nonumy eirmod. Tempor +invidunt ut labore. Et dolor\%e magna ali\%quyam erat, sed diam voluptua, +at vero. Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren. +.PP +No sea takimata\c +.FOOTNOTE +Takimata sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.FOOTNOTE OFF + sanctus est lorem. Ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo do\%lo\%res et ea rebum amet. Consetetur sadipscing +elitr sed diam nonumy eirmod tempor invidunt ut labore, et do\%lo\%re +magna ali\%quyam erat. Sed diam voluptua, at vero, eos et accusam et +justo duo do\%lo\%res et ea rebum. +\# +.SUBHEAD "Messiaen to Stockhausen\(em" "The Quest for Absolute Control" +\# +.PP +Vero eos et accusam et justo duo do\%lo\%res et ea rebum amet: +.QUOTE +Eirmod tempor invidunt +Ut labore et do\%lo\%re magna ali\%quyam erat +Sed diam voluptua +At vero eos et accusam et justo duo do\%lo\%res. +.QUOTE OFF +Lorem ipsum dolor sit amet, consetetur sadipscing elitr +sed diam. Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. +Aliquyam erat, sed diam voluptua at vero eos et accusam. Et +justo duo do\%lo\%res et ea rebum stet. +.PP +Elitr sed diam nonumy eirmod tempor. Invidunt ut labore et do\%lo\%re +magna ali\%quyam erat sed. Diam voluptua at vero eos et accusam et +justo duo do\%lo\%res et ea rebum. +\# +.BLOCKQUOTE +Sanctus est lorem ipsum dolor sit amet, consetetur sadipscing. Elitr, +sed diam nonumy eirmod tempor, invidunt ut labore et do\%lo\%re magna +ali\%quyam. Erat sed diam voluptua, at vero eos et accusam et justo +rebum amet. Consetetur sadipsc\%ing elitr sed diam nonumy eirmod +sed diam nonumy, eirmod tempor. Invidunt tempor invidunt ut labore.\c +.FOOTNOTE +Labore diam nonumy eirmod tempor, invidunt ut labore et do\%lo\%re +magna ali\%quyam. Erat sed diam voluptua, at vero eos et accusam et +justo. +.FOOTNOTE OFF + Et do\%lo\%re et magna ali\%quyam erat, sed diam voluptua, at vero. +Eos et accusam et justo duo. +.BLOCKQUOTE OFF +\# +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. +.PP +Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam +erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet +clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor +sit amet. Sadipscing elitr sed diam nonumy eirmod tempor invidunt. +Ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +Stet clita kasd gubergren no sea. Ali\%quyam erat, sed diam voluptua. +\# +.SUBHEAD "John Cage\(em" "Leaving It All to Chance" +\# +.PP +Sit amet, consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor +invidunt ut labore et do\%lo\%re magna. Ali\%quyam erat, sed diam +voluptua at vero. Eos et accusam et justo duo dolores et ea rebum. +Stet clita kasd gubergren, no sea taki\%mata sanctus est. +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero +eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus est lorem. Ipsum dolor sit amet, +consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero +eos et accusam et justo duo do\%lo\%res et ea rebum. +.PP +Stet clita kasd gubergren. No sea takimata sanctus est lorem ipsum +dolor sit. Amet consetetur sadipscing elitr, sed diam nonumy eirmod +tempor. Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua, at vero. Eos et accusam et justo duo do\%lo\%res et ea rebum. +Stet clita kasd gubergren, no sea takimata. Sanctus est lorem ipsum +dolor sit amet consetetur. Sadipscing elitr sed diam nonumy eirmod +tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +\# +.BLOCKQUOTE +.PP +Stet clita kasd gubergren no sea. Takimata sanctus est lorem ipsum +dolor sit amet. Consetetur sadipscing elitr sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re. Magna ali\%quyam\c +.FOOTNOTE +Aliquyam nonumy eirmod tempor invidunt ut labore. +.FOOTNOTE OFF + erat, sed diam +voluptua at vero eos et accusam. Et justo duo do\%lo\%res et ea rebum, +stet clita kasd gubergren, no sea takimata. +.PP +Sanctus est lorem ipsum. Dolor sit amet consetetur sadipscing +elitr. Sed diam nonumy eirmod tempor invidunt ut labore. Et +do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo. Dolores et ea rebum stet clita kasd gubergren +no sea. +.PP +Takimata lorem ipsum dolor sit amet consetetur sadipscing elitr. +Sed diam, nonumy eirmod tempor, invidunt ut labore et do\%lo\%re magna. +Aliquyam erat sed diam voluptua. At vero eos et accusam et +justo.\c +.FOOTNOTE +Justo vero eos et accusam et justo duo. +.FOOTNOTE OFF +.BLOCKQUOTE OFF +\# +.PP +Duo do\%lo\%res et ea rebum, stet clita kasd gubergren, no sea takimata +sanctus. Est lorem ipsum. Dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy. Eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam. +.PP +Et justo duo do\%lo\%res et ea rebum stet clita kasd. Gubergren +no sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et dolore magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, +no sea takimata sanctus est. +\# +.SUBHEAD "Beyond Cage\(em" "Catching the Midnight Train" +\# +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam +erat, sed diam voluptua. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren no sea takimata. Sanctus est, lorem ipsum dolor sit +amet. Consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor +invidunt ut labore et do\%lo\%re magna ali\%quyam erat. Sed diam voluptua +at vero eos et accusam et justo. +.PP +Duo do\%lo\%res et ea rebum, stet clita kasd gubergren. No sea takimata +sanctus est lorem ipsum dolor sit amet, consetetur sadipscing elitr. +Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam. Erat sed diam voluptua at. Vero eos et accusam et justo +duo do\%lo\%res et ea rebum stet. Clita kasd gubergren no sea takimata +sanctus est. +.PP +Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam +erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet +clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor +sit amet. Sadipscing\c +.FOOTNOTE +Sadipscing diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. +.FOOTNOTE OFF + elitr sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re +magna ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren no sea +takimata lorem. Ipsum dolor sit amet, consetetur sadipscing elitr. +Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. +Ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo +duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea +takimata sanctus est. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed +diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo +duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea +takimata sanctus est. +.RIGHT +\*[BD]\&...end of sample article\*[PREV] +.FINIS diff --git a/contrib/mom/examples/typesetting.mom b/contrib/mom/examples/typesetting.mom new file mode 100644 index 0000000..83bc53f --- /dev/null +++ b/contrib/mom/examples/typesetting.mom @@ -0,0 +1,673 @@ +\# Most mom users rely on mom's document processing macros to format +\# their work. The doc processing macros take care of all things +\# typographic and are simple, clear and easy to learn. The kind of +\# "by hand" typesetting this file shows off is really geared toward +\# professional typographers. Bear in mind, though, that the full +\# power of mom's typesetting capabilities can be brought to bear +\# on document processing as well. +\# +\# Basic page setup +\# +.PAGE 8.5i 11i \" Printer sheet size +.L_MARGIN 1i \" Left margin 1 inch +.R_MARGIN 1i \" Right margin 1 inch (calculates the line length) +\# +\# Basic type parameters +\# +.FAMILY T \" Times Roman family +.FT B \" Bold font +.PT_SIZE 12 \" Point size +.LS 14 \" Leading (line spacing) +.LEFT \" Set lines flush left, nofill mode +\# +\# Refinements +\# +.HY \" Hyphenate +.KERN \" Automatic pairwise kerning +.LIGATURES \" Automatic ligature generation +.SMARTQUOTES \" Enable smartquotes +.SS 0 \" No extra space between sentences +\# +.ALD 1i-1v \" Advance 1 inch from top of paper to first baseline +Example 1\*[BU 2]: +.ALD .25v \" Advance an extra 1/4 linespace +.UNDERSCORE 3.75p "T\*[BU 4]asting notes using padding, string tabs \ +and multi-columns" +\# +.SP \" Add an extra line space +\# +.FAM H \" Helvetica family +.PT_SIZE 10 +.LS 11 \" New leading +\# +\# The following uses a combination of padding, string tabs, and the +\# FWD escape to set up five tabs with 1-pica gutters stretched over +\# the full line length. +\# +.SILENT \" Don't print the next line +.PAD "\*[ST1]VIN#\*[ST1X]\*[FWD 1P]\*[ST2]ROBE#\*[ST2X]\*[FWD 1P]\*[ST3]NEZ#\*[ST3X]\*[FWD 1P]\*[ST4]BOUCHE#\*[ST4X]\*[FWD 1P]\*[ST5]COMMENTAIRES\*[ST5X]" +.SILENT OFF \" Resume normal printing of text +\# +\# Now that the string tabs have been marked off, we "set" them. +\# +.ST 1 L \" First string tab flush left, nofill mode (no need for .BR's between input lines) +.ST 2 L QUAD \" Remaining tabs are flush left/rag right, fill mode +.ST 3 L QUAD +.ST 4 L QUAD +.ST 5 L QUAD +\# +.TAB 1 \" Call first tab +.UNDERSCORE "VIN" +.TN \" Move to next tab and stay on the same baseline +.UNDERSCORE "ROBE" +.TN \" Ibid +.UNDERSCORE "NEZ" +.TN \" Ibid +.UNDERSCORE "BOUCHE" +.TN \" Ibid +.UNDERSCORE "COMMENTAIRES" +.TQ \" Quit tabs +\# +.ALD 6p \" Advance an extra 6 points +.FT R \" Change font to roman (medium) +.MCO \" Turn multi-column mode on +\# +.TAB 1 \" Notice that this tab gets set line-for-line +\*[IT]Peelee Island \" Set italic +\*[PREV]Gewürztraminer \" Revert to former font (roman) +2000 +(Canada) +.MCR \" Return to top of column +.TAB 2 \" Call tab 2; in multi-column mode, don't use .TN +Jaune pâle. +.MCR +.TB 3 \" Notice that from here on, we use the alias TB instead of TAB +Frais, fruité, ci\%tronné, arômes fortes de lichee et de fruits +tropicaux. +.MCR +.TB 4 +Doux, fruité, bien équilibré avec une bonne acidité. +.MCR +.TB 5 +Bon apéro. Servir avec des plats +.RW .1 \" Reduce Whitespace between letters to tighten this line +indiens ou \%chinois. +.RW 0 \" Back to normal spacing between letters +.BR +Excellent rapport qualité/prix. +.MCX 8p \" Multi-column mode off; advance an extra 8 points +.MCO \" Re-invoke multi-columns for next wine description +.TB 1 +\*[IT]Carau Pujol +\*[ROM]Tannat +1995 +(Uraguay) +.MCR +.TB 2 +Rubis foncé, vio\%lacée, presque opaque. +.MCR +.TB 3 +Belles arômes de fruits foncés (prunes, cerises noires, cassis). +Odeurs tertiares de cuir, cèdre, violets, eucalyptus, avec une trace +exotique de Band-Aid*\*[BU 12]. +\# +\# The \*[BU 12], above, pulls the period back so that it falls +\# underneath the asterisk. \*[BP] could have been used instead +\# if you prefer to use points rather than kern units. +\# +.MCR +.TB 4 +Très rond, tannins mûres et veloutés, avec un long finis fruité et +doucement alcoolique. +.MCR +.TB 5 +Superbe\|! Une aubaine à ne pas manquer. Prêt à boire maintenant. +.MCX 1v \" Multi-columns off; advance an extra linespace +\# +\# Now, an example of a hanging indent. This is excessively fussy +\# from a typographic standpoint in that it hangs the asterisk outside +\# the current left margin so that the text following it lines up with +\# with the text in the tasting notes. Notice that in order to use a +\# hanging indent, you must first set a left indent. +\# +.FT I \" Change font to italic +.PT_SIZE -.5 \" Reduce point size by 1/2 point +.LS -.5 \" Reduce leading by 1/2 point +.JUSTIFY \" Set text justified +\# +\# Now, move the left margin back by the width of an asterisk plus 2 points... +\# +.L_MARGIN -(\w'*'+2p) +\# +\# ...and set a left indent equal to the width of an asterisk plus 2 points +\# +.IL \w'*'+2p +\# +\# Now, set the hanging indent equal to the left indent, effectively pulling +\# the first line of the following text back to the new left margin. +\# Subsequent output lines will be indented by the .IL amount. +\# Notice that when using the \w inline escape, there's no need to append +\# a unit of measure to it. +\# +.HI \w'*'+2p +*\*[FWD 1p]The term "Band-Aid" means the slightly sweet, vaguely chemical +smell associated with medical-grade plastics. It is often found in +wines from terroirs in South America. Provided a wine has a sufficient +concentration of fruit +.RW .04 \" Kern the whole next line slightly, so "lipstick" doesn't hyphenate. +aromas and complex tertiary characteristics, Band-Aid is a Good Thing. +Otherwise, it smells like cheap lipstick. +.RW 0 \" Reset kerning to 0 +\# +\# Notice, above, that although the values for IL and HI are the width +\# of an asterisk plus 2 points, when setting the first line of text +\# (the one with the asterisk at the beginning), we put only 1 point of +\# space after the *. This is to compensate for the fact that in the +\# italic font, the letter T doesn't align visually with the rest of +\# the text. As already noted, this is an extremely fussy example. :) +\# +.IQ CLEAR \" Cancel and clear stored indent values +.L_MARGIN 1i \" Reset left margin to its original value. +\# +.ALD 2P \" Add 2-picas extra space before next example +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +\# +Example 2: +.ALD .25v +\# +.COMMENT \" COMMENT lets you enter comments without using \# or \" +In the next line, because the string to be underscored must be +enclosed in double-quotes, you can't use the double-quote character +itself around the word "Massaging". We circumvent this by using the +groff inline escapes \(lq and \(rq (leftquote and rightquote). +.COMMENT OFF \" Remember to turn COMMENT off! +\# +.UNDERSCORE 3.75p "\(lqMassaging\(rq \*[BCK 1p]a passage of rag right text" +.SP \" Add an extra linespace +\# +.PT_SIZE 12.5 +.LS 14 +.PT_SIZE -1 \" Reduce point size by 1 point +Passage using groff spacing defaults +\# +.ALD .5v \" Add an extra 1/2 line space +\# +.PT_SIZE +1 \" Restore point size +.QUAD LEFT \" Set quad left, fill mode +.IB 3P \" Indent 3 picas from both the left and right margins +.FT R +The thousand injuries of Fortunato I had borne as I best could; +but when he ventured upon insult, I vowed revenge. You, who so well +know the nature of my soul, will not suppose, however, that I gave +utterance to a threat. \*[IT]At length\*[PREV] I would be +avenged; this was a point definitively settled\(embut the very +definitiveness with which it was resolved, precluded the idea of +risk. I must not only punish, but punish with impunity. A +wrong is unredressed when retribution overtakes its redresser. +It is equally unredressed when the avenger fails to make himself +felt as such to him who has done the wrong. +.ALD 6p +\# +\# The next line is set quad right, nofill mode, 1/2 point smaller +\# than the preceding text (using the \*[SIZE ] inline escape. +\# +.RIGHT +\*[SIZE -.5]\(emEdgar Allen Poe, \*[IT]The Cask of Amontillado\*[PREV]\*[SIZE +.5] +.SP \" Extra linespace +.IBQ \" Disable "indent both" +\# +\# The passage above, while acceptable in a longer document, exhibits a +\# few typographic flaws. The shape of the right margin rag exhibits +\# a decidedly "rounded" appearance. The word "I" stands alone at the +\# end of the third line. The space between the 1st and 2nd sentences +\# ("...revenge. You...") is too large, owing to the letter "Y" that +\# begins the 2nd sentence. The spacing between "A wrong..." (line 6) +\# is equally too large because of the way "A" and "w" fit together. +\# The em-dash before Edgar isn't vertically centered with the letter "E". +\# And so on. The most important correction below is fixing the rag +\# so that longer and shorter lines alternate. This is accomplished by +\# manually breaking lines and then slightly lengthening and shortening +\# them until a pleasing rag is achieved. The remainder of the little +\# flaws are fixed with inline escapes. +\# +.FT B +.PT_SIZE -1 +.LEFT +The same passage, \*[BU 4]"massaged" +\# +.ALD .5v +\# +.FT R +.PT_SIZE +1 +.QUAD LEFT +.HY OFF \" Turn automatic hyphenation off +.BR_AT_LINE_KERN \" Automatically insert a line break (.BR) with each invocation of .RW and .EW +.WS +1 \" Increase word space slightly +.IB \" Turn "indent both" back on; values are the same as before +\# +The thousand injuries of Fortunato I had borne as I best could; but +when he ventured upon insult, I \*[BU 2]vowed revenge. \*[BU 4]Y\*[BU 6]ou, +\*[BU 4]who so \*[BU 2]well know the nature +.EW .2 +of my soul, \*[BU 2]will not suppose, however, that I gave utterance to +a threat. \*[IT]At +.EW .2 +length\*[PREV] I would be avenged; this was a point definitively +settled\(embut the +.EW .2 +v\*[BU 1]ery definitiveness with which it was resolved, precluded the idea +of risk. +.EW 0 +I must not only punish, but punish with impunity. A \*[BCK 1p]wrong is +unredressed +.EW .1 +when retribution overtakes its redresser. It is equally unredressed +when the +.RW .1 +avenger fails to make himself felt as such to him \*[BU 2]who has done +the wrong. +.RW 0 \" Restore normal kerning +.WS +0 \" Restore normal wordspacing +.ALD 6p +.PT_SIZE -.5 +.RIGHT +\*[UP 1.5p]\(em\*[DOWN 1.5p]\*[BCK 1p]Edgar \*[BCK 1p]Allen Poe, \*[IT]The Cask of Amontillado\*[PREV] +.IQ CLEAR \" Cancel and clear stored values of all indents +\# +\# +.NEWPAGE \" Start a new page +.T_MARGIN 1i \" Set top margin to 1i (approx. equivalent to .ALD 1i-1v above) +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +\# +Example 3: +.ALD .25v +.UNDERSCORE 3.75p "A \*[BU 2]recipe for enumerated lists using indents" +.SP .5v \" Add an extra half line space +.FAM N \" New Century Schoolbook family +.FT R +.PT_SIZE 11 +.LS 13 +.HY \" Turn hyphenation back on +.JUSTIFY \" Justify text +This example demonstrates the use of left and hanging indents for +simple enumerated lists. Nested lists are possible, as the example +shows; however, the more complex the nesting, the wiser it becomes +to use (string) tabs, as seen in Example 4. +.TI 1.5m +\*[BD]Please note: mom\*[PREV] has macros that allow you to set +enumerated lists automatically. These examples merely show hanging +indents and string tabs in use. +\# +.JUSTIFY \" Justify text +.IL \w'\0.\0' \" Establish a left indent equal to the width of 2 figure spaces plus a period. +.HI \w'\0.\0' \" Establish a hanging indent equal to the size of the left indent. +.ALD 6p +\# +\# +1.\0This is the first item in the list. N\*[BU 2]otice how the first line +"hangs" back from the remaining text, which is otherwise +indented by the width of by two figure-spaces (digit-width +spaces) and a period. +.BR +.HI \" Notice that HI doesn't require an argument once the value's been set +.ALD 6p +2.\0This is the second item in the list. As with the above item, +notice the use of the \*[BU 8]\\0 escape sequence in the input text. It's +there to ensure that the space after the number/period combination +always remains the same (i.e. doesn't stretch when the line is +justified). That way, the text of each item always lines up perfectly. +\# +.COMMENT +Now we're going to set a bullet-point list, indented from the text +above by 1 pica. IL arguments are always added to whatever value +is in already effect for IL, hence all we have to do is tell mom to +indent (from the current left indent) 1 pica plus the width of the +bullet character ( \(bu ). \*[FWD 3p] puts three points of space after +the bullet so that the bullet and the text are visually separated. +.COMMENT OFF +\# +\# +.IL 1P+\w'\(bu\*[FWD 3p]' +\# +\# Hanging indents are always relative to the current left indent. +\# The additional 1-pica indent, above, already having been taken +\# care of, we only want to hang the first lines of bullet list items +\# back by the width of the bullet character plus its 3 extra +\# points of space. +\# +.ALD 6p +.HI \w'\(bu\*[FWD 3p]' +\*[DOWN 1p]\(bu\*[UP 1p]\*[FWD 3p]This is the first line of a sublist with bullets. +N\*[BU 2]otice how the first line (the one with the bullet) is indented +exactly one pica from the text of the list item above it, while the +remaining lines align with the left indent we set above. +.ALD 6p +.HI +\*[DOWN 1p]\(bu\*[UP 1p]\*[FWD 3p]This is the second item of the sublist with bullets. \*[BU 4]We +could go on indefinitely, but let's go back to the top level (numbered) +list... +\# +\# The easiest way to return to a previous indent value is by subtraction. +\# The argument to IL, above, was 1P+\w'\(bu\*[FWD 3p]', so we just reverse +\# it by putting a minus sign in front. The parentheses are required +\# for groff to evaluate the expression properly. +\# +.IL -(1P+\w'\(bu\*[FWD 3p]') +.HI \w'\0.\0' \" Reset hanging indent for use with numbered items. +.ALD 6p +3.\0...and here we are. +.HI \" Again, notice that once HI has been set, you don't have to keep passing it an argument. +.ALD 6p +4.\0In order not to make the example too long, we'll stop here. +.IQ CLEAR \" Don't forget to cancel and/or clear indents! +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +.SP +\# +Example 4: +.ALD .25v +.UNDERSCORE 3.75p "A \*[BU 2]recipe for nested lists using string tabs" +.SP .5v +.FAM N +.FT R +.PT_SIZE 11 +.LS 13 +.JUSTIFY +Although setting up string tabs is a bit more complex than setting +up indents, it's \*[BU 3]well worth the effort, especially for nested lists. +.ALD 6p +\# +.COMMENT +The PAD line, below, sets up two string tabs. The first (ST1) +is exactly the length of two figure spaces and a period. The +second (ST2) is simply "the remainder of the line." +.COMMENT OFF +\# +.SILENT \" Don't print any of this +.PAD "\*[ST1]\0.\0\*[ST1X]\*[ST2]#\*[ST2X]" +.ST 1 L \" String tabs must be "set" after being marked off in a line +.ST 2 J \" ST 1 will be set flush left, nofill; ST 2 will be justified. +.SILENT OFF \" Restore printing +\# +.TB 1 +1. +.TN \" Use .TN here so text stays on the same baseline as the number in tab 1 +This is the first item in the list. N\*[BU 2]otice how, just as in Example 3, +the first line hangs back from the remaining text, which is otherwise +indented. +.ALD 6p +.TB 1 +2. +.TN +This is the second item in the list. N\*[BU 2]otice that when setting "lists" +with tabs, there's no need to use the \*[BU 8]\\0 escape sequence after +the number/period combination in the input text. +.ALD 6p +\# +.COMMENT +Now, set up the indented bullet-point sublist. The PAD line +says: move forward 12 points (1 pica), then mark off a string +tab (ST3) that's the length of the bullet character; move foward +another three points, then make the next string tab (ST4) the +length of remainder of the line. +.COMMENT OFF +\# +.SILENT +.PAD "\*[FWD 12p]\*[ST3]\(bu\*[ST3X]\*[FWD 3p]\*[ST4]#\*[ST4X]" +.ST 3 L +.ST 4 J +.SILENT OFF +.ALD 6p +.TB 3 +\*[DOWN 1p]\(bu\*[UP 1p] +.TN +This is the first line of a sublist with bullets. N\*[BU 2]otice how the +bullets and the text line up exactly the same as in Example 3. +.ALD 6p +.TB 3 +\*[DOWN 1p]\(bu\*[UP 1p] +.TN +This is the second item of the sublist with bullets. For the fun of +it, lets add in an +.SPREAD +en-dashed sub-sublist. +.BR \" We're in a fill mode right now, so you *must* terminate the line with BR +\# +.SILENT +.PAD "\*[FWD 12p]\*[ST5]\(en\*[ST5X]\*[FWD 4p]\*[ST6]#\*[ST6X]" +.ST 5 L +.ST 6 J +.SILENT OFF +.ALD 6p +.TB 5 +\*[UP .75p]\(en\*[DOWN .75p] +.TN +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, +sed diam voluptua. +.ALD 6p +.TB 5 +\*[UP .75p]\(en\*[DOWN .75p] +.TN +At \*[BU 3]vero eos et accusam et justo duo dolores et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. +.ALD 6p +.TB 1 +3. +.TN +And here we are, back at the top-level numbered list with a minimum +of muss and fuss, +.ALD 6p +.TB 1 +4. +.TN +Generally speaking, once you get the hang of string tabs and the +\*[BD]PAD\*[PREV] macro, you'll find setting up complex nested lists +(or anything similar to them) easier than with hanging indents. +.TQ +\# +.NEWPAGE +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +\# +Example 5: +.ALD .25v +.UNDERSCORE 3.75p "Word spacing" +.ALD 8p +.FAM P \" Palatino family +.PT_SIZE 11 +.LS 14 +\# +\# The "label" lines for the following are set in Helvetica bold, one +\# point smaller than the examples themselves. This demonstrates the +\# use of the groff inline escape \f[...] to change both family and +\# font inline. It also shows using the mom inline \*S[...], which is +\# an alternate form of the inline, \*[SIZE ] +\# +\f[HB]\*S[-1]Normal word spacing\*S[+1]\*[PREV] +.FT R +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.ALD 4p +\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]\*[BU 1]2\*S[+1]\*[PREV] +.FT R +.WS +2 +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.WS +0 +.ALD 4p +\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]4\*S[+1]\*[PREV] +.FT R +.WS +4 +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.WS +0 +.ALD 4p +\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]6\*S[+1]\*[PREV] +.FT R +.WS +6 +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.WS +0 +.SP 1.5v +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +\# +.LEFT +Example 6: +.ALD .25v +.UNDERSCORE 3.75p "Line kerning" +.ALD 8p +.FAM P \" Palatino family +.FT R +.PT_SIZE 11 +.LS 15 +\# +\# Here, we set up some tabs so the examples can go into facing columns. +\# +.TAB_SET 1 0 19.5P L +.TAB_SET 2 19.5P 19.5P L +\# +.MCO \" Turn multi-columns on +.TB 1 +\f[HB]\*S[-1]Unkerned line\*S[+1]\*[PREV] +.FT R +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "tightened" \(en .RW .1\*S[+1]\*[PREV] +.RW .1 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\# +\# In the next line, notice that because it uses a different family +\# (Helvetica instead of Palatino), the RW macro doesn't affect it. +\# +\f[HB]\*S[-1]Line "tightened" \(en .RW .2\*S[+1]\*[PREV] +.RW .2 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "tightened" \(en .RW .3\*S[+1]\*[PREV] +.RW .3 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.MCR +.TB 2 +\f[HB]\*S[-1]Unkerned line\*S[+1]\*[PREV] +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "loosened" \(en .EW .1\*S[+1]\*[PREV] +.EW .1 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "loosened" \(en .EW .2\*S[+1]\*[PREV] +.EW .2 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "loosened" \(en .EW .3\*S[+1]\*[PREV] +.EW .3 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.MCX 1.5v +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +\# +Example 7: +.ALD .25v +.UNDERSCORE 3.75p "Cutaround using left\*[FU 2]/right indents, multi columns \ +and a dropcap" +.SP +\# +.FT R +.PT_SIZE 11 +.LS 12 +.BR_AT_LINE_KERN OFF \" In justified text, it's best to have this OFF +\# +.TAB_SET 1 0 18.5P J +.TAB_SET 2 20.5P 18.5P J +.MCO +.ALD 5P+9p +\# +\# The little picture of tux. +\# +.PSPIC penguin.ps +.MCR +.TAB 1 +.XCOLOR red \" Initialize the X11 color, red +.DROPCAP_COLOR red +.DROPCAP_FONT B +.DROPCAP L 3 COND 80 \" i.e. the letter L dropped 3 lines, condensed to 80% of its normal width +.EW .2 +orem ipsum dolor sit amet, consetetur sa\%dip\%scing elitr, sed diam +nonumy eir\%mod tempor invidunt ut labore et dolore magna aliquyam erat, +sed diam voluptua. +.EW 0 +.TI 1P +At vero eos et accusam et justo duo dolores et ea rebum. Stet clita +kasd gubergren, no sea taki- +.SPREAD \" Force justify preceding line before starting indent +.IR 3.5P +kimata sanctus est lorem ipsum dolor sit amet. +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor. +.EW .2 +.TI +Invidunt ut labore et dolore magna ali\%qu\%yam erat, sed diam voluptua. +At +.EW 0 +vero eos et accusam et justo duo dolores et ea rebum. +.TI +Stet clita kasd gubergren, no sea ta- +.SPREAD \" Force justify preceding line before quitting indent +.IRQ +kimata sanctus est lorem ipsum dolor sit amet. Lorem ipsum dolor +sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor +in\%vi\%dunt ut labore et dolore magna aliquyam erat. Sed diam voluptua, +at vero eos et accusam et justo duo +.SPREAD +.EW .3 +dolores et ea rebum. Stet clita no kasd guber- +.SPREAD +.MCR +.TB 2 +gren, no sea takimata sanctus est lorem ipsum +.EW 0 +dolor sit amet. Consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et dolore. +.TI +Magna aliquyam erat, sed diam voluptua, at vero eos et accusam. +Et justo duo dolores et ea +.SPREAD +.IL 3.5P +rebum, stet clita kasd gubergren. No sea +takimata sanctus est, lorem ipsum dolor sit amet. +.TI +Sit amet, consetetur sadipscing elitr, sed diam. Nonumy eirmod tempor +in\%vi- +.EW .3 +dunt ut labore et dolore magna. Ali- +.EW 0 +quyam erat sed diam voluptua. +At vero eos et accusam et justo duo dolores et ea rebum stet. +.ILQ +.TI +Dolores et ea rebum stet clita kasd gubergren, no sea takimata +sanctus. Sadipscing elitr sed diam, nonumy eirmod tempor, invidunt +ut labore et dolore magna aliquyam erat. Sed diam voluptua, at vero +eos et accusam et justo duo dolores et ea rebum. diff --git a/contrib/mom/groff_mom.man b/contrib/mom/groff_mom.man new file mode 100644 index 0000000..b82fcad --- /dev/null +++ b/contrib/mom/groff_mom.man @@ -0,0 +1,101 @@ +.ig +This file is part of groff, the GNU roff type-setting system. + +Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +written by Werner Lemberg + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.1 or +any later version published by the Free Software Foundation; with the +Invariant Sections being this .ig-section and AUTHORS, with no +Front-Cover Texts, and with no Back-Cover Texts. + +A copy of the Free Documentation License is included as a file called +FDL in the main directory of the groff source package. +.. +. +.do nr groff_mom_C \n[.C] +.cp 0 +. +.mso www.tmac +. +.de TQ +.br +.ns +.TP \\$1 +.. +. +.TH GROFF_MOM @MAN7EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +.SH NAME +. +groff_mom \- groff `mom' macros +. +. +.SH SYNOPSIS +. +.B groff +.B \-mom +[ +.IR files .\|.\|.\& +] +.br +.B groff +.B \-m\ mom +[ +.IR files .\|.\|.\& +] +. +. +.SH DESCRIPTION +. +.B mom +(\[lq]my own macros\[rq], \[lq]my other macros\[rq], \[lq]maximum +overdrive macros\[rq], .\|.\|.\&) is a macro set for groff, designed +primarily to format documents for PostScript output. +.PP +.B mom +provides two categories of macros: macros for typesetting and macros +for document processing. +The typesetting macros provide access to groff's typesetting power in +ways that are simpler to master and to use than groff's primitives. +The document processing macros provide customizable markup +\[lq]tags\[rq] that allow the user to design and output +professional-looking documents with a minimum of typesetting +intervention. +.PP +mom comes with her own (very) complete documentation in HTML format. +. +.SH FILES +.TP +.B om.tmac +\[en] the main macro file +.TQ +.B mom.tmac +\[en] a wrapper file that calls om.tmac directly. +. +.TP +.URL @HTMLDOCDIR@/momdoc/toc.html @HTMLDOCDIR@/momdoc/toc.html +\[en] entry point to the HTML documentation +. +.TP +.B @EXAMPLEDIR@/*.mom +\[en] example files using mom +. +. +.SH AUTHOR +. +.B mom +was written by +.MTO peter@faustus.dyn.ca "Peter Schaffter" . +Please send bug reports to the +.MTO bug-groff@gnu.org "groff bug mailing list" +or directly to the author, either at the address above or to +.MTO ptpi@golden.net "" . +. +.cp \n[groff_mom_C] +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff --git a/contrib/mom/mom.tmac b/contrib/mom/mom.tmac new file mode 100644 index 0000000..b1b0b18 --- /dev/null +++ b/contrib/mom/mom.tmac @@ -0,0 +1,3 @@ +.\" mom.tmac +.\" +.do mso om.tmac diff --git a/contrib/mom/momdoc/appendices.html b/contrib/mom/momdoc/appendices.html new file mode 100644 index 0000000..6b5b63f --- /dev/null +++ b/contrib/mom/momdoc/appendices.html @@ -0,0 +1,692 @@ + + + + +Mom -- Appendices + + + + + +Next   +Prev   +Back to Table of Contents +

+ + + +

APPENDICES

+ + + + + +

Further notes on this documentation

+
+ +Some mom users are sure to ask: "Why is this +documentation in html? If mom's so great, why not +typeset the whole thing to show her off? And if groff's so great, +why not write a man page?" +

+Valid questions, to be sure, and mom has +answers. (Okay -- I have answers, but I speak for +mom.) +

+The documentation is in html because I still find it the best tool +for navigating lengthy manuals. Html, with its anchors and links, +came into being precisely so people could do something they'd never +been able to with the printed word: instantly track down internal +and external references in a document. +

+To me, it's essential that people reading mom's +documentation never have difficulty finding precisely the macro +they need for a particular task. Equally, when reading up on +a macro, they should never be presented with terms or other +macro names for which they cannot instantly find accurate explanations. +Short of having written the documentation in TeX for the info browser +(and TeX bloat is one of the reasons I prefer to typeset with groff), +I can think of no better way to achieve the kind of truly useful +documentation I wanted than html. +

+Another reason for html is that working with mom +necessarily involves creating files inside a text editor. I use +elvis, a truly fabulous vi clone that does a terrific job of rendering +basic (text only) html. I may have written mom, +but I still regularly call on her documentation. Elvis, with its +html capabilities, lets me write and format mom +documents AND peruse her documentation, clicking on links as +necessary, without ever leaving the comfy confines of my +text editor. +

+Not everyone, of course, uses an editor with html capabilities. +For them, firing up a browser is obviously necessary for reading +mom's documentation. Browsers being what they are, +and not everyone on the globe having the cash for muscle machines +to run Galeon, or Konqueror or Mozilla, their browser +needs to be fast and light--and probably "text-only". +

+Some mom users may notice the absence of graphics, +frames, and (for the most part) tables in this documentation. The +reason is simple: text-only browsers. People who, for whatever +reason (choice or necessity), use lynx, or links or w3m to read +the documentation must be able to make sense of it. All of it. +Graphical examples of mom in action might have made +some parts of the documentation easier to write, but would have +excluded text-only browser users. And it goes without saying that +the documentation looks fine if you're reading it in a graphical +browser. +
+


+ + + + +

Adding PostScript fonts to groff

+
+ + +Small note: the term <prefix> in this +section refers to the directory in which groff is installed, +typically something like /usr/share/groff/<version#> +(for distro-specific, pre-compiled groff packages) or +/usr/local/share/groff/<version#> (if you've built groff +from source). +

+Groff comes with a small library of PostScript +families +(see the +FAMILY +macro for a list). The families have four +fonts +associated with them. These fonts are a combination of +weight +and +shape: +
+

    +
  • R (Roman, usually Medium weight), +
  • I (Italic, usually Medium weight), +
  • B (Bold, usually Roman shape) and +
  • BI (Bold Italic). +
+

+If you do a lot of document processing or typesetting with +mom, you'll find, sooner or later, that these +families and their associated fonts aren't sufficient. You'll want +to supplement them, either with more fonts for the families already +provided--"Damn! I need Helvetica Bold Condensed Italic!"--or with +entire new families. +

+Without going into the gory details (yet), while it's true that +adding fonts to groff is a relatively straightforward +process, extending existing families or adding new ones requires +some planning. +

+The traditional approach to extending groff families has been +to create new families for non-default weights and +shapes (e.g. Light, which is a weight; Condensed, which is a +shape), then to associate them with groff's predefined R, +I, B and BI font styles. An example +of this can be seen in the groff PostScript font library itself +(<prefix>/font/devps/): there's one "family" for +Helvetica (HR, HI, HB, HBI) and another for Helvetica Narrow (HNR, +HNI, HNB, HNBI). +

+The difficulty with this approach is that typographers +tend to think of "families" as referring to the +entire set of font weights and shapes associated with a +particular family name. For example, when a typesetter says +"the Helvetica family", s/he is including the weights Helvetica Thin, +Helvetic Light, Helvetica Regular, Helvetica Bold, Helvetica Heavy, +etc, and all their associated +shapes +(Roman, +Italic, Condensed, Narrow, Extended, Outline, etc). +

+Thus, intuitively, when a typesetter gives mom a +.FAM(ILY) directive, s/he reasonably expects that any +subsequent .FT directive will access the desired font +from the Helvetica family--without the need to state explicitly both +family and font to .FT, as it is explained one can do in +the +FAMILY +and +FT +sections of these documents. +

+If one had, say, the fonts, Helvetica Light Roman +and Helvetica Light Italic as well as Helvetica Light Condensed +Roman and Helvetica Light Condensed Italic, the traditional +approach would require two "partial" families: HLR/HLI and +HLCDR/HLCDI. Accessing these family/font combos +routinely throughout a document would then require +changing family (with .FAM(ILY)) and selecting the +desired font (with .FT R or .FT I), or +passing .FT the lengthy family+fontname (.e.g. .FT +HLCDI). +

+Fortunately, groff provides a mechanism whereby it's possible to +extend the basic R, I, B and BI +fonts ("styles" in groff-speak) so that one can, in +fact, create extensive type families, and access all the fonts +in them with .ft (groff) or .FT (mom). +

+mom uses this mechanism to offer, in addition to +groff's default PostScript font styles, the following: +

+ +

+Mom's extensions to groff's basic font styles
+=============================================
+
+	L      =  Light Roman
+	LI     =  Light Italic
+	LCD    =  Light Condensed Roman
+	LCDI   =  Light Condensed Italic
+	LEX    =  Light Extended Roman
+	LEXI   =  Light Extended Italic
+	CD     =  Medium/Book Condensed Roman
+	CDI    =  Medium/Book Condensed Italic
+	EX     =  Medium/Book Extended Roman
+	EXI    =  Medium/Book Extended Italic
+	DB     =  DemiBold Roman
+	DBI    =  DemiBold Italic
+	BCD    =  Bold Condensed Roman
+	BCDI   =  Bold Condensed Italic
+	BEX    =  Bold Extended Roman
+	BEXI   =  Bold Extended Italic
+	HV     =  Heavy Roman
+	HVI    =  Heavy Italic
+	HVCD   =  Heavy Condensed Roman
+	HVCDI  =  Heavy Condensed Italic
+	HVEX   =  Heavy Extended Roman
+	HVEXI  =  Heavy Extended Italic
+	BL     =  Black Roman
+	BLI    =  Black Italic
+	BLCD   =  Black Condensed Roman
+	BLCDI  =  Black Condensed Italic
+	BLEX   =  Black Extended Roman
+	BLEXI  =  Black Extended Italic
+	UBL    =  Ultra-Black Roman
+	UBLI   =  Ultra-Black Italic
+
+ +Thus, with mom, if you've installed, say, some +extra Helvetica fonts and named them according to the convention FS +(where "F" means family and "S" means font +style), once having entered +

+

+	.FAMILY H
+	  or
+	.FAM H
+
+ +you can access any of those Helvetica fonts simply by +passing the correct argument from the list above to +FT. +

+For example, if you were working in Medium Roman (.FT R) +and you needed Medium Condensed Italic for a while (assuming it's +installed), you'd just type +

+

+	.FT CDI
+
+ +to access the Medium Condensed Italic font from the Helvetica +family. +

+Mom's list of font styles doesn't pretend to +be exhaustive, but rather tries to cover the basic weight/shape +combinations likely to be found in any reasonably complete type +family. +

+The actual extension names are arbitrary and can be used in a +flexible manner. For example, if you create a family that has a +DemiBold font (DB) but no Bold font (B), you might find it more +convenient to give the DemiBold font the extension "B". +Equally, if the family has an ExtraBold font, you might find it more +convenient to use the extension "HV" (Heavy). + +

+However, you may, at needs, want to add to mom's +list of font styles. You can do this by editing the file, om.tmac. +Near the top, you'll see lines of the form +

+

+	.sty \n[.fp] L       \" Light Roman
+	.sty \n[.fp] LI      \" Light Italic
+	.sty \n[.fp] LCD     \" Light Condensed Roman
+
+ +Simply add your new font style by imitating what you see and +plugging in your new font style (having, of course, first created the +font, correctly named, in groff's PostScript font directory; see +How to create a PostScript font for use with groff). +

+For example, if you already have some fonts from the Univers +family installed and have called the family UN, you might decide at +some point to add the Bold Outline font (UNBO). In which case, +you'd add +

+

+	.sty \n[.fp] BO      \" Bold Outline
+
+ +to the .sty \n[.fp] <font style> list in om.tmac. +

+Be careful, though, that any styles you add do not conflict +with family names that already exist. +"C", for example, conflicts with the Courier family +(CR, CI, CB, CI). Were you to create a font style "C", +thinking that .FT C would give you access to font style +once you'd given a .FAM(ILY) directive, you'd get a nasty +surprise: your type would come out in Courier Roman! +

+VERY IMPORTANT NOTE: mom's font extensions are +not "user-space" controllable via a macro. If you've +been using groff for a long time, and have already rolled your own +solution to adding PostScript families, fonts, weights, shapes, etc. to +groff, you may find that mom's font extensions +conflict with your own scheme. Should that be the case, comment out +the .sty \n[.fp] <font style> lines found near the +top of the om.tmac file. + +

How to create a PostScript font for use with groff

+These instructions aren't meant to cover all possibilities, merely +to present one way of making PostScript families/fonts available to +groff and mom. +

+GNU/Linux distributions being what they are, directory locations may +differ and the presence of some executables can't be guaranteed. +I run a Debian system. The instructions reflect that. Users of +other distros will have to interpret them according to the way their +distro operates. +

+What you need before you start: +
+

    +
  • groff, version 1.18 or higher +
    + (Debian package: groff) +
  • a full installation of gs and associated tools +
    + (Debian package: gs or gs-gpl) +
  • a library of gs fonts +
    + (Debian package: gsfonts) +
  • a utility for converting TrueType fonts to Type1 fonts +
    + (Debian package: ttf2pt1) +
  • a font manager +
    + (Debian packages: defoma, psfontmgr, dfontmgr) +
  • perl +
    + (Debian package: perl) +
+
+A reasonably complete installation of any major GNU/Linux distro +should already have these on your system, except perhaps for the +utility to convert TrueType fonts to Type1 fonts. +

+Initial preparation (you only have to do this once): +
+

    +
  1. If you don't already have one, create a directory in your + home directory to hold new fonts. Any directory name will do. + I use ~/Fonts, with subdirectories for Type1, TrueType and Groff + fonts. + +
  2. Locate the groff directory, site-font. The exact location is + difficult to predict, owing to differences between distros + and whether you're using a pre-packaged groff or have built + it from source. Some typical locations are +
    +
      +
    • /usr/share/groff, +
    • /usr/local/share/groff +
    • /etc/groff +
    +

    + If you can't find the site-font directory, locate + groff's site-tmac directory, and, as root, create site-font + in the same directory as the one that holds site-tmac. + E.g., if you find site-tmac in /usr/share/groff, create + site-font in /usr/share/groff. +

  3. Locate the file <prefix>/font/devps/generate/textmap + and symlink it to textmap in the directory that + contains your personal collection of PostScript fonts. (See the + Small Note, + above, for the meaning of <prefix>). On my system, + at the time of writing, <prefix> is + /usr/local/share/groff/1.19.2/, therefore, I symlink it in + ~/Fonts/Type1 with +
    +
    +ln -s /usr/local/share/groff/1.19.2/font/devps/generate/textmap textmap
    +		
    +
  4. Locate the file <prefix>/font/devps/text.enc and + symlink it to text.enc in your personal font + directory. On my system, in ~/Fonts/Type1 +
    +ln -s /usr/local/share/groff/1.19.2/font/devps/text.enc text.enc
    +		
    +
  5. Make sure you know which directory/ies holds your gs fonts. + You'll need the information later. On a Debian box, some + typical locations are +
    +
      +
    • /usr/lib/ghostscript/fonts +
    • /usr/share/ghostscript/fonts +
    • /usr/share/fonts/type1/gsfonts +
    +
+
+Font creation/installation: +
+
    +
  1. Acquire the font in either Type1 (.pfb) or TrueType + (.ttf) format. +
  2. Place the font in your personal font directory; for me, + that's ~/Fonts/Type1 or ~/Fonts/TrueType. +
  3. In your personal font directory, run one of the following: +
    +
      +
    • For Type1 fonts +
      +
        +
      • getafm fontfilename.pfb | gsnd - > fontfilename.afm +
        + For Type1 fonts, this will generate something called + an .afm (Adobe Font Metrics) file, which is + required to create PostScript fonts for groff. +
      +
    • For TrueType fonts +
      +
        +
      • ttf2pt1 \-b fontfilename.ttf +
        + For TrueType fonts, this will generate a PostScript + .pfb file as well as an .afm file. +
      +
    +
  4. Still in your personal font directory, run +
    +
      +
    • afmtodit -e text.enc fontfilename.afm textmap GROFF_FONTNAME +
    +

    + Q: How do I choose a GROFF_FONTNAME? +

    + A: Start by considering the + family + to which the font belongs. If you're adding to a family that + already exists in groff's <prefix>/font/devps + directory, that will be the first part of the font name. + (See + here + for a list of families already installed, along with their groff + names.) Add to that name the appropriate weight/style extension, + listed + here. +

    + For example, if you're adding Helvetica Light Roman, your + GROFF_FONTNAME would be HL. If you're + adding Helvetica Light Italic, your GROFF_FONTNAME would be + HLI. +

    + If you're adding a font not already in groff's PostScript + families, first choose a meaningful name for the + family + to which the font belongs. The name can be anything you like. If, + for example, the family is Garamond, you could choose GARAMOND, + GARA, GD, or even just plain G as the family name. Then tack on the + appropriate style/weight extension. Thus, if you were installing + Garamond Bold Condensed Italic and had chosen GD + as the family name for Garamond, your GROFF_FONTNAME would be + GDBCDI. +

    + In mom, you can then access the Garamond + family with .FAM GD, and the Bold Condensed + Italic font wth .FT BCDI. +

    + Note: The family name need not be in upper + case, and there's no limit to the length of the name. + "Garamond", for example, could be the name you + give the Garamond family. In fact, you might find it + preferable, since a) you wouldn't have to remember how + you'd named the family, and b) should you be scanning + your + site-font directory, + something like GaramondBCDI will be more meaningful than, + say, GDBCDI. +

  5. Copy or move GROFF_FONTNAME to your + site-font directory, + or change to the site-font directory and make a symlink to + GROFF_FONTNAME in your personal directory. +
  6. Copy or move the .pfb file to the directory that + holds your gs fonts, or change to that directory and make a + symlink to the .pfb file in your personal directory. +
  7. Do whatever your system or distro requires in order to + register the new PostScript font (the .pfb file). On a + Debian system, as root, you can run dfontmgr for a + graphical interface that will take care of registering the + font. +
+

+Written out in full, adding fonts looks like a lot of work. It +isn't. Basically, it's just: +
+

    +
  • acquire the font +
  • generate an .afm file for the font +
  • create the groff font +
  • put the groff font in <prefix>/font/devps +
  • make sure gs knows about the font +
+
+After you've done it a couple of times, it all makes sense, and is +really quite easy. Not to mention that once you understand the +process, you can write a bash script to automate the process. +Here's an example, which you can adapt to your own needs. The +script requires an argument (the .pfb filename), then prompts for +the GROFF_FONTNAME. +

+

+#! /bin/bash
+
+# A script for installing Type1 fonts.
+#
+# Builds .afm files from .pfb files, generates a groff font from the
+# .afm file, makes a symlink in /usr/lib/ghostscript/font/ to the
+# .pfb file, and a symlink in site-font to the groff font
+
+# .pfb filename, stripped of .pfb extension
+FONT=`basename $1 .pfb`
+
+# Directory holding my personal collection of type1 fonts
+FONTDIR="$HOME/Fonts/Type1"
+
+# Directory holding system ghostscript fonts
+GS_FONTDIR="/usr/lib/ghostscript/fonts"
+
+# Location of site-font/devps
+GROFF_SITE_FONTDIR="/usr/local/share/groff/site-font/devps"
+
+# Personal groff fonts directory
+GROFF_FONTS="$HOME/Fonts/Groff"
+
+# Symlinks to textmap and text.enc
+TEXTMAP="$FONTDIR/textmap"
+TEXTENC="$FONTDIR/text.enc"
+
+if [ ! `pwd` = "$FONTDIR" ] ; then
+    echo "Changing into $FONTDIR directory.."
+    cd $FONTDIR
+    sleep 1
+else
+	sleep 1
+fi
+
+echo -n "Groff name for this font: "
+read FONTNAME
+sleep 1
+
+echo "Getting .afm.."
+getafm $FONT.pfb | gsnd - > $FONT.afm
+sleep 1
+
+echo "Creating $FONTNAME.."
+afmtodit -e $TEXTENC $FONTDIR/$FONT.afm $TEXTMAP $FONTNAME
+mv -i $FONTNAME $GROFF_FONTS
+sudo ln -s $GROFF_FONTS/$FONTNAME $GROFF_SITE_FONTDIR/$FONTNAME
+sleep 1
+
+echo "Linking $FONT in $GS_FONTDIR.."
+cd $GS_FONTDIR
+sudo ln -s $FONTDIR/$FONT.afm $FONT.afm
+sudo ln -s $FONTDIR/$FONT.pfb $FONT.pfb
+sleep 1
+
+# This next bit is Debian specific.  If you're not running a
+# Debian system, replace it with whatever your distro requires
+# in order to register Type1 fonts.
+
+if [ !`pidof -x /usr/bin/dfontmgr` ] ; then
+    echo "I will now run dfontmgr so you can register the font."
+    exec sudo dfontmgr &
+else
+    echo "You may now register the font with dfontmgr."
+fi
+
+
+ + + + +

Some reflections on mom

+
+ +

+Mom, as a complete macro set, had her origins +in a "library" of groff routines I wrote over the +years to handle various aspects of typesetting and document +processing that weren't adequately covered by ms, me, mm, and so +on. Typically, I'd use the library to cobble together macro +sets for new challenges as they came my way. +

+If, as Eric Raymond asserts, open source begins with a programmer +scratching a personal itch, then mom can truly be +called open source, even if, a mere humble set of macros standing on +the shoulders of a giant named troff, she isn't programming at all. +

+As a writer living in a perpetual state of penury, all the computers +I've ever owned have been hand-me-downs -- several generations +out-of-date and "resource challenged". Disk space has +always been an issue, as has processor speed and available RAM. +One of the reasons I run GNU/Linux is that it has helped enormously +to get the most out of my poor little boxes. (It has been pointed +out to me that NetBSD might be an even better choice of operating +systems for computers with limited resources.) +

+In Linux-land, the choice of typesetting systems basically comes down +to groff or TeX. Both are wonderful -- monumental achievements if you +ask me -- and both have their own particular strengths. However, for +people in my financial position (and there are millions of us around +the globe, in both developed and developing countries), TeX and groff +have one big difference: size. TeX is huge. Even its most ardent +supporters agree it suffers from bloat, on top of being complex and +unwieldy to manage. Groff is tiny by comparison, occupying minimal +disk space and having only a small memory footprint while at the same +time being flexible and powerful, typographically speaking. I've run +it successfully on a 386 with 8 megs of RAM and a 250 meg hard disk. +

+However, groff has always had a liability: it's incredibly geeky. +Owing to its very long history, it -- and its "power users" +-- have remained stuck in a time warp. Most common macro packages +still look as they did in those decades when memory was exorbitantly +expensive and every byte mattered. Documentation -- not always +easy to find -- is written as if all readers are computer whizzes, +or at least have a university degree in one of the higher sciences. +

+By no means a stupid man, nor unfamiliar with the precepts of +programming, I've more than once torn my hair out over the terseness and +ambiguity of groff's documentation. Making sense of certain primitives +has often involved days of testing, interpreting the documentation +instead of just using the primitive. +

+(ADDENDUM to the previous two paragraphs: A tremendous amount of +effort has gone into creating a groff manual that can be read with +"info," as well as creating truly useful man pages. The info +manual is clear and well-written, so my comments are actually out +of date. I leave them in for the benefit of groff newbies, who may +still find the documents a bit intimidating.) +

+For some time now, groff users and macro writers have had the +option to use "long" names, yet have mostly chosen not to. +With long names, it's possible to create macro sets that are humanly +readable and easy to interpret, encouraging development and evolution. +What's more, the macros themselves need not be terse, intimidating, +and easily forgotten 1- or 2-letter commands inserted in the body +of a document. They can be sensible and helpful to everyone, groff +newbies and old hands alike. +

+Mom's macro file, om.tmac, uses long names, aliases, +and a host of other groff goodies that have become part of the +whole groff picture under the unflagging guidance of groff's current +maintainer, Werner Lemberg. Nearly every macro, number register and +string is "recognizable" simply by its name. The file is +heavily commented. A consistent, if idiosyncratic, indenting style +is used as well, significantly improving readability. Anyone +wanting to futz around with mom's macros should be +able to do so with a minimum of head scratching. +
+


+ + + + +

Contact the author

+
+ +

+If you have any questions or comments about mom, +suggestions to make, criticisms to offer, or bugs to report, use the +groff mailing list at +groff@ffii.org +(subscription information available +here) +or contact me, Peter Schaffter, directly at +peter@faustus.dyn.ca +or +ptpi@golden.net. + +

+Please include the word "mom" or "groff" in the +Subject: line of any message sent to my personal address, or you +risk the wrath of my implacable spam filters. :) +

+If you want to visit mom's homepage, you'll find +it +here. +

+


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/color.html b/contrib/mom/momdoc/color.html new file mode 100644 index 0000000..a6badbc --- /dev/null +++ b/contrib/mom/momdoc/color.html @@ -0,0 +1,338 @@ + + + + +Mom -- Colour + + + + + +Next   +Prev   +Back to Table of Contents + + +

+ Coloured text +

+

+Introduction to coloured text +
+Index of colour macros +

+ + +

Introduction to coloured text

+ + +Mom's support for coloured text is straightforward. +You begin by telling mom about the colours you want +with +NEWCOLOR +or +XCOLOR. +Afterward, any time you want text to be coloured, you either colour +it with an +inline escape +that contains the colour name (e.g. \*[red] or +\*[blue]) or invoke the macro, +COLOR, +with the name of the colour you want. + +

+For example, say you want to have the name "Jack" in the +sentence "All work and no play makes Jack a dull boy" +appear in yellow. You'd begin by telling mom about +the colour, yellow. There are two ways of doing this; see +NEWCOLOR +and +XCOLOR +for a full explanation of the difference between the two. If you +use XCOLOR, you'd enter this: +

+

+	.XCOLOR yellow
+
+ +If you use NEWCOLOR, you might enter +

+

+	.NEWCOLOR yellow RGB #FFFF00
+
+ + +After "defining" (or "initializing") the colour +"yellow", you'd colourize the name, Jack, either with an +inline escape +

+

+	All work and no play makes \*[yellow]Jack\*[black] a dull boy.
+
+ +or with the COLOR macro +

+

+	All work and no play makes
+	.COLOR yellow
+	Jack
+	.COLOR black
+	a dull boy.
+
+ +Notice, in both examples, that a) you have to set the colour back to +black after "Jack", and b) you don't have to define or +intialize the colour, black. Mom predefines +"black", "BLACK", "white" and +"WHITE" for you. +

+For information on using colour during +document processing, +see +Colour support in document processing. +

+Please note: Mom's colour support is for text only. +She doesn't support "fill" (or "background") +colour for drawn objects. Please also note that if you're +accustomed to using groff's .defcolor to define colours, +and groff's inline \m[<colorname>] to call them, you may +continue to do so without confusing mom. + +

+

Index of colour macros

+ +

+ + + +


+

Creating (initializing) a colour with NEWCOLOR

+
+
Macro: NEWCOLOR <colour name> [<colour scheme>] <colour components> + +

+NEWCOLOR lets you create a colour, rather like an +artist mixing paint on a palette. The colour isn't used +immediately; NEWCOLOR merely tells +mom how to mix the colour when you need it. If +you haven't invoked NEWCOLOR (or +XCOLOR), +mom doesn't have a clue what you mean when you +reference a colour (with +COLOR +or +\*[<color name>]). +

+The first argument to NEWCOLOR is a name for your +colour. It can be anything you like--provided it's just one word +long--and can be caps, lower case, or any combination of the two. +

+The second argument, which is entirely optional, is the "colour +scheme" you want mom to use when mixing the +colour. Valid arguments are RGB (3 components, +red green blue), CYM (3 components cyan yellow +magenta), CMYK (4 components cyan magenta yellow +black) or GRAY (1 component). If you omit the +second argument, mom assumes you want RGB. +

+The final argument is the components of your colour. This can be +hexadecimal string starting with a pound sign (#) (for colour values +in the 0-255 range) or two pound signs (##) (for colour values +in the 0-65535 range), or it can be a series of decimal digits, +separated by spaces, one digit per component, with the argument +enclosed in double quotes. (If this is all gibberish to you, see +Tips for newbies.) +

+Thus, to tell mom about a colour named +"YELLOW", you could enter one of the following: +

+

+	.NEWCOLOR YELLOW #FFFF00         \"or ##FFFFFFFF0000 or "1 1 0"
+	.NEWCOLOR YELLOW RGB #FFFF00     \"or ##FFFFFFFF0000 or "1 1 0"
+	.NEWCOLOR YELLOW CYM #00FF00     \"or ##0000FFFF0000 or "0 1 0"
+	.NEWCOLOR YELLOW CYMK #00FF0000  \"or ##0000FFFF00000000 or "1 1 0"
+
+ +After you've told mom about a colour, you can then get +her to set text in that colour either with the inline escape +\*[<colorname>] +or the macro +COLOR. +(See the +example, +above.) +
+

Tips for newbies

+Colour manipulation can be tremendously confusing if you don't have +a background in graphic arts or computing. My advice, if color +intimidates you, is to stick to using mom's +default RGB colour scheme, and to fire up a color chooser that +gives you the RGB values you want for the colour you select. Plug +those values into the components argument to +NEWCOLOR, and you'll get the colour you want. +Both the KDE and gnome desktops have colour selectors that provide +you with the shorter RGB hexadecimal string. If you're not running +KDE or gnome, the X utility, xcolorsel, provides you with a similar +functionality, although it only provides RGB values for 256 +pre-defined colours. If you use xcolorsel, be sure to click the +button "Display format" and select "8 bit truncated +rgb". +

+Alternatively, you can use mom's simpler +XCOLOR +macro to initialize one of the 256 pre-defined X colours by +supplying the name of the color as an argument. +
+ + + +


+

Initializing a colour with XCOLOR

+
+Macro: XCOLOR <X color name> [<alias>] +
+*<X color name> must be all one word, all lower case. +
+(See +
Finding X color names +for how to get a list of valid colour names.) + +

+XCOLOR is similar to NEWCOLOR in +that it tells mom to initialize a colour, but it's +easier to use. All you have to do is pass it, as an argument, the +legal name of one of the 256 pre-defined X colours. The name must +be all one word, and, breaking with mom policy, it +must be entered in lower case. +

+For example, if you want to intialize the X colour, coral, all you +have to do is enter +
+

+	.XCOLOR coral
+
+ +Afterwards +

+

+	.COLOR coral
+
+ +will colourize subsequent text coral until you instruct +mom to return to black, or some other pre-defined +initialized colour. (The +inline escape +\*[coral] will equally colourize text coral after you've +initialized the colour with XCOLOR.) +

+The downside of XCOLOR is that you can't create +custom colours. This restriction, however, is mitigated by the +fact that for many users, 256 colours is more than enough to play +around with. +

+While some X colours have fanciful names (peachpuff, papayawhip, +thistle, snow), many are self-explanatory and self-descriptive in +ordinary colour terms. "blue" is pure (rgb) blue, +"green" is pure (rgb) green, and so on. Furthermore, for +many X colors, there exist four variants, each representing +increasingly darker shades of the same colour. For example, +"blue" (and "blue1") are the brightest forms of +(rgb) blue; "blue2", "blue3" and "blue4" +are increasingly darker shades of the same blue. For that reason, +you may find XCOLOR is a better choice than +NEWCOLOR when it comes to initializing common +colors. +

+The whimsical nature of X colour names sometimes makes for names +that are long to type in, e.g. "mediumspringgreen". +The optional second argument to XCOLOR allows you +to come up with more convenient name by which to reference the +colour. For example, you could enter +

+

+	.XCOLOR mediumspringgreen mygreen
+	    or
+	.XCOLOR mediumspringgreen MYGREEN
+
+ +so that whenever you want text mediumspringgreen-ed, you can use +either .COLOR mygreen (or .COLOR MYGREEN) or +the inline escape \*[mygreen] (or +\*[MYGREEN].) +

+

Finding X color names

+
+There are two ways of finding the names of the pre-defined X +colours. One is to consult the file, rgb.txt, included with +all X11 installations. The location of the file on a Debian +GNU/Linux distribution is typically /etc/X11/rgb.txt. Other +distributions and other X installations may have the file in +another location. The file lists the colour names, but doesn't +show you what the colours actually look like. +

+A better way to get the colour names, as well as to see what the +colours look like, is to fire up a colour chooser (like xcolorsel) +that both lists the colour names and shows a swatch of the colour +as well. +

+Whichever method you use to find X color names, remember that the +names, passed as arguments to XCOLOR, must +be all one word, all in lower case. +
+ + + +


+

Invoking a color

+
+Macro: COLOR <colorname> +
+
Inline: \*[<colorname>] +

+ +Once you've told mom about a colour (via +NEWCOLOR or XCOLOR), you use either +the macro, COLOR, or the +inline escape, +\*[<colorname>], to cause mom to +set subsequent text in that colour. See the +example, +above, which shows both in action. +

+NOTE: You can use the +\*[<colorname>] inline escape in any +document processing +macro that takes a +string argument. +However, you must remember to reset the colour at the end of the +argument (typically with \*[black]) unless you want all +subsequent invocations of that particular macro to be colourized. +

+Furthermore, if you use \*[<colorname>] in the +string argument passed to +.HEAD, +.SUBHEAD +or +.PARAHEAD, +and you've requested that any of these types of heads be numbered, +the numbers themselves will not be coloured, only the text you +passed the macro. If you wish the numbers to be colourized as +well, you must explicitly tell mom that you wish +all of the head(s), subhead(s) or parahead(s), including the +numbers, colourized by invoking the appropriate +control macro. + +
+ +


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/cover.html b/contrib/mom/momdoc/cover.html new file mode 100644 index 0000000..2566547 --- /dev/null +++ b/contrib/mom/momdoc/cover.html @@ -0,0 +1,512 @@ + + + + +Mom -- Document processing, creating a cover page + + + + + +Next   +Prev   +Back to Table of Contents +

+ + +

CREATING A COVER PAGE

+ + + + +

Introduction to cover pages

+

+As of version 1.19 of mom, you can now have cover +pages generated automatically. +

+Though identical in treatment, mom provides two +kinds of cover pages: section cover pages (which I shall refer to +simply as "cover pages") and document cover pages +("doc covers"). +

+A document cover page +(doc cover) +is what you'd most likely use at the start of a collated document, where +you might want the name of the complete document, the author(s) and +the copyright line to appear. Another place you might use a doc +cover is for a novel, where you want the title of the novel, not +the chapter title or chapter number, as the first cover page. +

+A section +cover +page is what you'd use for cover pages that separate sections of a +collated document. A section cover page (but not a doc cover page) +in a collated document could, for example, simply read "PART +I". +

+In non-collated documents (say, an essay) you can use either a +section cover or a doc cover to generate a cover sheet. +

+In addition, nothing prevents you from generating both a doc cover +page and a section cover page for every document in a collated +document. Or you can selectively disable the automatic generation +of either doc covers or section covers in a collated document, +on-the-fly. +

+Important note: +automatic generation of cover or doc cover pages after the first +one(s) only takes place if you are working with collated documents. +Mom provides no mechanism for saying "print +a section cover here even though I'm still working on the same +(non-collated) document." + +

Description of what mom does on cover pages

+ +By default, mom typesets cover (and doc cover) +pages identically to +docheaders +(see +How to change the look of docheaders +for a description of what a docheader looks like). The only +differences are +
+
    +
  • the position on the page where the information is output +
  • the (optional) addition of copyright and miscellaneous + information +
  • there's no running text underneath +
+ +

+You tell mom what you want to appear on the cover +pages through the arguments you pass to +COVER +and/or +DOC_COVER. +Provided you have already given mom the +appropriate references macro (e.g. +TITLE +or +AUTHOR), +she will output cover (and doc cover) pages identically to how she +would output docheaders containing the same information. +

+By default, mom starts cover (and doc cover) pages +one-third of the way down the page. This can be changed through +the use of the control macros +COVER_ADVANCE/DOC_COVER_ADVANCE. +

+If you request copyright information (and have already given +mom the reference macro, +COPYRIGHT), +she sets it, by default, in a smaller +point size +in the bottom right hand corner of the cover (or doc cover) page. +The default point size and the position can be controlled +with +COVER_COPYRIGHT_SIZE/DOC_COVER_COPYRIGHT_SIZE +and +COVER_COPYRIGHT_QUAD/DOC_COVER_COPYRIGHT_QUAD. +

+Similarly, if you request miscellaneous information (and have already given +mom the reference macro, +MISC), +she sets it, by default, in a smaller point size in the bottom left +hand corner of the cover (or doc cover) page. The default point +size is dependent on +COVER_COPYRIGHT_SIZE/DOC_COVER_COPYRIGHT_SIZE, +but the position can be controlled with +COVER_MISC_QUAD/DOC_COVER_MISC_QUAD. + + +

+NOTE: mom does not set any +headers +or +footers +on cover pages. Neither does she set any page numbers. From the +point of pagination, cover (and doc cover) pages are considered +"null" pages; if you wish them to be included in the +pagination scheme (even though no page numbers appear), you must +set the page number of each first page following a +COLLATE +manually with +PAGENUMBER. + + +

+Finally, if you want to design your own cover page(s), you can +always typeset them (using the +typesetting macros), +invoke +NEWPAGE, +set up your document in full (see +Tutorial -- Setting up a mom document), +and lastly invoke +START. +The cover page (and any typesetting commands on it) will have no +effect on mom's processing of the document itself, +the first page of which, moreover, will be numbered "1" +unless you instruct her otherwise with +PAGENUMBER. +

+ + + +


+

+ + Macro: COVER +
+ Macro: DOC_COVER +
+ Required argument: TITLE | DOCTITLE | COVERTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE +
+ Optional arguments: [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC ] +

+ *Note: these macros should be placed in the + "style-sheet" section of your document setup (see the + Tutorial -- Setting up a mom document), + i.e. after PRINTSTYLE (and/or DOCTYPE and/or COPYSTYLE), but + before START. + + +

+COVER and DOC_COVER behave +identically. The reason mom provides two macros +for automatic cover page generation is so that you can have two +different kinds of covers with different information on each. +

+Imagine, for a moment, you've written a document comprised of three +sections. When you +COLLATE +the document for output, you could use DOC_COVER +to generate a cover page that contained the name of the entire +document, your (the author's) name, and perhaps the copyright date. +Subsequently, you could use COVER, after each +COLLATE but before each +START, +to generate a cover page (or cover "sheet", if you prefer) +containing just the name of the section. +
+ +

The required argument

+ +Both COVER and DOC_COVER, whenever +invoked, require a first argument, as listed above. This first argument +will become the first bit of information mom +prints on the cover (or doc cover) page (i.e. it will be the +"title"). +

+In order for the information to appear, you must, of course, first +have given mom the appropriate +reference macro. +A list of arguments with their equivalent reference macros follows. +
+ +

+
TITLE +
-means the argument you gave to +TITLE +
DOCTITLE +
-means the argument you gave to +DOCTITLE +
COVERTITLE +
-means the argument you gave to +COVERTITLE +or +DOC_COVERTITLE +
CHAPTER, CHAPTER_TITLE, CHAPTER+TITLE +
-see below (How the CHAPTER argument and friends work) +
+
+ +

How the CHAPTER argument and friends work

+ +CHAPTER, by itself, will print the CHAPTER_STRING as well +as the chapter number that you gave to +CHAPTER. +For example, assuming a vanilla setup for your chapter +

+

+	\# Reference macros
+	.CHAPTER 1
+	.CHAPTER_TITLE "The Bonny Blue Yonder"
+	<other stuff>
+	.COVER CHAPTER \" (or .DOC_COVER CHAPTER)
+	.START
+
+ +will simply print +

+

+	Chapter 1
+
+ +CHAPTER_TITLE will print the chapter title you +gave to +CHAPTER_TITLE. +For example, assuming a vanilla setup for your chapter +

+

+	\# Reference macros
+	.CHAPTER 1
+	.CHAPTER_TITLE "The Bonny Blue Yonder"
+	<other stuff>
+	.COVER CHAPTER_TITLE \" (or .DOC_COVER CHAPTER_TITLE)
+	.START
+
+ +will simply print +

+

+	The Bonny Blue Yonder
+
+ +

+CHAPTER+TITLE will print both the +chapter string + number AND the chapter title. For example, +assuming a vanilla setup for your chapter +

+

+	\# Reference macros
+	.CHAPTER 1
+	.CHAPTER_TITLE "The Bonny Blue Yonder"
+	<other stuff>
+	.COVER CHAPTER+TITLE \" (or .DOC_COVER CHAPTER+TITLE)
+	.START
+
+ +will print +

+

+	      Chapter 1
+	The Bonny Blue Yonder
+
+ +

The optional arguments

+ +The remainder of the arguments to COVER and +DOC_COVER are optional. They refer specifically +to the information you gave the +reference macros +bearing the same name as the arguments. +

+You may enter as many or as few as you would like to see on your +cover (or doc cover) page. The only hitch is--PAY ATTENTION, +CLASS!--they must be entered in the order given above. For +example, if you want TITLE, AUTHOR, +COPYRIGHT and MISC +

+

+	.COVER TITLE AUTHOR COPYRIGHT MISC
+
+ +is correct, while +

+

+	.COVER TITLE AUTHOR MISC COPYRIGHT
+
+ +is not. +
+ +

What the DOCTYPE argument means

+ +When you pass COVER or DOC_COVER +the argument, DOCTYPE, it refers to the argument you +gave to +DOCTYPE NAMED. +For example, if, in your +docstyle macros +you gave a +

+

+	.DOCTYPE NAMED "Abstract"
+
+ +the argument, DOCTYPE, in the COVER or +DOC_COVER macros, would mean that you wanted the +word, Abstract, to appear on the cover (or doc cover), just as it +would in the +docheader. +
+ + + +
+

+ + Macro: COVERS <toggle> +
+ Macro: DOC_COVERS <toggle> + +

+By default, if you give mom a +COVER +or +DOC_COVER +macro, she will print it. In a document that contains sections, +articles or chapters formerly treated as "one-off's" but +now being +collated, +such behaviour may not be desirable. +

+Mom lets you selectively enable or disable the +generation of covers and/or doc covers with the toggle macros +COVERS and DOC_COVERS. Because +they're toggle macros, simply invoking them by themselves enables +automatic cover (or doc cover) generation, while invoking them +with any argument at all (OFF, QUIT, X, etc) +disables cover (or doc cover) generation. +

+NOTE: You must place these macros prior to any +instance of +START. Since they're +"on" by default, there's no need to use them if you want +covers. However, if you don't, especially in the kind of scenario +described above, the best place to put them (most likely with an +OFF, NO, X, etc. argument), is immediately after the +first invocation of START. By doing so, you ensure +they precede all subsequent instances of START. +

+ +


+

+

Control macros--changing the defaults for covers and document covers

+The default typographic appearance of the items on a cover (or doc +cover) page is identical to that of the items in a +docheader. +(See +How to change the look of docheaders +for a description of the defaults.) +

+COPYRIGHT +and +MISC, +which do not appear in docheaders, have the following default +characteristics: +
+

    +
  1. The copyright line is set in the bottom right hand corner + of the page, 2 + point sizes + smaller than the size of + running text +
  2. The "misc" line is set in the bottom left hand + corner of the page, in the same family, font and point size + as the copyright line. +
+

+With the exception of the copyright and "misc" lines, the +defaults for the entirety of cover (and doc cover) pages, and all +the elements thereon, can be changed with control macros whose +behaviour and arguments are identical to +the control macros used for docheaders. +The only difference is the name by which you invoke the control +macro(s). +

+The complete list of cover (and doc cover) page control macros +follows; please refer to the +docheader control macros index +in order to understand how to use them. +

+

Index of cover and doc cover control macros

+
+.COVER_ADVANCE  .DOC_COVER_ADVANCE -+
+.COVER_FAMILY   .DOC_COVER_FAMILY   | like DOCHEADER_
+.COVER_LEAD     .DOC_COVER_LEAD    -+
+
+.COVER_TITLE_FAMILY  .DOC_COVER_TITLE_FAMILY -+
+.COVER_TITLE_FONT    .DOC_COVER_TITLE_FONT    | like
+.COVER_TITLE_COLOR   .DOC_COVER_TITLE_COLOR   | TITLE_
+.COVER_TITLE_SIZE    .DOC_COVER_TITLE_SIZE   -+
+
+.COVER_CHAPTER_TITLE_FAMILY  .DOC_COVER_CHAPTER_TITLE_FAMILY -+
+.COVER_CHAPTER_TITLE_FONT    .DOC_COVER_CHAPTER_TITLE_FONT    | like
+.COVER_CHAPTER_TITLE_COLOR   .DOC_COVER_CHAPTER_TITLE_COLOR   | CHAPTER_TITLE_
+.COVER_CHAPTER_TITLE_SIZE    .DOC_COVER_CHAPTER_TITLE_SIZE   -+
+
+.COVER_SUBTITLE_FAMILY  .DOC_COVER_SUBTITLE_FAMILY -+
+.COVER_SUBTITLE_FONT    .DOC_COVER_SUBTITLE_FONT    | like
+.COVER_SUBTITLE_COLOR   .DOC_COVER_SUBTITLE_COLOR   | SUBTITLE_
+.COVER_SUBTITLE_SIZE    .DOC_COVER_AUTHOR_SIZE     -+
+
+.COVER_ATTRIBUTE_COLOR  .DOC_COVER_ATTRIBUTE_COLOR - like ATTRIBUTE_COLOR
+ - the macro, .ATTRIBUTE_STRING, controls the attribution string
+   for both docheaders and cover pages; cover pages have no
+   separate ATTRIBUTE_STRING macro
+
+.COVER_AUTHOR_FAMILY  .DOC_COVER_AUTHOR_FAMILY -+
+.COVER_AUTHOR_FONT    .DOC_COVER_AUTHOR_FONT    | like
+.COVER_AUTHOR_COLOR   .DOC_COVER_AUTHOR_COLOR   | AUTHOR_
+.COVER_AUTHOR_SIZE    .DOC_COVER_AUTHOR_SIZE   -+
+
+.COVER_DOCTYPE_FAMILY  .DOC_COVER_DOCTYPE_FAMILY -+
+.COVER_DOCTYPE_FONT    .DOC_COVER_DOCTYPE_FONT    | like
+.COVER_DOCTYPE_COLOR   .DOC_COVER_DOCTYPE_COLOR   | DOCTYPE_
+.COVER_DOCTYPE_SIZE    .DOC_COVER_DOCTYPE_SIZE   -+
+
+.COVER_COPYRIGHT_FAMILY  .DOC_COVER_COPYRIGHT_FAMILY -+
+.COVER_COPYRIGHT_FONT    .DOC_COVER_COPYRIGHT_FONT    | like any
+.COVER_COPYRIGHT_COLOR   .DOC_COVER_COPYRIGHT_COLOR   | of the above
+.COVER_COPYRIGHT_SIZE    .DOC_COVER_COPYRIGHT_SIZE   -+
+.COVER_COPYRIGHT_QUAD    .DOC_COVER_COPYRIGHT_QUAD
+ - the copyright quad can be either L (left) or R (right); default is left
+
+.COVER_MISC_COLOR  .DOC_COVER_MISC_COLOR - like any of the above _COLOR
+.COVER_MISC_QUAD   .DOC_COVER_MISC_QUAD
+ - the misc quad can be either L (left) or R (right); default is right
+
+ +Note: COVER_MISC and +DOC_COVER_MISC have only two control macros, +_COLOR and _QUAD. The +family, font and size of the MISC argument to +COVER or DOC_COVER are always the +same as for COPYRIGHT. Should you wish the family, font +or size to be different from COPYRIGHT, I suggest setting +the type specs for COPYRIGHT to the ones you want for +MISC, then altering them for COPYRIGHT using +inline escapes +in the +string argument +you pass to the macro, +COPYRIGHT. (Of course, +you could always do the reverse, but if you pass several arguments +to +MISC, +it's more likely you want to get MISC right first.) + +

+


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/definitions.html b/contrib/mom/momdoc/definitions.html new file mode 100644 index 0000000..80542af --- /dev/null +++ b/contrib/mom/momdoc/definitions.html @@ -0,0 +1,768 @@ + + + + +Mom -- Definitions and Terms + + + + + +Next   +Prev   +Back to Table of Contents +

+ + +

DEFINITIONS OF TERMS USED IN THIS MANUAL

+ + +Typesetting Terms +
+Groff Terms +
+Mom Document Processing Terms +

+I use a number of typesetting-specific and groff-specific terms +throughout this documentation, as well as a few terms that apply +to mom herself. To make life easier, I'll explain +them here. Refer back to this section should you encounter a word +or concept you're not familiar with. +

+


+ + +

Typesetting terms

+
+ + + +
+
Ascender +
The portion of a letter that extends above the bowl. For example, +the letters a, c, and e have no ascenders. The letters b, d, and h +do. + +
Baseline +
The imaginary line on which the bottoms of capital letters and the +bowls of lower case letters rest. + +
Ballot box +
An unfilled square, usually +cap-height +in size, typically placed beside items in a checklist. + +
Bullet +
A small, filled circle typically found beside items or points in +a list. + +
Cap-height +
The height of the tallest capital letter in a given +font +at the current +point size. + +
Descender +
The portion of a letter that extends beneath the +baseline +(j, q, y are letters with descenders). + +
Discretionary hyphen +
A symbol inserted between two syllables of a word that indicates to a +typesetting program the legal hyphenation points in the word. Normally, +if hyphenation is turned on, groff knows where to hyphenate words. +However, hyphenation being what it is (in English, at any rate), +groff doesn't always get it right. Discretionary hyphens make sure +it does. In the event that the word doesn't need to be hyphenated +at all, groff leaves them alone. In groff, the discretionary hyphen is +entered with +

+

+	\%
+
+ +(backslash followed by a percent). + +
Drop cap +
A large, usually upper-case letter that introduces the first +paragraph of a document or section thereof. The top of the drop +cap usually lines up with the top of the first line of the +paragraph, and typically "drops" several lines lower. +Text adjacent to the drop cap is indented to the right of the +letter until the bottom of the drop cap is reached, at which +point text reverts to the left margin. + +
Em/en +
An em is a relative measurement equal to the width of the +letter M at a given +point size +in a given +font. +Since most Ms are designed square, an em is usually (but sometimes +erroneously) considered to be the same size as the current point +size (i.e. if the point size of the type is 12, one em equals 12 +points). An en is equal to the width of a letter N (historically +2/3 of an em, although groff treats an en as 1/2 of an em). +Typically, ems and ens are used to measure indents, or to define the +length of dashes (long hyphens). + +
Family +
The collective name by which a collection of +fonts +are known, e.g. Helvetica, Times Roman, Garamond. + +
Figure space/Digit space +
A +fixed width space +that has the width of one digit. Used for aligning numerals in, +say, columns or numbered lists. In groff, the figure space is +entered with +

+

+	\0
+
+ +(backslash followed by a zero). + +
Fixed width space +
Equal to +word space, +but does not expand or contract when text is +justified. +In groff, fixed width space is entered with +

+

+	\<space>
+
+ +where <space> means "hit the spacebar on your keyboard." + +
Font +
The specific +weight +and +shape +of type within a +family, +e.g. light, medium, bold (which are weights), and roman, italic, +condensed (which are shapes). By default, groff knows of four fonts +within its default set of families: R (medium roman), I (medium +italic), B (bold roman) and BI (bold italic). + +
Force justify + +
Sometimes, in +justified +text, a line needs to be broken short of the right margin. Force +justifying means telling a typesetting program (like groff) that you +want the line broken early AND that you want the line's word spacing +stretched to force the line flush with the right margin. + +
Gutter +
The vertical whitespace separating columns of type. + +
Justify/justification +
Lines of type are justified when they're flush at both the left and +right margins. Justification is the act of making both margins flush. +Some people use the terms "left justified" and "right justified" +to mean type where only the left (or right) margins align. I don't. +See +quad. + +
Kerning +
Moving pairs of letters closer together to remove excess +whitespace between them. In the days before phototypesetting, +type was set from small, rectangular blocks of wood or metal, each +block having exactly one letter. Because the edge of each block +determined the edge of each letter, certain letter combinations (TA, +for example) didn't fit together well and had to be mortised by hand +to bring them visually closer. Modern typesetting systems usually +take care of kerning automatically, but they're far from perfect. +Professional typesetters still devote a lot of time to fitting letters +and punctuation together properly. + +
Kern Units +
A relative distance equal to 1/36 of the current +point size. +Used between individual letters +for +kerning. +Different typesetting systems use different values (1/54 is +popular), and sometimes call kern units by a different name. +

+Experts: +
A kern unit has nothing to do with groff +machine units. + +

Lead/leading +
The distance from the +baseline +of one line of type to the line of type immediately beneath it. +Pronounced "ledding." Also called line spacing. Usually measured +in +points. +

+In case you're interested... In previous centuries, +lines of type were separated by thin strips of--you guessed +it--lead. Lines of type that had no lead between them were said to +be "set solid." Once you began separating them with strips +of lead, they were said to be "leaded", and the spacing was +expressed in terms of the number of +points +of lead. For this reason, "leading" and "line +spacing" aren't, historically speaking, synonymous. If type +was set 10 on 12, for example, the leading was 2 points, not 12. +Nowadays, however, the two terms are used interchangeably to mean +the distance from baseline to baseline. + +

Leaders +
Single characters used to fill lines, usually to their end. +So called because they "lead" the eye from one element +of the page to another. For example, in the following (brief) +Table of Contents, the periods (dots) are leaders. +

+

+	Foreword............... 2
+	Chapter 1.............. 5
+	Chapter 2.............. 38
+	Chapter 3.............. 60
+
+ +
Ligature +
Ligatures are letters joined together to form a single character. +The commonest are fi, fl, ff, ffi and ffl. Others are ae and oe. +Occasionally, one sees an st ligature, but this is archaic and +quite rare. + +
Picas/Points +
There are twelve points in a pica, and six picas in an inch +(hence 72 points to the inch). In the same way that gem-dealers +have always used their own system of measurement for weight (carats), +typographers have always used their own system of measurement for type. + +
Point Size +
The nominal size of type, measured in +points +from the bottom of the longest +descender +to the top of the highest +ascender. +In reality, type is always fractionally smaller than its point size. + +
Quad +
When only one margin of type is flush, lines of type are quadded in +the direction of the flush margin. Therefore, quad left means the +left margin is flush, the right isn't. Quad right means the right +margin is flush, the left isn't. Quad centre means neither the left +nor the right margin is flush; rather, lines of type are quadded on +both sides so that type appears centred on the page. + +
Rag +
Describes a margin that isn't flush. Rag right means the right +margin isn't flush. Rag left means the left margin isn't flush. +The expression "flush left/rag right" is sometimes used to describe +type that is +quadded +left. + +
Shape +
The degree of slant and/or the width of characters. +(Technically speaking, this is not a proper typesetting term; +however, it may help clarify some concepts presented in these +documents.) +

+Some typical shapes are: +

    +
  • "Roman", which has no slant, and has letterforms of + average width +
  • "Italic", which is slanted, and has letterforms + of average width +
  • "Condensed", which has no slant, but has + letterforms narrower than the average represented by Roman +
  • "Condensed Italic", which is slanted, with letterforms narrower + than average +
+The term +font, +as it is used in these documents, refers to a combination of +weight +and shape. + +
Solid/set solid +
When no +lead +is added between lines of type (i.e. the +point size +and linespacing are the same), the lines are said to be "set +solid." + +
Track kerning/Line kerning +
Sometimes, it's advantageous to increase or decrease the amount of +space between every letter in a line by an equal (usually small) +amount, in order to fit more (or fewer) characters on the line. +The correct term is letter spacing, but track kerning and line kerning +(and sometimes, just "kerning") have come to mean the same thing. + +
Unbreakable space +
Equal to +word space, +however words separated by an unbreakable space will always be kept +together on the same line. Expands and contracts like word space. +Useful for proper names, which one should, whenever possible, avoid +splitting onto two lines. In groff, unbreakable space is entered +with +

+

+	\~
+
+ +(backslash followed by a tilde). + +
Weight +
The thickness of the strokes of letterforms. Medium and Book +have average thicknesses and are the weights used for most of the +text in books, magazines, newspapers, etc. Light has strokes +slightly thinner than Medium or Book, but is still acceptable for +most text. Semibold, Bold, Heavy and Black all have strokes of +increasing thickness, making them suitable for heads, subheads, +headlines and the like. + +
Word space +
The amount of whitespace between words. When text is +justified, +word space expands or contracts to make the margins flush. + +
x-height +
The height of a lower case letter x in a given font at a given +point size. Generally used to mean the average height of the bowl +of lower case letters. +
+

+


+ + +

Groff terms

+
+ + +
+ +
Alias +
A +macro +invoked by a name different from its "official" +name. For example, the official name of the macro to change +family +is FAMILY. Its alias is +FAM. Aliases may be created for any macro (via the +ALIAS +macro) provided the alias uses a name not already taken +by the mom macros or one of the groff +primitives. +For a complete list of words or names you must not use, see the +list of reserved words. + +
Arguments +
Parameters or information needed by a +macro +to do its job. For example, in the macro +

+

+	.PT_SIZE 12
+
+ +"12" is the argument. In the macro +

+

+	.QUAD LEFT
+
+ +LEFT is the argument. Arguments are separated from macros by spaces. +Some macros require several arguments; each is separated by a space. + +
Comment Lines +
Input lines +introduced with the comment character +

+

+	\#
+
+ +When processing output, groff silently ignores everything on a +line that begins with the comment character. + +
Control Lines +
Instructions to groff that appear on a line by themselves, +which means that "control lines" are either +macros +or groff +primitives. +Control lines begin with a period or, occasionally, an apostrophe. + +
Filled lines/fill mode +
Automatic +justification +or +quadding. +In fill mode, the ends of lines as they appear in your text editor +are ignored. Instead, words from adjoining +input lines +are added one at a time to the output line until no more words fit. +Then, depending whether text is to be +justified +or +quadded +(left, right, or centre), and depending on whether automatic +hyphenation is turned on, groff attempts to hyphenate the last word, +or, barring that, spreads and breaks the line (when justification +is turned on) or breaks and quads the line (when quadding is turned +on). +

+ +Nofill mode (non-filled text) means that groff respects the ends +of lines as they appear in your text editor. + +

Inline escapes +
Instructions issued to groff that appear as part of an +input line +(as opposed to +macros, +which must appear on a line by themselves). Inline escapes are +always introduced by the backslash character. For example, +

+

+	A line of text with the word T\*[BU 2]oronto in it
+
+ +contains the inline escape \*[BU 2] (which means "move the letter +'o' 2 +kern units +closer to the letter 'T'"). +

+Mom's inline escapes always take the form +\*[ESCAPE], where ESCAPE +is composed of capital letters, sometimes followed immediately +by a digit, sometimes followed by a space and a +numeric argument. +Groff's escapes begin with the backslash character +but typically have no star and are in lower case. For example, the +mom escapes to move forward 6 points on a line are +either +

+

+	\*[FP6]  or  \*[FWD 6p]
+
+ +while the groff escape for the same thing is +

+

+	\h'6p'
+
+ +
Input line +
A line of text as it appears in your text editor. + +
Macros +
Instructions embedded in a document that determine how groff processes +the text for output. mom's macros always begin with a +period, on a line by themselves, and must be typed in capital letters. +Typically, macros contain complex commands issued to groff--behind +the scenes--via groff +primitives. + +
Machine units +
A machine unit is 1/1000 of a +point +when the groff device is ps. ("ps" means +"PostScript"--the default device for which groff +prepares output, and the device for which mom was +specifically designed.) + +
Numeric argument +
An +argument +that has the form of a digit. Numeric arguments can be built out +of arithmetic expressions using +, -, *, and / for plus, minus, +times, and divided-by respectively. If a numeric argument requires +a +unit of measure, +a unit of measure must be appended to every digit in the +argument. For example: +

+

+	.ALD 1i-1v
+
+ +NOTE: groff does not respect the order of operations, +but rather evaluates arithmetic expressions from left to right. +Parentheses must be used to circumvent this peculiarity. Not to +worry, though. The likelihood of more than just the occasional plus +or minus sign when using mom's macros is slim. + +
Output line +
A line of text as it appears in output copy. + +
Primitives +
The two-letter, lower case instructions groff uses as its +native command language, and out of which macros are built. + +
String Argument +
Technically, any +argument +that is not numeric. In this documentation, string argument means +an argument that requires the user to input text. For example, in +the +macro +

+

+	.TITLE "My Pulitzer Novel"
+
+ +"My Pulitzer Novel" is a string argument. +

+Because string arguments must be enclosed by double-quotes, you can't +use double-quotes as part of the string argument. If you need +double-quotes to be part of a string argument, use the +inline escapes +\(lq and \(rq (leftquote and rightquote +respectively) in place of the double-quote character ("). + +

Unit of measure +
The single letter after a +numeric argument +that tells mom what measurement scale the argument +should use. Common valid units are: +

+

+ +
i = inches +
p = points +
P = picas +
c = centimetres +
m = ems +
n = ens +
v = the current leading (line space)
+
+

Units of measure must come immediately after the numeric argument (i.e. +with no space between the argument and the unit of measure), like this: +

+

+	.ALD 2v
+	.LL  39P
+	.IL  1i
+
+ +The above example advances 2 line spaces and sets the line length to +39 picas with a left indent of 1 inch. +

+IMPORTANT: Most mom macros +that set the size or measure of something MUST be given a unit of +measure. mom's macros do not have default units +of measure. There are a couple of exceptions, the most notable of +which are PT_SIZE and LS. Both use +points +as the default unit of measure, which means +you don't have to append "p" to their argument. +

+You can enter decimal values for any unit of measure. Different units +may be combined by adding them together (e.g. 1.5i+2m, which gives a +measure of 1-1/2 inches plus 2 ems). +

+NOTE: a pica is composed of 12 points, +therefore 12.5 picas is 12 picas and 6 points, not 12 picas +and 5 points. If you want 12 picas and 5 points, you have to +enter the measure as 12P+5p. + +

Zero-width character +
The +inline escape +that allows you to print a literal period, apostrophe and, if +output lines +are +filled, +a space that falls at the beginning of an +input line. +It looks like this: +

+

+	\&
+
+ +(backslash followed by an ampersand). +

+Normally, groff interprets a period (or an apostrophe) at the beginning +of an input line as meaning that what follows is a +control line. +In fill modes, groff treats a space at the beginning of an input +line as meaning "start a new line and put a space at the +beginning of it." If you want groff to interpret periods and +apostrophes at the beginning of input lines literally (i.e. print +them), or spaces at the beginning of input lines as just garden +variety word spaces, you must start the line with the zero-width +character. + +

+


+ + +

Mom's Document Processing Terms

+
+ + +
+
Blockquote +
Cited material other than +quotes. +Typically set at a smaller point size than paragraph text, indented +from the left and right margins. Blockquotes are +filled. + +
Control macro +
Macros used in +document processing +to control/alter the appearance of document elements (e.g. heads, +quotes, footnotes, +headers, +etc.). + +
Document header/docheader +
Document information (title, subtitle, author, etc) output +at the top of page one. + +
Epigraph +
A short, usually cited passage that appears at the +beginning of a chapter, story, or other document. + +
Footer/page footer +
Document information (frequently author and title) output in +the bottom margin of pages after page one. Not to be +confused with footnotes, which are considered part of +running text. + +
Head +
A title that introduces a major section of a document. + +
Header/page header +
Document information (frequently author and title) output in +the top margin of pages after page one. +

+NOTE: In terms of content and style, headers and +footers +are the same; they differ only in their placement on the page. In +most places in this documentation, references to the content or +style of headers applies equally to footers. + +

Linebreak/author linebreak +
A horizontal gap in +running text, +frequently set off by typographic symbols such as asterisks or +daggers. Used to indicate a shift in the content of a document +(e.g. a scene change in a short story). Also commonly called a +scene break or a section break. + +
Paragraph head +
A title joined to the body of a paragraph; hierarchically one +level beneath +subheads. + +
Quote +
A quote, to mom, is a line-for-line setting +of quoted material (e.g. poetry, song lyrics, or a snippet of +programming code). You don't have to use +BR +with quotes. + +
Running text +
In a document formatted with mom, running +text means text that forms the body of the document, including +elements such as heads and subheads. +Docheaders, +headers, +footers +and page numbers are NOT part of running text. + +
Subhead +
A title used to introduce secondary sections of a document; +hierarchically one level beneath sections introduced by +heads. + +
Toggle +
A macro or tag that, when invoked without an argument, +begins something or turns a feature on, and, when invoked with +ANY argument, ends something or turns a feature off. See +Example 3 +of the section +How to read macro arguments. +
+ +

+


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/docelement.html b/contrib/mom/momdoc/docelement.html new file mode 100644 index 0000000..4ca56b1 --- /dev/null +++ b/contrib/mom/momdoc/docelement.html @@ -0,0 +1,5041 @@ + + + + +Mom -- Document Processing, element tags + + + + + +Next   +Prev   +Back to Table of Contents +

+ + +

THE DOCUMENT ELEMENT TAGS

+ + + + + +

Introduction to the document element tags

+
+ +Once you've completed the setup for a document (see +Setting up a mom document), +formatting it is a snap. Simply invoke the appropriate tag for +each document element as you need it. The tags are macros that +tell mom, "This is a paragraph, this +is a subhead, this is a footnote," and so on. +

+The list of tags is actually quite small -- ideal for the users +mom brought herself into being for (see +Who mom is meant for). +However, the list of macros that control the appearance of the +tags upon output is extensive. Generally, for each tag, +there are +control macros +for the tag's family, font and point size. Where appropriate, there +are macros to control leading, indents, quad and special features +as well. +

+Mom has tasteful defaults for all the tags, hence you +only use the control macros when you want to change the way +she does things. This is usually done prior to +START, +but can, in fact, be done at any time in the course of a document. +Any change to a tag's style affects all subsequent invocations of +the tag. +

+ +

Control macros -- changing defaults

+ +

+The control macros for document processing tags let you +"design" the look of all the parts of your documents -- +should you wish. At a bare minimum, all tags have macros to change +mom's defaults for family, font, point size and +colour. Where appropriate, there are macros to control leading, +indents and quad as well. +

+In addition, many tags have special macros to control features that +are pertinent to those tags alone. Have a look at the section dealing +with any particular tag to find out what macros control the tag, +and what mom's defaults for the tag are. +

+The control macros may be used at any time during the course of +a document (i.e. before or after +START). The changes you +make alter all subsequent invocations of the affected tag until +you make another change, either by passing new arguments to the +tag's control macro, or toggling a particular feature of the tag on +or off. +

+And don't forget: the +typesetting macros +can be used at any time, including inside +toggle +tags (affecting only that particular invocation of the tag). +Equally, +inline escapes +can be used in tags that take +string arguments. +

+IMPORTANT NOTE: The family, font, point size, +colour and leading control macros have no effect in +PRINTSTYLE TYPEWRITE, +which sets EVERYTHING in Courier roman, 12/24 (i.e. 12-point type on +a linespace of 24 points). +

+Please also note that the defaults listed +with the control macros apply only to +PRINTSTYLE TYPESET +unless a default for TYPEWRITE is also given. +

+A WORD OF ADVICE: Get familiar with +mom at her default settings before exploring the +control macros. Put her through her paces. See how she behaves. +Get to know what she feels like and how she looks, both in your text +editor and on the printed page. Then, if you don't like something, +use this documentation to find the precise macro you need to change it. +There are tons of control macros. Reading up on them and trying to +remember them all might lead you to think that mom +is complex and unwieldy, which is not only untrue, but would offend +her mightily. +

+ +

Arguments to the control macros

+ +

Family and font

+The arguments to the control macros that end in +_FAMILY or _FONT are the same +as for +FAMILY +and +FT. + +

Point size

+Control macros that end in _SIZE always take +the form +digit or -digit where digit is +the number of +points +larger (+) or smaller (-) than the point size of paragraphs +you want the document element to be. For example, to change +subheads to 1-1/2 points larger than the type in paragraphs, do +

+

+	.SUBHEAD_SIZE +1.5
+
+ +There's no need for a +unit of measure +with the _SIZE control macros; points is assumed. + +

Colour

+Control macros that end in _COLOR take as their +argument a colour name pre-defined (or "initialized") +with +NEWCOLOR +or +XCOLOR. +For example, if you want your heads to be red, once you've defined +or initialized the color, red, +

+

+	.HEAD_COLOR red
+
+ +will turn your heads red. + +

Lead/linespacing

+Control macros that end in _AUTOLEAD take the +same argument as +AUTOLEAD, +viz. a digit that represents the number of points to add to the +tag's point size to arrive at its +lead. +For example, to set footnotes +solid, do +

+

+	.FOOTNOTE_AUTOLEAD 0
+
+ +To set footnotes with a 1-point lead (i.e. with the line spacing +one point greater than the footnote's point size), do +

+

+	.FOOTNOTE_AUTOLEAD 1
+
+ +

Indents

+Except for PARA_INDENT, the argument to the control +macros that end +in _INDENT is always a single digit (whole numbers +only; no decimal fractions) with no +unit of measure +appended to it. The digit represents by how much you want the +size of the paragraph first-line indent multiplied to achieve the +correct indent for a particular tag. + +

Quad/justification style

+Control macros that end in _QUAD take the same +arguments as +QUAD. +

+


+ +

Document element tags list

+ +
+ + + + +

Epigraphs

+ +

+Epigraphs +colour, flavour, or comment on the document they precede. Typically, +they are centred at the top of a document's first page (underneath the +title) and set in a smaller point size than that of paragraph text. +

+By default, mom sets epigraphs centred and +unfilled; +this lets you input them on a line for line basis. This behaviour +can be changed to accomodate +filled +epigraph "blocks." +

+ + + +


+

+ + Macro: EPIGRAPH <toggle> | [ BLOCK ] + + +

+EPIGRAPH is a toggle, used like this: +

+

+	.EPIGRAPH
+	<text of epigraph>
+	.EPIGRAPH OFF
+
+ +OFF, above, could be anything -- say, Q or X -- +since any argument other than BLOCK turns it off. +

+If given the argument BLOCK, EPIGRAPH +sets epigraphs +filled, +justified or quadded in the same direction as paragraphs, indented +equally from both the left and right margins. +

+If a block-style epigraph runs to more than one paragraph (unlikely, +but conceivable), you MUST introduce every paragraph +-- INCLUDING THE FIRST!!! -- with the +PP +tag. +

+NOTE: EPIGRAPH should only be +used at the top of a document (i.e. just after +START) +or after +heads. The latter is not especially +recommended, but it does work. In all other places where you +want quotes or cited text, use +QUOTE +or +BLOCKQUOTE. +

+ +

Epigraph control macros

+

+See +Arguments to the control macros. +

+

+.EPIGRAPH_FAMILY    default = prevailing document family; default is Times Roman
+.EPIGRAPH_FONT      default = roman
+.EPIGRAPH_SIZE      default = -1.5 (points)
+.EPIGRAPH_COLOR     default = black
+.EPIGRAPH_AUTOLEAD  default = 2 points
+
+(The next two apply to "block" style epigraphs only)
+
+.EPIGRAPH_QUAD      default = same as paragraphs
+.EPIGRAPH_INDENT*   default = para indent x 3 (for typeset), x 2 (for typewrite)
+
+*Indent here refers to the indent from both the left and right margins
+ that centres the block style epigraph on the page.
+
+
+ + + +

Paragraphs

+ +

+The paragraph macro is the one you use most often. Consequently, +it's one of most powerful, yet simplest to use -- just the letters +PP. No arguments, nothing. Just .PP +on a line by itself any time, in any document element, tells +mom you want to start a new paragraph. The spacing +and indent appropriate to where you are in your document are taken +care of automatically. +

+By default, mom does not indent the first paragraph +of a document, nor paragraphs that fall immediately after +heads +or +subheads. +The first paragraphs of blockquotes and block-style epigraphs are +also not indented. This behaviour can be changed with the control +macro +INDENT_FIRST_PARAS. +

+In contrast to some other macro packages, mom does not +deposit a blank line between paragraphs. If you want her to do so, use +the control macro PARA_SPACE. (I don't recommend +using this macro with +PRINTSTYLE TYPEWRITE.) +

+Note that mom does not provide "orphan +control" for paragraphs (i.e. even if only one line of a paragraph +fits at the bottom of a page, she will set it on that page). The +reason for this is that writers of fiction often have single-line +paragraphs (e.g. in dialogue). Groff's simplistic orphan control +will break these one-liners -- if they fall at the bottom of the page +-- to a new page, which is not what you want. +

+TIP: The last thing you want while you're writing +and editing drafts of a document (particularly stories and chapters) +is a text file cluttered up with PP's. The visual +interruption in the flow of text is a serious obstacle to creativity +and critiquing. +

+I use the tab key on my keyboard to indent paragraphs when I'm writing, +producing a text file that looks pretty much like what you see on +a printed page. When it comes time to format and print the file, +I run it through a sed script that (amongst other things) converts +the character generated by the tab key (^I) into .PP +(plus a new line), and pipe the output to groff for processing and +printing. +

+Another solution is to insert a blank line between paragraphs. +The blank lines can then be sedded out at print time as above, or, +more conveniently, you can use the .blm +primitive +(blank line macro) to instruct groff (and mom) +that blank lines should be interpreted as PP's. +

+

+	.blm PP
+
+tells groff that all blank lines are really the macro PP. +

+ + + +


+

+ + Macro: PP + + +

+PP (on a line by itself, of course) tells mom to +start a new paragraph. See +above +for more details. In addition to regular text paragraphs, you can +use PP in +epigraphs, +blockquotes +and +footnotes. + +

Paragraph control macros

+

+The PP being so important, and representing, as +it were, the basis of everything that goes on in a document, its +control is managed in a manner somewhat different from other document +element tags. +

+

    +
  1. Family control +
  2. Font control +
  3. Paragraph colour +
  4. Leading/linespacing control +
  5. Justification/quad control +
  6. First-line indent control +
  7. Initial paragraphs indent control +
  8. Paragraph spacing control +
+ +

1. Family

+

+The paragraph +family +is set with +FAMILY +prior to +START, +or +DOC_FAMILY +afterwards. Please note that both globally affect the family of +every element in the document. +

+If you wish to change the family for regular +text paragraphs only, invoke FAMILY immediately +after PP in EVERY paragraph whose family you wish +to differ from the prevailing document family. +

+Mom's default paragraph (and document) family +is Times Roman. +

+ +

2. Font -- PP_FONT

+

+To change the +font +used in regular text paragraphs, use .PP_FONT, +which takes the same argument as +FT. +PP_FONT may be used before or after +START. +Only regular text paragraphs are affected; paragraphs in +epigraphs, +blockquotes +and +footnotes +remain at their default setting (medium roman) unless you change them +with the appropriate control macros. +

+Mom's default paragraph font is medium roman. +

+ +

3. Paragraph colour

+

+Mom has no special control macro for colourizing +paragraphs. If you wish a colourized paragraph, you must use the +macro, +COLOR, +or the +inline escape, +\*[<colorname>], +after .PP. The colour must be one +pre-defined (or "initialized") with +NEWCOLOR +or +XCOLOR. +

+Please note that unless you change the colour back to it's default +(usually black) at the end of the paragraph, all subsequent +paragraphs will be set in the new colour, although most other +elements of your document will continue to be set in the default +colour (usually black). +

+For example, assuming you have defined the colour, blue, +

+

+	.PP
+	.COLOR blue
+	<first paragraph>
+	.HEAD "Monty Python"
+	.SUBHEAD "The Origins of Spam"
+	.PP
+	<second paragraph>
+
+ +the first paragraph will be blue, the head and subhead will be in +the document's default colour (usually black), and the second +paragraph will be in blue. +

+The one document element that is affected by changing the colour +of paragraphs are +paraheads, +since they are attached directly to the body of paragraphs. In +other words, if you change the colour of a paragraph and do not +reset the paragraph colour back to its default, subsequent paraheads +will appear in the same colour as your paragraphs unless you have +explicitly told mom you want a pre-defined (or +"initialized") color (usually black) for your paraheads. +

+See the footnote to +.PARAHEAD_COLOR. + +

4. Leading

+

+The paragraph +leading +is set with +LS +prior to +START, +or +DOC_LEAD +afterwards. Please note that either method globally affects the +leading and spacing of every document element (except +headers +and +footers). +

+If you wish to change the leading of regular text paragraphs only, +invoke LS immediately after PP in +EVERY paragraph whose leading you wish to change. +

+HYPER-IMPORTANT NOTE: It is extremely unwise to change +paragraph leading with LS, as it will, in all cases, +screw up mom's ability to balance the bottom margin +of pages. Should you absolutely need to change paragraph leading +with LS, and subsequently want mom +to get back on the right leading track, use the +SHIM +macro. +

+Mom's default paragraph leading (document leading) +is 16 points, adjusted to fill the page. +

+ +

5. Justification/quad

+

+The justification/quad-direction of regular text paragraphs (i.e. +justified, +or +filled +and +quadded +left/right/centre) is set with +JUSTIFY +or +QUAD +prior to +START, +and with +DOC_QUAD +afterwards. +

+Please note that either method of setting the paragraph +justification/quad-direction also affects +epigraphs +and +footnotes, +but not +blockquotes +(whose default is QUAD LEFT unless you change it with +BLOCKQUOTE_QUAD). +The justification/quad-direction of epigraphs and footnotes may +be changed with their own control macros. +

+If you wish to change the justification/quad-direction of +individual paragraphs, use JUSTIFY or +QUAD immediately after PP. +Only the paragraph in question gets justified or quadded +differently; subsequent paragraphs remain unaffected. +

+Mom's default justification/quad-direction for +paragraphs is +
+

+

+

6. First-line indent -- PARA_INDENT

+

+The first-line indent of paragraphs is controlled by +PARA_INDENT, which takes one argument: the size +of the indent. PARA_INDENT may be used before +or after +START. +A +unit of measure +is required; fractional sizes are allowed. Thus, to set the paragraph +indent to 4-1/2 +ems, do +

+

+	.PARA_INDENT 4.5m
+
+ +In addition to establishing the basic first line-indent of +paragraphs, PARA_INDENT also affects +epigraphs, +quotes +and +blockquotes, +whose overall indenting from the left and (where applicable) right +margins is relative to PARA_INDENT. Furthermore, the +first-line indent of paragraphs within these document elements (as well +as footnotes) is also relative to PARA_INDENT (always +1/2 of PARA_INDENT)), hence they are also affected. +

+Mom's default PARA_INDENT is 2 +ems for +PRINTSTYLE_TYPESET +and 3 picas (1/2 inch) for +PRINTSTYLE_TYPEWRITE. +

+ +

7. Indenting initial paragraphs -- INDENT_FIRST_PARAS

+

+By default, mom does not indent the first paragraph +of a document, nor the first paragraph after a head or +subhead, nor the first paragraphs of +epigraphs, +blockquotes +or +footnotes +that run to more than one paragraph. + +

+If you wish to have first paragraphs indented, invoke the macro +.INDENT_FIRST_PARAS with no argument, either +before or after +START. +INDENT_FIRST_PARAS is a toggle macro, therefore +passing it any argument (OFF, QUIT, Q, X...) cancels +its effect, meaning that first paragraphs will once again NOT be +indented. +

+ +

8. Spacing paragraphs -- PARA_SPACE

+

+By default, mom does not insert a blank line +between paragraphs. If you would like her to do so, invoke the +macro .PARA_SPACE with no argument, either +before or after +START. +PARA_SPACE is a toggle macro, therefore passing +it any argument (OFF, QUIT, Q, X...) cancels its +effect, meaning that paragraphs will once again NOT be separated by +a blank line. +

+NOTE: If PARA_SPACE is on, +mom spaces only those paragraphs that come after +an "initial" paragraph. Initial paragraphs are those +that come immediately after the +docheader, +epigraphs, +heads, +subheads +and +linebreaks. +(The first paragraph after these document elements requires no +blank line to separate it from other paragraphs.) +

+Sometimes, you can be fairly deep into a document before using +.PP for the first time, and when you do, because +mom is still waiting for that "initial" +paragraph, she doesn't space it with a blank line, even though +you expect her to. The simple workaround for this is to invoke +.PP twice (in succession) at the point you +expect the blank line to appear. +
+


+ + + +

Main heads

+ +

+Main heads -- or, in this documentation, just "heads" +-- should be used any place you want titles to introduce major +sections of a document. If you wish, mom can number +your heads for you. Head numbers can also be included +hierarchically in numbered +subheads +and +paraheads. +

+By default, heads are centred on the page, underlined, +all in caps. A double linespace precedes each head. In PRINTSTYLE TYPESET, heads +are bold, slightly larger than paragraph text. +

+If these defaults don't suit you, you can change them with the +head control macros. +

+ + + +


+

+ + Macro: HEAD "<text of head>" [ "<2nd line>" [ "<3rd line>" ... ] ] + + +

+The argument to HEAD is the text of the head, +surrounded by double-quotes. If you need additional lines for a +head, simply surround each line with double-quotes. +

+NOTE: If a head falls near the bottom of an output page +and mom is unable to fit the head plus at least +one line of text underneath it, she will set the head at the +top of the next page. +

+ADDITIONAL NOTE: If an +input line +in a head (i.e. one of the lines surrounded by double-quotes) has +to be broken by mom in order to fit the current +line-length (say, a narrow column measure), the head underline +(underscore) will not behave. You'll recognize the problem as soon +as you preview your document. If you encounter a head that +misbehaves with respect to underlining, the solution is to +supply each line as you want it as a separate argument +(surrounded by double-quotes) to the HEAD macro. +

+For example, if mom breaks +

+	.HEAD "This is a very, very, very long head"
+
+into +
+	This is a very, very, very
+	        long head        
+
+ +you'll see the misbehaving underscore and should change the +argument to HEAD to +
+	.HEAD "This is a very, very very" "long head"
+
+ +

Head control macros

+

+There are, in addition to the usual family/font/size/quad control +macros, a number of macros to manage head numbering, spacing, +underlining, and so on. Check them out if you're unhappy with +mom's defaults. +

+

    +
  1. Family/font/size/colour/quad +
  2. Caps +
  3. Pre-head space +
  4. Underlining +
  5. Numbering +
  6. Reset head numbering +
  7. Vertical inline escapes inside heads +
+

+

1. Family/font/size/colour/quad

+

+See +Arguments to the control macros. +

+

+.HEAD_FAMILY default = prevailing document family; default is Times Roman
+.HEAD_FONT   default = bold
+.HEAD_SIZE   default = +1 (point)
+.HEAD_COLOR  default = black
+.HEAD_QUAD   default = CENTER
+
+ +

2. Capitalizing heads -- HEAD_CAPS

+

+By default, mom sets heads in caps, regardless +of the +string(s) +you give to +HEAD. +To change this behaviour, do +

+

+	.HEAD_CAPS OFF
+
+ +HEAD_CAPS is a toggle macro, therefore you can use +any argument you like instead of OFF (END, +QUIT, Q, X...). To turn HEAD_CAPS back on, +simply invoke it without an argument. +

+ +

3. Space before heads -- HEAD_SPACE

+

+By default, mom deposits 2 blank lines prior to every +head. If you'd prefer just a single blank line, do +

+

+	.HEAD_SPACE OFF
+
+ +HEAD_SPACE is a toggle macro, therefore you can use +any argument you like instead of OFF (END, +QUIT, Q, X...). To restore the space before heads to 2 +blank lines, invoke HEAD_SPACE without an argument. +

+ +

4. Underlining heads -- HEAD_UNDERLINE

+

+By default, mom underlines heads. To change this +behaviour, do +

+

+	.HEAD_UNDERLINE OFF
+
+ +HEAD_UNDERLINE is a toggle macro, therefore you can +use any argument you like instead of OFF (END, +QUIT, Q, X...). To restore underlining of heads, invoke +HEAD_UNDERLINE without an argument. +

+ +

5. Number heads -- NUMBER_HEADS

+

+If you'd like your heads numbered, simply invoke +NUMBER_HEADS with no argument. Mom +will number all subsequent heads automatically (in ascending order, +naturally). +

+If, in addition to numbering heads, you also request that +subheads +and/or +paraheads +be numbered, the head number will be included in their numbers +(each number separated by a period [dot]). +

+Should you wish to stop head numbering, invoke +NUMBER_HEADS with any argument (OFF, QUIT, +END, X...). Head numbering will cease, and the head number +will not be included in the numbering of subheads and/or paraheads. +

+ +

6. Reset head numbering -- RESET_HEAD_NUMBER

+

+Should you wish to reset the head number to "1", invoke +RESET_HEAD_NUMBER with no argument. If, for some +reason, you want mom to use a head number that is not +the next in ascending order (i.e. the last head number + 1), invoke +RESET_HEAD_NUMBER with the number you want, e.g. +

+

+	.RESET_HEAD_NUMBER 6
+
+ +Your next head will be numbered "6" and subsequent heads will +be numbered in ascending order from "6". +

+ +

7. Vertical inline escapes inside heads

+

+If you need to adjust the +baseline +position of a head (e.g. the head falls at the top of a column and +you want its +ascenders +to line up with the ascenders of +running text +in other columns), you can embed a vertical motion +inline escape +(either +mom's +or +groff's +in the string(s) you pass to HEAD +

+For example, +

+

+	.HEAD "\[ALD3]Text of head"
+	    or
+	.HEAD "\[DOWN 3p]Text of head"
+
+ +will lower the baseline of the head by three points. Note that +there's no need to reverse the sense of the inline escape. +

+In the case of heads that run to more than one line, you must embed +the escape in the string for each line, like this: +

+

+	.HEAD "\[ALD3]First line" "\[ALD3]Next line" 
+	    or
+	.HEAD "\[DOWN 3p]First line" "\[DOWN 3p]Next line" 
+
+
+ + + +

Subheads

+ +

+Subheads should be used any place you want titles to introduce +sections of a document below heads. If you wish, mom +can number subheads for you. Subhead numbers can also be included +hierarchically in numbered +paraheads. +

+By default, subheads are flush left. In +PRINTSTYLE TYPESET, +they are set bold, slightly larger than paragraph text. In +PRINTSTYLE TYPEWRITE, +they are underlined. A single linespace precedes them in both +printstyles, and a tiny space adjustment raises them slightly +above text that comes afterwards for greater clarity in +document structuring. +

+If these defaults don't suit you, you can change them with the +subhead control macros. +

+ + + +


+

+ + Macro: SUBHEAD "<text of subhead>" [ "<2nd line>" [ "<3rd line>" ... ] ] + +

+The argument to SUBHEAD is the text of the subhead, +surrounded by double-quotes. If you need additional lines for a +subhead, simply surround each line with double-quotes. +

+NOTE: If a subhead falls near the bottom of an output +page and mom is unable to fit the head plus at +least one line of text underneath it, she will set the subhead +at the top of the next page. + +

Subhead control macros

+

+In addition to the usual family/font/size/quad control +macros, there are macros to manage subhead numbering. +

+

    +
  1. Family/font/size/colour/quad +
  2. Numbering +
  3. Reset subhead numbering +
  4. Vertical inline escapes inside subheads +
+

+

1. Family/font/size/quad

+

+See +Arguments to the control macros. +

+

+.SUBHEAD_FAMILY default = prevailing document family; default is Times Roman
+.SUBHEAD_FONT   default = bold
+.SUBHEAD_SIZE   default = +.5 (point)
+.SUBHEAD_COLOR  default = black
+.SUBHEAD_QUAD   default = LEFT
+
+ +

2. Number subheads -- NUMBER_SUBHEADS

+

+If you'd like your subheads numbered, simply invoke +.NUMBER_SUBHEADS with no argument. +Mom will number all subsequent subheads automatically +(in ascending order, naturally). +

+If, in addition to numbering subheads, you also request that +heads +be numbered, the head number will be included in the subhead number +(separated by a period [dot]). +

+Should you wish to stop subhead numbering, invoke +NUMBER_SUBHEADS with any argument (OFF, QUIT, +END, X...). Subhead numbering will cease, and the subhead +number will not be included in the numbering of paraheads. +

+ +

3. Reset head numbering -- RESET_SUBHEAD_NUMBER

+

+Should you wish to reset the subhead number to "1", invoke +RESET_SUBHEAD_NUMBER with no argument. If, for some +reason, you want mom to use a subhead number that is not +the next in ascending order (i.e. the last subhead number + 1), invoke +RESET_SUBHEAD_NUMBER with the number you want, e.g. +

+

+	.RESET_SUBHEAD_NUMBER 4
+
+ +Your next subhead will be numbered "4" and subsequent +subheads will be numbered in ascending order from "4". + +

Vertical inline escapes inside subheads

+See +Vertical inline escapes inside heads. +The information there applies equally to subheads. +

+


+ + + +

Paragraph heads

+ +

+Paragraph heads (paraheads) should be used any place you want titles +to introduce paragraphs below heads or subheads. If you wish, +mom can number paraheads for you. +

+By default, paraheads are joined to the body of a paragraph, +slightly indented (provided the paragraph is not a +"first" paragraph as defined in +Indenting initial paragraphs). +In +PRINTSTYLE TYPESET, +they are set bold italic, slightly larger than paragraph text. In +PRINTSTYLE TYPEWRITE, +they are underlined. +

+If these defaults don't suit you, you can change them with the +parahead control macros. +

+ + + +


+

+ + Macro: PARAHEAD "<text of parahead>" + +

+PARAHEAD must come AFTER +PP +or it will not work! +

+The argument is the text of the parahead, surrounded by double-quotes. +Because paraheads are joined to the body of a paragraph, they accept +only one argument (see +HEAD +and +SUBHEAD). +

+ +

Parahead control macros

+

+In addition to the family/font/size/colour/indent control macros, +there are macros to manage parahead numbering. +

+

    +
  1. Family/font/size/color +
  2. Indent +
  3. Numbering +
  4. Reset parahead numbering +
+

+

1. Family/font/size/colour

+

+See +Arguments to the control macros. +

+

+.PARAHEAD_FAMILY default = prevailing document family; default is Times Roman
+.PARAHEAD_FONT   default = bold italic
+.PARAHEAD_SIZE   default = +.5 (point)
+.PARAHEAD_COLOR  default = black*
+
+*If you colourize paragraph text, paraheads will appear in the same
+colour as the text unless you explicitly tell mom to colour them
+otherwise by invoking .PARAHEAD_COLOR.  If you do want paraheads
+that are coloured the same as paragraph text, it's generally a good
+idea to invoke .PARAHEAD_COLOR anyway (with the same colour used
+for paragraph text), just to let mom know.
+
+ +

2. Indent

+

+Unlike other control macros that end in +_INDENT, +the argument to the macro that controls indenting of paragraph heads +(PARAHEAD_INDENT) is NOT relative to the first-line +indent of normal paragraphs. In other words, it takes an absolute +value, and requires a +unit of measure. +For example, to set the paragraph head indent to 2-1/2 picas, you +do: +

+

+	.PARAHEAD_INDENT 2.5P
+
+Mom's default indent for paragraph heads is 1/2 +the first-line indent of normal paragraphs (both printstyles). +However, as stated above, if you choose to change the indent, you +must give an absolute value (unless you're a groff expert and want +to manipulate the number register \n[#PP_INDENT]u +arithmetically as the argument to PARAHEAD_INDENT +for an indent that's relative to PP_INDENT.) +

+NOTE: Paragraph heads in "first +paragraphs", as defined in +Indenting initial paragraphs, +are not indented unless you turn +INDENT_FIRST_PARAS +on. +

+ +

3. Number paraheads -- NUMBER_PARAHEADS

+

+If you'd like your paraheads numbered, simply invoke +.NUMBER_PARAHEADS with no argument. +Mom will number all subsequent paraheads automatically +(in ascending order, naturally). +

+If, in addition to numbering paraheads, you also request that +heads +and +subheads +be numbered, the head and/or subhead number will be included in the +parahead number (separated by a period [dot]). +

+Should you wish to stop parahead numbering, invoke +NUMBER_PARAHEADS with any argument (OFF, +QUIT, END, X...). Parahead numbering will cease. +

+ +

4. Reset head numbering -- RESET_PARAHEAD_NUMBER

+

+Should you wish to reset the parahead number to "1", invoke +RESET_PARAHEAD_NUMBER with no argument. If, for some +reason, you want mom to use a parahead number that is not +the next in ascending order (i.e. the last parahead number + 1), invoke +RESET_PARAHEAD_NUMBER with the number you want, e.g. +

+

+	.RESET_PARAHEAD_NUMBER 7
+
+ +Your next parahead will be numbered "7" and subsequent +paraheads will be numbered in ascending order from "7". +

+


+ + + +

Author linebreaks

+ +

+By default, mom marks +author linebreaks +with three centred asterisks. You can change this behaviour +with the linebreak character +control macro. +

+ + + +


+

+ + Macro: LINEBREAK + +
+Alias: SECTION + +

+LINEBREAK takes no arguments. Simply invoke it +(on a line by itself, of course) whenever you want to insert an +author linebreak. The appearance of the linebreak is controlled +by the +LINEBREAK_CHAR +macro. + +

Linebreak character control macro

+

+ + Macro: LINEBREAK_CHAR [ <character> ] [ <iterations> [ <vertical adjustment> ] ] + +
+Alias: SECTION_CHAR +
+*The third optional argument requires a +unit of measure. +

+LINEBREAK_CHAR determines what mom +prints when LINEBREAK is invoked. It takes 3 +optional arguments: the character you want deposited at the line +break, the number of times you want the character repeated, and a +vertical adjustment factor. +

+The first argument is any legal groff character (e.g. * +[an asterisk], \(dg [a dagger], \f(ZD\N'141\fP +[an arbitrary character from Zapf Dingbats], \l'4P' +[a 4-pica long rule]). Mom sets the character +centred on the current line length. (See "man groff_char" +for a list of all legal groff characters.) +

+The second argument is the number of times to repeat the character. +

+The third argument is a +|- value by which to raise (+) or lower (-) +the character in order to make it appear visually centred between +sections of text. This lets you make vertical adjustments +to characters that don't sit on the +baseline +(such as asterisks). The argument must be preceded by a plus or +minus sign, and must include a unit of measure. +

+If you enter LINEBREAK_CHAR with no arguments, +sections of text will be separated by two blank lines when you invoke +LINEBREAK. +

+Mom's default for LINEBREAK_CHAR is +

+

+	.LINEBREAK_CHAR * 3 -3p
+
+ +i.e. three asterisks, lowered 3 points from their normal vertical +position (for +PRINTSTYLE TYPESET; +the vertical adjustment is -2 points for +PRINTSTYLE TYPEWRITE). + +

Linebreak colour control macro

+

+ + Macro: LINEBREAK_COLOR <color name> + +

+To change the colour of the linebreak character(s), simply invoke +LINBREAK_COLOR with the name of a pre-defined (or +"initialized") colour. +
+


+ + + +

Quotes (line for line)

+ +

+Quotes +are always set in +nofill mode, +flush left. This permits entering quotes on a line for line basis in +your text editor and have them come out the same way on output copy. +(See +Blockquotes +for how quotes, in the present sense, differ from longer +passages of cited text.) +

+Since mom originally came into being to serve +the needs of creative writers (i.e. novelists, short story +writers, etc. -- not to cast aspersions on the creativity of +mathematicians and programmers), she sets quotes in italics +(PRINTSTYLE TYPESET) +or underlined +(PRINTSTYLE TYPEWRITE), +indented from the left margin. Obviously, she's thinking +"quotes from poetry or song lyrics", but with the +quote control macros +you can change her defaults so QUOTE serves other +needs, e.g. entering verbatim snippets of programming code, command +line instructions, and so on. (See the +tip +below for suggestions about including programming code snippets in +documents.) +

+ +Besides indenting quotes, mom further sets them +off from +running text +with a small amount of vertical whitespace top and bottom. In +PRINTSTYLE TYPEWRITE, +this is always one full linespace. In +PRINTSTYLE TYPESET, +it's 1/2 of the prevailing +leading +if the quote fits fully on the page (i.e. with running text above +and below it), otherwise it's a full linespace either above or below +as is necessary to balance the page to the bottom margin. This +behaviour can be changed with the control macro +ALWAYS_FULLSPACE_QUOTES. +

+NOTE: ALWAYS_FULLSPACE_QUOTES +applies to both +QUOTE +and +BLOCKQUOTE, +as does the control macro +QUOTE_INDENT. +

+Version 1.3: mom's handling of the vertical +whitespace around quotes has changed slightly. In versions prior +to 1.3, it was not possible to alter the +leading +of quotes and blockquotes (which was the same as the document +leading), ensuring that the vertical whitespace remained consistent, +as described above. In 1.3 and later, it is possible to change the +leading of quotes and blockquote via +the QUOTE_AUTOLEAD and +BLOCKQUOTE_AUTOLEADmacro. Now, if your quote +(or blockquote) leading differs from the document leading, +mom attempts to observe the same rules for vertical +whitespace outlined above; however, she will also insert a small, +flexible amount of extra whitespace around the quotes to make sure +the whitespace is equal, top and bottom. Since she does this on a +quote by quote basis, rather than by figuring out how much extra +whitespace is needed to adjust all quotes on a page, +the spacing around multiple quotes on the same page will differ +slightly, although each will be balanced between lines of normal +running text, +top and bottom. (The inability to scan an entire page and insert +equalized whitespace at marked places is a limitation of groff, +which, by and large, works in a linear, line by line fashion.) +If you don't provide mom with a +QUOTE_AUTOLEAD, quotes are leaded at the default +for normal running text, meaning that multiple quotes on the same +page are all spaced identically. +

+TIP: +If you want to include snippets of programming code in +mom documents, you may come acropper of the fact +that groff (and mom's) escape character is the +backslash. In order for mom not to interpret +backslashes that occur in code snippets as escapes, you have to +tell mom that the backslash character is +(temporarily) no longer the escape character. The easiest way +to do this is to set the escape character to something else for +the duration of the code snippet. You accomplish this with +ESC_CHAR, like this: +

+

+	.ESC_CHAR c
+
+ +where "c", above, is the alternate escape character +(which should be a character that does not appear in the code). To +set the escape character back to the backslash, simply invoke +.ESC_CHAR by itself (i.e. with no argument). +

+Because mom, by default, sets the text after +.QUOTE in italic (for PRINTSTYLE +TYPESET) or underlined (for PRINTSTYLE +TYPEWRITE), you'll want to change that behaviour as +well. Therefore, a recipe for setting verbatim code snippets using +QUOTE could be (assuming you want a fixed width +font like Courier): +

+

+	\# You only need the first two lines before the first invocation
+	\# of QUOTE.  They stay in effect for all subsequent invocations.
+	\#
+	.QUOTE_FONT       CR    \" Set quote font to Courier roman
+	.UNDERLINE_QUOTES OFF   \" Don't underline quotes in TYPEWRITE
+	.QUOTE
+	.ESC_CHAR ^             \" Change escape character to ^
+	<code snippet>
+	.ESC_CHAR               \" Restore escape character to \
+	.QUOTE OFF
+
+
+ + + +
+

+ + Macro: QUOTE toggle + + +

+QUOTE is a toggle macro. To begin a section of +quoted text, invoke it with no argument, then type in your quote. +When you're finished, invoke QUOTE with any +argument (e.g. OFF, END, X, Q...) to turn it off. Example: +

+

+	.QUOTE
+	Nymphomaniacal Jill
+	Used a dynamite stick for a thrill
+	They found her vagina
+	In North Carolina
+	And bits of her tits in Brazil.
+	.QUOTE END
+
+ +

Quote control macros

+
    +
  1. Family/font/size/leading/colour/indent +
  2. Spacing above and below (typeset only) +
  3. Underline quotes (typewrite only) +
  4. Manually break a footnoted quote that crosses pages/columns +
+

+

1. Family/font/size/colour/indent

+

+See +Arguments to the control macros. +

+

+.QUOTE_FAMILY   default = prevailing document family; default is Times Roman
+.QUOTE_FONT     default = italic; underlined in TYPEWRITE
+.QUOTE_SIZE     default = +0 (i.e. same size as paragraph text)
+.QUOTE_AUTOLEAD default = none; leading of quotes is the same as paragraphs
+.QUOTE_COLOR    default = black
+.QUOTE_INDENT   default = paragraph indent x 3 (typeset); x 2 (typewrite)
+               (note that this macro also sets the indents (left and right)
+                for blockquotes)
+
+ +

2. Spacing above and below -- ALWAYS_FULLSPACE_QUOTES (typeset only)

+

+If you'd like mom always to put a full linespace above +and below quotes, invoke .ALWAYS_FULLSPACE_QUOTES +with no argument. If you wish to restore mom's +default behaviour regarding the spacing of quotes (see +above), +invoke the macro with any argument (OFF, QUIT, END, +X...) +

+NOTE: This macro also sets mom's +spacing policy for +blockquotes. +

+ +

3. Underlining -- UNDERLINE_QUOTES (typewrite only)

+

+By default in +PRINTSTYLE TYPEWRITE, +mom underlines quotes. If you'd rather she didn't, +invoke .UNDERLINE_QUOTES with any argument +(OFF, QUIT, END, X...) to disable the feature. +Invoke it without an argument to restore mom's +default underlining of quotes. +

+If you not only wish that mom not underline +quotes, but also that she set them in italic, you must follow each +instance of QUOTE with the typesetting macro FT I. +Furthermore, since mom underlines all instances +of italics by default in PRINTSTYLE TYPEWRITE, +you must also make sure that ITALIC_MEANS_ITALIC +is enabled (see +PRINTSTYLE TYPEWRITE control macros). +

+ +

4. Manually break a footnoted quote -- BREAK_QUOTE

+

+NOTE: As of version 1.1.9, the macro +BREAK_QUOTE has become obsolete (or, at least, +should have become obsolete.) It remains here for backward +compatibility with documents created prior to 1.1.9, and just in +case, despite my efforts to make it obsolete, you still encounter the +problem it's supposed to fix. Should you find yourself having to +use BREAK_QUOTE while running mom +1.1.9 or higher, please notify me immediately. + +

+Exceptionally, a quote or blockquote containing a footnote may cross +a page or column. When this happens, the footnote marker may not be +correct for its position relative to other footnotes on the page, and +the footnote itself may appear on the wrong page or at the bottom of +the wrong column. When this happens, study your output to determine +the precise point at which the quote breaks (or at which you want +it to break), and add .BREAK_QUOTE on a line by itself +afterwards. No other intervention is required, and the footnote(s) +will be marked correctly and appear on the correct page. +

+BREAK_QUOTE may be used with both quotes and +blockquotes, and hence is aliased as BREAK_BLOCKQUOTE, +BREAK_CITATION and BREAK_CITE. +

+


+ + + +

Blockquotes (cited passages)

+ +

+BLOCKQUOTES are used to cite passages from another +author's work. So that they stand out well from +running text, +mom indents them from both the left and right margins +and sets them in a different point size +(PRINTSTYLE TYPESET +only). +Output lines +are +filled, +and, by default, +quadded +left. +

+Besides indenting blockquotes, mom further sets them +off from running text with a small amount of vertical whitespace top +and bottom. (See +above +for a complete explanation of how this is managed, and how to control it. +Be sure to read the section Version 1.3.) +

+ + + +


+

+ + Macro: BLOCKQUOTE toggle +
+ Aliases: CITE, CITATION +
+ +

+BLOCKQUOTE is a toggle macro. To begin a +cited passage, invoke the tag with no argument, then type in your quote. +When you're finished, invoke BLOCKQUOTE with any +argument (e.g. OFF, END, X, Q...) to turn it off. Example: +

+

+	.BLOCKQUOTE
+	Redefining the role of the United States from enablers to keep
+	the peace to enablers to keep the peace from peacekeepers is
+	going to be an assignment.
+	.RIGHT
+	\(emGeorge W. Bush
+	.BLOCKQUOTE END
+
+ +If the cited passage runs to more than one paragraph, you MUST +introduce each paragraph -- including the first! -- +with +PP. +

+NOTE: The aliases CITE +and CITATION may be used in place of the +BLOCKQUOTE tag, as well as in any of the control +macros that begin with BLOCKQUOTE_ or end with +_BLOCKQUOTE. + +

Blockquote control macros

+
    +
  1. Family/font/size/leading/colour/quad/indent +
  2. Spacing above and below (typeset only) +
  3. Manually break a footnoted blockquote that crosses pages/columns +
+

+

1. Family/font/size/colour/quad/indent

+

+See +Arguments to the control macros. +

+

+.BLOCKQUOTE_FAMILY   default = prevailing document family; default is Times Roman
+.BLOCKQUOTE_FONT     default = roman
+.BLOCKQUOTE_SIZE     default = -1 (point)
+.BLOCKQUOTE_AUTOLEAD default = none; leading of blockquotes is the same as paragraphs
+.BLOCKQUOTE_COLOR    default = black
+.BLOCKQUOTE_QUAD     default = left
+.BLOCKQUOTE_INDENT   default = paragraph indent x 3 (typeset); x 2 (typewrite)
+                    (note that this macro also sets the left indent for quotes)
+
+ +

2. Spacing above and below -- ALWAYS_FULLSPACE_QUOTES (typeset only)

+

+If you'd like mom always to put a full linespace above +and below blockquotes, invoke .ALWAYS_FULLSPACE_QUOTES +with no argument. If you wish to restore mom's +default behaviour regarding the spacing of blockquotes (see +above), +invoke the macro with any argument (OFF, QUIT, END, +X...). +

+NOTE: This macro also sets mom's +spacing policy for +quotes. +

+


+ + + +

Nested lists

+ +

+Lists are points or items of interest or importance that are +separated from +running text +by enumerators. Some typical enumerators are +en-dashes, +bullets, +digits and letters. +

+Setting lists with mom is easy. First, you +initialize a list with the LIST macro. Then, for +every item in the list, you invoke the macro, ITEM, +followed by the text of the item. When a list is finished, you +exit the list with LIST OFF (or +QUIT, END, BACK, +etc.) +

+By default mom starts each list with the enumerator +flush with the left margin of running text that comes before it, +like this: +

+

+	My daily schedule needs organizing.  I can't
+	seem to get everything done I want.
+	o an hour's worth of exercise
+	o time to prepare at least one healthy
+	  meal per day
+	o reading time
+	o work on mom
+	o writing
+	  - changes from publisher
+	  - current novel
+	o a couple of hours at the piano
+
+ +In other words, mom does not, by default, indent +entire lists. Indenting a list is controlled by the macro, +SHIFT_LIST. +(This is a design decision; there are too many instances where a +default indent is not desirable.) Equally, mom +does not add any extra space above or below lists. +

+Lists can be nested (as in the example above). In other words, you +can set lists within lists, each with an enumerator (and possibly, +indent) of your choosing. In nested lists, each invocation of +LIST OFF (you may prefer to use LIST +BACK) takes you back to the previous depth (or +level) of list, with that list's enumerator and indent intact. The +final LIST OFF exits lists completely and returns +you to the left margin of running text. +

+Finally, lists can be used in documents created with either the +document processing macros or just the typesetting macros. +

+ + + +


+

+ + Macro: LIST [ BULLET | DASH | DIGIT | ALPHA | alpha | ROMAN<n> | roman<n> | USER <string>] [ <separator> | <user-defined enumerator> ] [ <prefix> ] [ <off> ] +

+Invoked by itself (i.e. with no argument), LIST +initializes a list (with bullets as the default enumerator). +Afterwards, each block of input text preceded by +.ITEM, +on a line by itself, is treated as a list item. +

+NOTE: Every time you invoke LIST +to start a list (as opposed to +exiting one), +you must supply an enumerator (and optionally, a separator) for the +list, unless you want mom's default enumerator, +which is a bullet. Within nested lists, mom +stores the enumerator, separator and indent for any list you return +backwards to (i.e. with LIST OFF), but +does not store any information for lists you move forward +to. +
+ +

The first argument--enumerator style

+

+The optional arguments BULLET, +DASH, DIGIT (for +Arabic numerals), ALPHA (for uppercase +letters), alpha (for lowercase letters), +ROMAN<n> (for uppercase roman numerals), +roman<n> (for lowercase roman numerals) tell +mom what kind of enumerator to use for a given +list. +

+The arguments, ROMAN<n> and +roman<n>, are special. You must append to +them a digit (arabic, e.g. "1" or "9" or "17") saying how many items +a particular roman-numeralled LIST is going to +have. Mom requires this information in order to +align roman numerals sensibly, and will abort--with a message--if +you don't provide it. +

+A roman-numeralled list containing, say, five items, would be set +up like this: +

+

+	.LIST roman5        producing        i)   Item 1.
+	.ITEM                                ii)  Item 2.
+	Item 1.                              iii) Item 3.
+	.ITEM                                iv)  Item 4.
+	Item 2.                              v)   Item 5.
+	.ITEM
+	Item 3
+	.ITEM
+	Item 4
+	.ITEM
+	Item 5
+
+ +

+The argument, USER, lets you make up your own +enumerator, and must be followed by a second argument: what you'd +like the enumerator to look like. For example, if you want a list +enumerated with +=>, +

+

+	.LIST USER =>
+	.ITEM
+	A list item
+
+ +will produce +

+

+	=> A list item
+
+ +Please note: if the argument to +USER contains spaces, you must enclose the argument +in double quotes. + +
+ +

The second argument--separator style

+

+If you choose DIGIT, ALPHA, +alpha, ROMAN<n>, or +roman<n>, you may enter the optional +argument, separator, to say what kind of separator +you want after the enumerator. The separator can be anything you +like. The default for DIGIT is a period (dot), +like this: +

+

+	1. A list item
+
+ +The default separator for ALPHA, +alpha, ROMAN<n> and +roman<n> is a right parenthesis, like this: +

+

+	a) An alpha-ed list item
+	b) A second alpha-ed list item
+
+	   or
+
+	i)  A roman-ed list item
+	ii) A second roman-ed item
+
+ +If you'd prefer, say, digits with right-parenthesis separators +instead of the default period, you'd do +

+

+	.LIST DIGIT )
+	.ITEM
+	A numberd list item
+
+ +which would produce +

+

+	1) A numbered list item
+
+ +Please note: BULLET, DASH and +USER do not take a separator. +
+ +

The third argument--prefix style

+

+Additionally, you may give a prefix (i.e. a character that comes +before the enumerator) when your enumerator style for a +particular list is DIGIT, ALPHA, +alpha, ROMAN<n> +or roman<n>. In the arguments to +LIST, the prefix comes after the +separator, which may seem counter-intuitive, so please be careful. +

+A prefix can be anything you like. Most likely, you'll want some +kind of open-bracket, such as a left parenthesis. If, for example, +you want a DIGIT list with the numbers enclosed in +parentheses, you'd enter +

+

+	.LIST DIGIT ) (
+	.ITEM
+	The first item on the list.
+	.ITEM
+	The second item on the list.
+
+ +which would produce +

+

+	(1) The first item on the list.
+	(2) The second item on the list.
+
+ +Please note: BULLET, DASH and +USER do not take a prefix. +
+ + +

Exiting lists--.LIST OFF/BACK or .QUIT_LISTS

+

+Any single argument to LIST other +than BULLET, DASH, +DIGIT, ALPHA, +alpha, ROMAN<n>, +roman<n> or USER (e.g. +LIST OFF or LIST +BACK) takes you out of the current list. +

+If you are at the first list-level (or "list-depth"), +mom returns you to the left margin of running text. +Any indents that were in effect prior to setting the list are fully +restored. +

+If you are in a nested list, mom moves you +back one list-level (i.e. does not take you out of the +list structure) and restores the enumerator, separator and indent +appropriate to that level. +

+Each invocation of LIST should be be matched by +a corresponding LIST OFF in order to fully exit +lists. For example, +

+

+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+	o List item in level 1
+	o List item in level 1
+	  - List item in level 2
+	  - List item in level 2
+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+
+ +is created like this: +

+

+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+	.LIST BULLET
+	.ITEM
+	List item in level 1
+	.ITEM
+	List item in level 1
+	.LIST DASH
+	.ITEM
+	List item in level 2
+	.ITEM
+	List item in level 2
+	.LIST OFF    \" Turn level 2 list off
+	.LIST OFF    \" Turn level 1 list off
+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+
+ +Alternatively, you may use the single-purpose macro, +QUIT_LISTS, to get yourself out of a list +structure. In the example above, the two .LIST OFF +lines could be replaced with a single .QUIT_LISTS. +

+ +


+

+ + Macro: ITEM +

+After you've initialized a list with +LIST, +precede each item you want in the list with ITEM. +Mom takes care of everything else with respect to +setting the item appropriate to the list you're in. +

+In document processing, it is legal to have list items that contain +multiple paragraphs. Simply issue a +PP +request for each paragraph following the first item. +I.e., don't do this: +

+

+	.ITEM
+	.PP
+	Some text...
+	.PP
+	A second paragraph of text
+
+ +but rather +

+

+	.ITEM
+	Some text...
+	.PP
+	A second paragraph of text
+
+
+ +

List control macros

+
    +
  1. Indenting lists (SHIFT_LIST) +
  2. Resetting an initialized list's enumerator (RESET_LIST) +
  3. Padding digit enumerators (PAD_LIST_DIGITS) +
+ +

1. Indenting lists -- SHIFT_LIST

+

+If you want a list to be indented to the right of running text, or +indented to the right of a current list, use the macro +SHIFT_LIST immediately after +LIST. +SHIFT_LIST takes just one argument: the amount by +which you want the list shifted to the right. The argument requires +a +unit of measure, +

+SHIFT_LIST applies only to the list you +just initialized with LIST. It does not carry +over from one invocation of LIST to the next. +However, the indent remains in effect when you return to a +list level in a nested list. +

+For example, if you want a 2-level list, with each list indented to +the right by 18 +points, +

+

+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+	.LIST           \" List 1
+	.SHIFT_LIST 18p \" Indent 18 points right of running text
+	.ITEM
+	List 1 item
+	.ITEM
+	List 1 item
+	.LIST DASH      \" List 2
+	.SHIFT_LIST 18p \" Indent 18 points right of list 1
+	.ITEM
+	List 2 item
+	.ITEM
+	List 2 item
+	.LIST OFF       \" Move back to list 1
+	.ITEM
+	List 1 item
+	.ITEM
+	List 1 item
+	.LIST OFF       \" Exit lists
+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+
+ +produces (approximately) +

+

+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+	    o List 1 item
+	    o List 1 item
+	        - List 2 item
+	        - List 2 item
+	    o List 1 item
+	    o List 1 item
+	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore.
+
+ +

2. Resetting an initialized list's enumerator -- RESET_LIST

+

+In nested lists, if your choice of list enumerator for a given +level of list is DIGIT, ALPHA, +alpha, ROMAN or +roman, you may sometimes want to reset the list's +enumerator when you return to that list. Consider the following: +

+

+	Things to do religiously each and every day:
+	1. Take care of the dog
+	   a) walk every day
+	   b) brush once a week
+	      - trim around the eyes every fourth brushing
+	      - don't forget to check nails
+	2. Feed the cat
+	   a) soft food on Mon., Wed. and Fri.
+	   b) dry food on Tues., Thurs. and Sat.
+	   c) canned tuna on Sunday
+
+ +Normally, within a nested list, when you return to an +incrementally-enumerated list, the enumerator continues incrementing +from where it left off. That means, in the example above, the +normal state of affairs for the alpha'ed list under "2. Feed +the cat" would be c), d) and e). The solution, in such a case, +is simply to reset the enumerator --before ITEM!-- +with the macro, RESET_LIST. +

+By default, with no argument, RESET_LIST resets the +enumerator to 1, A, a, I or i depending on the style of enumerator. +You may, if you wish, pass RESET_LISTS a numeric +argument representing the starting enumerator for the reset (if +different from "1"), although I can't at present think of a use for +this feature. +

+

3. Padding digit enumerators (PAD_LIST_DIGITS)

+

+Arabic digits +

+When your choice of enumerators is DIGIT AND the +number of items in the list exceeds nine (9), you have to make a +design decision: should mom leave room for the +extra numeral in two-numeral digits to the right or the left of +the single-numeral digits? +

+If you want the extra space to the right, invoke the macro, +.PAD_LIST_DIGITS (with no argument), after +LIST and before ITEM. This will +produce something like +

+

+	8.  List item
+	9.  List item
+	10. List item
+
+ +If you want the extra space to the left, invoke +PAD_LIST_DIGITS with the single argument, +LEFT, which will produce +

+

+	 8. List item
+	 9. List item
+	10. List item
+
+ +Of course, if the number of items in the list is less than ten +(10), there's no need for PAD_LIST_DIGITS. +

+Roman numerals +

+By default, mom sets roman numerals in lists flush +left. The <n> argument appended to +ROMAN<n> or roman<n> +allows her to calculate how much space to put after each numeral in +order to ensure that the text of items lines up properly. +

+If you'd like the roman numerals to line up flush right (i.e. be +padded "left"), simply invoke PAD_LIST_DIGITS +LEFT after LIST ROMAN<n> +or LIST roman<n> amd before +ITEM. +

+


+ + + +

Line numbering

+ + +

+Mom's line-numbering capabilities are not as flexible +as most of her other document processing macros. The reason is +that groff's underlying line-numbering +primitive, +.nm, is, well...primtive. It is not possible, for +example, to select a particular family or font for use exclusively +with line numbers. Nor is it possible to set the +gutter +using any +unit of measure +other than the +figure space. +

+That said, when you turn line-numbering on, mom, +by default +
+ +

    +
  • numbers every line of paragraph text; line-numbering is + suspended for all other document processing tags (like + docheaders, epigraphs, heads, subheads, etc.) and special + pages (covers, endotes, bibliographies, etc.); be aware, + though, that if you turn + docheaders + off (with + DOCHEADER OFF) + and create your own docheader, mom + will line-number your custom docheader +
  • doesn't touch your line length; line numbers are hung + outside your current left margin (as set with + L_MARGIN, + PAGE + or + DOC_LEFT_MARGIN), + regardless of any indents that may be active +
  • separates line numbers from running text by two + figure spaces. +
+

+Line numbering may be enabled and disabled for +QUOTE +and/or +BLOCKQUOTE +in one of three styles. See +Line numbering control macros for quotes and blockquotes. +

+The first time you invoke +NUMBER_LINES +you must, at a minimum, tell it what line number you want the +next +output line +to have. Optional arguments allow you to state which lines should +be numbered (e.g. every five or every ten lines), and the gutter to +place between line numbers and +running text. +

+Subsequently, you can turn line-numbering off, either permanently, +or resume it later at a place of your choosing. When you +resume line-numbering, the line numbers pick up where you left off. +

+ + + +


+

+ + + Macro: NUMBER_LINES <start number> [ <which lines to number> [ <gutter> ] ] +
+ Macro: NUMBER_LINES <anything> | RESUME +
+
+ + +

+NUMBER_LINES does what it says: prints line +numbers, to the left of +output lines +of paragraph text. One of the chief reasons for wanting numbered +lines is in order to identify footnotes or endnotes by line number +instead of by a marker in the text. (See +.FOOTNOTE_MARKER_STYLE LINE +for instructions on line-numbered footnotes, and +.ENDNOTE_MARKER_STYLE +for instructions on line-numbered endnotes.) +

+Every time you invoke NUMBER_LINES, unless you are +using the arguments OFF (QUIT, +END, X, etc.) or +RESUME you must, at a minimum, pass it one +argument, namely the number (digit) you want the next +output line +to have. For example, +

+	.NUMBER_LINES 3
+
+ +will prepend the number, 3, to the next output line. +

+Normally, of course, you will number lines of text starting at 1. +All you have to do in that case is ensure that +

+	.NUMBER_LINES 1
+
+ +precedes your first line of input text, which will also be the +first line of output text. +

+You can alter mom's default line numbering +behaviour (see +above) +with the optional arguments <which lines to +number> and <gutter>. +

+<which lines to number> instructs +NUMBER_LINES to number only certain lines, e.g. +every two lines or every five lines. If you want, say, only every +five lines to have a prepended number, you'd do +

+	.NUMBER_LINES 1 5
+
+ +GOTCHA! The argument to <which +lines to number> only numbers those lines that are +multiples of the argument. Hence, in the above example, line +number "1" will not be numbered, since "1" is not a +multiple of "5". +

+If you wanted line number "1" to be numbered, you'd have to invoke +.NUMBER_LINES 1 1 before the first output line, then +study your output copy and determine where best to insert +the following in your input copy: +

+	.NUMBER_LINES \n(ln 5
+
+ +(The escape, \n(ln, ensures that +NUMBER_LINES automatically supplies the correct +value for the first argument, <start +number>.) +

+Following this recipe, line number 1 will be numbered; subsequently, +only line numbers that are multiples of 5 will be numbered. A +little experimentation may be required to determine the best place +for it. +

+The optional argument, <gutter>, tells +mom how much space to put between the line numbers +and the running text. +

+Note: when giving a value for +<gutter>, you cannot skip the +<which lines to number> argument. Either +fill in the desired value, or use two double-quotes +("") to have mom use the value +formerly in effect. +

+<gutter> does not require (or even accept) a +unit of measure. +The argument you pass to it is the number of +figure spaces +you want between line numbers and running text. +Mom's default gutter is two figure spaces. If +you'd like a wider gutter, say, four figures spaces, you'd do +

+	.NUMBER_LINES 1 1 4
+	                |
+	                +-- Notice you *must* supply a value
+	                    for the 2nd argument in order to supply
+	                    a value for the 3rd.
+
+ +

+After you've set up line-numbering, NUMBER_LINES +can be used to control line numbering. +
+

Line-numbering control

+

+NUMBER_LINES OFF (or END, QUIT, X, etc.) +turns line-numbering off. +

+Sometimes, you merely want to suspend line-numbering. In that case, +turn line numbering off with NUMBER_LINES OFF. +Later, when you want it to resume, enter +

+	.NUMBER_LINES RESUME
+
+ +Line numbering will resume exactly where it left off. If this is +not what you want--say you want to reset the line number to "1"--simply +invoke NUMBER_LINES with whatever arguments +are needed for the desired result. +

+Extra Notes: +
+

    +
  1. In document processing, you may invoke NUMBER_LINES + either before or after START. + Mom doesn't care. +
  2. If you're collating documents with + COLLATE, + you should re-invoke, at a minimum, .NUMBER_LINES + 1 for each collated document, in order to ensure that + each begins with the number "1" prepended to the first line + (unless, of course, that is not what you want). +
  3. Occasionally, you may want to change the current gutter + between line numbers and running text without knowing + what the next output line number should be. Since + NUMBER_LINES requires this number + as its first argument, in such instances, pass + NUMBER_LINES as its first argument the + escape \n(ln. +

    + For example, if you were numbering every 5 lines with a + gutter of 2 (figure spaces) and you needed to change the + gutter to 4 (figures spaces), +

    +     .NUMBER_LINES \n(ln 5 4 +

    + would do the trick. +

  4. If you're using margin notes in a document, be sure to set + the gutter for margin notes wide enough to allow room for + the line numbers. +
  5. Mom (groff, actually), only numbers lines + to the left of text. For aesthetic reason, + therefore, the use of line numbering when setting a document + in columns is discouraged. However, should you wish to + number lines when setting in columns, make sure the + gutter(s) + between columns is wide enough to leave room for the + numbers. +
+
+ +

Line numbering control macros for QUOTE and BLOCKQUOTE

+
    +
  1. NUMBER_QUOTE_LINES +
  2. NUMBER_BLOCKQUOTE_LINES +
  3. Setting up line numbering in quotes and blockquotes on a case by case basis +
+ +

1. NUMBER_QUOTE_LINES

+

+If you'd like mom to number lines of output text +in a +QUOTE +as part of the same order and sequence as paragraph text, simply +invoke NUMBER_QUOTE_LINES by itself. +

+There is a catch with numbering quotes, though. Owing to groff's +restriction of accepting only the figure space as the line number +gutter's unit of measure, it is not possible for line numbers +in quotes to hang outside a document's overall left margin and +be reliably flush with the line numbers of paragraph text. +Conseqently, line numbers in quotes hang to the left of the quote, +separated from the quote by the <gutter> +argument. +

+If you'd like to change the gutter for quotes line-numbered in +this way, invoke NUMBER_QUOTE_LINES with a digit +representing the number of +figure spaces +you'd like between the line numbers and the quoted text, like this: +

+	.NUMBER_QUOTE_LINES 1
+
+ +With the above, line numbers in quotes (and only quotes) will have +a gutter of 1 figure space. +

+If you are using "line numbering style" for footnotes +(FOOTNOTE_MARKER_STYLE LINE), +you may not wish to have quotes visibly line-numbered, but +still want to embed footnotes inside quotes. In order to do that, +mom allows you to say NUMBER_QUOTE_LINES +SILENT. +

+When you invoke NUMBER_QUOTE_LINES +SILENT, mom continues to increment line +numbers while quotes are being output, but they won't appear in the +output copy. (Compare this with mom's default +behaviour of suspending incrementing of line numbers +during the output of quotes.) This allows you to embed +line-numbered footnotes inside quotes and have the line number +"label" in the footnote come out sensibly. +

+Once having turned NUMBER_QUOTE_LINES on, you +may disable it with NUMBER_QUOTE_LINES OFF (or +QUIT, END, X, +etc). +

+ +

2. NUMBER_BLOCKQUOTE_LINES

+

+If you'd like mom to number lines of output text +in a +BLOCKQUOTE +as part of the same order and sequence as paragraph text, simply +invoke NUMBER_BLOCKQUOTE_LINES by itself. +

+There is a catch with numbering blockquotes, though. Owing to +groff's restriction of accepting only the figure space as the +line number gutter's unit of measure, it is not possible for line +numbers in blockquotes to hang outside a document's overall left +margin and be reliably flush with the line numbers of paragraph +text. Conseqently, line numbers in blockquotes hang to the +left of the blockquote, separated from the blockquote by the +<gutter> argument. +

+If you'd like to change the gutter for blockquotes line-numbered in +this way, invoke NUMBER_BLOCKQUOTE_LINES with a digit +representing the number of +figure spaces +you'd like between the line numbers and the blockquoted text, like +this: +

+	.NUMBER_BLOCKQUOTE_LINES 1
+
+ +With the above, line numbers in blockquotes (and only blockquotes) +will have a gutter of 1 figure space. +

+If you are using "line numbering style" for footnotes +(FOOTNOTE_MARKER_STYLE LINE), +you may not wish to have blockquotes visibly line-numbered, +but still want to embed footnotes inside blockquotes. In +order to do that, mom allows you to say +NUMBER_BLOCKQUOTE_LINES SILENT. +

+When you invoke NUMBER_BLOCKQUOTE_LINES +SILENT, mom continues to increment line +numbers while blockquotes are being output, but they won't appear in +the output copy. (Compare this with mom's default +behaviour of suspending incrementing of line numbers during +the output of blockquotes.) This allows you to embed line-numbered +footnotes inside blockquotes and have the line number "label" in the +footnote come out sensibly. +

+Once having turned NUMBER_BLOCKQUOTE_LINES on, you +may disable it with NUMBER_BLOCKQUOTE_LINES OFF (or +QUIT, END, X, +etc). +

+ +

3. Setting up line numbering in quotes and blockquotes on a case by case basis

+

+Sometimes, you may want quotes or blockquotes to have a different +line numbering scheme from the one used in the rest of the +document. Or, you may want line numbering enabled only inside a +particular quote or blockquote. A common reason for this would be +if you were using the +QUOTE +macro to insert lines of programming code into a document. (See +here +for suggestions about including programming code snippets in +documents.) +

+To enable line numbering within quotes or blockquotes on a case by +case basis, simply invoke NUMBER_LINES, with the +arguments you need, immediately after entering QUOTE +or BLOCKQUOTE. (NUMBER_QUOTE_LINES +and/or NUMBER_BLOCKQUOTE_LINES should be turned +off if you're doing this.) The quote or blockquote will then be +line-numbered according to your specifications: the starting line +number of the quote or blockquote will be the one you give as a +first argument to NUMBER_LINES; which lines to +number will be the value you pass to <which lines to +number> (defaults to "1"); line numbers will hang +to the left of the quote or blockquote, separated from the quote or +blockquote by <gutter> (defaults to "2"). +

+As soon as QUOTE or BLOCKQUOTE is +turned off, line numbering ceases, not only with respect to +subsequent paragraph text (if they are not being line-numbered), +but also for any subsequent invocation of QUOTE or +BLOCKQUOTE. In other words, you must re-enable +quote or blockquote line-numbering inside every instance of +QUOTE or BLOCKQUOTE when +line-numbering either of them on a case by case basis. +

+


+ + + +

Footnotes

+ + +

+For something so complex behind the scenes, footnotes are easy to use. +You just type, for example +

+ +

+	...the doctrines of Identity as urged by Schelling\c
+	.FOOTNOTE
+	<footnote about who the hell is Schelling>
+	.FOOTNOTE OFF
+	 were generally the points of discussion presenting the most
+	of beauty to the imaginative Morella.
+
+ +and be done with it. +

+(Note the obligatory use of the \c +inline escape. +It is required when your +FOOTNOTE_MARKER_STYLE +is either STAR [star/dagger footnotes] or +NUMBER [superscript numbers]; it is NOT to be used +when the FOOTNOTE_MARKER_STYLE is +LINE, or when footnote markers have been disabled +with +.FOOTNOTE_MARKERS +OFF.) +

+***Version 1.3 change*** +

+As of version 1.3, the manner of entering the line +after .FOOTNOTE OFF has changed +to accommodate users' differing wishes with respect to +the order of punctuation and footnote markers. The +correct way to enter the line after .FOOTNOTE +OFF--ONLY if your +FOOTNOTE_MARKER_STYLE is +STAR or NUMBER--is to input +it as if it's literally a continuation of the line before +.FOOTNOTE, and therefore begins with either a space +or a punctuation mark, as in the two following examples. +

+

+	   Example 1					  Example 2
+	   ---------                      ---------
+
+	A line of text,\c				A line of text\c
+	.FOOTNOTE						.FOOTNOTE
+	A footnote line.				A footnote line.
+	.FOOTNOTE OFF					.FOOTNOTE OFF
+	 broken up with a comma.		, broken up with a comma.
+
+	(last line begins with			(last line begins with
+	 a literal space)				 the comma and a space)
+
+ +If your FOOTNOTE_MARKER_STYLE is line, none of +this is a concern. +

+***End of version 1.3 change*** +

+After you invoke FOOTNOTE, mom +takes care of everything: putting footnote markers in the body of +the document, keeping track of how many footnotes are on the page, +identifying the footnotes themselves appropriately, balancing them +properly with the bottom margin, deferring footnotes that don't fit +on the page... Even if you're using +COLUMNS, +mom knows what to do, and Does The Right Thing. +

+Footnotes can be sly little beasts, though. If you're writing a +document that's footnote-heavy, you might want to read the following. +

+ +

Footnote behaviour

+

+By default, mom marks footnotes with alternating +stars (asterisks), daggers, and double-daggers. The first footnote +gets a star, the second a dagger, the third a double-dagger, the +fourth two stars, the fifth two daggers, etc. If you prefer +numbered footnotes, rest assured mom is happy to +oblige. +

+A small amount of vertical whitespace and a short horizontal rule +separate footnotes from the document body. The amount of whitespace +varies slightly from page to page depending on the number of lines +in the footnotes. Mom tries for a nice balance +between too little whitespace and too much, but when push comes to +shove, she'll usually opt for ample over cramped. The last lines of +footnotes are always flush with the document's bottom margin. + +

+If mom sees that a portion of a footnote cannot +be fit on its page, she carries that portion over to the next +page. If an entire footnote can't be fit on its page (i.e. +FOOTNOTE has been called too close to the bottom), +she defers the footnote to the next page, but sets it with the +appropriate marker from the previous page. +

+When footnotes occur within cited text, for example a +QUOTE +or a +BLOCKQUOTE, +mom will usually opt for deferring the footnote +over to the next page if it allows her to complete the cited text +on one page. +

+In the unfortunate happenstance that a deferred footnote is the +only footnote on its page (i.e. it's marked in the document body with +a star) and the page it's deferred to has its own footnotes, +mom separates the deferred footnote from the page's +proper footnote(s) with a blank line. This avoids the confusion that +might result from readers seeing two footnote entries on the same page +identified by a single star (or the number 1 if you've requested +numbered footnotes that begin at 1 on every page). The blank line +makes it clear that the first footnote entry belongs to the previous +page. +

+In the circumstance where a deferred footnote is not the only one +on its page, and is consequently marked by something other than a +single star, there's no confusion and mom doesn't +bother with the blank line. (By convention, the first footnote on +a page is always marked with a single star, so if readers see, say, +a dagger or double-dagger marking the first footnote entry, they'll +know the entry belongs to the previous page). +

+Very exceptionally, two footnotes may have to be deferred (e.g. one +occurs on the second to last line of a page, and another on the +last line). In such a circumstance, mom does not +add a blank after the second deferred footnote. If you'd like a +blank line separating both deferred footnotes from any footnotes +proper to the page the deferred ones were moved to, add the space +manually by putting a +.SPACE +command at the end of the footnote text, before +FOOTNOTE OFF (or FOOTNOTE X, QUIT, +EXIT, etc...). +

+Obviously, deferred footnotes aren't an issue if you request numbered +footnotes that increase incrementally throughout the whole document -- +yet another convenience mom has thought of. +

+While mom's handling of footnotes is +sophisticated, and tries to take nearly every imaginable situation +under which they might occur into account, some situations are +simply impossible from a typographic standpoint. For example, if +you have a +HEAD +near the bottom of the page AND that page has some footnotes on it, +mom may simply not have room to set any text under +the head (normally, she insists on having room for at least one line +of text beneath a head). In such an instance, mom +will either set the head, with nothing under it but footnotes, +or transfer the head to the next page. Either way, you'll have a +gaping hole at the bottom of the page. It's a sort of typographic +Catch-22, and can only be resolved by you, the writer or formatter +of the document, adjusting the type on the offending page so as to +circumvent the problem. +

+NOTE: Exceptionally, you may encounter problems with footnotes inside +quotes and blockquotes that cross a page or column. See BREAK_QUOTE +for a solution. +

+ +

Footnote markers and punctuation in the running text

+ +

+As of version 1.3, the manner of entering the line after +.FOOTNOTE OFF has changed. The correct way to +enter the line after .FOOTNOTE OFF now is to +input it as if it's literally a continuation of the line before +.FOOTNOTE, and therefore begins with either a space +or a punctuation mark, as in the two following examples. +

+

+	   Example 1					  Example 2
+	   ---------                      ---------
+
+	A line of text,\c				A line of text\c
+	.FOOTNOTE						.FOOTNOTE
+	A footnote line.				A footnote line.
+	.FOOTNOTE OFF					.FOOTNOTE OFF
+	 broken up with a comma.		, broken up with a comma.
+
+	(last line begins with			(last line begins with
+	 a literal space)				 the comma and a space)
+
+ +Care must be taken, though, if the punctuation mark that begins the +line after FOOTNOTE OFF is a period (dot). You +must begin such lines with +\&., like this: +

+

+	end of a sentence\c
+	.FOOTNOTE
+	A footnote line.
+	.FOOTNOTE OFF
+	\&.  A new sentence...
+
+ +If you omit the \&., the line will vanish! +

+ + + + +


+

+ + Tag: FOOTNOTE <toggle> | INDENT LEFT | RIGHT | BOTH <indent value> +
+ *See
HYPER-IMPORTANT NOTE!!! +
+ <indent value> requires a + unit of measure + + +

+FOOTNOTE is a toggle macro, therefore invoking it +on a line by itself allows you to enter a footnote in the body of a +document. Invoking it with any argument other than INDENT +(i.e. OFF, QUIT, END, X...) tells mom +you're finished. +

+Footnotes are the only element of +running text +that are not affected by the typesetting +indent macros. +In the unlikely event that you want a page's footnotes to line +up with a running indent, invoke FOOTNOTE with +the INDENT argument and pass it an indent +direction and indent value. L, R, and +B may be used in place of LEFT, +RIGHT, and BOTH. +FOOTNOTE must be invoked with INDENT +for every footnote you want indented; mom does +not save any footnote indent information from invocation to +invocation. +

+NOTE: If a footnote runs to more than one +paragraph(!), DO NOT begin the footnote with +the +PP +tag. Use PP only to introduce subsequent paragraphs. +

+HYPER-IMPORTANT NOTE: +The final word on the +input line +that comes immediately before FOOTNOTE MUST terminate +with a +\c +inline escape if your +FOOTNOTE_MARKER_STYLE +is either STAR or NUMBER. +See the +footnote example +above. +

+Additionally, the line after a FOOTNOTE +OFF should be entered as if there were no interruption in +the input text, i.e. the line should begin with a literal space or +punctuation mark. See +above. +

+Do NOT use the \c inline escape if your +FOOTNOTE_MARKER_STYLE is LINE, or +if you have disabled footnote markers with +.FOOTNOTE_MARKERS +OFF. As well, the line after +FOOTNOTE OFF should be entered normally. + +

+

Footnote control macros

+
    +
  1. Family/font/size/colour/lead/quad +
  2. Footnote markers -- on or off +
  3. Footnote marker style -- star+dagger, numbered or by line number + +
  4. Reset footnote number -- set footnote marker number to 1 +
  5. Inter-footnote spacing +
  6. Footnote rule -- on or off +
  7. Footnote rule length -- length of footnote separator rule +
  8. Adjust vertical position of footnote separator rule +
+

+

1. Family/font/size/colour/lead/quad

+

+See +Arguments to the control macros. +

+

+.FOOTNOTE_FAMILY    default = prevailing document family; default is Times Roman
+.FOOTNOTE_FONT      default = roman
+.FOOTNOTE_SIZE      default = -2 (points)
+.FOOTNOTE_COLOR     default = black
+.FOOTNOTE_AUTOLEAD  default = 2 points (typeset); single-spaced (typewrite)
+.FOOTNOTE_QUAD      default = same as paragraphs
+
+ +

2. Footnote markers -- FOOTNOTE_MARKERS

+

+If you don't want footnote markers, in either the body of +the document or beside footnote entries themselves, toggle +them off with .FOOTNOTE_MARKERS OFF (or +END, QUIT, X...). This means, of course, that +you'll have to roll your own. If you want them back on, invoke +.FOOTNOTE_MARKERS with no argument. Footnote markers +are on by default. +

+If FOOTNOTE_MARKERS are disabled, do NOT use the +\c inline escape to terminate the line before +.FOOTNOTE. +

+ +

3. Footnote marker style -- FOOTNOTE_MARKER_STYLE

+

+Mom gives you two choices of footnote marker style: +star+dagger (see +footnote behaviour +above), or numbered. +

+.FOOTNOTE_MARKER_STYLE STAR gives you star+dagger +(the default). There is a limit of 10 footnotes per page with +this style. +

+.FOOTNOTE_MARKER_STYLE NUMBER gives you superscript +numbers, both in the document body and in the footnote entries +themselves. By default, footnote numbers increase incrementally +(prev. footnote number + 1) throughout the whole document. You can +ask mom to start each page's footnote numbers at 1 +with .RESET_FOOTNOTE_NUMBER +(see below.) +

+

+.FOOTNOTE_MARKER_STYLE LINE lets you have +footnotes which are identified by line number, rather than by a +marker in the text. (Note that +NUMBER_LINES +must be enabled in order to use this marker style.) +

+With FOOTNOTE_MARKER_STYLE LINE, mom +will identify footnotes either by single line numbers, or line +ranges. If what you want is a single line number, you need only +invoke .FOOTNOTE, without terminating the text +line before it with \c, at the appropriate +place in running text. +

+If you want a range of line numbers (e.g. [5-11] ), +insert, directly into the first line of the range you want, the +inline escape, +\*[FN-MARK]. For the terminating line number of +the range, you need only invoke .FOOTNOTE, (again, +without attaching \c to the text line before it). +Mom is smart enough to figure out that where +FOOTNOTE was invoked represents the terminating +line number. Range-numbered footnotes are always output on the page +where FOOTNOTE was invoked, not the page where +\*[FN-MARK] appears (subject, of course, to the +rules for footnotes that fall too close to the bottom of a page, as +outlined +here). + +

+Mom, by default, puts footnote line numbers inside +square brackets. The style of the brackets may be changed with +the macro, FOOTNOTE_LINENUMBER_BRACKETS, which +takes one of three possible arguments: PARENS +("round" brackets), SQUARE (the default) or +BRACES (curly braces). If you prefer a +shortform, the arguments, (, [ or +{ may be used instead. + +

+If you don't want the numbers enclosed in brackets, you may tell +mom to use a "separator" instead. A common +separator would be the colon, but it can be anything you like. The +macro to do this is FOOTNOTE_LINENUMBER_SEPARATOR, +which takes, as its single argument, the separator you want. For +safety and consistency's sake, ALWAYS enclose the argument in +double-quotes. +

+The separator can be composed of any legal groff character, or any +combination of characters. A word of caution: when +using a separator, mom doesn't insert a space +after the separator. Hence, if you want the space (you probably +do), you must make the space part of the argument you pass to +FOOTNOTE_LINENUMBER_SEPARATOR. For example, +to get a colon separator with a space after it, you'd do +

+

+	.FOOTNOTE_LINENUMBER_SEPARATOR ": "
+
+ +RUN-ON FOOTNOTES +

+Finally, if your footnote marker style is LINE, you +may instruct mom to do "run-on style" footnotes. +Run-on footnotes do not treat footnotes as discrete entities, i.e. +on a line by themselves. Rather, each footnote is separated from +the footnote before it by a space, so that the footnotes on any +given page form a continuous block, like lines in a paragraph. The +macro to get +mom to run footnotes on is +.FOOTNOTES_RUN_ON. Invoked by itself, it turns +the feature on. Invoked with any other argument +(OFF, NO, etc.), it turns the +feature off. It is generally NOT a good idea to turn the feature +on and off during the course of a single document. If you do, +mom will issue a warning if there's going to be a +problem. However, it is always perfectly safe to enable/disable the +feature after +COLLATE. +

+The usual reason for wanting run-on footnotes is that you're +using them to hold many, short references. (See +here +for instructions on using the groff program, +refer, to set up references.) + +

+ +

4. Reset footnote number -- RESET_FOOTNOTE_NUMBER

+

+.RESET_FOOTNOTE_NUMBER, by itself, resets +footnote numbering so that the next footnote you enter is +numbered 1. +

+.RESET_FOOTNOTE_NUMBER PAGE tells +mom to start every page's footnote numbering at 1. +

+ +

5. Inter-footnote spacing -- FOOTNOTE_SPACE

+

+If you'd like a little extra space between footnotes, you can have +mom put it in for you by invoking +.FOOTNOTE_SPACE with an argument representing the +amount of extra space you'd like. The argument to +FOOTNOTE_SPACE requires a +unit of measure. +

+In the following example, footnotes will be separated from each +other by 3 +points. +

+	.FOOTNOTE_SPACE 3p
+
+ +

6. Footnote rule -- FOOTNOTE_RULE

+

+If you don't want a footnote separator rule, toggle it off with +.FOOTNOTE_RULE OFF (or END, +QUIT, X...). Toggle it back on by invoking +.FOOTNOTE_RULE with no argument. The default is to +print the rule. +

+ +

7. Footnote rule length -- FOOTNOTE_RULE_LENGTH

+

+If you want to change the length of the footnote separator rule, +invoke .FOOTNOTE_RULE_LENGTH with a length, like +this, +

+	.FOOTNOTE_RULE_LENGTH 1i
+
+ +which sets the length to 1 inch. Note that a +unit of measure +is required. The default is 4 +picas +for both +PRINTSTYLES. +

+ +

8. Adjust vertical position of footnote separator rule -- FOOTNOTE_RULE_ADJ

+

+The footnote separator rule is actually a baseline rule that falls +on the +baseline +of the first line of a page's footnotes. By default, +mom raises the rule 3 +points +from the baseline so that the separator and the footnotes don't +look jammed together. If you'd prefer a different vertical +adjustment, invoke .FOOTNOTE_RULE_ADJ with the +amount you'd like. For example +

+

+	.FOOTNOTE_RULE_ADJ 4.25p
+
+ +raises the rule by 4-1/4 points. Note that you can only raise +the rule, not lower it. A +unit of measure +is required. +

+Tip: If your document +leading +is 2 +points +or less (e.g your +point size +is 10 and your linespacing is 10, 11, or 12, lowering +mom's default footnote rule adjustment will +almost certainly give you nicer looking results than leaving +the adjustment at the default. Furthermore, you can invoke +FOOTNOTE_RULE_ADJ on any page in which footnotes +appear, or in any column, so that the placement of the footnote rule +can be changed on-the-fly, should you wish to do so. +

+


+ + + +

Endnotes

+ + +

+Embedding endnotes into mom documents is accomplished +the same way as embedding +footnotes. The example below is +identical to the one shown in the +introduction to footnotes, +except that .FOOTNOTE has been replaced with +.ENDNOTE. +

+ +

+	...the doctrines of Identity as urged by Schelling\c
+	.ENDNOTE
+	<endnote about who the hell is Schelling>
+	.ENDNOTE OFF
+	 were generally the points of discussion presenting the most
+	of beauty to the imaginative Morella.
+
+ +As with footnotes, note the obligatory use of the \c +inline escape +when your +ENDNOTE_MARKER_STYLE +is NUMBER (which marks endnotes references in +running text +with superscript numbers). When the marker style is +LINE, you must not use the +\c escape. +

+***Version 1.3 change*** +

+As of version 1.3, the manner of entering the line after +.ENDNOTE OFF has changed to accommodate users' +differing wishes with respect to the order of punctuation and +endnote markers. The correct way to enter the line after +.ENDNOTE OFF--but NOT +if your +ENDNOTE_MARKER_STYLE +is LINE--is to input it as if it's literally +a continuation of the line before .ENDNOTE, and +therefore begins with either a space or a punctuation mark, as in +the two following examples. +

+ +

+	   Example 1					  Example 2
+	   ---------                      ---------
+
+	A line of text,\c				A line of text\c
+	.ENDNOTE						.ENDNOTE
+	A footnote line.				A footnote line.
+	.ENDNOTE OFF					.ENDNOTE OFF
+	 broken up with a comma.		, broken up with a comma.
+
+	(last line begins with			(last line begins with
+	 a literal space)				 the comma and a space)
+
+ +***End version 1.3 change*** +

+Endnotes differ from footnotes in two ways (other than the fact that +endnotes come at the end of a document whereas footnotes appear in the +body of the document): +
+

    +
  1. When your ENDNOTE_MARKER_STYLE is + NUMBER, endnotes are always numbered + incrementally, starting at "1". +
  2. Endnotes MUST be output explicitly; mom does + not output them for you. In + collated + documents, this allows you to choose whether you + want the endnotes to appear at the end of each chapter or + article in a document, or grouped together at the very end + of the document. +
+

+Within endnotes, you may use the document element tags +PP, +QUOTE +and +BLOCKQUOTE. +This provides the flexibility to create endnotes that run to several +paragraphs, as well as to embed cited text within endnotes. +

+Should you wish to change the appearance of quotes or blockquotes that +appear within endnotes, you may do so with the +quote control macros +or +blockquote control macros. +HOWEVER... you must make the changes within each endnote, prior +to invoking QUOTE or BLOCKQUOTE, and +undo them prior to terminating the endnote (i.e. before ENDNOTE +OFF), otherwise the changes will affect subsequent quotes and +blockquotes that appear in the document body as well. +

+ +

Endnote behaviour

+
+When you output endnotes (with +ENDNOTES), +mom finishes processing the last page of your document, +then breaks to a new page for printing the endnotes. If the document +type is +CHAPTER, +the centre part of the +header +(or footer), which, by default, contains a chapter number or title, is +removed. +

+By default, mom starts the endnotes page with a +bold, centred, double-underscored head, "ENDNOTES". +Underneath--flush left, bold, and underscored--she prints the document +title (or, in the case of chapters, the chapter number or title). She +then prints the endnotes. Each endnote is identified by its appropriate +number, in bold, right aligned to two placeholders. The text of the +endnotes themselves is indented to the right of the numbers. +

+If the endnotes are grouped together at the end of a collated document, +each section of the document that contains endnotes is identified by its +own unique title (or chapter number or title), bold, flush left, and +underscored. +

+Of course, all the defaults, as well as the overall style of the +endnotes page, can be changed with the +endnote control macros. +The attentive will notice that endnotes have an awful lot of control +macros. This is because endnotes are like a mini-document unto +themselves, and therefore need not be bound by the style parameters of +the body of the document. +

+ + +

A Note on Endnote Spacing

+ +
+On the endnotes page(s), each new endnote is separated from the +previous endnote by a full line space. This can result in a bottom +margin that hangs, and is the one instance, other than the use of +PARA_SPACE, +where mom allows unequal bottom alignment of pages. +Should you wish to correct this, by adding or subtracting small amounts +of space between endnotes that appear together on an endnotes page, make +the adjustment (with +ALD, +RLD +or +SPACE) +at the end of each endnote (i.e. just before invoking +ENDNOTE OFF) +rather than at the top. +

+ + +

Endnotes and columnar documents

+ +
+Formerly (pre 1.1.6), there was no way to set a document in columns +(see +COLUMNS) +and then turn off column mode for endnotes. As of version 1.1.6, +you may now do so. See +ENDNOTES_NO_COLUMNS. +

+


+ + + +

+ + Macro: ENDNOTE <toggle> +
+ *See
HYPER-IMPORTANT NOTE!!! + + +

+ENDNOTE is a toggle macro, therefore invoking it +on a line by itself allows you to enter an endnote in the body of a +document. Invoking it with any other argument +(i.e. OFF, QUIT, END, X...) tells mom +that you've finished the endnote. +

+NOTE: If an endnote runs to more than one paragraph, +DO NOT begin the endnote with the +PP +tag. Use PP only to introduce subsequent paragraphs. +

+HYPER-IMPORTANT NOTE: +If your +ENDNOTE_MARKER_STYLE +is NUMBER (mom's default), the +final word on the +input line +that comes immediately before ENDNOTE MUST terminate +with a +\c +inline escape. See the +endnote example +above. +

+Additionally, the line after +.ENDNOTE OFF should be entered as if there +were no interruption in the input text, i.e. the line should begin +with a literal space or punctuation mark. See the two +examples, +above. +

+If your ENDNOTE_MARKER_STYLE is +LINE, do NOT use the \c escape, +and enter the line after .ENDNOTE OFF +normally. +

+ + + +


+

+Tag: ENDNOTES + +

+Unlike footnotes, which mom automatically outputs at the +bottom of pages, endnotes must be explicitly output by you, the user. +ENDNOTES, by itself (i.e. without any argument), is +the macro to do this. +

+Typically, you'll use ENDNOTES at the end of +a document. If it's a single (i.e. not collated) document, +mom will print the endnotes pertaining to it. If it's +a collated document, mom will print all the endnotes +contained within all sections of the document (typically chapters), +appropriately identified and numbered. +

+Should you wish to output the endnotes for each section of a collated +document at the ends of the sections (instead of at the very end of the +document), simply invoke ENDNOTES immediately prior to +COLLATE. +Mom will print the endnotes, identified and numbered +appropriately, on a separate page prior to starting the next section of +the document. Each subsequent invocation of ENDNOTES +outputs only those endnotes that mom collected +after the previous invocation. +

+


+ +

Endnote control macros

+

+VERY IMPORTANT NOTE! +
+Endnote control macros must always be invoked prior to the first +instance of +ENDNOTE/ENDNOTE OFF. +

+When you embed endnotes in the body of a document, +mom collects and processes them for later +outputting (when you invoke +ENDNOTES). +By the time you do invoke ENDNOTES, it's much too +late to change your mind about how you want them to look. +

+My advice? If you're planning to change the default appearance of +endnotes pages, set them up prior to +START. +

+

    +
  1. General endnotes-pages style control + +
  2. Endnotes-page header/footer control + +
  3. Endnotes-page head (i.e. the title at the top) control + +
  4. Endnote document-identification title + +
  5. Endnotes-pages endnote numbering style + +
+
+ +

1. General endnotes page style control

+ +

*Endnote family/font/quad

+

+See +Arguments to the control macros. +

+

+.ENDNOTE_FAMILY    default = prevailing document family; default is Times Roman
+.ENDNOTE_FONT      default = roman
+.ENDNOTE_QUAD*     default = justified
+
+*Note: ENDNOTE_QUAD must be set to either L or J
+
+ + + +

*Endnote point size

+

+Macro: ENDNOTE_PT_SIZE <base type size of endnotes> + +

+Unlike most other control macros that deal with size of document +elements, ENDNOTE_PT_SIZE takes as its argument an +absolute value, relative to nothing. Therefore, the argument represents +the size of endnote type in +points, +unless you append an alternative +unit of measure. +For example, +

+

+	.ENDNOTE_PT_SIZE 12
+
+ +sets the base point size of type on the endnotes page to 12 +points, whereas +

+

+	.ENDNOTE_PT_SIZE .6i
+
+ +sets the base point size of type on the endnotes page to 1/6 of an +inch. +

+The type size set with ENDNOTE_PT_SIZE is the size of +type used for the text of the endnotes, and forms the basis from which +the point size of other endnote page elements is calculated. +

+The default for +PRINTSTYLE TYPESET +is 12.5 points (the same default size used in the body of the document). +

+ + + +

*Endnote lead

+

+Macro: ENDNOTE_LEAD <base leading of endnotes> [ ADJUST ] +
+*Does not require a unit of measure; points is assumed + +

+Unlike most other control macros that deal with leading of document +elements, ENDNOTE_LEAD takes as its argument an +absolute value, relative to nothing. Therefore, the argument represents +the +leading +of endnotes in +points +unless you append an alternative +unit of measure. +For example, +

+

+	.ENDNOTE_LEAD 14
+
+ +sets the base leading of type on the endnotes page to 14 +points, whereas +

+

+	.ENDNOTE_LEAD .5i
+
+ +sets the base leading of type on the endnotes page to 1/2 inch. +

+If you want the leading of endnotes adjusted to fill the page, pass +ENDNOTE_LEAD the optional argument +ADJUST. (See +DOC_LEAD_ADJUST +for an explanation of leading adjustment.) +

+The default for +PRINTSTYLE TYPESET +is 14 points, adjusted. +

+NOTE: Even if you give mom a +DOC_LEAD_ADJUST OFF command, she will still, by +default, adjust endnote leading. You MUST enter +ENDNOTE_LEAD <lead> with no +ADJUST argument to disable this default behaviour. +

+ + + +

*Singlespace endnotes (TYPEWRITE only)

+

+Macro: SINGLESPACE_ENDNOTES <toggle> + +

+If your +PRINTSTYLE +is TYPEWRITE and you use TYPEWRITE's default +double-spacing, endnotes are double-spaced. If your document is +single-spaced, endnotes are single-spaced. +

+If, for some reason, you'd prefer that endnotes be single-spaced +in an otherwise double-spaced document (including double-spaced +collated +documents), invoke SINGLESPACE_ENDNOTES with +no argument. And if, god help you, you want to change endnote +single-spacing back to double-spacing for different spacing of +endnotes output at the ends of separate documents in a collated +document, invoke SINGLESPACE_ENDNOTES with any +argument (OFF, QUIT, Q, X...). +

+ + + +

*Endnote paragraph indenting

+

+Macro: ENDNOTE_PARA_INDENT <amount to indent first line of paragraphs in endnotes> +
+*Requires a unit of measure + +

+ENDNOTE_PARA_INDENT works exactly the same way as +PARA_INDENT, +except that the indent given is the amount by which to indent the first +lines of endnote paragraphs, not document body paragraphs. +

+The default is 1.5 +ems +for +PRINTSTYLE TYPESET; +1/2 inch for +PRINTSTYLE TYPEWRITE. + +

+NOTE: The first line of the first paragraph of endnotes +(the one attached immediately to the identifying endnote number) is +never indented. Only subsequent paragraphs are affected by +ENDNOTE_PARA_INDENT. +

+ + + +

*Endnote paragraph spacing

+

+Macro: ENDNOTE_PARA_SPACE <toggle> + +

+ENDNOTE_PARA_SPACE works exactly the same way as +PARA_SPACE, +except that it inserts a blank line between endnote paragraphs, not +document body paragraphs. +

+The default is not to insert a blank line between paragraphs in +endnotes. +

+NOTE: Each endnote itself is always separated from any +previous endnote by a line space. ENDNOTE_PARA_SPACE +refers only to paragraphs that appear within each discrete endnote. +

+ + + +

*Turning off column mode during endnotes output

+

+Macro: ENDNOTES_NO_COLUMNS <toggle> + +

+By default, if your document is +set in columns, +mom sets the endnotes in columns, too. However, +if your document is set in columns and you'd like the endnotes not +to be, just invoke ENDNOTES_NO_COLUMNS with no +argument. The endnotes pages will be set to the full page measure +of your document. +

+If you output endnotes at the end of each document in a +collated +document set in columns, column mode will automatically +be reinstated for each document, even with +ENDNOTES_NO_COLUMNS turned on. +

+ + + +

*Endnotes-pages page numbering style

+

+Macro: ENDNOTES_PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha + +

+Use this macro to set the page numbering style of endnotes pages. +The arguments are identical to those for +PAGENUM_STYLE. +The default is digit. You may want to change it +to, say, alpha, which you would do with +

+

+	.ENDNOTES_PAGENUM_STYLE alpha
+
+ + + +

*Setting the first page number of endnotes pages

+

+Macro: ENDNOTES_FIRST_PAGENUMBER <page # that appears on page 1 of endnotes> + +

+Use this macro with caution. If all endnotes for several +collated +documents are to be output at once, i.e. not at the end of each +separate doc, ENDNOTES_FIRST_PAGENUMBER tells +mom what page number to put on the first page of +the endnotes. +

+If you set ENDNOTES_FIRST_PAGENUMBER in collated +documents where the endnotes are output after each separate doc, +you have to reset every separate document's first page number after +COLLATE +and before +START. +

+ + + +

*Omitting a page number on the first page of endnotes

+

+Macro: ENDNOTES_NO_FIRST_PAGENUM <toggle> + +

+This macro is for use only if FOOTERS are on. It +tells +ENDNOTES +not to print a page number on the first endnotes page. +Mom's default is to print the page number. +

+ + + +

*Suspending pagination of endnotes pages

+

+Macro: SUSPEND_PAGINATION +
+Macro: RESTORE_PAGINATION + +

+SUSPEND_PAGINATION doesn't take an argument. +Invoked immediately prior to +ENDNOTES, +it turns off endnotes pages pagination. Mom +continues, however to increment page numbers silently. +

+To restore normal document pagination after endnotes, invoke +RESTORE_PAGINATION (again, with no argument) +immediately after ENDNOTES. + +

2. Endnotes-page header/footer control

+

+ +If you wish to modify what appears in the header/footer that appears +on endnotes page(s), make the changes before you invoke +ENDNOTES, +not afterwards. +

+Except in the case of +DOCTYPE CHAPTER, +mom prints the same header or footer used throughout +the document on the endnotes page(s). Chapters get treated differently +in that, by default, mom does not print the +header/footer centre string (normally the chapter number or chapter +title.) In most cases, this is what you want. However, should you +not want mom to remove the centre string from +the endnotes page(s) headers/footers, invoke +ENDNOTES_HEADER_CENTER +with no argument. +

+An important change you may want to make is to put the word +"Endnotes" in the header/footer centre position. +To do so, do +

+

+	.HEADER_CENTER "Endnotes"
+	           or
+	.FOOTER_CENTER "Endnotes"
+
+ +prior to invoking .ENDNOTES. If your +DOCTYPE +is CHAPTER, you must also invoke +ENDNOTES_HEADER_CENTER +for the HEADER_CENTER to appear. +

+ +

*Endnotes page(s) header/footer centre string

+

+Macro: ENDNOTES_HEADER_CENTER toggle + +

+If your +DOCTYPE +is CHAPTER and you want mom to include +a centre string in the headers/footers that appear on endnotes pages, +invoke ENDNOTES_HEADER_CENTER (or +ENDNOTES_FOOTER_CENTER) with no argument. +Mom's default is NOT to print the centre string. +

+If, for some reason, having enabled the header/footer centre string +on endnotes pages, you wish to disable it, invoke the same macro +with any argument (OFF, QUIT, Q, X...). +

+ +

*Allow headers on endnotes-pages

+

+Macro: ENDNOTES_ALLOWS_HEADERS <none> | ALL + +

+By default, if HEADERS are on, mom +prints page headers on all endnotes pages except the first. If you +don't want her to print headers on endnotes pages, do +

+

+	.ENDNOTES_ALLOWS_HEADERS OFF
+
+ +If you want headers on every page including the first, do +

+

+	.ENDNOTES_ALLOWS_HEADERS ALL
+
+ +NOTE: If FOOTERS are on, +mom prints footers on every endnotes page. This is +a style convention. In mom, there is no such beast +as ENDNOTES_ALLOWS_FOOTERS OFF. +

+ +

3. Endnotes-page first page head (title) control

+ + + +

*Endnotes-page first page head (title) string

+

+Macro: ENDNOTE_STRING "<head to print at the top of endnotes>" + +

+By default, mom prints the word "ENDNOTES" +as a head at the top of the first page of endnotes. If you want her +to print something else, invoke ENDNOTE_STRING with +the endnotes-page head you want, surrounded by double-quotes. If +you don't want a head at the top of the first endnotes-page, invoke +ENDNOTE_STRING with a blank argument (either two +double-quotes side by side -- "" -- or no argument +at all). +

+ + + +

*Endnotes-page first page head (title) control

+

+See +Arguments to the control macros. +

+

+.ENDNOTE_STRING_FAMILY    default = prevailing document family; default is Times Roman
+.ENDNOTE_STRING_FONT      default = bold
+.ENDNOTE_STRING_SIZE*     default = +1
+.ENDNOTE_STRING_QUAD      default = centred
+
+*Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
+
+ + + +

*Endnotes-page head (title) underscoring

+

+Macro: ENDNOTE_STRING_UNDERSCORE toggle | 2 + +

+Invoked by itself, ENDNOTE_STRING_UNDERSCORE will +underscore the endnotes-page head. Invoked with the argument 2 +(i.e. the digit 2), ENDNOTE_STRING_UNDERSCORE will +double-underscore the head. Invoked with any other argument, the macro +disables underscoring of the head. +

+Mom's default is to double-underscore the +head, therefore if you want no underscoring, you must insert +.ENDNOTE_STRING_UNDERSCORE OFF (or QUIT, X, NO, +NONE, etc.) into your document prior to outputting endnotes with +ENDNOTES. + + + +

*Endnotes-page head (title) automatic capitalization

+

+Macro: ENDNOTE_STRING_CAPS toggle + +

+Invoked by itself, ENDNOTE_STRING_CAPS will +automatically capitalize the endnotes-page head. Invoked with any +other argument, the macro disables automatic capitalization of the +head. +

+If you're generating a table of contents, you may want the +endnotes-pages head string in caps, but the toc entry in caps/lower +case. If the argument to +ENDNOTE_STRING +is in caps/lower case and ENDNOTE_STRING_CAPS is +on, this is exactly what will happen. +

+Mom's default is to capitalize the endnotes-pages +head string. +

+ + + +

4. Endnote document-identification title

+

*Endnote document-identification title string

+

+Macro: ENDNOTE_TITLE "<title to identify a document in endnotes>" + +

+By default, mom identifies the document(s) to which +endnotes belong by the document title(s) given to the +TITLE +macro. If you'd want her to identify the document(s) another way, +just invoke ENDNOTE_TITLE with the identifying +title you want, surrounded by double-quotes. +

+If you don't want any identifying title, invoke +ENDNOTE_TITLE with a blank argument (either two +double-quotes side by side -- "" -- or no +argument at all). This is particularly useful if you have a single +(i.e. non-collated) document and find having the document's title +included in the endnotes redundant. +

+ + + +

*Endnote document-identification title control

+

+See +Arguments to the control macros. +

+

+.ENDNOTE_TITLE_FAMILY    default = prevailing document family; default is Times Roman
+.ENDNOTE_TITLE_FONT      default = bold
+.ENDNOTE_TITLE_SIZE*     default = 0
+.ENDNOTE_TITLE_QUAD      default = left
+
+*Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
+
+ + + +

*Endnote document-identification title underscoring

+

+Macro: ENDNOTE_TITLE_UNDERSCORE toggle + +

+Invoked by itself, ENDNOTE_TITLE_UNDERSCORE will +underscore the endnote document-identification title(s). Invoked with any +other argument, the macro disables underscoring of the title(s). +

+Mom's default is to underscore the document-identification title, therefore if you want no underscoring, you must +insert .ENDNOTE_TITLE_UNDERSCORE OFF (or QUIT, X, NO, +NONE, etc.) into your document prior to outputting endnotes with +ENDNOTES. +

+ + + +

5. Endnotes-pages endnote numbering style

+ +

*Endnote marker style

+

+The macro to control how endnotes are referenced is +ENDNOTE_MARKER_STYLE. +

+By default, mom places superscript numbers in +running text +to identify endnotes. However, if you have +line-numbering +turned on, you may instruct mom not to put +superscript numbers in the running text, but rather to reference +endnotes by line number. The command to do this is +

+

+	.ENDNOTE_MARKER_STYLE LINE
+
+ +With ENDNOTE_MARKER_STYLE LINE, mom +will identify endnotes either by single line numbers, or line +ranges. If what you want is a single line number, you need only +invoke .ENDNOTE, without terminating the text +line before it with \c, at the appropriate +place in running text. (Should you wish to revert to +mom's default behaviour of placing a superscript +number in the text to identify an endnote, you can invoke +ENDNOTE_MARKER_STYLE with the argument, +NUMBER. It is not advisable to switch marker +styles within a single document, for aesthetic reasons, but there +is nothing to prevent you from doing so.) +

+If you want a range of line numbers (e.g. [5-11] ), +insert, directly into the first line of the range you want, the +inline escape, +\*[EN-MARK]. For the terminating line number of +the range, you need only invoke .ENDNOTE, (again, +without attaching \c to the text line before it). +Mom is smart enough to figure out that where +ENDNOTE was invoked represents the terminating +line number. + +

+Given the impossibility of knowing, in advance, the "string length" +of all the line numbers or ranges of line numbers that will be used +in endnotes (the string length of 12 is two; the string length +of 12-15 is 5), mom cannot "hang" line numbers +and guarantee that they, and the endnote text, will align in a +visually pleasing manner. Consequently, mom sets +the entirety of line-numbered endnotes completely flush left, +including the line numbers themselves. The line +numbers (by default, enclosed in square brackets) are separated from +the beginning of each endnote by a gap, so that a line-numbered +endnote looks approximately like this: +

+

+	[1-2]   Notwithstanding, Frye later asserts that Christianity
+	is "a ghost  with the chains of a foul historical record of
+	cruelty clanking behind it."
+
+ +The default gap for PRINTSTYLE TYPESET and +PRINSTYLE TYPEWRITE is 1.5 +ems. +You can change the size of the gap with the macro, +ENDNOTE_LINENUMBER_GAP, which takes, as its single +argument, the size of the gap. The argument requires a +unit of measure, +so, for example, to change the gap to 2 +picas, +you'd do +

+

+	.ENDNOTE_LINENUMBER_GAP 2P
+
+ + +By default, mom puts endnote line numbers inside +square brackets. The style of the brackets may be changed with +the macro, ENDNOTE_LINENUMBER_BRACKETS, which +takes one of three possible arguments: PARENS +("round" brackets), SQUARE (the default) or +BRACES (curly braces). If you prefer a +shortform, the arguments, (, [ or +{ may be used instead. + +

+If you don't want the numbers enclosed in brackets, you may tell +mom to use a "separator" instead. A common +separator would be the colon, but it can be anything you like. The +macro to do this is ENDNOTE_LINENUMBER_SEPARATOR, +which takes, as its single argument, the separator you want. +(If the argument contains spaces, don't forget to enclose the +argument in double-quotes.) The separator can be composed of +any legal groff character, or any combination of characters. +For example, to get a colon separator after the line number in +line-numbered endnotes, you'd do +

+

+	.ENDNOTE_LINENUMBER_SEPARATOR :
+
+ +

*Endnote numbering style control

+

+See +Arguments to the control macros. +

+Please note that the control macros for endnote numbering affect only +the numbers that appear on the endnotes pages themselves, not the +endnote numbers that appear in the body of the document(s). +

+

+.ENDNOTE_NUMBER_FAMILY    default = prevailing document family; default is Times Roman
+.ENDNOTE_NUMBER_FONT      default = bold
+.ENDNOTE_NUMBER_SIZE*     default = 0
+
+*Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
+
+ +

*Endnote numbering alignment

+

+By default, mom hangs the numbers on endnotes pages, +aligned right to two placeholders, producing this: +

+ +

+	 9. Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	    sed diam nonumy eirmod tempor invidunt ut labore et
+	    dolore magna aliquyam erat, sed diam voluptua.
+
+	10. Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	    sed diam nonumy eirmod tempor invidunt ut labore et
+	    dolore magna aliquyam erat, sed diam voluptua.
+
+ +The macros to alter this behaviour are +
+ +
+
+ + + +

+ + Macro: ENDNOTE_NUMBERS_ALIGN_RIGHT <number of placeholders> + +

+ENDNOTE_NUMBERS_ALIGN_RIGHT takes one (non-optional) +argument: the number of placeholders to reserve for right alignment of +endnote numbers. +

+For example, if you have fewer than ten endnotes, you might want to do +

+

+	.ENDNOTE_NUMBERS_ALIGN_RIGHT 1
+
+ +which would ensure that the endnote numbers hang, but are all flush +with the page's left margin. If, god help you, you have over a hundred +endnotes, you'd want to do +

+

+	.ENDNOTE_NUMBERS_ALIGN_RIGHT 3
+
+ +to ensure that the numbers hang and are properly right-aligned. +

+ +


+ + + +

+ + Macro: ENDNOTE_NUMBERS_ALIGN_LEFT + +

+If you don't want the endnote numbers to hang and right-align, invoke +ENDNOTE_NUMBERS_ALIGN_LEFT, which doesn't require any +argument. This disables hanging and right-alignment of endnote numbers, +so that the example +above +comes out like this: +

+

+	9. Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore et
+	dolore magna aliquyam erat, sed diam voluptua.
+
+	10. Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
+	sed diam nonumy eirmod tempor invidunt ut labore et
+	dolore magna aliquyam erat, sed diam voluptua.
+
+
+ + + +

Margin notes

+ + +

+Margin notes are short annotations that appear in either the left +or right margin of a document. Sometimes they comment on the text. +Sometimes they assist in following the "flow" of a document by +summarizing the subject of a portion of text. Sometimes they're +comments to yourself in a draft copy. +

+The margin notes macros and routines in om.tmac +(mom) are "mommified" versions of the margin notes +macros and routines written by Werner Lemberg and patched by Gaius +Mulley. +

+ +Margin notes behaviour +

+First things first: before you enter your first margin note, you +must "initialize" margin notes with +MN_INIT. +MN_INIT sets up the style parameters for margin +notes, including things like +font, +family +and +leading. +

+After initializing margin notes, you create margin notes with the +MN +macro. Based on the argument you pass MN, your +margin note will go in either the left or the right margin. +

+Margin notes are tricky from a typographic standpoint with respect +to vertical placement. Since the leading of margin notes may +differ from that of +running text, +it's impossible for mom to guess whether to align +the first lines of margin notes with a document +baseline, +whether to align the last lines of margin notes with a document +baseline, or whether to center them, vertically, so that neither +first nor last line aligns with anything! +

+Given this difficulty, mom always aligns the first +line of any margin note with a document baseline. If you want a +different behaviour, you must adjust the position(s) of margin +notes yourself, on a note by note basis. (See +Adjusting the vertical position of margin notes.) +

+Generally speaking, mom tries to place margin +notes at the point where you invoke the tag, +MN. +However, in the event that a margin note runs deep, she may not +be able to place a subsequent margin note exactly where you want. +In such an instance, mom will "shift" the margin +note down on the page, placing it one (margin note) +linespace beneath the previous margin note (plus whatever vertical +space is required to get the first line to line up with a baseline +of running text). A warning will be issued, letting you know this +has happened, and where. +

+Sometimes, if a margin note has to be shifted down, there simply +isn't enough room to start the margin note on the page on which +MN is invoked. In that case, mom +ignores the margin note entirely and issues a warning, letting you +know what she's done, and where. +

+In the event that a margin note, sucessfully begun on a page, +runs past your bottom margin (or the last line before footnotes +begin), the margin note will "flow" onto the next page. If it is a +"left" margin note, it will continue in the left margin. If it is a +"right" margin note, it will continue in the right margin. +

+If your document is being set in two columns, mom +will sensibly and automatically set all margin notes pertaining +to the left column in the left margin, and all margin notes +pertaining to the right column in the right margin, regardless of +the "direction" argument you give the MN tag. If +you try to use MN in documents of more than two +columns, mom will ignore all margin notes, and +issue warning for each. +

+

Adjusting the vertical position of margin notes

+

+When the +leading +of margin notes differs from the leading used throughout a document, +you may want to adjust the vertical position of individual margin +notes. This is most often going to be the case with margin notes +that end near the bottom of the page, where you want the last line of +the margin note to line up with the last line of text on the page. +

+Adjustments to the vertical position of margin notes must be done +inside the margin note (i.e. after MN), at the +top, before entering text. The commands to use are +\!.ALD +(to lower the margin note), and +\!.RLD +(to raise it). The \! must precede the +macros, or they won't have any effect. + +

+


+ + + +

+ + Macro: MN_INIT [ ragged | symmetric ] < left-width right-width gutter family+font point-size lead colour hyphenation-flags > + +

+Before you enter your first margin note, you must initialize +all the parameters associated with margin notes with +MN_INIT. If you forget to do so, +mom will issue a warning and abort. +

+The argument list is quite long; an +explanation of each argument follows. Any argument whose value you +want to be the default must be entered as "" (i.e. two +double-quotes with no space between them). Defaults for each +argument are given in the explanation below. +

+[ ragged | symmetric ] +
+If the first argument is "ragged", both left and right margin notes +will be flush left. If the first argument is "symmetric", left +margin notes will be set flush right, and right margin +notes will be set flush left. The effect is something +like this: +

+

+	     A left    This is a meaningless batch        A right
+	margin note    of text whose sole purpose is      margin note
+	  with just    to demonstrate how the sym-        with just
+	a few words    metric argument to MN sets left    a few words
+	     in it.    and right margin notes.            in it.
+
+ + +If the argument is omitted, +or given as "", both left and right margin notes will be set +justified. (Justified is usually not a good idea, since the narrow +measure of margin notes makes pleasing justification a near +impossibility.) +

+left-width +
+The width of left margin notes. A +unit of measure +must be appended directly onto the argument. The default is to set +left margin notes right out to the edge of the page, which is +almost certainly not what you want, so you should give a value for +this argument if using left margin notes. +

+right-width +
+The width of right margin notes. A +unit of measure +must be appended directly onto the argument. The default is to set +right margin notes right out to the edge of the page, which is +almost certainly not what you want, so you should give a value for +this argument if using right margin notes. +

+gutter +
+The +gutter +between margin notes and +running text. +A +unit of measure +must be appended directly onto the argument. The gutter applies to +both left and right margin notes. The default is 1 +em. +

+font +
+The family+font for margin notes. Yes, that's right: the family +PLUS font combo. For example, if you want Times Roman Medium, +the argument must be TR. If you want Palatino Medium Italic, the +argument must be PI. The default is the same family+font combo used +for a document's paragraph text. +

+lead +
+The +leading +of margin notes. lead uses +points +as its unit of measure, so don't tack a unit of measure onto the +end of the argument. The default lead is the same leading as +is used for paragraph text (i.e. the document's base leading). +For convenience and clarity, you may also give the word, +DOC, to this argument, which indicates that the +leading should be the same as the document's base leading. +

+colour +
+The colour of margin notes. The colour must be pre-initialized +with +NEWCOLOR +or +XCOLOR. +The default is black. +

+hyphenation-flags +
+A number telling groff how you want margin notes +hyphenated. +

+

+	1 = hyphenate without restrictions
+	2 = do not hyphenate the last word on the page
+	4 = do not hyphenate the last two characters of a word
+	8 = do not hyphenate the first two characters of a word
+
+ +The values can be added together, so, for example, if you want +neither the first two nor the last two characters of words +hyphenated, the hyphenation-flag would be 12. The default value is +14 (i.e. 2+4+8). + +

+


+ + + +

+ + Macro: MN LEFT|RIGHT | <anything> + +

+Once you've initialized margin notes with +MN_INIT, +you can enter margin notes any time you like with +MN. An argument of LEFT will set +a left margin note. An argument of RIGHT will set +a right margin note. +

+Any argument, such as OFF (or +QUIT, END, X, +etc) exits the current margin note. + +

+


+ + + +

Inserting a blank page into the document

+

+ + Macro: BLANKPAGE <# of blank pages to insert> + + +

+This one does exactly what you'd expect -- inserts a blank page into +the document. Mom silently increments the page +number of every blank page and keeps track of +recto/verso +stuff, but otherwise, does nothing. It's up to you, the user, to +figure out what to do with this feature. However, it's worth +noting that without it, inserting completely blank pages, to use +a vernacular Québécois phrase, "c'est pas évident" +(somewhere between "isn't easy", "isn't +obvious" and "isn't fun"). +

+The argument to BLANK_PAGE is the number of blank +pages to insert. The argument is not optional, hence even if you +only want one blank page, you have to tell mom: +

+

+	.BLANKPAGE 1
+
+ +

Terminate document processing

+ + +

+The use of FINIS is optional. If you invoke it +(at the end of a document before +TOC +or +ENDNOTES), +mom +deposits the word END, centred after a blank line, beneath the last +line of the document. END is enclosed between +em-dashes. +

+Please note that in versions of +mom prior to 1.1.9, FINIS used to +turn off +footers +(if they were on) and page numbering (if page numbers were at the +bottom of the page). Damned if I can recall why I thought anyone +would want this behaviour, but it has been removed. +

+If you're writing in a language other than English, you can +change what mom prints for END with +the control macro FINIS_STRING. +

+


+ + + +

Table of contents

+ + +

+Want a table of contents for your document? Easy. Just enter +

+

+	.TOC
+
+ +as the very last macro of your document file. Mom +will have picked up all document titles (in +collated +documents), all heads, subheads, and paragraph heads, as well as any +endnotes pages that have been output, and assigned them the +appropriate page number (and page numbering style). Talk about a +no-brainer! + +That said, tables of contents (tocs) have even more control macros +than endnotes. As always, the reason for so many control macros is +so that if you want to change just about any aspect of the toc's +typographic appearance, you can. Mom is all about +simplicity AND flexibility. +

+ +

TOC behaviour

+

+When you output a toc (with +TOC), +mom finishes processing the last page of your document, +then breaks to a new page for printing the toc. +

+Mom follows standard typesetting conventions for +tables of contents. To this end, if +HEADERS +are on for the document, the first page of the toc has no page +header, but does have a first page (roman numeral) number, always +"1", in the bottom margin. If +FOOTERS +are on for the document, the first page has neither a footer, nor a +page number in the top margin. (If you absolutely must have a page +footer on the first page of the toc, simply invoke +FOOTER_ON_FIRST_PAGE +immediately before TOC.) Subsequent toc pages have +both page headers or footers and a page number. +

+Entries in the toc are hierarchically indented, as you would +expect. By default, each type of entry (e.g. a head or a subhead) +is set in a different font as well. If any of heads, subheads or +paragraph heads are numbered in the body of the document, they are +also numbered in the toc. Head numbering in the toc is NOT +concatenated as it is in the body of the document, which would be +visually redundant in a toc. +

+Tocs are never set in columns, regardless of whether the rest of +the document is. Lastly, if +recto/verso +printing is enabled, the toc respects it. This sometimes leads to +tocs that begin with the wrong margins, but the margins can be +corrected either by outputting a +BLANKPAGE +or by using the toc control macro +TOC_RV_SWITCH. +

+The overall toc +family, +point size +and +lead +can be altered with the toc +control macros, +as can the family, +font, +point size and indent of each type of toc entry (i.e. title, head, +subhead, paragraph head). Furthermore, the page numbering style +can be changed, as can the amount of visual space reserved for toc +entry page numbers. +

+ + + +


+

+Macro: TOC + +

+If you want a toc, just put TOC as the last macro +in a document. Mom takes care of the rest. +

+


+ +

TOC control macros

+

+Toc entries are not actually processed when mom +collects them, so you can put any toc control macros anywhere you +like in your document. Some may prefer to place them at the top of +the file. Others may prefer to place them just before outputting +the toc. The choice is yours. +
+

    +
  1. General toc page style control + +
  2. Toc page numbering + +
  3. Changing the toc header (title), string and style + +
  4. Changing the style for toc entries + +
  5. Additional toc control macros + +
+
+ +

1. General toc page style control

+ +

*Toc family

+

+See +Arguments to the control macros. +

+Set the family of toc pages with TOC_FAMILY, which +establishes the default family for every element of a toc page, +including the toc title ("Contents") and the page number +in the top or bottom margin. The default is the prevailing document +family. +

+All elements on a toc page also have their own _FAMILY +control macros, which override the default set by +TOC_FAMILY. +

+ + + +

*Toc point size

+

+Macro: TOC_PT_SIZE <base type size of the toc> + +

+Unlike most other control macros that deal with size of document +elements, TOC_PT_SIZE takes as its argument an +absolute value, relative to nothing. Therefore, the argument +represents the size of toc type in +points, +unless you append an alternative +unit of measure. +For example, +

+

+	.TOC_PT_SIZE 12
+
+ +sets the base point size of type for the toc to 12 points, whereas +

+

+	.TOC_PT_SIZE .6i
+
+ +sets the base point size of type for the toc to 1/6 of an inch. +

+The type size set with TOC_PT_SIZE forms the basis +from which the point size of other toc page elements are calculated. +

+The default for +PRINTSTYLE TYPESET +is 12.5 points (the same default size used in the body of the +document). +

+ + + +

*Toc lead

+

+Macro: TOC_LEAD <leading of the toc> [ ADJUST ] +
+*Does not require a unit of measure; points is assumed + +

+Unlike most other control macros that deal with leading of document +elements, TOC_LEAD takes as its argument an +absolute value, relative to nothing. Therefore, the argument +represents the +leading +of tocs in +points +unless you append an alternative +unit of measure. +For example, +

+

+	.TOC_LEAD 14
+
+ +sets the base leading of type on the endnotes page to 14 +points, whereas +

+

+	.TOC_LEAD .5i
+
+ +sets the base leading of type on the endnotes page to 1/2 inch. +

+If you want the leading of toc pages adjusted to fill the +page, pass TOC_LEAD the optional argument +ADJUST. (See +DOC_LEAD_ADJUST +for an explanation of leading adjustment.) +

+The default for +PRINTSTYLE TYPESET +is the prevailing document lead (16 by default), adjusted. +

+NOTE: Even if you give mom a +DOC_LEAD_ADJUST OFF command, she will still, by +default, adjust toc leading. You MUST enter +TOC_LEAD <lead> with no +ADJUST argument to disable this default behaviour. +

+ADDITIONAL NOTE: Tocs are always double-spaced in +PRINTSTYLE TYPEWRITE, regardless of whether the +body of the document is single-spaced. + +

2. Toc page numbering

+

+The page numbering of toc pages is controlled by the same macros +that control +document page numbering, +except +PAGENUM +(tocs always start on page 1). The defaults are the same as the +rest of the document. +

+If you wish to change some aspect of toc pagination, use the +document pagination control macros immediately prior to +.TOC. +

+A special macro, +TOC_PAGENUM_STYLE +controls the style of toc pages page numbers. +

+ +


+ + + +

+ + Macro: PAGINATE_TOC <toggle> + +

+By default, mom paginates the toc. If you'd like +her not to, do +

+

+	.PAGINATE_TOC OFF
+
+ +NOTE: Simply invoking PAGINATION +OFF or PAGINATE OFF disables toc +pagination for the first toc page only. You MUST use +.PAGINATE_TOC OFF to disable toc pagination, even +if pagination is turned off elsewhere in your document. +

+ +


+

+ + + + + Macro: TOC_PAGENUM_STYLE <DIGIT | ROMAN | roman | ALPHA | alpha> + +

+By default, mom uses roman numerals to number +toc pages. Use TOC_PAGENUM_STYLE if you'd prefer +something else. For example, to have standard digits instead of +roman numerals, do the following: +

+

+	.TOC_PAGENUM_STYLE DIGIT
+
+ +
+ +

3. Changing the toc header (title) string and style

+

+The toc header string is the title that appears at to top of the +toc. By default, it's "Contents". If you'd like +something else, say, "Table of Contents", do +

+ +

+	.TOC_HEADER_STRING "Table of Contents"
+
+ + +The style of the toc header (title) is managed by the usual control +macros (see +arguments to the control macros). +

+

+	.TOC_HEADER_FAMILY  default = prevailing doc family (Times Roman in TYPEWRITE)
+	.TOC_HEADER_FONT    default = bold
+	.TOC_HEADER_SIZE    default = +4
+	.TOC_HEADER_QUAD    default = left
+
+ +

4. Changing the style for toc entries

+

+"Toc entries" refers to titles, heads, subheads and +paragraph heads as they appear in the toc. Their style is managed +by the usual +control macros, +starting with TOC_ +

+ +

The toc _INDENT control macros

+

+The toc control macros that end in _INDENT all take a single +argument that requires a +unit of measure. +The argument is the distance to indent the entry, always measured +from the left margin. For example, +

+

+	.TOC_HEAD_INDENT 2P
+
+ +indents head entries 2 +picas +from the left margin. +

+ +

*Changing the style for toc title entries

+

+(See +arguments to the control macros). +

+Toc title entries are the titles of documents that have been +collated +together. +

+

+	.TOC_TITLE_FAMILY  default = prevailing doc family (Times Roman in TYPEWRITE)
+	.TOC_TITLE_FONT    default = bold italic
+	.TOC_TITLE_SIZE    default = +0
+	.TOC_TITLE_INDENT  default = 0 for TYPESET and TYPEWRITE
+
+ +

*Changing the style for toc head entries

+

+(See +arguments to the control macros). +

+Toc head entries are main heads that appear in the body of a +document. +

+

+	.TOC_HEAD_FAMILY  default = prevailing doc family (Times Roman in TYPEWRITE)
+	.TOC_HEAD_FONT    default = bold
+	.TOC_HEAD_SIZE    default = +.5
+	.TOC_HEAD_INDENT  default = 18p for TYPESET; 2m for TYPEWRITE
+
+ +

*Changing the style for toc subhead entries

+

+(See +arguments to the control macros). +

+Toc subhead entries are subheads that appear in the body of a +document. +

+

+	.TOC_SUBHEAD_FAMILY  default = prevailing doc family (Times Roman in TYPEWRITE)
+	.TOC_SUBHEAD_FONT    default = roman
+	.TOC_SUBHEAD_SIZE    default = +0
+	.TOC_SUBHEAD_INDENT  default = 30p for TYPESET; 4m for TYPEWRITE
+
+ +

*Changing the style for toc paragraph head entries

+

+(See +arguments to the control macros). +

+Toc paragraph head entries are paragraph heads that appear in the +body of a document. +

+

+	.TOC_PARAHEAD_FAMILY  default = prevailing doc family (Times Roman in TYPEWRITE)
+	.TOC_PARAHEAD_FONT    default = italic
+	.TOC_PARAHEAD_SIZE    default = +0
+	.TOC_PARAHEAD_INDENT  default = 42p for TYPESET; 6m for TYPEWRITE
+
+ +

*Changing the style for toc paragraph page number listings

+

+(See +arguments to the control macros). +

+Toc paragraph head entries are paragraph heads that appear in the +body of a document. +

+

+	.TOC_PN_FAMILY  default = prevailing doc family (Times Roman in TYPEWRITE)
+	.TOC_PN_FONT    default = roman
+	.TOC_PN_SIZE    default = +0
+
+ +

5. Additional toc macros

+

+The following macros allow you to switch page margins should +they be incorrect for recto/verso printing, to establish how +many placeholders to leave for page listings, and to have +mom append author(s) to toc title entries. +

+ +


+ + + +

+ + Macro: TOC_RV_SWITCH + +

+TOC_RV_SWITCH doesn't take an argument. It simply +instructs mom to switch the left and right margins +of +recto/verso +documents should the toc happen to begin on an even page when you +want an odd, or vice versa. +

+The same result can be accomplished by outputting a +BLANKPAGE. +

+ +


+ + + +

+ + Macro: TOC_TITLE_ENTRY <"alternate wording for a title entry in the toc"> + +

+In +collated +documents, the title of each separate document appears in the table +of contents. It may sometimes happen that you don't want the title +as it appears in the toc to be the same as what appears in +the +docheader. +You might, for example, want to shorten it. Or, in the case of +chapters where the docheader contains both a chapter number and a +chapter title, like this +

+

+	           Chapter 6
+	Burning Bush -- Maybe God Was Right
+
+ +you might want only the chapter title, not the chapter number, to +show up in the toc. (By default, TOC generates +both.) +

+If you want to change the wording of a title entry in the toc, +simply invoke TOC_TITLE_ENTRY with the desired +wording, enclosed in double-quotes. Using the example, above, +

+

+	.CHAPTER 6
+	.CHAPTER_TITLE "Burning Bush -- Maybe God Was Right"
+	.TOC_TITLE_ENTRY "Burning Bush"
+	.DOCTYPE CHAPTER
+
+ +would identify chapter 6 in the toc simply as "Burning +Bush". + +

+ +


+ + + +

+ + Macro: TOC_APPENDS_AUTHOR <none> | <"name(s) of authors"> + +

+In certain kinds of collated documents, different authors are +responsible for the articles or stories contained within them. In +such documents, you may wish to have the author or authors +appended to the toc's title entry for each story or article. +

+If you invoke TOC_APPENDS_AUTHOR with no argument, +mom appends the first argument you passed to +AUTHOR +to toc title entries, separated by a front-slash. +

+If you invoke TOC_APPENDS_AUTHOR with an argument +(surrounded by double-quotes), mom will append it +to the toc title entries instead. This is useful if you have +multiple authors you wish to identify by last name only. For +example, if three authors--Joe Blough, Jane Doe, and John +Deere--are responsible for a single article +

+

+	.TOC_APPENDS_AUTHOR "Blough et al."
+
+ +would be a good way to identify them in the toc. +

+ +


+ + + +

+ + Macro: TOC_PADDING <# of placeholders to allow for page number listings> + +

+By default, mom allows room for 3 digits in the +page number listings of tocs. If you'd like some other number of +placeholders, say 2, do +

+

+	.TOC_PADDING 2
+
+ + + +
+

+ + Macro: FINIS + + +

+The use of FINIS is optional, but if you use +it, it should be the last macro you invoke in a document (before +ENDNOTES +or +TOC). +See +above +for a description of how FINIS behaves. +

+NOTE: If you don't use FINIS, +and you don't want +footers +(if they're on) or a page number at the bottom of the last page of +a document, you have to turn them off manually, as the last two +lines of your document file, like this: +

+

+	.FOOTERS OFF
+	.PAGINATE OFF
+
+ +

Changing the FINIS string

+ +

+By default, FINIS prints the word +END between +em-dashes. +If you'd like mom to print something else +between the dashes, use the FINIS_STRING macro +(anywhere in the document prior to FINIS). +

+For example, if your document's in French, you'd do +

+

+	.FINIS_STRING "FIN"
+
+ +Double-quotes must enclose the macro's argument. +

+NOTE: If you pass FINIS_STRING +a blank string, i.e. +

+

+	.FINIS_STRING ""
+
+ +mom will still print the em-dashes if you +invoke FINIS. This, in effect, produces a +short, centred horizontal rule that terminates the document. +(In +PRINTSTYLE TYPEWRITE, +it's a short, dashed line composed of four hyphens.) + +

Changing the FINIS colour

+

+Invoking FINIS_COLOR with a pre-defined (or +"initalized") color changes the colour of both the FINIS +string and the em-dashes that surround it. If you use the +inline escape, +\*[<colorname>], +in the argument passed to FINIS, only the text +will be in the new colour; the em-dashes will be in the default +document colour (usually black). + +

+


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/docprocessing.html b/contrib/mom/momdoc/docprocessing.html new file mode 100644 index 0000000..862d560 --- /dev/null +++ b/contrib/mom/momdoc/docprocessing.html @@ -0,0 +1,2484 @@ + + + + +Mom -- Document Processing, Introduction and Setup + + + + + +Next   +Prev   +Back to Table of Contents +

+ + +

DOCUMENT PROCESSING WITH MOM

+ +Introduction to document processing +
+Some document defaults +
+* IMPORTANT NOTE on leading/spacing and bottom margins * +
+The SHIM macro +
+

Table of Contents for document processing

+ +
+
+ +

Introduction to document processing

+ +As explained in +Document processing with mom, +document processing uses markup tags to identify document elements +such as heads, paragraphs, and so on. The tags are, of course, macros, +but with sensible, readable names that make them easy to grasp and +easy to remember. (And don't forget: if you don't like the +"official" name of a tag -- too long, cumbersome +to type in, not "intuitive" enough -- you can change it +with the +ALIAS +macro.) +

+In addition to the tags themselves, mom has an +extensive array of macros that control how they look and behave. +

+Setting up a mom doc is a simple, four-part procedure. +You begin by entering information about the document itself (title, +subtitle, author, etc.). Next, you tell mom what +kind of document you're creating (e.g. chapter, letter, abstract, +etc...) and what kind of output you want (typeset, typewritten, +draft-style, etc). Thirdly, you make as many or as few changes to +mom's default behaviour as you wish. Lastly, you +invoke the +START +macro. Voilà! You're ready to write. +

+


+ + +

Some document defaults

+ +As is to be expected, mom has defaults for everything. +If you want to know a particular default, read about it in the +description of the pertinent tag. +

+I fear the following may not be adequately covered in the +documentation. Just in case, here they are. +

+

    +
  • the paper size is 8.5x11 inches +
  • the left and right margins are 1-inch +
  • the top and bottom margins for document text are plus/minus + visually 1-inch +
  • pages are numbered; the number appears centred, at the + bottom, surrounded by hyphens ( e.g. -6- ) +
  • the first page of a document begins with a + document header +
  • subsequent pages have + page headers + with a rule underneath +
+

+Another way to check up on document processing defaults is to have +a look at the macro file (om.tmac). Each macro is preceded by a +description that (generally) says what its default is (if it has +one). +

+


+ + +

IMPORTANT NOTE on leading/spacing and bottom margins

+
+ +Mom takes evenly-aligned bottom margins in +running text +very seriously. Only under a very few (exceptional) circumstances +will she allow a bottom margin to "hang" (i.e. to fall +short). +

+In order to ensure even bottom margins, mom +uses the "base" document +leading +in effect at the start of running text on each page (i.e. +the leading used in paragraphs) to calculate the spacing of every +document element. Prior to invoking +START, +this is set with the +typesetting macro +LS, +afterwards with the document +control macro +DOC_LEAD. +

+Because mom relies so heavily on the base document +leading, any change to the leading or spacing on a page will almost +certainly have undesirable consequences on that page's bottom margin +unless the change is fully compensated for elsewhere on the page. +

+In other words, if you add a few points of space somewhere on a page, +you must subtract the same number of points somewhere else on that +same page, and vice versa. +

+If it's a question of adding or subtracting full line spaces between +or within document elements, you can do so by using the "v" +unit of measure +with whatever spacing macro you choose -- +ALD, +RLD, +SPACE +-- and mom won't object. "v" means +"the current leading", so she isn't confused by it. And +since "v" accepts decimal fractions, you can add/subtract +half linespaces and quarter linespaces with "v" as well, +provided you compensate for the fractional linespace somewhere +else on the page. +

+If all this seems like too much work, mom +provides a special macro to get you out of trouble if you've played +around with leading and/or spacing. The macro is called +SHIM (like those little pieces of wood carpenters +use to get their work even, level and snug), and it's described +below. +

+ + + +


+

+ +Macro: SHIM + +

+SHIM doesn't take any argument. Use it whenever +you've played around with the +leading +or spacing on a page and you +need to get mom's document leading back on track. +

+For example, say you want to insert a picture into a document with +the special groff macro, PSPIC (see the +groff_tmac man page for usage). +

+Pictures aren't usually conveniently sized in multiples of document +leading, which means that when you insert the picture, you disrupt +mom's ordered placement of baselines on the page. +This will certainly result in a bottom margin that doesn't match the +bottom margins of your document's other pages. +

+The solution is to insert SHIM after the picture, +like this: +

+

+	<some lines of text>
+	.PSPIC <full path to picture>
+	.SHIM
+	<more lines of text>
+
+SHIM instructs mom to insert as +much or a little space after the picture as is needed to ensure that +the baseline of the next +output line +falls where mom would have put it had you not +disrupted the normal flow of output lines with the picture. +

+And say, on previewing the above example, you find that the picture +doesn't centre nicely between the lines of text, you can always do +

+

+	<some lines of text>
+	.RLD 3p
+	.PSPIC <full path to picture>
+	.SHIM
+	<more lines of text>
+
+ +to raise the picture slightly +(Reverse LeaD +3 points; see +RLD), +and still have SHIM ensure that text underneath +falls exactly where it's supposed to. +

+


+ +

Document setup

+

+ +

Tutorial -- Setting up a mom document

+ +There are four "parts" to setting up a mom +doc (three, actually, with one optional). Before we proceed, though, +be reassured that something as simple as +

+

+	.TITLE     "By the Shores of Lake Attica"
+	.AUTHOR    "Rosemary Winspeare"
+	.PRINTSTYLE TYPESET
+	.START
+
+ +produces a beautifully typeset 8.5x11 document, with a +docheader +at the top of page 1, +page headers +with the title and author on subsequent +pages, and page numbers at the bottom of each page. In the course +of the document, heads, subheads, citations, quotes, epigraphs, +and so on, all come out looking neat, trim, and professional. +

+For the purposes of this tutorial, we're going to set up a short +story -- My Pulitzer Winner by Joe Blow. Thankfully, +we don't have to look at story itself, just the setup. +Joe wants the document +

+

    +
  • to be draft 7, revision 39; +
  • to use the "default" style of document formatting: +
  • to print as draft-style output (instead of "final" copy output); +
  • to be typeset, in Helvetica, 12 on 14, + rag-right; +
  • to have footers + instead of + headers; +
  • to use a single asterisk for + author linebreaks. +
+

+Joe Blow has no taste in typography. His draft won't look pretty, +but this is, after all, a tutorial; we're after examples, not beauty. +

Step 1

+ +The first step in setting up any document is giving mom +some reference information. The reference macros are: +

+

    +
  • TITLE +
  • DOCTITLE +
  • COVERTITLE +
  • SUBTITLE +
  • AUTHOR +
  • CHAPTER -- the chapter number +
  • DRAFT -- the draft number +
  • REVISION -- the revision number +
  • COPYRIGHT -- only used on cover pages +
  • MISC -- only used on cover pages +
  • COVER_TITLE -- only on cover pages; only if needed +
  • DOC_COVER_TITLE -- only on document cover pages; only if needed +
+

+You can use as many or as few as you wish, although at a minimum, +you'll probably fill in TITLE (unless the document's +a letter) and AUTHOR. Order doesn't matter. +You can separate the +arguments +from the macros by any number of spaces. The following are +what you'd need to start Joe Blow's story. +

+

+	.TITLE    "My Pulitzer Winner"
+	.AUTHOR   "Joe Blow"
+	.DRAFT     7
+	.REVISION  39
+
+ +

Step 2

+ +Once you've given mom the reference information she +needs, you tell her how you want your document formatted. What kind +of document is it? Should it be typeset or typewritten? Is this +a "final" copy (for the world to see) or just a draft? +Mom calls the macros that answer these questions +"the docstyle macros." They are: +

+

    +
  • DOCTYPE -- the type of document (default, chapter, user-defined, letter) +
  • PRINTSTYLE -- typeset or typewritten +
  • COPYSTYLE -- draft or final copy +
+

+Mom has defaults for DOCTYPE +and COPYSTYLE; if they're what you want, you +don't need to include them here. However, PRINTSTYLE +has no default and MUST be present in every formatted document. +If you omit it, mom won't process the document AND +she'll complain (both to stderr and as a single printed sheet with +a warning). Moms -- they can be so annoying sometimes. <sigh> +

+Adding to what we already have, the next bit of setup for Joe +Blow's story looks like this: +

+

+	.TITLE    "My Pulitzer Winner"
+	.AUTHOR   "Joe Blow"
+	.DRAFT     7
+	.REVISION  39
+	\#
+	.DOCTYPE     DEFAULT \"Superfluous; mom uses DOCTYPE DEFAULT by default
+	.PRINTSTYLE  TYPESET
+	.COPYSTYLE   DRAFT
+
+ +Notice the use of the +comment line +( \# ), a handy way to keep groups of macros visually separated +for easy reading in a text editor. + +

Step 3

+ +This step -- completely optional -- is where you, the user, take +charge. Mom has defaults for everything, +but who's ever satisfied with defaults? Use any of the typesetting macros +here to change mom's document defaults (paper +size, margins, family, point size, line space, rag, etc), or +any of the document processing macros that set/change/control +the appearance of document elements. Think of this as the +"style-sheet " section of a document. And please note: +you MUST give mom a +PRINTSTYLE +directive before making any such changes. +

+Joe Blow wants his story printed in Helvetica, 12 on 14, rag +right, with +page footers +instead of +page headers +and a single asterisk for the +linebreak +character. None of these requirements conforms +to mom's defaults for the chosen +PRINTSTYLE (TYPESET), so we change them here. +The setup for Joe Blow's story now looks like this: +

+

+	.TITLE    "My Pulitzer Winner"
+	.AUTHOR   "Joe Blow"
+	.DRAFT     7
+	.REVISION  39
+	\#
+	.DOCTYPE     DEFAULT
+	.PRINTSTYLE  TYPESET
+	.COPYSTYLE   DRAFT
+	\#
+	.FAMILY  H
+	.PT_SIZE 12
+	.LS      14
+	.QUAD    LEFT    \"i.e. rag right
+	.FOOTERS
+	.LINEBREAK_CHAR *
+
+ +

Step 4

+The final step in setting up a document is telling mom +to start document processing. It's a no-brainer, just the single macro +START. Other than PRINTSTYLE, it's +the only macro required for document processing (although +I can't guarantee you'll like the results of using just the two). +

+Here's the complete setup for My Pulitzer Winner: +

+

+	.TITLE    "My Pulitzer Winner"
+	.AUTHOR   "Joe Blow"
+	.DRAFT     7
+	.REVISION  39
+	\#
+	.DOCTYPE     DEFAULT
+	.PRINTSTYLE  TYPESET
+	.COPYSTYLE   DRAFT
+	\#
+	.FAMILY   H
+	.PT_SIZE  12
+	.LS       14
+	.QUAD     LEFT    \"i.e. rag right
+	.FOOTERS
+	.LINEBREAK_CHAR *
+	\#
+	.START
+
+ +As pointed out earlier, Joe Blow is no typographer. Given that all he +needs is a printed draft of his work, a simpler setup would have been: +

+

+	.TITLE    "My Pulitzer Winner"
+	.AUTHOR   "Joe Blow"
+	.DRAFT     7
+	.REVISION  39
+	\#
+	.PRINTSTYLE  TYPEWRITE
+	.COPYSTYLE   DRAFT
+	\#
+	.START
+
+ +.PRINTSTYLE TYPEWRITE, above, means that Joe's work +will come out "typewritten, double-spaced", making the +blue-pencilling he (or someone else) is sure to do much +easier (which is why many publishers and agents still insist on +typewritten, double-spaced copy). +

+When J. Blow stops re-writing and decides to print off a final, +typeset copy of his work for the world to see, he need only +make two changes to the (simplified) setup: +

+

+	.TITLE    "My Pulitzer Winner"
+	.AUTHOR   "Joe Blow"
+	.DRAFT     7
+	.REVISION  39
+	\#
+	.PRINTSTYLE  TYPESET  \"first change
+	.COPYSTYLE   FINAL    \"second change
+	\#
+	.START
+
+ +In the above, .DRAFT 7, .REVISION 39, and .COPYSTYLE +FINAL are actually superfluous. The draft and revision numbers +aren't used when COPYSTYLE is FINAL, +and COPYSTYLE FINAL is mom's +default unless you tell her otherwise. BUT... to judge from the +number of drafts already, J. Blow may very well decide his +"final" version still isn't up to snuff. Hence, he might +as well leave in the superfluous macros. That way, when draft 7, +rev. 62 becomes draft 8, rev. 1, he'll be ready to tackle his Pulitzer +winner again. +

+


+ + + + +

The Reference Macros

+
+ +The reference macros give mom the information +she needs to generate +docheaders, +page headers, +and +covers. +They must go at the top of any file that uses mom's +document processing macros. +

+ +

Reference macros list

+ + + +
+ + + +
+

+ +Macro: TITLE "<title>" +
+*Argument must be enclosed in double-quotes + +

+The title string can be caps or caps/lower-case; it's up to you. +In +PRINTSTYLE TYPESET, +the title will appear in the +docheader +exactly as you typed it. However, mom converts +the title to all caps in +page headers +unless you turn that feature off (see +HEADER_<POSITION>_CAPS). In +PRINTSTYLE TYPEWRITE, +the title always gets converted to caps. +

+NOTE: If your +DOCTYPE +is CHAPTER, TITLE should be the +title of the opus, not "CHAPTER whatever". +

+ + + +


+

+ +Macro: DOCTITLE "<overall document title>" +
+*Argument must be enclosed in double-quotes + +

+NOTE: This macro should be used only if your +DOCTYPE +is DEFAULT (which is mom's +default). +

+When you're creating a single document, say, an essay or a short +story, you have no need of this macro. +TITLE +takes care of all your title needs. +

+However if you're +collating +a bunch of documents together, say, to print out a report containing +many articles with different titles, or a book of short stories, you +need DOCTITLE. +

+DOCTITLE tells mom the title +of the complete document (as opposed to the title of each article +or entitled section). +

+The doctitle string can be caps or caps/lower-case; it's up to you. +In +PRINTSTYLE TYPESET, +by default, the doctitle appears in the rightmost position of +page headers, +all in caps unless you turn that feature off (see +HEADER_<POSITION>_CAPS). In +PRINTSTYLE TYPEWRITE, +the doctitle always gets converted to caps. +

+NOTE: If your +DOCTYPE +is CHAPTER, you don't need +DOCTITLE. TITLE takes care of +everything. +

+ + + +


+

+ +Macro: SUBTITLE "<subtitle>" +
+*Argument must be enclosed in double-quotes + +

+The subtitle string can be caps or caps/lower-case. Since a +document's subtitle appears only in the +docheader, +and the title is most likely in caps, I recommend caps/lower case. +

+ + + +


+

+ +Macro: AUTHOR "<author string>" [ "<author2 string>" "<author3 string>" ... ] +
+*Multiple arguments must all be enclosed in double-quotes + +

+Each author string can hold as many names as you like, e.g. +

+

+	.AUTHOR "Joe Blow"
+	    or
+	.AUTHOR "Joe Blow, Jane Doe" "John Hancock"
+
+ +Mom prints each string that's enclosed in +double-quotes on a separate line in the +docheader, +however only the first string appears in +page headers. +If you want mom to put something else in the author +part of page headers (say, just the last names of a document's two +authors), redefine the appropriate part of the header (see +header/footer control). +

+The strings can be caps or caps/lower-case. I recommend caps/lower +case. +

+ + + +


+

+ +Macro: CHAPTER <chapter number> + +

+The chapter number can be in any form you like -- a digit, a roman +numeral, a word. If you choose +DOCTYPE CHAPTER, +mom prints whatever argument you pass +CHAPTER beside the word "Chapter" as a +single line +docheader. +She also puts the same thing in the middle of +page headers. +

+Please note that if your argument to CHAPTER runs +to more than one word, you must enclose the argument in +double-quotes. +

+If you're not using DOCTYPE CHAPTER, the macro serves +no purpose and mom ignores it. +

+CHAPTER_STRING +

+If you're not writing in English, you can ask mom +to use the word for "chapter" in your own language by +telling her what it is with the CHAPTER_STRING +macro, like this: +

+

+	.CHAPTER_STRING "Chapître"
+
+ +You can also use CHAPTER_STRING if you want +"CHAPTER" instead of "Chapter" in the doc- and +page-headers. +

+ + + +


+

+ +Macro: CHAPTER_TITLE "<chapter title>" +
+*Argument must be enclosed in double-quotes + +

+If, either in addition to or instead of "Chapter #" appearing +at the top of chapters, you want your chapter to have a title, use +CHAPTER_TITLE, with your title enclosed in +double-quotes, like this: +

+

+	.CHAPTER_TITLE "The DMCA Nazis"
+
+ +If you've used +CHAPTER to give the chapter a number, +both "Chapter #" and the chapter title will appear at the +top of the chapter, like this: +

+

+                       Chapter 1
+                    The DMCA Nazis
+
+ +In such a case, by default, only the chapter's title will appear in the +page headers, +not "Chapter #". +

+If you omit CHAPTER when setting up your reference +macros, only the title will appear, both at the top of page one and in +subsequent page headers. +

+The style of the chapter title can be altered by +control macros, +e.g. CHAPTER_TITLE_FAMILY, +CHAPTER_TITLE_FONT, etc. The default family, +font and point size are Times Roman, Bold Italic, 4 points larger +than +running text. +

+ + + +


+

+ +Macro: DRAFT <draft #> + +

+DRAFT only gets used with +COPYSTYLE DRAFT. +If the COPYSTYLE is FINAL (the +default), mom ignores DRAFT. +DRAFT accepts both alphabetic and numeric +arguments, hence it's possible to do either +

+

+	.DRAFT 2
+	   or
+	.DRAFT Two
+
+ +Mom prints the argument to .DRAFT +(i.e. the draft number) beside the word "Draft" in the +middle part of +page headers. +

+A small word of caution: If your argument to +.DRAFT is more than one word long, you must +enclose the argument in double-quotes. +

+You may, if you wish, invoke .DRAFT without an +argument, in which case, no draft number will be printed beside +"Draft" in headers or footers. +

+DRAFT_STRING +

+If you're not writing in English, you can ask mom +to use the word for "draft" in your own language by +telling her what it is with the DRAFT_STRING macro, +like this: +

+

+	.DRAFT_STRING "Jet"
+
+ +Equally, DRAFT_STRING can be used to roll your own +solution to something other than the word "Draft." For +example, you might want "Trial run alpha-three" to appear +in the headers of a draft version. You'd accomplish this by doing +

+

+	.DRAFT alpha-three
+	.DRAFT_STRING "Trial run
+
+ +.DRAFT without an argument, above, ensures that +only the DRAFT_STRING gets printed. +

+NOTE: If you define both a blank .DRAFT +and a blank .DRAFT_STRING, mom +skips the draft field in headers entirely. If this is what you +want, this is also the only way to do it. Simply leaving out +.DRAFT and .DRAFT_STRING will +result in mom using her default, which is to print +"Draft 1". +

+ + + +


+

+ +Macro: REVISION <revision #> + +

+REVISION only gets used with +COPYSTYLE DRAFT. +If the COPYSTYLE is FINAL +(the default), mom ignores the +REVISION macro. REVISION accepts +both alphabetic and numeric arguments, hence it's possible to do +either +

+

+	.REVISION 2
+	   or
+	.REVISION Two
+
+ +Mom prints the revision number beside the shortform +"Rev." in the middle part of +page headers. +

+A small word of caution: If your argument to +.REVISION is more than one word long, you must +enclose the argument in double-quotes. +

+You may, if you wish, invoke .REVISION without an +argument, in which case, no revision number will be printed beside +"Rev." in headers or footers. +

+REVISION_STRING +

+If you're not writing in English, you can ask mom +to use the word for "revision," or a shortform +thereof, in your own language by telling her what it is with the +REVISION_STRING macro, like this: +

+

+	.REVISION_STRING "Rév."
+
+ +Additionally, you may sometimes want to make use of +mom's +COPYSTYLE DRAFT +but not actually require any draft information. For example, you +might like mom to indicate only the revision number +of your document. The way to do that is to define an empty +.DRAFT and .DRAFT_STRING in +addition to .REVISION, like this: +

+

+	.DRAFT
+	.DRAFT_STRING
+	.REVISION 2
+
+ +

+Equally, if you want to roll your own solution to what revision +information appears in headers, you could do something like this: +

+	.DRAFT
+	.DRAFT_STRING
+	.REVISION "two-twenty-two"
+	.REVISION_STRING "Revision"
+
+ +

+The above, naturally, has no draft information. If you want to +roll your own .DRAFT and/or +.DRAFT_STRING as well, simply supply arguments to +either or both. +

+ + + +


+

+ +Macro: COPYRIGHT "<copyright info>" +
+*Argument must be enclosed in double-quotes + +

+The argument passed to COPYRIGHT is only used on +cover or doc cover pages, and then only if the argument COPYRIGHT is +passed to +COVER +or +DOC_COVER. +Do not include the copyright symbol in the argument passed to +COPYRIGHT; mom puts it in for +you. +

+ + + +


+

+ +Macro: MISC "<argument 1>" ["<argument 2>" "<argument 3>" ...] +
+*Multliple arguments must all be enclosed in double-quotes + +

+The argument(s) passed to MISC are only used on +cover or doc cover pages, and then only if the argument MISC is +passed to +COVER +or +DOC_COVER. +MISC can contain any information you like. Each +argument appears on a separate line at the bottom of the cover or +doc cover page. +

+For example, if you're submitting an essay where the prof has +requested that you include the course number, his name and the +date, you could do +

+

+	.MISC "Music History 101" "Professor Hasbeen" "Dec. 24, 2006"
+
+ +and the information would appear on the essay's cover page. +

+ + + +


+

+ +Macro: COVERTITLE "<user defined cover page title>" +
+Macro: DOC_COVERTITLE "<user defined document cover page title>" +
+*Argument must be enclosed in double-quotes + +

+The argument passed to COVERTITLE or +DOC_COVERTITLE is only used on cover or doc cover +pages, and then only if the argument COVERTITLE is passed to +COVER +or +DOC_COVER. +

+The only time you require a COVERTITLE or +DOC_COVERTITLEis when none of the required first +arguments to COVER or DOC_COVER +fits your needs for the title you want to appear on cover (or doc +cover) pages. + +

+


+ + + +

The Docstyle Macros

+
+ +The docstyle macros tell mom what type of document you're +writing, whether you want the output typeset or +"typewritten", and whether you want a draft copy (with +draft and revision information in the headers) or a final copy. + + +

Docstyle macros list

+
+ + +
+ + + +
+

+ +Macro: DOCTYPE DEFAULT | CHAPTER | NAMED "<name>" | LETTER +

+The arguments DEFAULT, CHAPTER and +NAMED tell mom what to put +in the +docheader +and +page headers. +LETTER tells her that you want to write a +letter. +

+Mom's default DOCTYPE is +DEFAULT. If that's what you want, you don't +have to give a DOCTYPE command. +

+DEFAULT prints a +docheader +containing the title, subtitle and author information given to the +reference macros, +and page headers with the author and title. +(See +Default specs for headers +for how mom outputs each part of the page header.) +

+CHAPTER prints "Chapter #" in place of a +docheader +(# is what you gave to the +reference macro +CHAPTER). +If you give the chapter a title with +CHAPTER TITLE, +mom prints "Chapter #" and the title +underneath. If you omit the +CHAPTER +reference macro but supply a +CHAPTER_TITLE, +mom prints only the chapter title. (*For +backward compatibility with pre-1.1.5 versions of +mom, you can also supply a chapter title by +omitting the CHAPTER reference macro and +supplying a chapter title with +CHAPTER_STRING.) +

+The page headers in DOCTYPE CHAPTER contain the author, +the title of the book (which you gave with +TITLE), +and "Chapter #" (or the chapter title). See +Default Specs for Headers +for mom's default type parameters for each part of +the page header. +

+NAMED takes an additional argument: a name +for this particular kind of document (e.g. outline, synopsis, +abstract, memorandum), enclosed in double-quotes. +NAMED is identical to DEFAULT +except that mom prints the argument to +NAMED beneath the +docheader, +as well as in page headers. +(See +Default specs for headers +for how mom outputs each part of the page header.) +

+Additionally, if you wish the name of this particular kind of +document to be coloured, you can pass DOCTYPE NAMED +a third (optional) argument: the name of a colour pre-defined (or +"initialized") with +NEWCOLOR +or +XCOLOR. +For example, if you have a doctype named "Warning", and +you'd like "Warning" to be in red, assuming you've +pre-defined (or "initialized") the color, red, this is +what the DOCTYPE entry would look like: +

+

+	.DOCTYPE NAME "Warning" red
+
+ +

+LETTER tells mom you're writing a letter. See +the section +Writing Letters +for instructions on using mom to format letters. +

+ + + +


+

+ +Macro: PRINTSTYLE TYPESET | TYPEWRITE [ SINGLESPACE ] +
+*Required for document processing. +
+*Must come before any changes to default document style + +

+PRINTSTYLE tells mom whether to typeset +a document, or to print it out "typewritten, doubled-spaced". +

+THIS MACRO MAY NOT BE OMITTED. In order for +document processing to take place, mom requires +a PRINTSTYLE. If you don't give one, +mom will warn you on stderr and print a single +page with a nasty message. +

+Furthermore, PRINTSTYLE must come before any +changes to mom's default typestyle parameters. +(This applies primarily to, but is by no means restricted to, +PRINTSTYLE TYPESET.) PRINTSTYLE +sets up complete "templates" that include default +papersize, margins, family, fonts, point sizes, and so on. +Therefore, changes to any aspect of document style must come +afterwards. +

+TYPESET, as the argument implies, typesets documents +(by default in Times Roman; see +TYPESET defaults). +You have full access to all the +typesetting macros +as well as the +style control macros +of document processing. +

+As mentioned above, PRINTSTYLE TYPESET must come +before any changes to mom's default typographic +settings. For example, + +

+	.PAPER A4
+	.LS 14
+	.PRINTSTYLE TYPESET
+
+ +will not changes mom's default paper size to A4, +nor her default document leading 14 points, whereas + +
+	.PRINTSTYLE TYPESET
+	.PAPER A4
+	.LS 14
+
+ +will. +

+With TYPEWRITE, mom does her best +to reproduce the look and feel of typewritten, double-spaced copy (see +TYPEWRITE defaults). +Control macros +and +typesetting macros +that alter family, font, point size, and +leading +are (mostly) ignored. An important exception is +HEADER_SIZE +(and, by extension, FOOTER_SIZE), which allows +you to reduce the point size of headers/footers should they become +too crowded. Most of mom's inlines affecting the +appearance of type are also ignored (\*S is an +exception; there may be a few others). +

+In short, TYPEWRITE never produces effects other than +those available on a typewriter. Don't be fooled by how brainless +this sounds; mom is remarkably sophisticated when +it comes to conveying the typographic sense of a document within the +confines of TYPEWRITE. +

+The primary uses of TYPEWRITE are: outputting hard +copy drafts of your work (for editing), and producing documents +for submission to publishers and agents who (wisely) insist on +typewritten, double-spaced copy. To get a nicely typeset version of +work that's in the submission phase of its life (say, to show fellow +writers for critiquing), simply change TYPEWRITE +to TYPESET and print out a copy. +

+If, for some reason, you would prefer the output of +TYPEWRITE single-spaced, pass PRINTSTYLE +TYPEWRITE the optional argument, SINGLESPACE. +

+If you absolutely must have a leading other than typewriter double- +or singlespaced, the only way to get it is with the +DOC_LEAD +macro, and then ONLY if DOC_LEAD is set +before you invoke the START +macro. +

+

TYPESET defaults

+
+	Family            = Times Roman
+	Point size        = 12.5
+	Paragraph leading = 16 points, adjusted
+	Fill mode         = justified
+	Hyphenation       = enabled
+	                    max. lines = 2
+	                    margin = 36 points
+	                    interword adjustment = 1 point
+	Kerning           = enabled
+	Ligatures         = enabled
+	Smartquotes       = enabled
+	Word space        = groff default
+	Sentence space    = 0
+
+ +

TYPEWRITE defaults

+
+	Family            = Courier
+	Italics           = underlined
+	Point size        = 12
+	Paragraph leading = 24 points, adjusted; 12 points for SINGLESPACE
+	Fill mode         = left
+	Hyphenation       = disabled
+	Kerning           = disabled
+	Ligatures         = disabled
+	Smartquotes       = disabled
+	Word space        = groff default
+	Sentence space    = groff default
+	Columns           = ignored
+
+ +

PRINTSTYLE TYPEWRITE control macros

+

+In PRINTSTYLE TYPEWRITE, mom, +by default, underlines anything that looks like italics. This +includes the +\*[SLANT] +inline escape +for pseudo-italics. +

+If you'd prefer that mom were +less bloody-minded about pretending to be a typewriter (i.e. +you'd like italics and pseudo-italics to come out as italics), +use the control macros .ITALIC_MEANS_ITALIC and +.SLANT_MEANS_SLANT. Neither requires an +argument. +

+Although it's unlikely, should you wish to reverse the sense of +these macros in the midst of a document, +.UNDERLINE_ITALIC and +.UNDERLINE_SLANT restore underlining of +italics and pseudo-italics. +

+ +Additionally, by default, mom underlines +quotes +(but not +blockquotes) +in PRINTSTYLE TYPEWRITE. +If you don't like this behaviour, turn it off with +

+

+	.UNDERLINE_QUOTES OFF
+
+ +To turn underlining of quotes back on, use +UNDERLINE_QUOTES without an argument. +

+While most of the +control macros +have no effect on PRINTSTYLE TYPEWRITE, there +is an important exception: +HEADER_SIZE +(and by extension, FOOTER_SIZE). This is +particularly useful for reducing the point size of +headers/footers should they become crowded (quite likely to +happen if the title of your document is long and your +COPYSTYLE +is DRAFT). +

+ + + +


+

+ +Macro: COPYSTYLE DRAFT | FINAL + +

+Mom's default COPYSTYLE is +FINAL, so you don't have to use this macro unless +you want to. +

+COPYSTYLE DRAFT exhibits the following behaviour: +
+

    +
  1. documents start on page 1, whether or not you + request a different starting page number with + PAGENUMBER +
  2. page numbers are set in lower case roman numerals +
  3. the draft number supplied by + DRAFT + and a revision number, if supplied with + REVISION + (see + reference macros), + appear in the centre part of + page headers + (or footers, depending on which you've selected) along with + any other information that normally appears there. +
+

+IMPORTANT: If you define your own centre part for page +headers with +HEADER_CENTER, +no draft and/or revision number will appear there. If you want draft +and revision information in this circumstance, use +DRAFT_WITH_PAGENUMBER. +

+COPYSTYLE FINAL differs from DRAFT in that: +
+

    +
  1. it respects the starting page number you give the document +
  2. page numbers are set in normal (Arabic) digits +
  3. no draft or revision number appears in the page headers +
+

+NOTE: The centre part of page headers can get crowded, +especially with +DOCTYPE CHAPTER +and +DOCTYPE NAMED, +when the COPYSTYLE is DRAFT. +Three mechanisms are available to overcome this problem. One is to +reduce the overall size of headers (with +HEADER_SIZE). +Another, which only works with +PRINTSTYLE TYPESET, +is to reduce the size of the header's centre part only (with +HEADER_CENTER_SIZE). +And finally, you can elect to have the draft/revision information +attached to page numbers instead of having it appear in the centre +of page headers (see +DRAFT_WITH_PAGENUMBER). +

+


+ + + +

Changing type/style parameters prior to START

+

+In the third (optional) part of setting up a document (see +Tutorial -- setting up a mom document), +you can use the +typesetting macros +to change mom's document-wide defaults for margins, +line length, family, base point size, +leading, +and justification style. +

+Two additional style concerns have to be addressed here (i.e. in +macros before +START): +changes to the +docheader, +and whether you want you want the document's nominal leading +adjusted to fill pages fully to the bottom margin. +

+

+
+ +
+

Using the typesetting macros prior to START

+

+From time to time (or maybe frequently), you'll want the overall +look of a document to differ from mom's defaults. +Perhaps you'd like her to use a different +family, +or a different overall +leading, +or have different left and/or right page margins. +

+To accomplish such alterations, use the appropriate +typesetting macros +(listed below) after +PRINTSTYLE +and before +START. +

+More than one user has, quite understandably, not fully grasped +the significance of the preceding sentence. The part they've missed +is "after PRINTSTYLE". +

+Changes to any aspect of the default look and/or formatting +of a mom document must come after +PRINTSTYLE. For example, it might seem natural to +set up page margins at the very top of a document with +

+

+	.L_MARGIN 1i
+	.R_MARGIN 1.5i
+
+ +However, when you invoke .PRINTSTYLE, those +margins will be overridden. The correct place to set margins--and +all other changes to the look of a document--is after +PRINTSTYLE. + +

+NOTE: Don't use the macros listed in Changing document-wide typesetting +parameters after START prior to START; they are +exclusively for use afterwards. +

+When used before +START, +the +typesetting macros +(below) have the following meanings: +

+

+	L_MARGIN       Left margin of pages, including headers/footers
+	R_MARGIN       Right margin of pages, including headers/footers
+	T_MARGIN       The point at which running text (i.e. not
+	               headers/footers or page numbers) starts on each page
+	B_MARGIN*      The point at which running text (i.e. not
+	(see note)     headers/footers or page numbers) ends on each page
+
+	PAGE           If you use PAGE, its final four arguments have the
+	               same meaning as L_ R_ T_ and B_MARGIN (above).
+
+	LL             The line length for everything on the page;
+	               equivalent to setting the right margin with R_MARGIN
+	FAMILY         The family of all type in the document
+	PT_SIZE        The point size of type in paragraphs; mom uses this
+	               to calculate automatic point size changes (e.g. for
+	               heads, footnotes, quotes, headers, etc)
+	LS/AUTOLEAD**  The leading used in paragraphs; all leading and spacing
+	               of running text is calculated from this
+
+	QUAD/JUSTIFY   Affects paragraphs only
+	LEFT           No effect***
+	RIGHT          No effect***
+	CENTER         No effect***
+
+------
+  *See FOOTER MARGIN AND BOTTOM MARGIN for an important warning
+ **See DOC_LEAD_ADJUST
+***See Special note
+
+ +Other macros that deal with type style, or refinements thereof +(KERN, LIGATURES, HY, WS, SS, etc.), behave normally. +It is not recommended that you set up tabs or indents prior to +START. +

+If you want to change any of the basic parameters (above) +after START and have them affect a +document globally (as if you'd entered them before +START), you must use the macros listed in +Changing document-wide style parameters after START. + + +

Special note on .LEFT, .RIGHT and .CENTER prior to START

+In a word, these three macros have no effect on document processing +when invoked prior to START. +

+All mom's document element tags +(PP, HEAD, +BLOCKQUOTE, FOOTNOTE, etc.) +except +QUOTE +set a +fill mode +as soon as they're invoked. If you wish to turn fill mode off for +the duration of any tag (with +.LEFT, .RIGHT or .CENTER) +you must do so immediately after invoking the tag. Furthermore, +the change affects only the current invocation of the tag. +Subsequent invocations of the same tag for which you want the same +change require that you invoke LEFT, +RIGHT or CENTER immediately after +every invocation of the tag. +

+ + +

Colour

+
+Although it doesn't really matter where you define/initialize +colours for use in document processing (see +NEWCOLOR +and +XCOLOR +in the section +Coloured text), +I recommend doing so before you begin document processing with +START. +

+The macro, +COLOR, +and the +inline escape, +\[<colorname>], +can be used at any time during document processing for occasional +colour effects. However, consistent and reliable colourizing of +various document elements (the docheader, heads, linebreaks, +footnotes, pagenumbers, and so on) must be managed through the use +of the +document element control macros. +

+PLEASE NOTE: If you plan to have mom +generate a +table of contents, +do NOT embed colour +inline escapes +(\[<colorname>]) +in the +string arguments +given to any of the +reference macros, +nor in the string arguments given to +.HEAD, +.SUBHEAD +or +.PARAHEAD. +Use, rather, the +control macros +mom provides to automatically colourize these +elements. +
+ + + +


+

Adjusting document leading to fill pages

+
+Macro: DOC_LEAD_ADJUST toggle +
+*Must come after LS or AUTOLEAD and before START + +

+DOC_LEAD_ADJUST is a special macro to adjust +document +leading +so that bottom margins fall precisely where you expect. +

+If you invoke DOC_LEAD_ADJUST, mom +takes the number of lines that fit on the page at your requested +leading, then incrementally adds +machine units +to the leading until the maximum number of lines at the new leading +matches the bottom margin. In most instances, the difference +between the requested lead and the adjusted lead is +unnoticeable, and since in almost all cases adjusted leading is +what you want, it's mom's default. +

+Should you NOT want adjusted document leading, you MUST turn it +off manually, like this: +

+

+	.DOC_LEAD_ADJUST OFF
+
+ If you set the document leading prior to START +with +LS +or +AUTOLEAD, +DOC_LEAD_ADJUST OFF must come afterwards, like +this: +

+

+	.LS 12
+	.DOC_LEAD_ADJUST OFF
+
+ +In this scenario, the maximum number of lines that fit on a page at +a +leading +of 12 +points +determine where mom ends +a page. The effect will be that last lines usually fall (slightly) +short of the "official" bottom margin. +

+In +PRINTSTYLE +TYPEWRITE, the leading is always adjusted and +can't be turned off. +

+NOTE: DOC_LEAD_ADJUST, if +used, must be invoked after +LS +or +AUTOLEAD +and before +START +

+ADDITIONAL NOTE: Even if you disable +DOC_LEAD_ADJUST, mom will still +adjust the leading of endnotes pages and toc pages. See +ENDNOTE_LEAD +and +TOC_LEAD +for an explanation of how to disable this default behaviour. +

+ + + +


+

Managing the docheader

+
+Macro: DOCHEADER <toggle> [ distance to advance from top of page ] +
+*Must come before START; distance requires a unit of measure + +

+By default, mom prints a +docheader +on the first page of any document (see +below +for a description of the docheader). If you don't want a docheader, +turn it off with +

+

+	.DOCHEADER OFF
+
+ +DOCHEADER is a toggle macro, so the argument doesn't +have to be OFF; it can be anything you like. +

+If you turn the docheader off, mom, by default, starts +the running text of your document on the same top +baseline +as all subsequent pages. If you'd like her to start at a different +vertical position, give her the distance you'd like as a second +argument. +

+

+	.DOCHEADER OFF 1.5i
+
+ +This starts the document 1.5 inches from the top of the page PLUS +whatever spacing adjustment mom has to make in +order to ensure that the first baseline of running text falls on a +"legal" baseline (i.e. one that ensures that the bottom +margin of the first page falls where it should). The distance is +measured from the top edge of the paper to the +baseline +of the first line of type. +

+TIP: Since no document processing happens until +you invoke +START +-- including anything to do with docheaders -- you can typeset +your own docheader prior to START (if you don't +like the way mom does things) and use +DOCHEADER OFF with its optional distance argument +to ensure that the body of your document starts where you want. +You can even insert a PostScript file (with .PSPIC; +see the groff_tmac man page for usage). +

+

How to change the look of docheaders: docheader control macros

+ +

+With +PRINTSTYLE TYPEWRITE, +the look of docheaders is carved in stone. +In +PRINTSTYLE TYPESET, +however, you can make a lot of changes. Macros that alter docheaders +MUST come before +START. + +

+A typeset docheader has the following characteristics. Note that +title, subtitle, author, and document type are what you supply +with the +reference macros. +Any you leave out will not appear; mom will +compensate: +

+

+	    TITLE         bold, 3.5 points larger than running text (not necessarily caps)
+	   Subtitle       medium, same size as running text
+	      by          medium italic, same size as running text
+	   Author(s)      medium italic, same size as running text
+
+	(Document type)   bold italic, underscored, 3 points larger than running text
+
+ +If the +DOCTYPE +is CHAPTER, +
+	   Chapter #       bold, 4 points larger than running text
+	 Chapter Title     bold italic, 4 points larger than running text
+
+ +

+The +family +is the prevailing family of the whole document. +

+NOTE: If your DOCTYPE is +CHAPTER and you have both "Chapter #" +and a "Chapter Title" (as above), you may find the +leading +a bit cramped (owing to mom's default docheader +leading). If this is the case, you can adjust the leading either +with +DOCHEADER_LEAD +or by including the +inline escape, +\*[DOWN], +in the argument you pass to +CHAPTER_TITLE, like this: +

+

+	.CHAPTER_TITLE "\*[DOWN 2p]Why Not Patent Calculus?"
+
+ + +

The docheader macros to:

+
    +
  1. Change the starting position of the docheader +
  2. Change the family of the entire docheader +
  3. Adjust the docheader leading +
  4. Change the family of individual docheader elements +
  5. Change the font of docheader elements +
  6. Change the colour of the docheader +
  7. Adjust the size of docheader elements +
  8. Change the attribution string ("by") +
+

+

1. Change the starting position

+

+By default, a docheader starts on the same +baseline +as +running text. +If you'd like it to start somewhere else, use the macro +.DOCHEADER_ADVANCE and give it the distance you want +(measured from the top edge of the paper to the first baseline +of the docheader), like this: +

+

+	.DOCHEADER_ADVANCE 4P
+
+ +A +unit of measure +is required. +

+NOTE: If +HEADERS +are OFF, mom's normal top +margin for +running text +(7.5 +picas) +changes to 6 picas (visually approx. 1 inch). Since the +first baseline of the docheader falls on the same baseline +as the first line of running text (on pages after page 1), +you might find the docheaders a bit high when headers are off. +Use +DOCHEADER_ADVANCE +to place them where you want. +

+ +

2. Change the family of the entire docheader

+

+By default, mom sets the docheader in the same +family used for +running text. +If you'd prefer to have your docheaders set in a different family, +invoke DOCHEADER_FAMILY with the family you want. +The argument for DOCHEADER_FAMILY is the same as +for +FAMILY. +

+For example, mom's default family for running text +is Times Roman. If you'd like to keep that default, but have the +docheaders set entirely in Helvetica, +

+

+	.DOCHEADER_FAMILY H
+
+ +is how you'd do it. +

+Please note that if you use DOCHEADER_FAMILY, +you can still alter the family of individual parts of the docheader +with the macros listed +here. + +

3. Adjust the leading

+

+The +leading +of docheaders is the same as running text (except when +DOCTYPE +is CHAPTER and both a chapter number and a +chapter title have been supplied, in which case the default is 4 points +more than running text.) +

+If you'd like your docheaders to have a different leading, say, 2 +points more than the lead of running text, use: +

+

+	.DOCHEADER_LEAD +2
+
+ +Since the leading of docheaders is calculated from the lead of running +text, a + or - sign is required before the argument (how much to add +or subtract from the lead of running text). No +unit of measure +is required; points is assumed. +

+ +

4. Change the family of docheader elements

+

+The following macros let you change the +family +of each docheader element separately: +

+

    +
  • TITLE_FAMILY <family> +
  • CHAPTER_TITLE_FAMILY <family> +
  • SUBTITLE_FAMILY <family> +
  • AUTHOR_FAMILY <family> +
  • DOCTYPE_FAMILY <family> (if +DOCTYPE is NAMED) +
+

+Simply pass the appropriate macro the family you want, just as you +would with +FAMILY. +

+ +

5. Change the font of docheader elements

+

+The following macros let you change the +font +of each docheader element separately: +

+

    +
  • TITLE_FONT R | B | I | BI +
  • CHAPTER_TITLE_FONT R | B | I | BI +
  • SUBTITLE_FONT R | B | I | BI +
  • AUTHOR_FONT R | B | I | BI +
  • DOCTYPE_FONT R | B | I | BI (if +DOCTYPE is NAMED) +
+

+Simply pass the appropriate macro the font you want. R, +B, I and BI have the same meaning as +they do for +FT. +

+ +

6. Change the colour of the docheader elements individually

+

+The following macros let you change the color of each docheader +element separately. You must pre-define (or +"initialize") the color with +NEWCOLOR +or +XCOLOR. +

+

    +
  • TITLE_COLOR <colorname> +
  • CHAPTER_TITLE_COLOR <colorname> +
      +
    • Note: CHAPTER_TITLE_COLOR is needed + only if you enter both a CHAPTER + reference macro AND a CHAPTER_TITLE + macro. Otherwise, the macro, + TITLE_COLOR takes care of colorizing + the chapter header. +
    +
  • SUBTITLE_COLOR <colorname> +
  • ATTRIBUTE_COLOR <colorname> + (the "by" string that precedes the author[s] name[s]) +
  • AUTHOR_COLOR <colorname> +
  • DOCTYPE_COLOR <colorname> (if + DOCTYPE is NAMED) +
+

+It is not recommended that you embed colour (with the +inline escape, +\*[<colorname>]) +in the strings passed to +TITLE, CHAPTER_TITLE, +SUBTITLE, AUTHOR or the name you +give DOCTYPE NAMED. The strings passed to these +macros are used to generate page +headers +and +footers. +An embedded colour will cause the string to be colourized any time +it appears in headers or footers. (If you want headers or footers +colourized, or parts thereof, use the header/footer control macros.) +

+ +If you want to colourize the entire docheader, use the macro +

+

    +
  • DOCHEADER_COLOR <color name>. +
+ +

7. Adjust the size of docheader elements

+

+The following macros let you adjust the point size of each docheader +element separately. +

+Mom calculates the point size +of docheader elements from the point size of paragraphs in running +text, so you must prepend a + or - sign to the argument. Points is +assumed as the +unit of measure, +so there's no need to append a unit to the argument. Fractional point +sizes are allowed. +

+

    +
  • TITLE_SIZE <+/-points> +
    +default = +3.5 (+4 if docheader title is "Chapter #") +
  • CHAPTER_TITLE_SIZE <+/-points> +
    +default = +4 +
  • SUBTITLE_SIZE <+/-points> +
    +default = +0 +
  • AUTHOR_SIZE <+/-points> +
    +default = +0 +
  • DOCTYPE_SIZE <+/-points> (if +DOCTYPE is NAMED) +
    +default = +3 +
+

+Simply pass the appropriate macro the size adjustment you want. +

+ +

8. Change the attribution string ("by")

+

+If you're not writing in English, you can change what +mom prints where "by" appears in +docheaders. For example, +

+

+	.ATTRIBUTE_STRING "par"
+
+ +changes "by" to "par". If you +don't want an attribution string at all, simply pass +ATTRIBUTE_STRING an empty argument, like this: +

+

+	.ATTRIBUTE_STRING ""
+
+ +Mom will deposit a blank line where the +attribution string normally appears. +

+NOTE: The type specs for the attribution line +in docheaders are the same as for the author line. Although +it's highly unlikely you'll want the attribution line in a +different family, font, or point size, you can do so by using +inline escapes +in the argument to ATTRIBUTE_STRING. For +example, +

+

+	.ATTRIBUTE_STRING "\f[HBI]\*[SIZE -2p] by \*[SIZE +2p]\*[PREV]"
+
+ +would set "by" in Helvetica bold italic, 2 points +smaller than normal. +

+


+ + + +

Setting documents in columns

+ +

+Setting documents in columns is easy with mom. (Of +course she'd say that, but it's true!) All you have to do is is +say how many columns you want and how much space you want +between them (the +gutters). +That's it. Mom takes care of everything else, from +soup to nuts. +

+SOME WORDS OF ADVICE: +

+If you want your type to achieve a pleasing +justification +or +rag +in columns, reduce the point size of type (and probably the +leading +as well). Mom's default document point +size is 12.5, which works well across her default 39 +pica +full page line length, but with even just two columns on a page, +the default point size is awkward to work with. +

+Furthermore, you'll absolutely need to reduce the indents for +epigraphs, +quotes, +and +blockquotes +(and probably the +paragraph first-line indent +as well). +

+ + + +


+

COLUMNS

+
+Macro: COLUMNS <number of columns> <width of gutters> +
+*Should be the last macro before START +
+The second argument requires a unit of measure
+ +

+COLUMNS takes two arguments: the number of +columns you want on document pages, and the width of the +gutter +between them. For example, to set up a page with two columns +separated by an 18 point gutter, you'd do +

+

+	.COLUMNS 2 18p
+
+ +Nothing to it, really. However, as noted above, +COLUMNS should always be the last document +setup macro prior to +START. +

+NOTE: Mom ignores columns completely +when the +PRINTSTYLE +is TYPEWRITE. The notion of typewriter-style +output in columns is just too ghastly for her to bear. + +

Using tabs when COLUMNS are enabled

+Mom's tabs +(both +typesetting tabs +and +string tabs) +behave as you'd expect during document processing, even when +COLUMNS are enabled. Tab structures set up +during document processing carry over from page to page and column +to column. + + +

Breaking columns manually

+Mom takes care of breaking columns when they reach +the bottom margin of a page. However, there may be times you want to +break the columns yourself. There are two macros for breaking columns +manually: COL_NEXT and COL_BREAK. + + +

+.COL_NEXT breaks the line just before it, +quads +it left (assuming the type is justified or quad left), and moves over +to the top of the next column. If the column happens to be the last +(rightmost) one on the page, mom starts a new page +at the "column 1" position. This is the macro to use when +you want to start a new column after the end of a paragraph. + + +

+.COL_BREAK is almost the same, except that +instead of breaking and quadding the line preceding it, +she breaks and spreads it (see +SPREAD). +Use this macro whenever you need to start a new column in the middle +of a paragraph. +

+If you need COL_BREAK in the middle of a blockquote +or (god help us) an epigraph, you must do the following in order for +COL_BREAK to work: +

+

+	.SPREAD
+	\!.COL_BREAK
+
+
+ + + + +

Start document processing

+
+ +In order to use mom's document element macros +(tags), you have to tell her you want them. The macro to do this +is START. +

+START collects the information you gave +mom in the setup section at the top of your file (see +Tutorial -- setting up a mom document), +merges it with her defaults, sets up headers and page numbering, +and prepares mom to process your document using +the document element tags. No document processing takes place until +you invoke START. +

+ + + +


+

+ +Macro: START +
+*Required for document processing. + +

+START takes no arguments. It simply instructs +mom to begin document processing. If you don't +want document processing (i.e. you only want the +typesetting macros), +don't use START. +

+At a barest minimum before START, you must enter a +PRINTSTYLE +command. +

+


+ + + + +

Changing document-wide style parameters after START

+
+ +In the normal course of things, you change the basic type +parameters of a document before +START, +using +typesetting macros +(L_MARGIN, FAMILY, PT_SIZE, LS, etc). After +START, you MUST use the following macros to make +global changes to the basic type parameters of a document. +

+ + +

Macro list

+ + +
+ +
+

+ + Macro: DOC_LEFT_MARGIN <left margin> + +
+*Requires a unit of measure +

+

    +
  • the argument is the same as for + L_MARGIN +
  • changes all left margins to the new value +
  • the line length remains the same (i.e. the right margin + shifts when you change the left margin) +
+
+ +
+

+ + Macro: DOC_RIGHT_MARGIN <right margin> + +
+*Requires a unit of measure +

+

+
+ +
+

+ + Macro: DOC_LINE_LENGTH <length> + +
+*Requires a unit of measure +

+

+
+ +
+

+ + Macro: DOC_FAMILY <family> + +

+

    +
  • the argument is the same as for + FAMILY +
  • globally changes the type family +
  • any page elements (e.g. + headers, + page numbers, footnotes) whose families you wish to remain + at their old values must be reset with the appropriate + control macros +
+
+ +
+

+ + Macro: DOC_PT_SIZE <point size> + +
+*Does not require a unit of measure; points is assumed +

+

    +
  • the argument is the same as for + PT_SIZE, + and refers to the point size of type in paragraphs +
  • all automatic point size changes (heads, quotes, + footnotes, headers, etc.) are affected by the new size; + anything you do not want affected must be reset to + its former value (see the Control Macros section of + the pertinent document element for instructions on + how to do this) +
+
+ +
+

+ + Macro: DOC_LEAD <points> [ ADJUST ] + +
+*Does not require a unit of measure; points is assumed +

+

    +
  • the argument is the same as for + LS, + and refers to the + leading + of paragraphs +
  • because paragraphs will have a new leading, the leading and + spacing of most running text is influenced by the new value +
  • epigraphs and footnotes remain unaffected; + if you wish to change their leading, use + EPIGRAPH_AUTOLEAD + and + FOOTNOTE_AUTOLEAD. +
  • the optional argument ADJUST performs + leading adjustment as explained in + DOC_LEAD_ADJUST +
+

+IMPORTANT: Do not use DOC_LEAD +in the middle of a page! It should always and only be invoked +immediately prior to a new page, like this: +

+

+	.DOC_LEAD <new value>
+	.NEWPAGE
+
+ +NOTE: Even if you don't pass +DOC_LEAD the optional argument +ADJUST, mom will still adjust the +leading of endnotes pages and toc pages. See +ENDNOTE_LEAD +and +TOC_LEAD +for an explanation of how to disable this default behaviour. +

+ +


+

+ + Macro: DOC_QUAD L | R | C | J + +

+

    +
  • the arguments are the same as for + QUAD +
  • affects paragraphs, epigraphs and footnotes; does not + affect blockquotes +
+
+ +
+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/goodies.html b/contrib/mom/momdoc/goodies.html new file mode 100644 index 0000000..36f3576 --- /dev/null +++ b/contrib/mom/momdoc/goodies.html @@ -0,0 +1,1057 @@ + + + + +Mom -- Goodies + + + + + +Next   +Prev   +Back to Table of Contents +

+ + +

Goodies

+ +

+ +The macros in this section are a collection of useful (and sometimes +nearly indispensable) routines to simplify typesetting. +

+ +

Goodies list

+ + + + + + +
+

Rename macros

+
+Macro: ALIAS <new name> <old name> + +

+The ALIAS macro may well be your best friend. With it, +you can change the name of a macro to anything you like +(provided the new name is not already being used by +mom; see the +list of reserved words). +

+Groff has always been a bit intimidating for new users because +its standard macro packages use very terse macro names. +Mom doesn't like people to feel intimidated; she wants +them to feel welcome. Consequently, she tries for easy-to-grasp, +self-explanatory macro names. However, mom knows +that people have their own ways of thinking, their own preferences, +their own habits. Some of her macro names may not suit you; they +might be too long, or aren't what you automatically think of +when you want to do a particular thing, or might conflict with habits +you've developed over the years. +

+If you don't like one of mom's macro names, +say, PAGEWIDTH, change it, like this: +

+

+	.ALIAS PW PAGEWIDTH
+	       |      |
+	  new__|      |__official
+	 name            name
+
+ +The first argument to ALIAS is the new name you want +for a macro. The second is the "official" name by +which the macro is normally invoked. After ALIAS, +either can be used. +

+Note that in ALIAS, you do NOT include the period +(dot) that precedes the macro when it's a +control line. +

+NOTE: If you use ALIAS a lot, +and always for the same things, consider creating an aliases +file of the form +

+

+	.ALIAS <new name> <old name>
+	.ALIAS <new name> <old name>
+	.ALIAS <new name> <old name>
+	...etc
+
+ +Put the file someplace convenient and source it at the +beginning of your documents using the groff +primitive +.so. Assuming that you've created an aliases file +called mom_aliases in your home directory under a directory +called Mom, you'd source it by placing +

+

+	.so /home/<username>/Mom/mom_aliases
+
+ +at the top of your documents. +

+If you share documents that make use of an alias file, remember that +other people don't have the file! Paste the whole thing at the top +of your documents, please. +

+EXPERTS: ALIAS is an alias of +.als. You can use either, or mix 'n' match with +impunity. +

+ + + +


+

Hide input lines from output

+
+Macro: SILENT toggle +
+Alias: COMMENT + +

+Sometimes, you want to "hide" +input lines +from final output. This is most likely to be the case when setting +up string tabs (see the +quickie tutorial on string tabs +for an example), but there are other places where you might want input +lines to be invisible as well. Any place you don't want input lines +to appear in the output, use the SILENT macro. +

+SILENT is a toggle. Invoking it without an argument +turns it on; any argument turns it off. E.g., +

+

+	.SILENT
+	A line of text
+	.SILENT OFF
+
+ +The line "A line of text" will not appear in the +output copy. +

+SILENT is aliased as COMMENT. +If you want to insert non-printing comments into your documents, +you may prefer this. +

+NOTE: SILENT does not automatically break an +input line +(see +BR) +when you're in one of the +fill modes +(JUSTIFY +or +QUAD L | R | C | J). +The same applies to tabs +(typesetting +or +string) +to which you've passed the J or QUAD +argument. You must insert .BR yourself, or risk a +portion of your text disappearing into a black hole. +

+ + + +


+

Suspend/re-invoke traps

+
+Macro: TRAP toggle + +

+Traps are vertical positions on the output page at which you or +mom have instructed groff to start doing +something automatically. Commonly, this is near the bottom of +the page, where automatic behind-the-scenes processing is needed +in order for one page to finish and another to start. +

+Sometimes, traps get sprung when you don't want them. If this +happens, surround just the offending macros and input lines with +

+

+	.TRAP OFF
+	...
+	.TRAP
+
+ +TRAP is a toggle, therefore any argument +turns it off (i.e. suspends the trap), and no argument turns it +(back) on. +

+ + + +


+

Convert typewriter doublequotes to proper doublequotes

+
+Macro: SMARTQUOTES [<off>] [ ,, | >> | << ] +
+or +
+Macro: SMARTQUOTES DA | DE | ES | FR | IT | NL | NO | PT | SV + +

+If you invoke SMARTQUOTES without an argument, +mom converts all instances of the inch-mark, +(" -- also called a "doublequote"), into +the appropriate instances of true Anglo-American open- and +close-doublequotes. (See +Internationalization +for how to get SMARTQUOTES to behave correctly for non-English +quoting styles.) +

+Typographically, there is a difference between the inch-mark and +doublequotes -- a BIG difference. Sadly, typewriters and computer +keyboards supply only one: the inch-mark. While using inches for +doublequotes is, and always has been, acceptable in typewriter-style +copy, it has never been, and, God willing, never will be acceptable in +typeset copy. Failure to turn inches into quotes is the first thing +a professional typesetter notices in documents prepared by amateurs. +And you don't want to look like an amateur, do you? +

+

Internationalization

+

+If you invoke SMARTQUOTES with one of the optional +arguments (,, or >> or +<<) you can use " as "cheap" +open- and close-quotes when inputting text in a language other than +English, and have mom convert them, on output, +into the chosen open- and close-quote style. +

+,, opens quotes with "lowered doublequotes" and +closes them with "raised doublequotes", as in this ascii +approximation: +

+

+	,,Hilfe !``
+
+ +>> opens quotes with guillemets pointing to the +right, and closes them with guillemets pointing to the left, as in +this ascii approximation: +

+

+	>>Zurück !<<
+
+ +<< opens quotes with guillemets pointing to the +left, and closes them with guillemets pointing to the right, as in +this ascii approximation: +

+

+	<<Mais monsieur! Je ne suis pas ce genre de fille!>>
+
+ +Please note: the above arguments to SMARTQUOTES +are literal ASCII characters. ,, is two commas, +<< is two less-than signs and >> +is two greater-than signs. +

+Alternatively, you can pass SMARTQUOTES the +two-letter, ISO 639 abbreviation for the language you're writing in, +and mom will output the correct quotes. +

+

+	.SMARTQUOTES DA     = Danish      >>text<<
+	.SMARTQUOTES DE     = German      ,,text``
+	.SMARTQUOTES ES     = Spanish     ``text´´
+	.SMARTQUOTES FR     = French      << text >>
+	.SMARTQUOTES IT     = Italian     << text >>
+	.SMARTQUOTES NL     = Dutch       ´´text´´
+	.SMARTQUOTES NO     = Norwegian   <<text>>
+	.SMARTQUOTES PT     = Portuguese  <<text>>
+	.SMARTQUOTES SV     = Swedish     >>text>>
+
+

+Turn SMARTQUOTES off by passing it any argument +not in the argument list (e.g. OFF, +QUIT, X, etc.) +

+If you're using the +document processing macros +with +PRINTSTYLE TYPESET, +SMARTQUOTES is on by default (in the Anglo-American +style); with +PRINTSTYLE TYPEWRITE, +it's off by default (and should probably stay that way). +

+Finally, if you're fussy about the kerning of quote marks in +relation to the text they surround, or have special quoting needs, +you have to enter quote marks by hand using groff's native +inline escapes +for special characters (see man groff_char for a complete list of +special characters). Entering quote marks this way allows you to +use mom's +inline kerning escapes +to fine-tune the look of quotes. +

+NOTE: SMARTQUOTES does not work on +single quotes, which most people input with the apostrophe (found at +the right-hand end of the "home row" on a QWERTY keyboard). +Groff will interpret all instances of the apostrophe as an apostrophe, +making the symbol useless as an open-single-quote. For open single +quotes, input the backtick character typically found under the tilde +on most keyboards. (Pour nous autres, "backtick" veut dire +l'accent grave.) +Here's an example of correct input copy with single quotes: +

+

+	"But she said, `I don't want to!'"	
+
+ +ADDITIONAL NOTE: Whether or not you have +SMARTQUOTES turned on, get into the habit of entering +the foot- and inch-marks, when you need them, with the +inline escapes +\*[FOOT] and \*[INCH], instead +of ' and ". +

+ + + +


+

Convert to upper case

+
+Macro: CAPS toggle + +

+CAPS converts all lower case letters to upper +case. Primarily, it's a support macro used by the +document processing macros, +but you may find it helpful on occasion. CAPS +is a toggle, therefore no argument turns it on, any argument +turns it off. +

+

+	.CAPS
+	All work and no play makes Jack a dull boy.
+	.CAPS OFF
+
+ +produces, on output +

+

+	ALL WORK AND NO PLAY MAKES JACK A DULL BOY.
+
+ + + +
+

User-defined strings

+
+Macro: STRING <name> <what you want in the string> + +

+You may find sometimes that you have to type out portions of text +repeatedly. If you'd like not to wear out your fingers, you can +define a "string" that, whenever you call it by name, +outputs whatever you put into it. +

+For example, say you're creating a document that repeatedly uses +the phrase "the Montreal/Windsor corridor". Instead of +typing all that out every time, you could define a string, like +this: +

+

+	.STRING mw the Montreal/Windsor corridor
+
+ +Once a string is defined, you can call it any time with the +inline escape +\*[<stringname>]. Using the example string above +

+

+	The schedule for trains along \*[mw]:
+
+ +produces, on output +

+

+	The schedule for trains along the Montreal/Windsor corridor:
+
+ +NOTE: Be very careful not to put any spaces at the +ends of strings you're defining, unless you want them. Everything +after the name argument you pass to STRING goes +into the string, including trailing spaces. +

+Experts: STRING is an alias for ds. +You can use either, or mix 'n' match with impunity. +

+ + + +


+

Single underscore

+
+Macro: UNDERSCORE [ <distance below baseline> ] "<string>" +
+*Optional argument requires a unit of measure + +

+By default, UNDERSCORE places an underscore 2 points +beneath the required +string argument. +The string must be enclosed in double-quotes, like this: +

+

+	.UNDERSCORE "Unmonitored monopolies breed high prices and poor products."
+
+ +If you wish to change the distance of the rule from the +baseline, use the optional argument <distance below +baseline> (with a unit of measure). +

+

+	.UNDERSCORE 3p "Unmonitored monopolies breed high prices and poor products."
+
+ +The above places the underscore 3 points below the baseline. +

+ +NOTES: +
+UNDERSCORE does not work across line breaks in output +copy, which is to say that you can't underscore a multi-line passage +simply by putting the text of the whole thing in the string you pass +to UNDERSCORE. Each +output line +or portion of an output line you want underscored must be plugged +separately into UNDERSCORE. Bear in mind, though, +that underscoring should at best be an occasional effect in typeset +copy. If you want to emphasize an entire passage, it's much, much +better to change fonts (e.g. to italic or bold). +

+You can easily and successfully underline entire passages in simulated +typewriter-style copy (i.e. if your font is Courier, or you're using +the document processing macro +PRINTSTYLE TYPEWRITE), +with the +UNDERLINE +macro. UNDERLINE is designed specifically for this +purpose, but works only with the Courier font. +

+Mom doesn't always get the position and length +of the underscore precisely right in +justified +copy, although she's fine with all the other +fill modes, +as well as with the no-fill modes. As of this writing, I have +no solution to the occasional problems with justified copy. +

+UNDERSCORE tends to confuse +gxditview, even though the output, when +printed, looks fine. Generally, I recommend using gv +to preview files anyway. See the section on +previewing. +

+ + + +


+

Double underscore

+
+Macro: UNDERSCORE2 [ <distance below baseline> [ <distance between rules> ] ] "<string>" +
+*Optional arguments require a unit of measure + +

+By default, UNDERSCORE2 places a double underscore +2 points beneath the required +string argument. +The string must be enclosed in double-quotes, like this: +

+

+	.UNDERSCORE2 "Unmonitored monopolies breed high prices and poor products."
+
+ +The default distance between the two rules is 2 points. +

+If you wish to change the distance of the double underscore from +the baseline, use the optional argument <distance below +baseline> (with a unit of measure), e.g., +

+

+	.UNDERSCORE2 3p "Unmonitored monopolies breed high prices and poor products."
+
+ +which places the double underscore 3 points below the baseline. +

+If you wish to change the distance between the two rules as +well, use the second optional argument <distance between +rules> (with a unit of measure). Be aware that you must +give a value for the first optional argument if you want to use +the second. +

+NOTE: the same restrictions and caveats apply +to UNDERSCORE2 as to +UNDERSCORE. See the +NOTES +for UNDERSCORE. +

+ + + +


+

Underline text -- Courier font only!

+
+Macro: UNDERLINE toggle + +

+If your font is Courier, or you're using the document processing macro +PRINTSTYLE TYPEWRITE, +UNDERLINE allows you to underline words and +passages that, in typeset copy, would be italicized. You invoke +UNDERLINE as you do with all toggle macros -- +by itself (i.e. with no argument) to initiate underlining, and +with any argument to turn underlining off. +

+When on, UNDERLINE underlines letters, words +and numbers, but not punctuation or spaces. This makes for more +readable copy than a solid underline. +

+NOTE: Underlining may also be turned on and off +inline +with the escapes +\*[UL]...\*[ULX]. +

+ + + +


+

Inline escape for underlining -- Courier font only!

+
+Inline: \*[UL]...\*[ULX] + +

+If your font is Courier, or you're using the document processing macro +PRINTSTYLE TYPEWRITE, +\*[UL]...\*[ULX] underlines words and +passages that, in typeset copy, would be italicized. +

+\*[UL] underlines all letters, words and numbers +following it, but not punctuation or spaces. This makes for more +readable copy than a solid underline. When you no longer want +underlining, \*[ULX] turns underlining off. +

+The macro +UNDERLINE +and the inline escape \*[UL] are functionally +identical, hence +

+

+	.FAM     C
+	.FT      R
+	.PT_SIZE 12
+	.LS      24
+	.SS      0
+	.QUAD    LEFT
+	Which should I heed?
+	.UNDERLINE
+	Just do it
+	.UNDERLINE OFF
+	or
+	.UNDERLINE
+	just say no?
+	.UNDERLINE OFF
+
+ +produces the same result as +

+

+	.FAM     C
+	.FT      R
+	.PT_SIZE 12
+	.LS      24
+	.SS      0
+	.QUAD    LEFT
+	Which should I heed? \*[UL]Just do it\*[ULX] or \*[UL]just say no?\*[ULX]
+
+ + + +
+

Insert space into lines

+
+Macro: PAD "<string with pad markers inserted>" [NOBREAK] + +

+With PAD, you can insert unspecified amounts of +whitespace into a line. The optional NOBREAK +argument tells mom not to advance on the page +after the PAD macro has been invoked. +

+PAD calculates the difference between the length of +text on the line and the distance remaining to its end, then inserts +the difference (as whitespace) at the place(s) you specify. +

+Take, for example, the following relatively common typesetting +situation, found at the bottom of legal agreements: +

+

+	Date             Signature                               |
+
+ +The person signing the agreement is supposed to fill in the date +as well as a signature. Space needs to be left for both, but +the exact amount is neither known, nor important. All that +matters is that there be a little space after Date, and rather +more space after Signature. (In the above, | represents +the end of the line at the prevailing line length.) +

+The +pad marker +(see below) is # (the pound or number sign on your keyboard) and +can be used multiple times in a line. With that in mind, here's how +you'd input the Date/Signature line (assuming a length of 30 picas): +

+

+	.LL 30P
+	.PAD "Date#Signature###"
+
+ +When the line is output, the space remaining on the line, after +"Date" and "Signature" have been taken into +account, is split into four (because there are four # signs). +One quarter of the space is inserted between Date and Signature, +the remainder is inserted after Signature. + +

+One rarely wants merely to insert space in a line; one usually +wants to fill it with something, hence PAD is +particularly useful in conjunction with +string tabs. +The following uses the Date/Signature example above, but adds +rules into the whitespace through the use of string tabs and +mom's +inline escape +\*[RULE]. +(Instead of \*[RULE], +groff's line drawing function, +\l +could be used.) +

+

+	.LL 30P
+	.PAD "Date \*[ST1]#\*[ST1X] Signature \*[ST2]###\*[ST2X]" NOBREAK
+	.ST 1 J
+	.ST 2 J
+	.TAB 1
+	\*[RULE]
+	.TN
+	\*[RULE]
+	.TQ
+
+ +If you're not a typesetter, and if you're new to groff, the +example probably looks like gibberish. My apologies. However, +remember that typesetting is a craft, and without having studied +the craft, it takes a while to grasp its concepts. +

+Basically, what the example does is: +
+

    +
  1. Pads the Date/Signature line (using the pad marker #), + encloses the padded space with two string tabs markers, + and outputs the line. +
    +
  2. Sets the two string tabs (notice the use of + EL + beforehand; you don't want mom + to advance a line at this point). +
    +
  3. Calls the first string tab and draws a rule to its full + length. +
    +
  4. Calls the second tab with + TN + (which moves to tab 2 and stays on the same baseline) + then draws a rule to the full length of string tab 2. +
+
+Often, when setting up string tabs this way, you don't want the +padded line to print immediately. To accomplish this, use +SILENT. +See the quickie tutorial on string tabs +for an example. +

+NOTE: Because the pound sign (#) is used as the pad +marker, you can't use it as a literal part of the pad string. If you +need the sign to appear in the text of a padded line, change the pad +marker with PAD_MARKER. Also, be aware +that # as a pad marker only applies within the PAD +macro; at all other times it prints literally, just as you'd expect. +

+Another important consideration when using PAD is that +because the string must be enclosed in double-quotes, you can't use the +double-quote (") as part of the string. The way to circumvent +this is to use the groff +inline escapes +\(lq and \(rq (leftquote and +rightquote respectively) whenever double-quotes are required in the +string passed to PAD. +

+ + + +


+

Change/set the marker used with PAD

+
+Macro: PAD_MARKER <character to use as the pad marker> + +

+If you need to change mom's default pad marker +(#), either because you want a literal # in the padded line, +or simply because you want to use another character instead, use +PAD_MARKER, whose argument is the new pad marker +character you want. +

+

+	.PAD_MARKER @
+
+ +changes the pad marker to @. +

+Once you've changed the pad marker, the new marker remains in +effect for every instance of +PAD +until you change it again (say, back to the pound sign). +

+ + + +


+

Inline escape to add leaders to a line

+
+Inline: \*[LEADER] + +

+Whenever you want to fill a line or tab with +leaders, +use the +inline escape +\*[LEADER]. The remainder of the line or tab will be +filled with the leader character. Mom's +default leader character is a period (dot), but you can change +it to any character you like with +LEADER_CHARACTER. +

+NOTE: \*[LEADER] fills lines +or tabs right to their end. You cannot insert leaders into a +line or tab and have text following the leader on the same line +or in the same tab. Should you wish to achieve such an effect +typographically, create tabs for each element of the line and +fill them appropriately with the text and leaders you need. +String tabs are perfect for this. An +example follows. +

+

+	.LL 30P
+	.PAD "Date\*[ST1]#\*[ST1X]Signature\*[ST2]###\*[ST2X]"
+	.EL
+	.ST 1 J
+	.ST 2 J
+	.TAB 1
+	\*[LEADER]
+	.TN
+	\*[LEADER]
+	.TQ
+
+ +The PAD line sets the words Date and Signature, +and marks string tabs around the pad space inserted in the line. +The string tabs are then "set", called, and filled +with leaders. The result looks like this: +

+

+	Date.............Signature.....................................
+
+ + + +
+

Change/set the leader character

+
+Macro: LEADER_CHARACTER <character> + +

+LEADER_CHARACTER takes one argument: a single +character you would like to be used for +leaders. +(See +\*[LEADER] for an explanation of how to +fill lines with leaders.) +

+For example, to change the leader character from mom's +default (a period) to the underscore character, enter +

+

+	.LEADER_CHARACTER _
+
+ + + +
+

Drop caps

+
+Macro: DROPCAP <dropcap letter> <number of lines to drop> [ COND <percentage> | EXT <percentage> ] + +

+The first two arguments to DROPCAP are the letter you +want to be the +drop cap +and the number of lines you want it to drop. By default, +mom uses the current family and font for the drop cap. +

+The optional argument (COND or EXT) indicates that you want the +drop cap condensed (narrower) or extended (wider). If you use +COND or EXT, you must follow the +argument with the percentage of the letter's normal width you want +it condensed or extended. No percent sign (%) is required. +

+Mom will do her very best to get the drop cap to +line up with the first line of text indented beside it, then set +the correct number of indented lines, and restore your left margin +when the number of drop cap lines has been reached. +

+Beginning a paragraph with a drop cap "T" looks +like this: +

+

+	.DROPCAP T 3 COND 90
+	he thousand injuries of Fortunato I had borne as best I
+	could, but when he ventured upon insult, I vowed revenge.
+	You who so well know the nature of my soul will not suppose,
+	however, that I gave utterance to a threat...
+
+ +The drop cap, slightly condensed but in the current family and font, +will be three lines tall, with whatever text fills those three +lines indented to the right of the letter. The remainder of the +paragraph's text will revert to the left margin. +

+NOTE: When using the +document processing macro +PP, +DROPCAP only works +
+

    +
  • with initial paragraphs (i.e. at the start of the document, + or after + HEAD), +
  • when DROPCAP comes immediately after PP, +
  • and when the + PRINTSTYLE + is TYPESET. +
+
+If these conditions aren't met, DROPCAP is silently ignored. +

+WARNING: DROPCAP puts a bit of +a strain on resource-challenged systems. If you have such a +system and use drop caps extensively in a document, be prepared +for a wait while mom does her thing. + +

Support macros for DROPCAP

+Drop caps are the bane of most typesetters' existence. It's +very difficult to get the size of the drop cap right for the +number of drop lines, especially if the drop cap is in a +different family from the prevailing family of running text. +Not only that, but there's the gutter around the drop cap to +take into account, plus the fact that the letter may be too wide +or too narrow to look anything but odd or misplaced. +

+Mom solves the last of these problems with the +COND and EXT arguments. The +rest she solves with macros that change the default behaviour of +DROPCAP, namely +

+DROPCAP_FAMILY, +
+DROPCAP_FONT, +
+DROPCAP_COLOR, +
+DROPCAP_ADJUST +
+and +
+DROPCAP_GUTTER. +

+These macros must, of course, come before you invoke +DROPCAP. + +

DROPCAP_FAMILY

+ +Set the drop cap family by giving +DROPCAP_FAMILY the name of the family you want, +e.g. +

+

+	.DROPCAP_FAMILY H
+
+ +which will set the family to Helvetica for the drop cap only. + +

DROPCAP_FONT

+ +Set the drop cap font by giving +DROPCAP_FONT the name of the font you want, +e.g. +

+

+	.DROPCAP_FONT I
+
+ +which will set the font to italic for the drop cap only. + +

DROPCAP_ADJUST

+ +If the size mom calculates for the drop cap +isn't precisely what you want, you can increase or decrease it +with DROPCAP_ADJUST, like this: +e.g. +

+

+	.DROPCAP_ADJUST +1
+	    or
+	.DROPCAP_ADJUST -.75
+
+ +DROPCAP_ADJUST only understands +points, +therefore do not append any +unit of measure +to the argument. And always be sure to prepend the plus or +minus sign, depending on whether you want the drop cap larger or +smaller. + + +

DROPCAP_COLOR

+ +If you'd like your drop cap colourized, simply invoke +DROPCAP_COLOR with the name of a colour you've already +created ("initialized") with +NEWCOLOR +or +XCOLOR. Only the drop cap will be +colourized; all other text will remain at the current colour +default (usually black). + +

DROPCAP_GUTTER

+ +By default, mom puts three points of space +between the drop cap and the text indented beside it. If you +want another value, use DROPCAP_GUTTER (with a +unit of measure), like this: +

+

+	.DROPCAP_GUTTER 6p
+
+ + + +
+

Superscript

+
+Inlines: \*[SUP]...\*[SUPX] + +

+Superscripts are accomplished +inline. +Whenever you need one, typically for numerals, all you need to +do is surround the superscript with the inlines above. +\*[SUP] begins superscripting; +\*[SUPX] turns it off. + + +

+If your running type is +pseudo-condensed +or +pseudo-extended +and you want your superscripts to be equivalently pseudo-condensed or +-extended, use \*[CONDSUP]...\*[CONDSUPX] or +\*[EXTSUP]...\*[EXTSUPX]. +

+The superscript inlines are primarily used by the +document processing macros +for automatic generation of numbered footnotes. However, you may +find them useful for other purposes. +

+NOTE: Mom does a pretty fine job of +making superscripts look good in any font and at any size. If you're +fussy, though (and I am), about precise vertical placement, kerning, +weight, size, and so on, you may want to roll your own solution. +And sorry, there's no mom equivalent for subscripts. +I'm neither a mathematician nor a chemist, so I don't need them. +Of course, anyone who wishes to contribute a subscript routine to +mom will receive eternal blessings not only in this +lifetime, but in all lifetimes to come. +

+


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/headfootpage.html b/contrib/mom/momdoc/headfootpage.html new file mode 100644 index 0000000..ac34eb8 --- /dev/null +++ b/contrib/mom/momdoc/headfootpage.html @@ -0,0 +1,1636 @@ + + + + +Mom -- Document processing: headers, footers and pagination + + + + + +Next   +Prev   +Back to Table of Contents +

+ + + +

PAGE HEADERS, FOOTERS, AND PAGINATION

+ + + + + +

Introduction

+
+ +Headers +and +footers, +as defined in the section +Mom's Document Processing Terms, +are those parts of a document that contain information about the document +itself which appear in the margins either above or below +running text. +They are, in all respects but two, identical. The differences are: +

+

    +
  1. headers appear in the margin above running text while + footers appear in the margin beneath running text; +
  2. the (optional) rule that separates headers from running + text appears below the header while + the (optional) rule that separates footers from running + text appears above the footer. +
+ +

+Because headers and footers are virtually identical, this +documentation addresses itself only to headers. In all cases, +unless otherwise noted, descriptions of headers +describe footers as well. +

+Furthermore, any +control macro +that begins with HEADER_ may be used to control +footers, simply by replacing HEADER_ with +FOOTER_. +

+Author's note: Left to their own devices (i.e. if +you're happy with the way mom does things by default), +headers are something you never have to worry about. You can skip +reading this section entirely. But if you want to change them, be +advised that headers have more macros to control their appearance than +any other document element. The text of this documentation becomes +correspondingly dense at this point. + +

+NOTE: While the single page number that +mom generates in either the top or bottom margin +above or below running text is technically a kind of header/footer, +mom and this documentation treat it as a +separate page element. +

+ +

General description of headers/footers

+

+Headers comprise three distinct parts: a left part, a centre part, +and a right part. Each part contains text (a "string") +that identifies some aspect of the document as a whole. +

+The left part ("header left") lines up with the document's +left margin. The centre part ("header centre") is +centred on the document's line length. The right part ("header +right") lines up with the document's right margin. Not all parts +need contain a string, and if you don't want headers at all, you can +turn them off completely. +

+A note to groff experts: Although +mom's headers resemble the three-part titles generated +by .tl, they're in no way related to it, nor based +upon it. .tl is not used at all in mom. +

+Normally, mom fills headers with strings appropriate +to the document type selected with +DOCTYPE. +You can, however, supply whatever strings you like -- including page +numbers -- to go in any part of headers. What's more, you can set the +family, font, size and capitalization style (caps or caps/lower-case) +for each header part individually. +

+By default, mom prints a horizontal rule beneath +headers to separate them visually from running text. In the case of +footers, the rule is above running text. You can increase +or decrease the space between the header and the rule if you like (with +HEADER_RULE_GAP), +or remove it completely. +

+ +

Default specs for headers/footers

+

+Mom makes small type adjustments to each part of +the header (left, centre, right) to achieve an aesthetically +pleasing result. The defaults are listed below. (The strings +mom puts by default in each part are explained in +DOCTYPE.) +

+NOTE: Except for capitalization (all caps or +caps/lower-case), these defaults apply only to +PRINTSTYLE TYPESET. +

+

+TYPE SPEC    HEADER LEFT         HEADER CENTER       HEADER RIGHT
+---------    -----------         -------------       ------------
+Family       document default    document default    document default
+Font         roman               italic              roman
+Colour       (black)             (black)             (black)
+All caps     no                  no                  yes
+Size*        -.5 (points)        -.5 (points)        -2 (points)
+            (-2 if all caps)    (-2 if all caps)    (-.5 if not all caps)
+
+*Relative to the point size of type in paragraphs
+
+ +You can, of course, change any of the defaults using the appropriate +control macros. And should you wish to design headers from the ground +up, mom has a special macro, +HEADER_PLAIN, +that removes all type adjustments to headers. The straightforward +type specs for paragraphs are used instead, providing a simple +reference point for any alterations you want to make to the family, +font, size and capitalization style of any header part. +

+ +

Vertical placement and spacing of headers/footers

+

+As explained in the section on +typesetting macros in document processing, +the top and bottom margins of a mom document +are the vertical start and end positions of +running text, +not the vertical positions of headers or footers, which, by definition, +appear in the margins above (or below) running text. +

+The vertical placement of headers +is controlled by the macro +HEADER_MARGIN, +which establishes the +baseline +position of headers relative to the top edge of the page. +The header rule, whose position is relative to the header itself, +is controlled by a separate macro. +FOOTER_MARGIN establishes the baseline position of +footers relative to the bottom edge of the page. +

+HEADER_GAP establishes +the distance between headers and the start of running text (effectively +making HEADER_MARGIN + HEADER_GAP the top margin of +running text unless you give mom a literal top margin +(with +T_MARGIN), +in which case she ignores HEADER_GAP and starts +running text at whatever top margin you gave. +FOOTER_GAP and +B_MARGIN +work similarly, except they determine where running text +ends on the page. (See +FOOTER MARGIN AND BOTTOM MARGIN -- VERY IMPORTANT! +for a warning about possible conflicts between the footer margin +and the bottom margin.) +

+Confused? Mom apologizes. It's really quite +simple. By default, mom sets headers 4-1/2 +picas +down from the top of the page and starts running text 3 picas (the +HEADER_GAP) beneath that, which means the +effective top margin of running text is 7-1/2 picas (visually approx. 1 +inch). If you give mom a literal top margin (with +T_MARGIN), +she ignores the HEADER_GAP and starts running +text at whatever top margin you gave. +

+Footers are treated the same way, the only difference being the +default distances. Mom sets footers 3 picas up from +the bottom of the page, and interrupts the processing of running text 3 +picas (the FOOTER_GAP) above that (again, visually +approx. 1 inch). If you give mom a literal bottom +margin (with B_MARGIN), she ignores the +FOOTER_GAP and interrupts the processing of running +text at whatever bottom margin you gave. +

+If mom is paginating your document (she +does, by default, at the bottom of each page), the vertical +spacing and placement of page numbers, whether at the top +or the bottom of the page, is managed exactly as if the +page numbers were headers (or footers), and are controlled +by the same macros. See +Pagination control. +

+


+ + + + +

Managing headers/footers

+
+ +

+The following are the basic macros for turning +headers +or +footers +on or off. They should be invoked prior to +START. +

+By default, mom prints page headers. If you turn +them off, she will begin +running text +on each page with a default top margin of 6 +picas +unless you have requested a different top margin (with +T_MARGIN) +prior to +START. +

+Please note that headers and footers are mutually exclusive. If +headers are on, footers (but NOT bottom-of-page numbering) are +automatically turned off. Equally, if footers are on, headers +(but NOT top-of-page numbering) are automatically turned off. Thus, if +you'd prefer footers in a document, you need only invoke +FOOTERS; +there's no need to turn headers off first. +

+ + + +


+

+ +Macro: HEADERS toggle + +

+Page headers +are on by default. If you don't want them, turn them off by +invoking HEADERS with any argument +(OFF, QUIT, END, X...), e.g. +

+

+	.HEADERS OFF
+
+

+NOTE: HEADERS automatically +disables +footers +(you can't have both), but not the page numbers that normally +appear at the bottom of the page. +

+ADDITIONAL NOTE: If HEADERS +are OFF, mom's normal top +margin for +running text +(7.5 +picas) +changes to 6 picas (visually approx. 1 inch). This does NOT apply +to the situation where footers have been explicitly turned on +(with +FOOTERS). +Explicitly invoking footers moves page numbering to the +top of the page, where its placement and spacing are the same as +for headers. (I.e. the top margin of running text remains 7.5 +picas.) +

+ + + +


+

+ +Macro: FOOTERS toggle + +

+Page footers +are off by default. If you want them instead of +headers +(you can't have both), turn them on by invoking +FOOTERS without an argument, e.g. +

+

+	.FOOTERS
+
+ +

+FOOTERS automatically disables headers, and +mom shifts the placement of page numbers from their +normal position at page bottom to the top of the page. +

+NOTE: By default, when footers are on, +mom does not print a page number on the first +page of a document, nor on first pages after +COLLATE. +If you don't want this behaviour, you can change it with +PAGENUM_ON_FIRST_PAGE. +

+ + + +


+

+ +Macro: FOOTER_ON_FIRST_PAGE toggle + +

+If you invoke +FOOTERS, +mom, by default, does not print a footer on the +first page of the document. (The +docheader +on page 1 makes it redundant.) However, should you wish a footer on +page 1, invoke FOOTER_ON_FIRST_PAGE without any argument. +

+


+ + + + +

User-defined, single string recto/verso headers/footers

+
+ +

Introduction

+ +Sometimes, you'll find you can't get mom's handling +of 3-part headers or footers to do exactly what you want in the +order you want. This is most likely happen when you want the +information contained in the headers/footers split over two pages, +as is often the case with recto/verso documents. +

+Say, for example, you want recto page headers to contain a document's +author, centred, and verso page headers to contain the document's +title, also centred, like this: +

+

+	+------------------------+   +------------------------+     
+	|         Author         |   |         Title          |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	+------------------------+   +------------------------+     
+
+ +With mom's standard 3-part headers, this isn't +possible, even when +RECTO_VERSO +is enabled. RECTO_VERSO switches the left and +right parts of headers on alternate pages, but the centre +part remains unchanged. +

+Any time you need distinctly different headers on alternate +pages, mom has macros that let you manually +design and determine what goes into headers on recto pages, and +what goes into headers on verso pages. The macros are +HEADER_RECTO +and +HEADER_VERSO. +Both allow you to state whether the header is flush left, centred, +or flush right, and both take a single +string argument +with which, by combining text and +inline escapes, +you can make the headers come out just about any way you want. +Use of the \*[PAGE#] escape is permitted in the +string argument (see +Including the page number in header-left, -centre or -right), +and as an added bonus, mom provides a special +mechanism whereby it's possible to "pad" the string as well. +

+ + + +


+

+ +Macro: HEADER_RECTO LEFT | CENTER | RIGHT "<header recto string>" +
+Macro: HEADER_VERSO LEFT | CENTER | RIGHT "<header verso string>" +
+ +

+HEADER_RECTO and HEADER_VERSO behave +identically, hence all references to HEADER_RECTO +in this section also refer to HEADER_VERSO. +Furthermore, FOOTER_ can be used instead of +HEADER_ to set up recto/verso footers. +

+The first argument to HEADER_RECTO is the +direction in which you want the header +quadded. +L, C and R may be used in +place of LEFT, CENTER and +RIGHT. The second argument is a string, +surrounded by double-quotes, containing what you want in the +header. HEADER_RECTO disables mom's +normal 3-part headers, therefore anything you want in the +headers must be entered by hand in the string, including colours +(via the +inline escape +\*[<colorname>]). +

+By default, HEADER_RECTO is set at the same +size, and in the same family and font, as paragraph text. The +control macros +HEADER_FAMILY +and +HEADER_SIZE +may be used to change the default family and size. Changes to +the font(s) within the string must be accomplished with the +inline escapes +\*[ROM], \*[IT], \*[BD], \*[BDI] and +\*[PREV] (see +Changing fonts). +Additional refinements to the style of the header-recto string, +including horizontal spacing and/or positioning, can also be made with +inline escapes. +

+To include the current page number in the string, use the +\*[PAGE#] inline. +
+ +

*Padding the HEADER_RECTO/HEADER_VERSO string

+You can "pad" the header-recto string, a convenience you'll +appreciate in circumstances such as the following. +

+

+	           VERSO                       RECTO 
+	+------------------------+   +------------------------+     
+	| Author          Page#  |   | Page#            Title |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	|                        |   |                        |     
+	+------------------------+   +------------------------+     
+
+ +To pad the string argument passed to HEADER_RECTO, +begin and end the string (inside the double-quotes) with the caret +character (^). Enter the pound sign (#) at any +point in the string where you want an equalized amount of whitespace +inserted. (If you're unsure what padding is, see +Insert space into lines.) +Note that if you're padding the string, it doesn't matter what +quad direction you give HEADER_RECTO since +padding, by its nature, justifies text to the left and right +margins. +

+The situation depicted above is accomplished like this: +

+

+	.HEADER_RECTO LEFT "^\*[PAGE#]#Title^"
+	.HEADER_VERSO LEFT "^Author#\*[PAGE#]^"
+
+ +Note that mom does not interpret the # +in \*[PAGE#] as a padding marker (i.e. as a place +to insert whitespace). +

+Also, notice that the argument LEFT is used in both +cases. When padding a header, it doesn't matter whether you use +LEFT, CENTER or RIGHT as the argument. +

+Furthermore, should you need a user-defined header of +the sort provided by HEADER_RECTO and +HEADER_VERSO but aren't actually printing +recto/verso, you can use HEADER_RECTO to design the +header that appears at the top of every page. +

+IMPORTANT: The +PAD_MARKER +macro, which changes the default pad marker (#) used by +PAD, +has no effect on the pad marker used in the +HEADER_RECTO string. If you absolutely must +have a literal pound sign in your HEADER_RECTO +string, use the escape sequence for the pound sign +(\[sh]) where you want the pound sign to go. +

+


+ + +

Control macros for headers/footers

+
+Virtually every part of headers (see the paragraph on how +"headers" means "footers" +in the +introduction to headers/footers) +can be designed to your own specifications. +

+ + +

Header/footer control macros

+ + + + + + +
+

Header/footer strings

+

+ + Macro: HEADER_LEFT "<text of header left>" | # + +
+ + Macro: HEADER_CENTER "<text of header centre>" | # + +
+ + Macro: HEADER_RIGHT "<text of header right>" | # + + +

+To change the text (the "string") of the left, centre, +or right part of headers, invoke the appropriate macro above with +the string you want. For example, mom, by default, +prints the document's author in the header-left position. If your +document has, say, two authors, and you want both their names to +appear header-left, change HEADER_LEFT like this: +

+

+	.HEADER_LEFT "R. Stallman, E. Raymond"
+
+ +Because the arguments to HEADER_LEFT, _CENTER, +and _RIGHT are +string arguments, +they must be enclosed in double-quotes. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change the strings in footers. + +

*Padding the header/footer centre string

+

+Macro: HEADER_CENTER_PAD LEFT | RIGHT <amount of space by which to pad centre string left or right> +
+*Requires a unit of measure +

+By default, mom centres the header centre string +literally on the line length in effect for page headers. In some +cases, notably when the header left or header right strings are +particularly long, the effect isn't pretty. The offendingly long +header left or right crowds, or even overprints, the header centre. +That's where HEADER_CENTER_PAD comes in. With a +bit of experimentation (yes, you have to preview the document), you +can use HEADER_CENTER_PAD to move the header +centre string left or right until it looks acceptably centred +between the two other strings. +

+For example, say your document is an outline for a novel called "By +the Shores of Lake Attica." You've told mom +you want +

+    DOCTYPE + +NAMED "Outline" +

+but when you preview your work, you see that "Outline", in the +centre of the page header, is uncomfortably close to the title, +which is to the right of it. By invoking +

+

+	.HEADER_CENTER_PAD RIGHT 3P
+
+ +you can scoot the word "Outline" over three +picas +to the left (the padding's added to the right of the string) +so that your head looks nicely spaced out. Invoking +HEADER_CENTER_PAD with the LEFT +argument obviously puts the padding on the left side of the string. +

+Most reassuring of all is that if you use +HEADER_CENTER_PAD conjunction with +RECTO_VERSO, +mom will pad the centre string appropriately left +OR right, depending on which page you're on, without you having to +tell her to do so. +

+ +


+

+

Using mom's "reserved" strings in header/footer definitions

+

+As pointed out in the author's note in the introduction to +headers/footers, headers and footers are something you don't +normally have to worry much about. Mom usually +knows what to do. +

+However, situations do arise where you need to manipulate what goes +in the header/footer strings, setting and resetting them as you go +along. A case where you might want to do this would be if you want +to output endnotes at the end of each document in a series of +collated +documents, and you want the word "Endnotes" to go in the header +centre position of the endnotes, but want, say, the +TITLE +to go back into the centre position for the next output document. +

+In scenarios like the above, mom has a number of +"reserved" strings that you can plug into the +HEADER_LEFT, _CENTER and _RIGHT +macros. They are: +

+

+	\*[$TITLE]          -- the argument passed to .TITLE
+	\*[$DOCTITLE]       -- the argument passed to .DOCTITLE
+	\*[$AUTHOR_1]       -- the first argument passed to .AUTHOR
+	\*[$CHAPTER_STRING] -- the argument passed to .CHAPTER_STRING,
+	                       if invoked, otherwise, "Chapter"
+	\*[$CHAPTER]        -- the argument (typically a number) passed
+	                       to .CHAPTER
+	\*[$CHAPTER_TITLE]  -- the argument passed to .CHAPTER_TITLE
+
+ +Returning to the scenario above, first, you'd define a centre +string for the endnotes page: +

+

+	.HEADER_CENTER "Endnotes"
+
+ +Then, you'd output the endnotes: +

+

+	.ENDNOTES
+
+ +Then, you'd prepare mom for the next document: +

+

+	.COLLATE
+	.TITLE "New Doc Title"
+	.AUTHOR "Josephine Blough"
+
+ +Then, you'd redefine the header centre string using the reserved +string \*[$TITLE], like this: +

+

+	.HEADER_CENTER "\*[$TITLE]"
+
+ +And last, you'd do: +

+

+	.START
+
+ +Voilà! Any argument you pass to TITLE from here +on in (say, for subsequent documents) is back in the header centre +position. Here's the whole routine again: +

+

+	.HEADER_CENTER "Endnotes"
+	.ENDNOTES
+	.COLLATE
+	.TITLE         "New Doc Title"
+	.AUTHOR        "Josephine Blough"
+	.HEADER_CENTER "\*[$TITLE]"
+	.START
+
+ +If need be, you can concatenate the strings, as in the following +example. +

+

+	.HEADER_CENTER "\*[$CHAPTER_STRING] \*[$CHAPTER]"
+
+ +which, assuming a .CHAPTER_STRING of +"Chapter" and a .CHAPTER of +"2", would put "Chapter 2" in the header centre +position. +

+ + +

*Replacing header-left, -CENTER or -right with the page number

+ +

+If you would like to have the current page number to appear +header-left, -center, or -right instead of a text +string, invoke the appropriate macro, above, with the single +argument # (the "number" or +"pound" sign). Do NOT use +double-quotes. For example, +

+

+	.HEADER_CENTER #
+
+ +will print the current page number in the CENTER part of +headers. +

+ + +

*Including the page number in header-left, -CENTER or -right

+ +

+If you would like to include the current page number in +the string you pass to HEADER_LEFT, _CENTER, or +_RIGHT, use the special +inline escape +\*[PAGE#] in the string argument. +

+For example, say you have a document that's ten pages long, and +you want header-right to say "page <whichever> of 10", +invoke HEADER_RIGHT as follows: +

+

+	.HEADER_RIGHT "page \*[PAGE#] of 10"
+
+ +Header-right of page two will read "page 2 of 10", +header-right of page three will read "page 3 of 10", +and so on. +

+


+ + + +

Header/footer style

+ +

+Global changes +

+The following macros allow you to make changes that affect all +parts of the header at once. +

+Please note that HEADER_FAMILY and +HEADER_FONT have no effect on +PRINTSTYLE TYPEWRITE. +

+

+ +
+

+ + Macro: HEADER_FAMILY <family> + + +

+By default, mom uses the default document family +for headers. If you would like her to use another +family +in headers, invoke HEADER_FAMILY with the identifier +for the family you want. The argument is the same as for the +typesetting macro +FAMILY. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change the footer family. +

+ +


+

+ + Macro: HEADER_SIZE <+|-number of points> +
+ *Argument is relative to the point size of type in paragraphs +
+ +

+By default, mom makes small adjustments to the size +of each part of a header to achieve an aesthetically pleasing result. +If you'd like her to continue to do so, but would like the overall +appearance of headers to be a little smaller or a little larger, +invoke HEADER_SIZE with + or - the number of +points +(fractions allowed) by which you want her to in/decrease the size +of headers. For example, +

+

+	.HEADER_SIZE +.75
+
+ +increases the size of every part of a header by 3/4 of a point while +respecting mom's own little size changes. +

+See +Arguments to the control macros +for an explanation of how control macros ending in +_SIZE work. +

+ +NOTE: Replace HEADER_, above, +with FOOTER_ to change the footer size. +

+ADDITIONAL NOTE: Normally, macros that control headers have no +effect on +PRINTSTYLE TYPEWRITE. +HEADER_SIZE is an exception. While all parts of a +header in PRINTSTYLE TYPEWRITE are always the same +size, you can use HEADER_SIZE with PRINTSTYLE +TYPEWRITE to reduce the header's overall point size. +You'll most likely require this when the +COPYSTYLE +is DRAFT, since portions of the header may overprint +if, say, the title of your document is very long. +

+ +


+

+ + Macro: HEADER_PLAIN + + +

+By default, mom makes adjustments to the font, +size, and capitalization style of each part of headers to achieve +an aesthetically pleasing look. Should you wish to design your own +headers from the ground up without worrying how changes to the various +elements of header style interact with mom's defaults, +invoke HEADER_PLAIN by itself, with no argument. +Mom will disable her default behaviour for headers, +and reset all elements of header style to the same family, font, +and point size as she uses in paragraphs. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to disable mom's +default behaviour for the various elements of footer style. +

+ +


+

+ + Macro: HEADER_COLOR <colorname> + + +

+If you want your headers in a colour different from the document +default (usually black), invoke HEADER_COLOR with +the name of a colour pre-defined (or "initialized") with +NEWCOLOR +or +XCOLOR. +

+HEADER_COLOR will set all the parts of the header +AND the header rule in the colour you give it as an argument. If +you wish finer control over colour in headers, you can use +HEADER_<POSITION>_COLOR +to colourize each part of the header separately, as well as +HEADER_RULE_COLOR +to change the colour of the header rule. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to colourize footers. +

+ +


+

+Part by part changes +

+NOTE: When using the following control macros, +replace "<POSITION>" by LEFT, CENTER, +or RIGHT as appropriate. +

+

+ +
+

+ + Macro: HEADER_<POSITION>_FAMILY <family> + +

+Use HEADER_<POSITION>_FAMILY to change the +family +of any part of headers. See +Arguments to the control macros +for an explanation of how control macros ending in +_FAMILY work. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change a footer part's family. +

+ +


+

+ + Macro: HEADER_<POSITION>_FONT <font> + +

+Use HEADER_<POSITION>_FONT to change the +font +of any part of headers. See +Arguments to the control macros +for an explanation of how control macros ending in +_FONT work. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change a footer part's font. +

+ +


+

+ + Macro: HEADER_<POSITION>_SIZE <+|-number of points> + +

+Use HEADER_<POSITION>_SIZE to change the size of any +part of headers (relative to the point size of type in +paragraphs). See +Arguments to the control macros +for an explanation of how control macros ending in +_SIZE work. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change a footer part's size. +

+ +


+

+ + Macro: HEADER_<POSITION>_CAPS toggle + +

+HEADER_<POSITION>_CAPS is a +toggle macro. +If you want any part of headers to be set in all caps, +regardless of the capitalization of that part's string as given +to the +reference macros +or as defined by you with the +header string control macros, +simply invoke this macro (using the appropriate position) with no +argument. If you wish to turn capitalization off (say, for the +header-right string that mom capitalizes by +default), invoke the argument with any argument (e.g. OFF, +QUIT, END, X...). +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change a footer part's +capitalization style. + +

+


+

+ + Macro: HEADER_<POSITION>_COLOR <colorname> + +

+HEADER_<POSITION>_COLOR allows you to set a +colour for each of the three possible parts of a page header +separately. For example, say you want the right part of the header +(by default, the document title) in red, this is how you'd get it: +

+

+	.HEADER_RIGHT_COLOR red
+
+ +The other parts of the header will be in the default header colour +(usually black, but that can be changed with +HEADER_COLOR). +

+Remember that you have to define (or "initialize") a +colour with +NEWCOLOR +or +XCOLOR +before you can use the colour. +

+If you create a +user-defined header +with +HEADER_RECTO +or +HEADER_VERSO, +and you want various elements within the header to be colourized, +embed the colours in the string passed to HEADER_RECTO +or HEADER_VERSO with the +\*[<colorname>] +inline escape. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to set the colours for the various +elements of footers. +

+


+ + + + +

Header/footer vertical placement and spacing

+
+ +

+See +Vertical placement and spacing of headers/footers +for an explanation of how mom deals with +headers, footers, and top/bottom page margins. +

+ + + +


+

+ +Macro: HEADER_MARGIN <distance to baseline of header> +
+*Requires a unit of measure + +

+Use HEADER_MARGIN to set the distance from the +top edge of the page to the +baseline +of type in headers. A unit of measure is required, and decimal +fractions are allowed. +

+Mom's default header margin is 4-1/2 +picas, +but if you want a different margin, say, 1/2-inch, do +

+

+	.HEADER_MARGIN .5i
+
+ +If your document uses +footers, +replace HEADER_, above, with +FOOTER_. The argument to +FOOTER_MARGIN is the distance from the bottom +edge of the page to the baseline of type in footers. +

+Mom's default footer margin is 3 +picas. + + +

+FOOTER MARGIN AND BOTTOM MARGIN -- VERY IMPORTANT! +

+Mom requires a footer margin for proper operation, +hence she sets one, even if you don't. (As stated above, her default +footer margin is 3-picas). +

+If you set a bottom margin for your document (with +B_MARGIN, +prior to +START) +and the margin's too close to mom's default +footer margin (or a footer margin you set yourself +with FOOTER_MARGIN), mom will +not print your footers; additionally, she'll give you a warning +and some advice on standard error. When this happens, you must +reset either B_MARGIN or +FOOTER_MARGIN so there's an adequate amount of +space for mom to print the bottom line of running +text and the footer. +

+If you see the warning even when footers and/or bottom-of-page page +numbering are disabled, set a nominal footer margin of 0 prior to +START, +as in these examples. +

+Example 1 +

+

+	<reference macros, etc>
+	.PAGINATION    OFF
+	.B_MARGIN      .25i
+	.FOOTER_MARGIN O
+	.START
+
+ +Example 2 +

+

+	<reference macros, etc>
+	.HEADERS       OFF
+	.PAGENUM_POS   TOP RIGHT
+	.B_MARGIN      .25i
+	.FOOTER_MARGIN O
+	.START
+
+ +

A note on header/footer margins and page numbering

+Mom uses HEADER_MARGIN and +FOOTER_MARGIN to establish the baseline +position of page numbers in addition to the baseline position of +headers and footers. +

+By default, page numbers appear at the bottom of the page, therefore +if you want the default position (bottom), but want to change the +baseline placement, use FOOTER_MARGIN. Conversely, +if page numbers are at the top of the page, either because you turned +FOOTERS +on or because you instructed mom to put them +there with +PAGENUM_POS, +you'd use HEADER_MARGIN to change their +baseline placement. +

+ + + +


+

+ +Macro: HEADER_GAP <distance from header to start of running text> +
+*Requires a unit of measure + +

+Use HEADER_GAP to set the distance from the +baseline +of type in headers to the start of +running text. +A unit of measure is required, and decimal fractions are allowed. +

+As explained in +Vertical placement and spacing of headers/footers, +HEADER_MARGIN + HEADER_GAP determine the +default vertical starting position of running text on the page +UNLESS you have given mom your own top margin +(with +T_MARGIN). If you give +a top margin, mom ignores +HEADER_GAP; running text starts at your stated +top margin. + +

+Mom's default header gap is 3 +picas, +but if you want a different gap, say, 2 centimetres, do +

+

+	.HEADER_GAP 2c
+
+ +If your document uses +footers, +replace HEADER_, above, with +FOOTER_. The argument to +FOOTER_GAP is the distance from the +baseline of type in footers to the last baseline of running text +on the page. +

+As explained in +Vertical placement and spacing of headers/footers, +FOOTER_MARGIN + FOOTER_GAP determine the +default vertical end position of running text on the page +UNLESS you have given mom a bottom margin +(with +B_MARGIN). If you give +a bottom margin, mom ignores +FOOTER_GAP; running text ends at your stated +bottom margin. +

+Mom's default footer gap is 3 +picas. +

+NOTE: Mom uses +HEADER_GAP and +FOOTER_GAP to establish the start and end baseline +positions of running text with respect to both headers and footers +AND page numbers. If you wish to change the gap between +the last line of running text and a bottom page number, use +FOOTER_GAP. If page numbers are at the top of the +page, change the gap between the number and the first line of running +text with HEADER_GAP. +

+


+ + + + +

Header/footer separator rule

+
+ +

+The header/footer separator rule is a modest horizontal rule, +set slightly below the header (or above the footer), that runs +the length of the +header +and helps separate it visually from +running text. If +you don't want the rule, you can turn it off. If you want it, +but at a different vertical position relative to the header (or +footer), you can alter its placement. +

+

+ + + +
+

+ +Macro: HEADER_RULE toggle + +

+By default, mom prints a header separator rule +underneath headers (or above footers). If you don't want the +rule, turn it off by invoking HEADER_RULE with any +argument (OFF, QUIT, END, X...), e.g. +

+

+	.HEADER_RULE OFF
+
+ +To turn the rule (back) on, invoke HEADER_RULE +without any argument. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to enable/disable the printing of +the footer separator rule. (Most likely, if you're using +FOOTERS, you'll want it off.) +

+ + + +


+

+ +Macro: HEADER_RULE_GAP distance of rule beneath header +
+*Requires a unit of measure + +

+HEADER_RULE_GAP is the distance from the +baseline +of type in headers to the rule underneath. A unit of measure is +required, and decimal fractions are allowed. Please note that +HEADER_RULE_GAP has no effect on +HEADER_GAP +(i.e. HEADER_RULE_GAP is NOT added to +HEADER_GAP when mom calculates +the space between headers and the start of +running text). +

+By default, the header rule gap is 4 +points. +If you'd like to change it to, say, 1/4 +em, do +

+

+	.HEADER_RULE_GAP .25m
+
+ +NOTE: Replace HEADER_, above, +with FOOTER_ if you're using +footers +and want to change the separator rule gap. In footers, the gap +is measured from the top of the tallest +ascender +in the footer. +

+ADDITIONAL NOTE: When using +FOOTER_RECTO +and +FOOTER_VERSO, +make sure that the default size for footers +(FOOTER_SIZE) +is set to the largest size of type that will be used in the +footer or mom may not get the rule gap right. +Inline changes to the size of type in +FOOTER_RECTO and FOOTER_VERSO +should always be negative (smaller) than the default. +

+ + + +


+

+ +Macro: HEADER_RULE_COLOR <colorname> + +

+If you wish to change the colour of the header rule, invoke +HEADER_RULE_COLOR with the name of a colour +pre-defined (or "initialized") with +NEWCOLOR +or +XCOLOR. +

+Please note that HEADER_RULE_COLOR overrides the +colour set with +HDRFTR_COLOR, +so that it's possible to have the heads entirely in, say, blue (set +with HEADER_COLOR), and the header rule in, say, +red. +

+NOTE: Replace HEADER_, above, +with FOOTER_ to change the colour of the footer +rule. +

+


+ + +

Pagination

+
+ +

+By default, mom paginates documents. Page numbers +appear in the bottom margin of the page, centred between two hyphens. +As with all elements of mom's document processing, +most aspects of pagination style can be altered to suit your taste +with control macros. +

+ + +

Pagination macros list

+ + + +

+ + + +


+

+ +Macro: PAGINATE toggle +
+Alias: PAGINATION + +

+By default, mom paginates documents (in the bottom +margin). If you'd prefer she not paginate, turn pagination off +by invoking PAGINATE with any argument (OFF, +NO, QUIT, END, X...), e.g. +

+

+	.PAGINATE NO 
+
+ +To (re)start pagination, invoke PAGINATE +without any argument. +

+ + + +


+

+ +Macro: PAGENUMBER <number> + +

+As is to be expected, pagination of documents begins at page 1. +If you'd prefer that mom begin with a different +number on the first page of a document, invoke +PAGENUMBER with the number you want. +

+PAGENUMBER need not be used only to give +mom a "first page" number. It can be used at +any time to tell mom what number you want a +page to have. Subsequent page numbers will, of course, be +incremented by 1 from that number. +

+ + + +


+

+ +Macro: PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha + +

+PAGENUM_STYLE lets you tell +mom what kind of page numbering you want. +

+ + +
DIGIT=Arabic digits (1, 2, 3...) +
ROMAN=upper case roman numerals (I, II, III...) +
roman=lower case roman numerals (i, ii, iii...) +
ALPHA=upper case letters (A, B, C...) +
alpha=lower case letters (a, b, c...)
+

+ + + +


+

+ +Macro: PAGENUM_ON_FIRST_PAGE toggle + +

+This macro applies only if you've enabled +FOOTERS. +If FOOTERS are on, mom automatically +places page numbers at the tops of pages except on +the first page of a document (or on first pages after +COLLATE). If you'd +like the page number to appear on "first" pages when +footers are on, invoke PAGENUM_ON_FIRST_PAGE with +no argument. Any other argument turns the feature off (OFF, +QUIT, END, X...). +

+As with most of the control macros, +PAGENUM_ON_FIRST_PAGE can be invoked at any time, +meaning that if you don't want a page number on the very first +page of a document, but do want one on pages that appear after +COLLATE, omit it before the first +START +of the document, then invoke it either just before or after your +first COLLATE. +

+ + + +


+

+ +Macro: DRAFT_WITH_PAGENUMBER + +

+Sometimes, in +COPYSTYLE DRAFT, +the CENTER part of page headers gets overcrowded because of the draft +and revision information that go there by default. +DRAFT_WITH_PAGENUMBER is one way to +fix the problem. +

+Invoked without an argument, DRAFT_WITH_PAGENUMBER +removes draft/revision information from the page headers and attaches +it instead to the document's page numbering, in the form +

+

+    Draft #, Rev. # / <pagenumber>
+
+ +See the note in +COPYSTYLE DRAFT +for other ways of dealing with crowded page headers when formatting +draft-style copy. +

+


+ + + +

Pagination control macros

+ +
    +
  1. Family/font/size/colour +
  2. Page number position (vertical and horizontal) +
  3. Enclose page numbers with hyphens (on or off) +
+
+

1. Page number family/font/size/colour

+

+See +Arguments to the control macros. +

+

+.PAGENUM_FAMILY default = prevailing document family; default is Times Roman
+.PAGENUM_FONT   default = roman
+.PAGENUM_SIZE   default = 0 (i.e. same size as paragraph text)
+.PAGENUM_COLOR  default= black
+
+ +

2. Page number position

+

+Macro: PAGENUM_POS TOP | BOTTOM  LEFT | CENTER | RIGHT + +

+Use PAGENUM_POS to change the default position of +automatic page numbering. PAGENUM_POS requires +two arguments: a vertical position (TOP or BOTTOM) and a +horizontal position (LEFT or CENTER or RIGHT). +

+For example, if you turn both +headers +and +footers +off (with .HEADERS OFF and .FOOTERS +OFF) and you want mom to number your +pages at the top right position, enter +

+

+	.PAGENUM_POS TOP RIGHT
+
+ +

3. Enclose page numbers with hyphens (on or off)

+

+By default, mom encloses page numbers between hyphens. +If you don't want this behaviour, invoke the macro +PAGENUM_HYPHENS with any argument (OFF, QUIT, END, X...), +like this: +

+

+	.PAGENUM_HYPHENS OFF
+
+ +If, for some reason, you want to turn page number hyphens back +on, invoke the macro without an argument. +

+ +


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/inlines.html b/contrib/mom/momdoc/inlines.html new file mode 100644 index 0000000..c6d4b03 --- /dev/null +++ b/contrib/mom/momdoc/inlines.html @@ -0,0 +1,802 @@ + + + + +Mom -- Inline escapes + + + + + +Next   +Prev   +Back to Table of Contents + + +

+ Inline escapes +

+

+Introduction to inline escapes +
+Index of inline escapes +

+ + +

Introduction to inline escapes

+ + + +Inline escapes, as described in the +groff terms +section of this manual, are typesetting commands that appear in +text +input lines, +as opposed to macros and other +control lines +that must appear on lines by themselves. +

+Aside from altering type parameters within a line, inlines also +tell groff about special characters -- em-dashes, bullets, +figure/digit-width spaces, +and so on. It is beyond the scope of this manual to provide a +complete list of groff's inline functions and special characters. +I recommend having a look at the +canonical reference materials +should you need more information than is contained herein. +

+In groff, the escape character is the backslash ( \ ). Groff interprets +everything following the backslash as instructions, not literal text, +until the escape sequence is complete. Should you need the actual +backslash character as part of a line of text, simply enter it twice +( \\ ). Groff understands that this means "please print a backslash +character." (You can also use \e to print a literal +backslash.) +

+Groff has a number of ways of recognizing what constitutes a complete +escape sequence. This is both a boon and a curse; some escape +sequences have no terminating delimiter and consequently become +difficult to distinguish from real input text. Others require +the use of an opening parenthesis with no corresponding closing +parenthesis. Still others need to be enclosed in square brackets. +

+Mom recognizes that certain escapes get used more +often than others. For these, she has a consistent input style that +takes the form \*[...], which makes them stand out well from the text +of your documents. These escapes are the ones listed under +Mom's personal inlines. +

+Despite mom's best intentions, there are still +a number of typesetting functions that can only be accomplished +with groff's native inline escapes. I've listed the ones that +strike me as essential, but there are many others. If you want +to know what they are, please read the +canonical reference materials +pertaining to groff. +

+HELPFUL BIT OF INFORMATION: Inline escapes can be used +in +document processing macros +that take +string arguments. +

+

Inlines index

+ +

+


+ + + +

Mom's personal inlines

+ +

Changing fonts

+ +

+Mom provides five escapes for changing fonts +inline: +

+ + + + + + + + + + + + + + + + + + + + + +
\*[ROM]Change font to medium roman
\*[IT]Change font to medium italic
\*[BD]Change font to bold roman
\*[BDI]Change font to bold italic
\*[PREV]Revert to previous font
+

+These escapes are provided for merely for convenience, legibility, +and consistency when typesetting with mom. For +more complete and flexible inline font control, please see +font control with \f. + +

+NOTE: If you're using the +document processing macros, +inline font changes remain in effect only for the duration of the +current document element tag. +

+ + + +


+

Changing point size

+ +

+Mom has two inline escapes for changing point +size: +

+

+	\*[SIZE <size>]
+
+ +and +

+

+	\*[S<size>]
+
+ +where "size" is the new size you want. You can use +either; they behave exactly the same way. For example, to change +the point size of type inline to 12 points, you could enter either +

+

+	\*[SIZE 12]
+
+ +or +

+

+	\*S[12]
+
+ +The advantage of the first form is that it's easy to remember, and +follows mom's usual inline syntax. The advantage +of the second is that it's more concise. +

+Notice that in both cases, the new size does not require a +unit of measure; +points +is assumed. However, a unit of measure may be appended to the size +if that's what you wish. Fractional sizes are, of course, allowed. +

+The size given to \*[SIZE <size>] or +\*S[<size>] may be expressed in plus or minus +terms, which can be very useful. In the following examples, the word +"mom" will be output 2 points larger than the point size +of the rest of the line. +

+

+	While she isn't perfect, \*S[+2]mom\*S[-2] isn't half bad.
+	While she isn't perfect, \*[SIZE +2]mom\*[SIZE -2] isn't half bad.
+
+ +NOTE: If you're accustomed to groff's usual way +of handling inline size requests (\sN, \s±N, \s(NN, \s±(NN, +\s[NNN], \s±[NNN]), feel free to continue with your old habits. +Mom doesn't care. +

+ + + +


+

Pairwise kerning

+ +

+Pairwise kerning means moving specific letter pairs closer +together or further apart (see +Typesetting terms, kerning +for more details). +

+Mom permits inline pairwise +kerning through the use of the inline escapes + + + + + + + + + +
\*[BU n]
Closes the space between letters (Back Units).
\*[FU n]
Opens the space between letters (Forward Units).
+
+"n" is the number of +kern units +by which to close or open the space between letters. +

+For example, +

+

+	THE HUMAN COST OF COMMODIF\*[FU 1]YING FRESH W\*[BU 4]A\*[BU 5]TER
+
+ +moves the letter Y in "COMMODIFYING" 1 kern unit away from +the letter F, and the letter A in "WATER" 4 kern units closer +to the letter W. Additionally, the letter T in "WATER" is moved 5 kern +units closer to the letter A. +

+For backward compatibility, the forms + + + + + + + + + +
\*[BU1]...\*[BU36]
Move back 1...36 kern units
\*[FU1]...\*[FU36]
Move forward 1...36 kern units
+
+also exist (i.e. with no space before the number of kern units desired, +up to a limit of 36). +

+NOTE: Using BU or FU +between characters pairs that are already automatically kerned +disables the automatic kerning and uses the value you give to +BU or FU instead. +

+ + + +


+

Horizontal inline movement

+ +

+Sometimes, you may need to insert a specified amount amount of white +space into an +output line, +or -- occasionally -- back up to a +previous position on an +output +line in order to create special typographic effects. +

+Mom's inline escapes for these horizontal movements are +

+ + + + + + + + + + + +
\*[FWD n<unit>]
Move forward inline the specified number of + units of measure; + decimal fractions are allowed.
\*[BCK n<unit>]
Move backward inline the specified number of + units of measure; + decimal fractions are allowed.
+

+For example, +

+

+	1.\*[FWD 12p]The Free Trade Play-Offs: WalMart 100, Mexico 0
+
+puts 12 points of space between "1." and +"The". +

+NOTE: For backward compatibility, the forms +

+ + + + + + + + + +
\*[BP.25]...\*[BP12.75]
Move back .25...12.75 points
\*[FP.25]...\*[FP12.75]
Move forward .25...12.75 points
+
+also exist (i.e. with no space before the digit and points being +the unit of measure, hence no unit of measure required). Both +accept quarter points, so it's possible to do, for example, +\*[FP.5] or \*[BP1.25] up to a limit +of 12.75 points. +

+ + + +


+

Vertical inline movement

+ +

+If you need to move portions of type up or down on a line, +mom provides the following inline escapes: +

+ + + + + + + + + + + +
\*[UP n<unit>]
Move up inline the specified number of + units of measure
\*[DOWN n<unit>]
Move down inline the specified number of + units of measure
+
+For example, +

+

+	Tel: 905\*[UP 1p]-\*[DOWN 1p]4072
+
+ +moves the hyphen in the telephone number up by 1 point, then +moves back down by the same amount. +

+NOTE: \*[UP] and \*[DOWN] do not +work with the inline escape, +\*[RULE]. +See +here +for details. +

+ADDITIONAL NOTE: For backward compatibility, the +following are also available: +

+ + + + + + + +
\*[ALD.25]...\*[ALD12.75]
+
Advance lead .25...12.75 points (move downward) +
\*[RLD.25]...\*[RLD12.75]
Reverse lead .5...12.75 points (move upward)
+

+

+Both \*[ALD] and \*[RLD] work in +points, hence you mustn't use a unit of measure. +

+ + + +


+

Terminate a line without advancing on the page

+ +

+Sometimes, you want mom to break a line but not +advance on the page. See +here +for an example of when you might want to do this. +

+In versions of mom prior to 1.2-f, this was +accomplished through the use of +EL. +As of 1.2-f, you can, if you prefer, accomplish the same thing +by using the inline escape, \*[B]. Simply +attach the escape to the end of any line. Using the example +given in the document entry for EL, you'd use +\*[B] like this: + +

+

+	.LEFT
+	.LS 12.5
+	A line of text.\*[B]
+	.ALD 24p
+	The next line of text.
+
+ +\*[B] works reliably regardless of the current +fill mode. +

+ + + +


+

Call the next sequential tab without advancing on the page

+ +

+Sometimes, you want mom to move to the next tab in +sequence (e.g. from TAB 1 to TAB 2, or TAB 8 to TAB 9) without +mom advancing on the page. (See the example in +here +if you're not clear how mom manages tabs and +linebreaks.) +

+In versions of mom prior to 1.2-f, this was +accomplished through the use of +TN. +As of 1.2-f, you can, if you prefer, accomplish the same thing +by using the inline escape, \*[TB+]. Simply +attach the escape to the end of any line in a tab, like this: + +

+

+	.TAB 1
+	Some text\*[TB+]    \" This line is in tab 1
+	Some more text      \" This line is in tab 2, on the same baseline as tab 1
+
+ +\*[TB+] works reliably regardless of the current +fill mode. +

+ + + +


+

Full measure rules

+ +

+I find I often need rules drawn to the full measure of the current line +or tab length. The official way to do this is \l'\n(.lu', +which is annoying to type, and doesn't mean a whole heck of a lot if +you're new to groff. The inline, \*[RULE], is a simple +replacement for \l'\n(.lu'. Use it whenever you need +a rule drawn to the full measure of the current line or tab length, for +example: +

+

+	.LL 6P
+	\*[RULE]
+
+ +The above draws a rule the full measure of the 6-pica line length. +

+\*[RULE] should appear on a line by itself. In +fill modes, +(i.e. +QUAD +or +JUSTIFY), +it requires a +.BR +on the line immediately before it; otherwise, the rule will be drawn +on the same baseline occupied by any type preceding it. In +nofill modes +(i.e +LEFT, +RIGHT +or +CENTER), +the .BR is not required. +

+Please note that \*[RULE] draws the rule to the +full measure, hence it cannot be used to fill the remainder +of a partial line with a rule in this way: +

+

+	Signature__________________________________________
+
+ +If you wish to accomplish this effect, you have to use +\*[RULE] in conjunction with the +PAD +macro and +string tabs. +(See the +example +provided with PAD.) + +

+Please also note that the inline escapes +\*[UP] +and +\*[DOWN] +cannot be used in conjunction with \*[RULE]. This +doesn't work: +

+

+	\*[DOWN 2p]\*[RULE]\*[UP 2p]
+
+ +This does: +

+

+	.ALD 2p
+	\*[RULE]
+	.RLD 2p
+
+ +See groff's +Horizontal line drawing function +for more information on drawing horizontal rules. +

+


+ + + +

Groff inline escapes

+ +

Font control with \f

+ +

+Groff's basic mechanism for inline font control is the escape +\f[<font>]. +

+ + + + + + + + + + + + + + + + + + + + + +
\f[R]Change font to medium roman (equivalent to mom's \*[ROM])
\f[I]Change font to medium italic (equivalent to mom's \*[IT])
\f[B]Change font to bold roman (equivalent to mom's \*[BD])
\f[BI]Change font to bold italic (equivalent to mom's \*[BDI])
\f[P]Revert to previous font (equivalent to mom's \*[PREV])
+

+\f[<font>] can be used with +any legal font style registered with groff. (See +here +for a list of pre-registered font styles provided by +mom). +

+\f[<font>] can also take a +complete legal family+font name combo. This is especially useful +should you need to change both family and font inline. For example, +if your prevailing family and font are Times Roman and you want a +few words in Courier Bold Italic, you could do this: +

+

+	.FAM T
+	.FT  R
+	The command \f[CBI]ls -l\f[P] gives a "long" directory listing.
+
+ +The Unix command "ls -l" will appear in Courier Bold Italic +in a line that is otherwise in Times Roman. +

+ + + +


+

Inline horizontal motions with \h

+ +

+Whenever you need to move forward or backward on a line, use the inline +\h'<distance>'. In order to avoid unpleasant surprises, +always append a +unit of measure +to "distance". +

+

+	\h'1.25i'
+
+ +moves you 1.25 inches to the right (forwards) of the horizontal +position on the current +output line. +\h'<distance>' is exactly equivalent to +\*[FWD n<unit>]. +

+

+	\h'-1.25i'
+
+ +moves you 1.25 inches to the left (backwards). +\h'-<distance>' is exactly equivalent to +\*[BCK n<unit>]. +

+ + + +


+

Inline vertical motions with \v

+ +

+If you need to raise or lower type on a line (say, for sub- or +superscripts, or any other special effect), use +\v'<distance>'. In order to avoid unpleasant +surprises, always append a +unit of measure +to "distance". +

+

+	\v'.6m'
+
+ +moves you (approx.) 2/3 of an +em +downward on the current +output line. +\v'<distance>' is exactly equivalent to +\*[DOWN n<unit>]. +

+

+	\v'-.6m'
+
+ +moves you (approx.) 2/3 of an em upward. +\v'<-distance>' is exactly equivalent to \*[UP n<unit>]. +

+IMPORTANT: The vertical motion of \v +affects ONLY type on the current +output line. +When groff breaks the output line, the effect of +\v is cancelled; the baseline of the next output line +is where it would be if you hadn't used \v. +

+TIP: When using \v for +occasional effects on a line, don't forget to reverse it when +you've done what you want to do. Otherwise, the remaining type +will be set too high (if you used \v with the +minus sign) or too low (if you used \v without +the minus sign). +

+ + + +


+

String width function \w

+ +

+In the context of mom, the string width inline +\w'string' primarily serves to let you +establish the horizontal measure of something (e.g. indents) based +on the length of a bit of text. For example, if you want a left +indent the length of the word "Examples:" plus a +space, you can set it with the \w inline escape: +

+

+	.IL "\w'Examples: '"
+
+ +NOTE: Whenever you pass \w'string' +to a macro that normally requires a +unit of measure, +do NOT add a unit of measure to the \w'string' +argument. +

+Furthermore, if the string is composed of several words separated +by spaces, you MUST surround the whole escape with double quotes, +as in the example above. +

+ + + +


+

Horizontal line drawing function \l

+ +

+The \l'distance' inline allows you to draw a +horizontal rule of the specified distance. You must supply a +unit of measure. +Therefore, to set a 3-pica rule into a line of text, you'd do +

+

+	A line of text with a superfluous \l'3P' 3-pica rule in it.
+
+ +\l'3P' above not only draws the rule, but +advances 3 picas horizontally as well, just as you'd expect. +

+For an easy way of drawing rules to the full measure of the current +line or tab length, see +Full measure rules. +

+The weight (thickness) of rules varies according to the point size +in effect when you invoke \l, but you can't fix +the weight with any real precision. A point size of 12 produces +a tastefully moderate rule weight of between one-half and one +point (depending on your printer), and is the point size used by +mom for all macros and routines that create rules. +

+NOTE: There are, in addition to \l, +a number of other line-drawing escapes, but frankly, using them for +typographically precise drawing is a bit like hammering in a nail +with a screwdriver -- doable, but not recommended. +

+Groff comes with a number of "preprocessors" designed +to ease creating rules, boxes, splines, and so on (tbl, pic, +and friends), but I tend not to use them. A firm believer +in the "right tool for the job," I prefer a vector +drawing program when I need to combine type with graphic elements +(say, a complex ruled form). Inserting the results into a +document is easy enough with .PSPIC (consult +the groff_tmac man page for information on this +indispensable and easy-to-use macro). +

+ + + +


+

Special characters and symbols

+ +

+Here follows a short list of commonly-used special characters available +via inline escapes. If you're not sure of the meaning of some of +these characters, consult the +Definitions of Terms. +

+For a complete list of special characters and glyphs (i.e. just +about anything you'd ever want to appear on the printed page, +including mathematical symbols, accented characters, unusual +ligatures and letters unique to various European languages), consult +man groff_char. +

+

+    CHARACTER                   ESCAPE SEQUENCE
+    ---------                   ---------------
+
+    Comment line                \#
+    Fixed-width space           \<space>  i.e. backslash followed by a space
+    Unbreakable space           \~
+    Digit-width (figure) space  \0
+    Zero-width character        \&
+    Discretionary hyphen        \%
+    Backslash                   \\ or \e
+    Plus/minus (arithmetic)     \(+-
+    Subtract (arithmetic)       \(mi
+    Multiply (arithmetic)       \(mu
+    Divide (arithmetic)         \(di
+    Em-dash                     \(em
+    En-dash                     \(en
+    Left double-quote           \(lq
+    Right double-quote          \(rq
+    Bullet                      \(bu
+    Ballot box                  \(sq
+    One-quarter                 \(14
+    One-half                    \(12
+    Three-quarters              \(34
+    Degree sign                 \(de
+    Dagger                      \(dg
+    Foot mark                   \(fm
+    Cent sign                   \(ct
+    Registered trademark        \(rg
+    Copyright                   \(co
+    Section symbol              \(se
+
+ +
+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/intro.html b/contrib/mom/momdoc/intro.html new file mode 100644 index 0000000..4c6e3eb --- /dev/null +++ b/contrib/mom/momdoc/intro.html @@ -0,0 +1,405 @@ + + + + +What is mom? + + + + + +Next   +Back to Table of Contents + + + +

WHAT IS MOM?

+
+ +Who is mom meant for? +
+Typesetting with mom +
+Document processing with mom +
+Mom's philosophy +
+A note on mom's documentation +
+Canonical reference materials +
+How to read macro arguments + +

Who is mom meant for?

+ +Mom ("my own macros", "my other +macros", "maximum overdrive macros"...) is a macro set for +groff, designed to format documents for PostScript output. +She's aimed at three kinds of users: +
+
    +
  1. typesetters who suspect groff might be "the right + tool for the job" but who are + frustrated/intimidated by groff's terse, geeky, + not-always-typographically-intuitive + primitives; +
    +
  2. non-scientific writers (novelists, short story writers, + journalists, students) who just want their work to + look good; +
    +
  3. newbies to computer typesetting, document processing, or + groff who need a well-documented macro set to help them get + started. +
+

+As might be inferred from the above, mom is two macro +packages in one: a set of typesetting macros, and a set of document +processing macros. The typesetting macros govern the physical +aspects of page layout and provide sane, comprehensible control over +typographic refinements. The document processing macros let you focus +on a document's content and logical structure without worrying about +typesetting or page layout at all. +

+Because mom provides both typesetting and document +processing macros, it's safe to say she blurs the distinction between +document processing and document design. While her basic document style +comes with pretty spiffy defaults (okay--change "spiffy" +to "typographically professional"), you can easily control +how all the various document elements look: titles, page headers and +footers, page numbering, heads, subheads, footnotes and so on can be +made to come out exactly the way you want. And should you need precise +typographic control over elements in a document that fall outside the +range of mom's document element tags, you don't have to +read up on groff +primitives +in order to accomplish what you want; the typesetting macros take +care of that. +

+ + +

Typesetting with mom

+ + +Mom's typesetting macros control the basic parameters +of type: margins, line length, type family, font, point size, +linespacing, and so on. In addition, they allow you to move around +on the page horizontally and vertically, and to set up tabs, indents, +and columns. Finally, they let you adjust such typographic details as +justification style, letter spacing, word spacing, hyphenation, and +kerning. + +

+In terms of typographic control, these macros resemble the +commands used on dedicated typesetting computers like Compugraphics and +Linotronics. Most of them simply give access to groff's typesetting +primitives in a way that's consistent and easy to use. A few of +them (tabs and indents, for example) handle fundamental typesetting +requirements in ways radically different from groff primitives. + +

+With mom's typesetting macros, you can, if you wish, +create individual output pages that you design from the ground up. +Provided you have not signalled to mom that you +want document processing (via the +START +macro; see below), every macro is a literal command that remains in +effect until you modify it or turn it off. This means that if you +want to create flyers, surveys, tabulated forms, curricula vitae and +so on, you may do so in the good old-fashioned way: one step at a +time with complete control over every element on the page. +

+Years of reading various mailing lists dealing with computer +typesetting (groff, TeX, and friends) have convinced me that no program +can ever replace the human eye and human input when it comes to high +quality typesetting. As of this writing, a thread on the subject of +"micro typography" in groff has been going on for nearly a +month. The reason for the lengthy thread is obvious; words and +punctuation on the printed page are too variable, too fluid, to be +rendered flawlessly by any algorithm, no matter how clever. (For +whatever it's worth, a similar problem exists with engraving musical +scores by computer.) +

+Mom does not try to solve the problems posed +by things like hanging punctuation, left-margin adjustments for +upper case letters like T and W, and so on. She merely tries to +provide tools that allow knowledgeable typesetters to come up with +solutions to these problems in ways that are easier and more +intuitive than manipulating groff at the +primitive +level. As a professional typesetter of more than two decades, and a +writer, I have encountered few situations that cannot be handled by +mom's typesetting macros. +

+Author's note: One area where groff itself needs +serious rethinking is in the matter of an algorithm that takes into +account both word and letter spacing when +justifying +lines. At present, only word spacing is adjusted, requiring what I +consider an unnecessary amount of user intervention whenever +letter spacing is required. +

+ +

Document processing with mom

+ + +Mom's document processing macros let you format +documents without having to worry about the typographic details. +In this respect, mom is similar to other groff macro +packages, as well as to html and LaTeX. Where mom +differs is in the degree of control you have over the look and +placement of the various elements of a document. For example, if you +don't want your heads underlined, or you want them bigger/smaller, +or you'd prefer them to be in a different font, or you'd rather they +were flush left instead of centred, you can make the changes easily +and have them apply to the whole document. Temporary and one-off +changes are easy, too. +

+Mom has some nifty features other macro sets +don't provide. For example, you can switch between draft-style and +final-copy output. If you regularly make submissions to publishers +and editors who insist on "typewritten, double-spaced," there's a +special macro-- +PRINTSTYLE TYPEWRITE +--that changes typeset documents into ones that would make your +high-school typing teacher proud. Footnotes, endnotes, tables of +contents, multiple columns, nested lists, recto/verso printing and +user designable headers and footers are also part of the fun. +

+ +

Mom's philosophy

+ + +Formatting documents should be easy, from soup to nuts. Writers need +to focus on what they're writing, not on how it looks. From the +moment you fire up an editor to the moment you add "FINIS" +to your opus, nothing should interfere with the flow of your words. +The commands needed to format your work should be easy to remember, +comprehensible, and stand out well from the text. There shouldn't +be too much clutter. Your documents should be as readable inside a +text editor as they are on the printed page. +

+Unfortunately, in computerland, "easy," +"comprehensible," and "readable" often mean +"you're stuck with what you get." No document formatting +system can give you exactly what you want all the time, every time. +Documents, it seems, always need to be tweaked, either to satisfy a +typographic whim or to clarify some aspect of their content. +

+Groff has traditionally solved the problem of formatting vs. tweaking +by requiring users of the common macro packages (mm, ms, me and their +offspring) to resort to groff +primitives +and +inline escapes +for their special typesetting needs. Not to put too fine a point on +it, groff primitives tend toward the abstruse, and most inline escapes +are about as readable in-line as an encrypted password. This does +not make for happy-camper writers, who either find themselves stuck +with a document formatting style they don't really like, or are +forced to learn groff from the ground up--a daunting task, to say +the least. +

+Mom aims to make creating documents a simple matter, +but with no corresponding loss of user control. The document +processing macros provide an excellent set of defaults, but if +something is not to your liking, you can change it. And in combination +with the typesetting macros, you have all the tools you need to +massage passages and tweak pages until they look utterly professional. +

+One rarely hears the word "user interface" in conjunction +with document processing. Since the user formatting takes place +inside a text editor, little thought is given to the look and feel +of the formatting commands. Mom attempts to rectify +this by providing users with a consistent, readable "coding" +style. Most of the macros (especially in the document processing set) +have humanly-readable names. Not only does this speed up learning +the macros, it makes the sense of what's going on in a document, +typographically and structurally, easier to decipher. +

+Mom does not try to be all things to all people. +In contrast to the normal groff philosophy, she does not try to +produce output that looks good no matter where it's displayed. +She's designed for printed output, although with +PRINTSTYLE TYPEWRITE +she produces acceptable terminal copy. She makes no attempt to be +compatible with older versions of troff. +

+One special feature in mom's design is the attention +she pays to aligning the bottom margins of every page. Nothing screams +"shoddy" in typeset documents louder than bottom margins +that wander, or, in typesetter jargon, "hang." There are, +of course, situations where whitespace at the bottom of a page may +be desirable (for example, you wouldn't want a head to appear at the +bottom of the page without some text underneath it), but in all cases +where hanging bottom margins can be avoided, mom does +avoid them, by clever adjustments to leading ("line spacing") +and the spacing between different elements on the page. +

+ +

A note on mom's documentation

+ + +Writing documentation is tough, no doubt about it. One is never +quite sure of the user's level of expertise. Is s/he new to the +application, new to its underlying protocols and programs, new to +the operating system, new to computers? At some point, one has to +decide who the documentation is for. Making the wrong decision can +mean the difference between a program that gets used and a program +that gets tossed. +

+Mom's documentation assumes users know their way +around GNU/Linux. It further assumes they at least know what groff +is, even if they don't know much about it. Lastly, it assumes that +everyone--groff newbies and experts alike--learns faster from +a few well-placed examples than from manpage-style reference docs. +What mom's documentation doesn't assume is that +you know everything--not about groff, not about typesetting, +not about document processing. Even experts have odd lacunae in +their knowledge base. Therefore, whenever I suspect that a term +or procedure will cause head scratching, I offer an explanation. +And when explanations aren't enough, I offer examples. +
+ +

Canonical reference materials

+

+The canonical reference materials for groff are +cstr54 (a downloadable PostScript copy of which is +available +here) +and the troff and groff_diff +manpages. Another excellent source of information (maybe the best) +is the groff info pages, available by typing +

+

+	info groff
+
+ +at the command line (assuming you have info +installed on your system). And for inputting special characters, +see man groff_char. +

+I've tried to avoid reiterating the information contained in these +documents; however, in a few places, this has proved impossible. +But be forewarned: I have no qualms about sidestepping excruciating +completeness concerning groff usage; I'm more interested in getting +mom users up and running. Mea culpa. +

+Note: Mom's macro file +(om.tmac) is heavily commented. Each macro is preceded by a +description of its arguments, function and usage, which may +give you information in addition to what's contained in this +documentation. +

+ +

How to read macro arguments

+ + +The concise descriptions of macros in this documentation typically +look like this: +
+Macro: NAME arguments +
+arguments lists the macro's arguments using conventions that +should be familiar to anyone who has ever read a manpage. Briefly: +

+

    +
  1. Macro arguments are separated from each other by spaces. +
  2. If an argument is surrounded by chevrons + ( < > ), it's a description of the argument, + not the argument itself. +
  3. If an argument begins with or is surrounded by double-quotes, the + double quotes MUST be included in the argument. +
  4. If the user has a choice between several arguments, each of the + choices is separated by the pipe character ( | ), + which means "or." +
  5. Arguments that are optional are surrounded by square brackets. +
  6. <off> in an argument list means that any argument + other than those in the argument list turns the macro off. +
+ +

Toggle macros

+

+Some macros don't require an argument. They simply start something. +When you need to turn them off, the same macro with any +argument will do the trick. That's right: ANY argument. This permits +choosing whatever works for you: OFF, END, QUIT, DONE, Q, X... Hell, +it could even be I_LOVE_MOM. +

+Since these macros toggle things on and off, the argument list +simply reads +

+toggle +
+
+
+ +

Example 1: an argument requiring double-quotes

+
+Macro: TITLE "<title of document>" +
+

+The required argument to TITLE is the title of your +document. Since it's surrounded by double-quotes, you must +include them in the argument, like this: +

+

+	.TITLE "My Pulitzer Novel"
+
+ +

Example 2: a macro with required and optional arguments

+
+Macro: TAB_SET <tab #> <indent> <length> [ L | R | C | J [ QUAD ] ] +
+

+The first required argument is a number that identifies the tab (say, +"3"). The second required argument is an indent from the left margin +(say, 6 picas). The third required argument is the length of the tab +(say, 3 picas). Therefore, at a minimum, when using this macro, +you would enter: +

+

+	.TAB_SET 3 6P 3P
+
+ +The remaining two arguments are optional. The first is a single +letter, either L, R, C or J. The second, which is itself optional +after L, R, C or J, is the word QUAD. Therefore, depending on +what additional information you wish to pass to the macro, +you could enter: +

+

+	.TAB_SET 3 6P 3P L
+		or
+	.TAB_SET 3 6P 3P L QUAD
+
+ + +

Example 3: a sample toggle macro:

+
+Macro: QUOTE toggle +
+

+QUOTE begins a section of quoted text in a document +and doesn't require an argument. When the quote's finished, +you have to tell mom it's done. +

+

+	.QUOTE
+	So runs my dream, but what am I?
+	An infant crying in the night
+	An infant crying for the light
+	And with no language but a cry.
+	.QUOTE OFF
+
+ +Alternatively, you could have turned the quote off with END, or +X, or something else. + +

+


+Next   +Top   +Table of Contents + + diff --git a/contrib/mom/momdoc/letters.html b/contrib/mom/momdoc/letters.html new file mode 100644 index 0000000..fe67583 --- /dev/null +++ b/contrib/mom/momdoc/letters.html @@ -0,0 +1,463 @@ + + + + +Mom -- Document Processing, Writing Letters + + + + + +Next   +Prev   +Back to Table of Contents +

+ + + +

WRITING LETTERS WITH MOM

+ + + +

Introduction

+
+ +Mom's simple but effective letter-writing +macros are a subset of the +document processing macros, +designed to ease the creation of correspondence. +

+Because the letter macros are a subset of the document +processing macros, you can use +control macros +to design correspondence to your own specifications. However, +mom makes no pretence of providing complete design +flexibility in the matter of letters, which are, after all, simple +communicative documents whose only real style requirements are that +they be neat and professional-looking. +

+

Tutorial on writing letters

+

+Mom letters begin, like all +mom-processed documents, with a +reference macro +(in this case, +AUTHOR), +a +DOCTYPE +(LETTER, obviously), the essential +PRINTSTYLE +macro, and +START, +like this: +

+

+	.AUTHOR    "Yannick P. Guique"
+	.DOCTYPE    LETTER
+	.PRINTSTYLE TYPESET
+	.START
+
+ +PRINTSTYLE, above, could also be +TYPEWRITE. Mom has no objection +to creating letters that look like they were typed on an Underwood +by a shapely secretary with 1940s gams. +

+After the START macro, you enter headers pertinent to +your letter: the date, the addressee (in business correspondence, +typically both name and address), the addresser (that's you; in +business correspondence, typically both name and address), and a +greeting (in full, e.g. "Dear Mr. Smith," or "Dear +Mr. Smith:"). +

+The macros for entering the headers are simple (they're not even +toggles): +

+

+	.DATE
+	.TO
+	.FROM
+	.GREETING
+
+ +You may enter them in any order you like, except for +GREETING, which must come last. +Mom ignores any headers you omit and spaces the +letter's opening according to what you do include. See +Default for letters +to find out how mom formats the headers. +

+(In pre 1.1.7-a releases of mom, the order +of entry was fixed at the above. This has been changed, although +if you do follow the above order, mom will +continue to behave exactly as she did in pre 1.1.7-a.) +

+Once you've filled in what you need to get a letter started, simply +type the letter, introducing each and every paragraph, including +the first, with the +PP +macro. +

+At the end of the letter, should you wish an indented closing +("Yours truly," "Sincerely," "Hugs and +kisses"), invoke the macro CLOSING on a +line by itself and follow it with the text of the closing. +N.B. Don't put your name here; mom +supplies it automatically from AUTHOR with +enough space to leave room for your signature. + +

+Assuming our tutorial letter is for business correspondence, +here's what the complete letter looks like. +

+

+	.AUTHOR    "Yannick P. Guique"
+	.DOCTYPE    LETTER
+	.PRINTSTYLE TYPESET
+	.START
+	.DATE
+	August 25, 2004
+	.TO
+	GUILLAUME BARRIÈRES
+	Minidoux Corporation
+	5000 Pannes Drive
+	Redmond, Virginia
+	.FROM
+	Y.P. GUIQUE
+	022 Umask Road
+	St-Sauveur-en-dehors-de-la-mappe, Québec
+	.GREETING
+	Dear Mr. Barrières,
+	.PP
+	It has come to my attention that you have been lobbying the
+	US government to prohibit the use of open source software by
+	endeavouring to outlaw so-called "warranty free"
+	applications.
+	.PP
+	I feel it is my duty to inform you that the success of your
+	operating system with its embedded web browser relies heavily
+	on open source programs and protocols, most notably TCP/IP.
+	.PP
+	Therefore, in the interests of your corporation's fiscal health,
+	I strongly advise that you withdraw support for any US
+	legislation that would cripple or render illegal open source
+	development.
+	.CLOSING
+	Sincerely,
+
+ +This produces a letter with headers that follow the North American +standard for business correspondence. If you'd prefer another +style of correspondence, for example, British, you'd set up the +same letter like this: +

+

+	.AUTHOR    "Yannick P. Guique"
+	.DOCTYPE    LETTER
+	.PRINTSTYLE TYPESET
+	.START
+	.FROM
+	.RIGHT
+	Y.P. GUIQUE
+	022 Umask Road
+	St-Sauveur-en-dehors-de-la-mappe, Québec
+	.TO
+	GUILLAUME BARRIÈRES
+	Minidoux Corporation
+	5000 Pannes Drive
+	Redmond, Virginia
+	.DATE
+	.RIGHT
+	August 25, 2004
+	.GREETING
+	Dear Mr. Barrières,
+
+ +Notice the use of .RIGHT after +.FROM and .DATE in this example, +used to change the default quad for these macros. +

+


+ + +

Defaults for letters

+
+ +In letters, if the order of header macros is +

+

+	.DATE
+	.TO
+	.FROM
+	.GREETING
+
+ +mom sets +
+
    +
  1. the date flush right, page right, at the top of page one, +with a gap of two linespaces underneath +
  2. the addressee in a block flush left, page left, with a gap of +one linespace underneath +
  3. the addresser in a block flush left, page left, with a gap of +one linespace underneath +
  4. the greeting flush left, with a gap of one linespace +underneath +
+

+which is the standard for North American business correspondence. +

+If you switch the order of .DATE, +.TO and/or .FROM, +mom sets all the headers flush left, with a gap of +one linespace underneath each. (The default left quad of any header +can be changed by invoking the .RIGHT macro, on +a line by itself, immediately before inputting the text of the +header.) +

+Following the headers, mom sets +

+

    +
  • the body of the letter justified +
  • in multi-page letters: +
      +
    • a footer indicating there's a next page (of the form .../#) +
    • the page number at the top of every page after page one +
    +
  • the closing/signature line flush left, indented halfway across the page +
+

+Other important style defaults are listed below, and may be changed +via the +typesetting macros +or the document processing +control macros +prior to +START. Assume that any +style parameter not listed below is the same as for +PRINTSTYLE TYPESET +or +PRINTSTYLE TYPEWRITE. +

+

+PARAMETER             PRINTSTYLE TYPESET   PRINTSTYLE TYPEWRITE
+---------             ------------------   --------------------
+
+Paper size            8.5 x 11 inches      8.5 x 11 inches
+Left/right margins    1.25 inches          1.25 inches
+Header margin         3.5 picas            3.5 picas
+ (for page numbers)
+Header gap            3 picas              3 picas
+ (for page numbers)
+Family                Times Roman          Courier
+Font                  roman                roman
+Point size            12                   12
+Line space            13.5                 12 (i.e. singlespaced)
+Paragraph indent      3 ems                3 picas
+Spaced paragraphs     yes                  no
+Footers*              yes                  yes
+Footer margin         3 picas              3 picas
+Footer gap            3 picas              3 picas
+Page numbers          top, centred        top, centred
+
+*Footers contain a "next page" number of the form .../#
+
+
+ + +

The letter macros

+
+ +All letter macros must come after +START, +except NO_SUITE. +

+

+
+ + + +
+

+ +Macro: DATE + +

+Invoke DATE on a line by itself, with the date +underneath, like this: +

+

+	.DATE
+	October 31, 2002
+
+ +If you wish to change the default quad direction for the date, +enter .LEFT or .RIGHT, on a line by itself, +immediately after .DATE. +

+If you wish to insert additional space between the date and any +letter header that comes after it, do so after inputting the date, +not at the top of the next header macro, like this: +

+

+	.DATE
+	October 31, 2002
+	.SPACE     \" Or, more simply, .SP
+
+ +If you wish to remove the default space, +

+

+	.SPACE -1v \" Or, more simply, .SP -1v
+
+ +will do the trick. +

+ + + +


+

+ +Macro: TO + +

+Invoke TO on a line by itself, with the name +and address of the addressee underneath, like this: +

+

+	.TO
+	JOHN SMITH
+	10 Roberts Crescent
+	Bramladesh, Ont.
+
+ +If you wish to change the default quad direction for the address, +enter .LEFT or .RIGHT, on a line by itself, +immediately after .TO. +

+If you wish to insert additional space between the address and +any letter header that comes after it, do so after inputting the +address, not at the top of the next header macro, like this: +

+

+	.TO
+	JOHN SMITH
+	10 Roberts Crescent
+	Bramladesh, Ont.
+	.SPACE     \" Or, more simply, .SP
+
+ +If you wish to remove the default space, +

+

+	.SPACE -1v \" Or, more simply, .SP -1v
+
+ +will do the trick. +

+ + + +


+

+ +Macro: FROM + +

+Invoke FROM on a line by itself, with the name +and address of the addresser underneath, like this: +

+

+	.FROM
+	JOE BLOW
+	15 Brunette Road
+	Ste-Vieille-Andouille, Québec
+
+ +If you wish to change the default quad direction for the address, +enter .LEFT or .RIGHT, on a line by itself, +immediately after .FROM. +

+If you wish to insert additional space between the address and +any letter header that comes after it, do so after inputting the +address, not at the top of the next header macro, like this: +

+

+	.FROM
+	JOE BLOW
+	15 Brunette Road
+	Ste-Vieille-Andouille, Québec
+	.SPACE     \" Or, more simply, .SP
+
+ +If you wish to remove the default space, +

+

+	.SPACE -1v \" Or, more simply, .SP -1v
+
+ +will do the trick. +

+ + + +


+

+ +Macro: GREETING + +

+Invoke GREETING on a line by itself, with the +full salutation you want for the letter, like this: +

+

+	.GREETING
+	Dear Mr. Smith,
+
+ + + +
+

+ +Macro: CLOSING + +

+Invoke CLOSING on a line by itself after the +body of the letter, with the closing you'd like (e.g. "Yours +truly,"), like this: +

+

+	.CLOSING
+	Yours truly,
+
+ + + +
+

+ +Macro: NO_SUITE + +

+If you don't want mom to print a "next +page" number at the bottom of multi-page letters, invoke +.NO_SUITE, on a line by itself, prior to +START. + +

+


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/macrolist.html b/contrib/mom/momdoc/macrolist.html new file mode 100644 index 0000000..01125f7 --- /dev/null +++ b/contrib/mom/momdoc/macrolist.html @@ -0,0 +1,1794 @@ + + + + +Mom -- Quick reference guide + + + + + +Next   +Prev   +Back to Table of Contents + + +

+ Quick reference guide +

+ +Once you know your way around mom, you may find +this guide preferable to using the Table of Contents. It lists (I +hope) all mom's user-space macros. The links +point to references found elsewhere in the documentation. +

+NOTE: This guide uses tables extensively. Better +make sure you're reading it in a browser that renders them +sensibly. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypesettingDocument processing
Page/paper size; margins; line lengthReference macros
Family/font; pointsize; leadingLetters
Font modificationsDocument style
Underscoring and underliningSpecial to PRINTSTYLE TYPEWRITE
ColourBegin document processing
Quad, justification and fillCustomizing the document header
Line terminationPagination
HyphenationRecto/verso
Word and sentence spacingAutomatic columns
Kerning; ligaturesEpigraphs
Vertical movementsHeads
Horizontal movementsSubheads
IndentsParagraph heads
TabsParagraphs
Manual columnsQuotes
SuperscriptsBlockquotes
DropcapsAuthor linebreaks
ListsFootnotes
Padding linesEndnotes
MiscellaneousDesigning endnotes pages
 Lists
 Margin notes
 Line numbering
 References
 Bibliographies
 Table of contents
 Designing a table of contents
 Finis
 Headers and footers
 Part-by-part control +
of headers
 Footers
 Covers and doc covers
 Customizing covers +
and doc covers
 Part-by-part control of +
covers and doc covers
 Miscellaneous
+ +
+


+

Typesetting macros

+ +

Page/paper size; margins; line length

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Page/paper sizeMarginsLine length
PAGEWIDTHT_MARGINLL
PAGELENGTHB_MARGIN 
PAPERL_MARGIN 
PAGER_MARGIN 
+ +

Family/font; pointsize; leading

+ + + + + + + + + + + + + + + + + + + + + + +
Family/fontPoint sizeLeading
FAMILYPT_SIZELS
FT\*[SIZE n]AUTOLEAD
FALLBACK_FONT  
+ +

Font modifications (pseudo-italic, -bold, -condensed, -extended)

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ItalicizeEmboldenCondenseExtend
SETSLANTSETBOLDERCONDENSEEXTEND
\*[SLANT]\*[BOLDER]\*[COND]\*[EXT]
\*[SLANTX]\*[BOLDERX]\*[CONDX]\*[EXTX]
+ +

Underscoring and underlining

+ + + + + + + + + + + + + + +
UnderscoreUnderline
UNDERSCOREUNDERLINE
UNDERSCORE_2\*[UL]...\*[ULX]
+ +

Colour

+ + + + + + + + + + + + + +
Define coloursInvoke colours
NEWCOLORCOLOR
XCOLOR\*[<colorname>]
+ +

Quad, justification and fill

+ + + + + + + + + + + + + + + + + + +
Fill modesNo-fill modes
JUSTIFYLEFT
QUADCENTER
 RIGHT
+ +

Line termination

+ + + + + + + + + + + + + + +
BreakBreak (no space)Break (extra space)Break (force justify)
BRELSPACESPREAD
+ +

Hyphenation

+ + + + + + + + + + +
EnableSet parameters
HYHY_SET
+ +

Word and sentence spacing

+ + + + + + + + + + +
Word spaceSentence space
WSSS
+ +

Character pair and full line kerning; ligatures

+ + + + + + + + + + + + + + + + + + + + +
Kern character pairsKern full linesLigatures
KERNRWLIGATURES
\*[BU n] + EW 
\*[FU n] + BR_AT_LINE_KERN 
+ +

Vertical movements

+ + + + + + + + + + + + + + +
DownUp
ALDRLD
\*[DOWN n]\*[UP n]
+ +

Horizontal movements

+ + + + + + + + + + +
ForwardBack
\*[FWD n]\*[BCK n]
+ +

Indents

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
LeftRightBothQuitTempHanging
ILIRIBIQTIHI
ILXIRXIBX   
+ +

Tabs

+ + + + + + + + + + + + + + + + + + + + + + +
SetupInvokingQuitting
TAB_SETTABTQ
\*[STn]...\*[STnX]TN 
ST  
+ +

Manual columns

+ + + + + + + + + + + + +
InitializingReturning to topExiting
MCOMCRMCX
+ +

Superscripts

+ + + + + + + + + + + + +
SuperscriptCondensed superscriptExtended superscript
\*[SUP]...\*[SUPX]\*[CONDSUP]...\*[CONDSUPX]\*[EXTSUP]...\*[EXTSUPX]
+ +

Dropcaps

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
InvokingDropcap control
DROPCAPDROPCAP_FAMILY
 DROPCAP_FONT
 DROPCAP_COLOR
 DROPCAP_ADJUST
 DROPCAP_GUTTER
+ +

Lists

+ + + + + + + + + + + + + + + + + + + + + + +
InitializingSetting itemsList control
LISTITEMSHIFT_LIST
  RESET_LIST
  PAD_LIST_DIGITS
+ +

Padding lines

+ + + + + + + + + + +
Pad a lineChange the pad marker
PADPAD_MARKER
+ +

Miscellaneous

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NewpageAll capsSmartquotesRules/leaders
NEWPAGECAPSSMARTQUOTES\*[RULE]
   \*[LEADER]
   LEADER_CHARACTER
+
+ + + + + + + + + + + + + + + + + +
Change the escape characterSuppress inputDisable traps
ESC_CHARCOMMENTTRAP
 SILENT 
+ +
+
+ +

Document processing

+ +

Reference macros

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
TitlesAuthorsDraft copies
TITLEAUTHORDRAFT
SUBTITLE REVISION
DOCTITLE DRAFT_STRING
CHAPTER REVISION_STRING
+ +

Letters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeadersClosingControl
DATECLOSINGNO_SUITE
FROM  
TO  
GREETING  
+ +

Document style

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Basic styleStyle control*
COPYSTYLEDOC_LEFT_MARGIN
DOCTYPEDOC_RIGHT_MARGIN
PRINTSTYLE**DOC_LINE_LENGTH
 DOC_FAMILY
 DOC_PT_SIZE
 DOC_LEAD
 DOC_LEAD_ADJUST
 DOC_QUAD
+

+*See the note +Changing document-wide style parameters after START +
+**Absolutely required if you wish to use the document processing macros. + +

Special to PRINTSTYLE TYPEWRITE

+ + + + + + + + + + + + + + + + + + + + + + +
Italic/underliningQuotes
UNDERLINE_ITALICUNDERLINE_QUOTES
ITALIC_MEANS_ITALIC 
UNDERLINE_SLANT 
SLANT_MEANS_SLANT 
+ +

Begin document processing

+ + + + + + + +
Absolutely required in order to initialize document processing
START
+ +

Customizing the document header

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GlobalTitleSubtitleChapter
DOCHEADERTITLE_FAMILYSUBTITLE_FAMILYCHAPTER_STRING
DOCHEADER_ADVANCETITLE_FONTSUBTITLE_FONTCHAPTER_TITLE_FAMILY
DOCHEADER_FAMILYTITLE_SIZESUBTITLE_SIZECHAPTER_TITLE_FONT
DOCHEADER_COLORTITLE_COLORSUBTITLE_COLORCHAPTER_TITLE_SIZE
   CHAPTER_TITLE_COLOR
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributionAuthorDocument type
ATTRIBUTE_STRINGAUTHOR_FAMILYDOCTYPE_FAMILY
ATTRIBUTE_COLORAUTHOR_FONTDOCTYPE_FONT
 AUTHOR_SIZEDOCTYPE_SIZE
 AUTHOR_COLORDOCTYPE_COLOR
+ +

Pagination

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PaginateStyle control
PAGINATEPAGENUM_FAMILY
PAGENUMBERPAGENUM_FONT
PAGENUM_STYLE*PAGENUM_SIZE
PAGENUM_ON_FIRST_PAGEPAGENUM_COLOR
DRAFT_WITH_PAGENUMBERPAGENUM_POS
SUSPEND_PAGINATIONPAGENUM_HYPHENS
RESTORE_PAGINATION 
+

+*I.e. the "format" of page numbering (digits, roman numerals, letters) + +

Recto/verso

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
EnablingControlingUser-defined page headers/footers +
+ for alternating pages* +
RECTO_VERSOSWITCH_HEADERSHEADER_RECTO
 SWITCH_FOOTERS*HEADER_VERSO
  FOOTER_RECTO*
  FOOTER_VERSO*
+

+*Please note that most aspects of page header and footer control +are treated identically. In the documentation, the descriptions +of macros that control header and footer behaviour usually only +mention "HEADER" or "HEADER_". Simply apply +"FOOTER" or "FOOTER_" to the appropriate +"HEADER" or "HEADER_"macros in order to enable +their behaviour for footers. + + +

Automatic columns

+ + + + + + + + + + + + + + +
EnablingControling
COLUMNSCOL_NEXT
 COL_BREAK
+ +

Epigraphs

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
EPIGRAPHEPIGRAPH_FAMILYEPIGRAPH_AUTOLEAD
 EPIGRAPH_FONTEPIGRAPH_QUAD
 EPIGRAPH_SIZEEPIGRAPH_INDENT
 EPIGRAPH_COLOR 
+ +

Heads

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
HEADHEAD_FAMILYHEAD_QUAD
 HEAD_FONTHEAD_CAPS
 HEAD_SIZEHEAD_UNDERLINE
 HEAD_COLORHEAD_SPACE
  NUMBER_HEADS
  RESET_HEAD_NUMBER
+ +

Subheads

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
SUBHEADSUBHEAD_FAMILYSUBHEAD_QUAD
 SUBHEAD_FONTNUMBER_SUBHEADS
 SUBHEAD_SIZERESET_SUBHEAD_NUMBER
  SUBHEAD_COLOR
+ +

Paragraph heads

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
PARAHEADPARAHEAD_FAMILYPARAHEAD_INDENT
 PARAHEAD_FONTNUMBER_PARAHEADS
 PARAHEAD_SIZERESET_PARAHEAD_NUMBER
 PARAHEAD_COLOR 
+ +

Paragraphs

+ + + + + + + + + + + + + + + + + + + + + + +
MacroType-style control*Other
PPPP_FONTPARA_INDENT
  INDENT_FIRST_PARAS
  PARA_SPACE
+

+*For an in-depth explanation of how to manage the type-style of +paragraphs, much of which is normally established through the use of +typesetting macros prior to +START, +see +Paragraph control macros. + +

Quotes +
+(line-for-line cited text, e.g. poetry or code snippets) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
QUOTEQUOTE_FAMILYQUOTE_INDENT*
 QUOTE_FONTALWAYS_FULLSPACE_QUOTES
 QUOTE_SIZEBREAK_QUOTE
 QUOTE_AUTOLEADUNDERLINE_QUOTES
 QUOTE_COLOR 
+

+*Note that the use of QUOTE_INDENT sets the indent for both QUOTE +and BLOCKQUOTE. + +

Blockquotes +
+(formatted citations) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
BLOCKQUOTEBLOCKQUOTE_FAMILYBLOCKQUOTE_INDENT
 BLOCKQUOTE_FONTBLOCKQUOTE_QUAD
 BLOCKQUOTE_SIZEBREAK_BLOCKQUOTE
 BLOCKQUOTE_AUTOLEAD 
 BLOCKQUOTE_COLOR 
+

+*Note that the use of BLOCKQUOTE_INDENT sets the indent for both BLOCKQUOTE +and QUOTE. + +

Author linebreaks +
+(also called "scene" or "section" breaks) +

+ + + + + + + + + + + + +
MacroType-style controlOther
LINEBREAKLINEBREAK_COLORLINEBREAK_CHAR
+ +

Footnotes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroType-style controlOther
FOOTNOTE*FOOTNOTE_FAMILYFOOTNOTE_AUTOLEAD
 FOOTNOTE_FONTFOOTNOTE_QUAD
 FOOTNOTE_SIZEFOOTNOTE_MARKERS
 FOOTNOTE_COLORFOOTNOTE_MARKER_STYLE
  RESET_FOOTNOTE_NUMBER
  FOOTNOTE_RULE
  FOOTNOTE_RULE_ADJ
  FOOTNOTE_RULE_LENGTH
  FOOTNOTES_RUN_ON
+

+*Indenting of footnotes is handled by arguments passed to FOOTNOTE. + +

Endnotes

+ + + + + + + + + + +
Input endnotesOutput endnotes pages
ENDNOTEENDNOTES
+ +

Designing endnotes pages +
+(if you want to change the defaults) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type-style controlEndnotes page +
title string* +
Document identification string**
ENDNOTE_FAMILYENDNOTE_STRINGENDNOTE_TITLE
ENDNOTE_FONTENDNOTE_STRING_FAMILYENDNOTE_TITLE_FAMILY
ENDNOTE_LEADENDNOTE_STRING_FONTENDNOTE_TITLE_FONT
ENDNOTE_PT_SIZEENDNOTE_STRING_SIZEENDNOTE_TITLE_SIZE
ENDNOTE_QUADENDNOTE_STRING_CAPSENDNOTE_TITLE_QUAD
 ENDNOTE_STRING_UNDERSCOREENDNOTE_TITLE_UNDERSCORE
+

+*By default, "Endnotes", at the top of the first page of +endnotes +
+**I.e. how each document in the endnotes for a collated document is +identified (by default, the strings passed to the reference +macro, .TITLE +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Endnotes numberingParagraph controlEndnotes headers/footers
ENDNOTE_NUMBER_FAMILYENDNOTE_PARA_INDENTENDNOTES_ALLOWS_HEADERS
ENDNOTE_NUMBER_FONTENDNOTE_PARA_SPACEENDNOTES_HEADER_CENTER
ENDNOTE_NUMBER_SIZE ENDNOTES_FOOTER_CENTER
ENDNOTE_NUMBERS_ALIGN_LEFT  
ENDNOTE_NUMBERS_ALIGN_RIGHT  
+
+ + + + + + + + + + + + + + + + + + +
Endnotes page numberingMisc
ENDNOTES_FIRST_PAGENUMBERENDNOTES_NO_COLUMNS
ENDNOTES_PAGENUM_STYLE*SINGLESPACE_ENDNOTES**
ENDNOTES_NO_FIRST_PAGENUM 
+

+*I.e. the format of page numbering (digits, roman, letters) +
+**Applies to PRINTSTYLE TYPEWRITE only + +

Margin notes

+ + + + + + + + + + +
InitializeStart
MN_INITMN
+ +

Line numbering

+ + + + + + + + + + + + +
TextQuotesBlockquotes
NUMBER_LINESNUMBER_QUOTE_LINESNUMBER_BLOCKQUOTE_LINES
+ +

References

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Begin/end refsFootnote refsEndnote refsEmbedded refs
REFFOOTNOTE_REFSENDNOTE_REFSREF( / REF)
   REF( / REF)
   REF[ / REF]
   REF{ / REF}
+ +

Bibliographies

+ + + + + + + + + + +
Start bibliography pageBibliography type
BIBLIOGRAPHYBIBLIOGRAPHY_TYPE
+ +

Table of contents

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GenerateGeneral +
+ type-style control +
TOC title string* +
+ and style control +
TOCTOC_FAMILYTOC_HEADER_STRING
 TOC_PT_SIZETOC_HEADER_FAMILY
 TOC_LEADTOC_HEADER_FONT
  TOC_HEADER_SIZE
  TOC_HEADER_QUAD
+

+*By default, "Table of Contents" + +

Designing a table of contents +
+(if you want to change the defaults) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Title entriesHead entriesSubhead entries
TOC_TITLE_ENTRYTOC_HEAD_FAMILYTOC_SUBHEAD_FAMILY
TOC_APPENDS_AUTHORTOC_HEAD_FONTTOC_SUBHEAD_FONT
TOC_TITLE_FAMILYTOC_HEAD_SIZETOC_SUBHEAD_SIZE
TOC_TITLE_FONTTOC_HEAD_INDENTTOC_SUBHEAD_INDENT
TOC_TITLE_SIZE  
TOC_TITLE_INDENT  
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parahead entriesPage number entriesPaginationMisc
TOC_PARAHEAD_FAMILYTOC_PN_FAMILYPAGINATE_TOCTOC_RV_SWITCH
TOC_PARAHEAD_FONTTOC_PN_FONTTOC_PAGENUM_STYLE* 
TOC_PARAHEAD_SIZETOC_PN_SIZE  
TOC_PARAHEAD_INDENTTOC_PADDING  
+

+*I.e. the format of page numbering (digits, roman, letters) + +

Finis

+ + + + + + + + + + + + + + +
MacroType style control
FINISFINIS_COLOR
FINIS_STRING 
+ +

Headers and footers

+

+Mom treats all aspects of headers and footers +identically. The only difference between the two is whether the +information they contain appears at the top of the page or at the +bottom. Consequently, in the following, substitute FOOTERS +for HEADERS, and FOOTER_ for HEADER_ if you're hunting down how to +do something with footers. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroPlacementUser-defined headersGeneral +
+ type-style control +
HEADERSHEADER_MARGINHEADER_RECTOHEADER_FAMILY
 HEADER_GAPHEADER_VERSOHEADER_SIZE
   HEADER_COLOR
   HEADER_PLAIN
+ +

Part-by-part control of headers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LeftCenterRight
HEADER_LEFTHEADER_CENTERHEADER_RIGHT
HEADER_LEFT_FAMILYHEADER_CENTER_FAMILYHEADER_RIGHT_FAMILY
HEADER_LEFT_FONTHEADER_CENTER_FONTHEADER_RIGHT_FONT
HEADER_LEFT_SIZEHEADER_CENTER_SIZEHEADER_RIGHT_SIZE
HEADER_LEFT_COLORHEADER_CENTER_COLORHEADER_RIGHT_COLOR
HEADER_LEFT_CAPSHEADER_CENTER_CAPSHEADER_RIGHT_CAPS
 HEADER_CENTER_PAD 
+
+ + + + + + + + + + + + + + + + + + +
Separator ruleMisc
HEADER_RULEREVISION_STRING
HEADER_RULE_GAPDRAFT_STRING
HEADER_RULE_COLOR 
+ +

Footers

+

+This is the one exception to the "HEADER also means FOOTER" +convention used throughout the documentation. + + + + + +
FOOTER_ON_FIRST_PAGE
+ +

Covers and doc covers

+ + + + + + + + + + + + + + +
CoversDoc covers
COVERDOC_COVER
COVERSDOC_COVERS
+ + +

Customizing covers and doc covers

+ + + + + + + + + + + + + + + + + + + + + + +
CoversDoc covers
COVERTITLEDOC_COVERTITLE
COVER_ADVANCEDOC_COVER_ADVANCE
COVER_FAMILYDOC_COVER_FAMILY
COVER_LEADDOC_COVER_LEAD
+ +

Part-by-part control of covers and doc covers

+ +

+For part-by-part control of the family, font, size and color, please +see + + + + + + + + +
Control macros--changing the defaults for covers and document covers
Index of cover and doc cover control macros
+ +

Miscellaneous

+ + + + + + + + + + + + +
Output a blank pageCollate multiple +
documents
Get leading back +
on track
BLANKPAGECOLLATESHIM
+ +
+
+ +Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/rectoverso.html b/contrib/mom/momdoc/rectoverso.html new file mode 100644 index 0000000..0644903 --- /dev/null +++ b/contrib/mom/momdoc/rectoverso.html @@ -0,0 +1,253 @@ + + + + +Mom -- Document Processing, Recto/verso printing + + + + + +Next   +Prev   +Back to Table of Contents +

+ + + + +

RECTO/VERSO PRINTING and COLLATING

+ + + + + +

Introduction to recto/verso

+
+ +Recto/verso printing allows you to set up a mom +document in such a way that it can be printed on both sides of a +printer sheet and subsequently bound. +

+With recto/verso, mom automatically takes control +of the following aspects of alternating page layout: +
+

    +
  • switching left and right margins (if they're not equal) +
  • switching the left and right parts of the default 3-part + headers + or + footers + (see the + General description of headers) +
  • switching + HEADER_RECTO + and + HEADER_VERSO + if user-defined, single string recto/verso headers + or footers are used in place of the default 3-part + headers or footers +
  • switching the page number position (if page numbers are not centred) +
+

+It is beyond the scope of this documentation to cover the different +ways in which you can make your printer print on both sides of a sheet. +A simple but effective method for those of us with "dumb" +printers is to open the document (after it's been processed into +PostScript by groff -- see +How to invoke groff with mom) +in gv (ghostview), +click the "odd pages" icon, then click "Print +Marked". After printing is complete, rearrange the sheets +appropriately, put them back in your printer, and have +gv print the "even pages". If you prefer to +work from the command line, check out the man pages for +pstops and psbook. There are other +programs out there as well to help with two-sided printing. +

+ + +

Recto/verso macros list

+ + + +

+ +


+ + + +

Recto/verso printing

+
+Macro: RECTO_VERSO + +

+If you want mom to set up alternating pages for +recto/verso printing, simply invoke RECTO_VERSO +with no argument. +

+NOTE: +
+Recto/verso always switches the left and right parts of +headers +or +footers +on odd/even pages. However, it only switches the left and right +margins if the margins aren't equal. Consequently, it is your +responsibility to set the appropriate differing left and right +margins with +L_MARGIN +and +R_MARGIN +(prior to +START) +or with +DOC_LEFT_MARGIN +and +DOC_RIGHT_MARGIN +(before or after START). +

+Equally, recto/verso only switches the page number position if page +numbers aren't centred, which means you have to set the page +number position with +PAGENUM_POS +(before or after START). +

+ + + +


+ +

Switch header left part/right part

+
+Macro: SWITCH_HEADERS + +

+SWITCH_HEADERS switches the location of the +header left string (by default, the author) and the header right +string (by default, the document title). If you don't like +mom's default placement of author and title, use +SWITCH_HEADERS to reverse it. +

+SWITCH_HEADERS can also be useful in conjunction +with +RECTO_VERSO. +The assumption of RECTO_VERSO is that the first +page of a document (recto/odd) represents the norm for header-left +and header-right, meaning that the second (and all subsequent even) +page(s) of the document exchange header-left and header-right. +

+If mom's behaviour in this matter is not what +you want, simply invoke SWITCH_HEADERS on the +first page of your recto/verso document to reverse her default +treatment of header parts. The remainder of your document (with +respect to headers) will come out as you want. +

+NOTE: Replace _HEADERS, above, +with _FOOTERS if your document uses footers. +

+


+ + + + +

Introduction to collating

+
+ +The macro COLLATE lets you join documents together. +Primarily, it's a convenience for printing long documents that +comprise several chapters, although it could be used for any +document type (except LETTER). +

+Personally, I prefer to keep chapters in separate files and print +them out as needed. However, that means keeping track of the correct +starting page number for each chapter, a problem circumvented by the +use of COLLATE. +

+When collating chapters, you need only put .COLLATE +at the end of a chapter, follow it with any +reference macros +needed for the new chapter, e.g. +CHAPTER +or +CHAPTER_STRING +(have a look at the +Special Note on CHAPTER) +make any pertinent style changes to the document (unlikely, but +possible), and re-invoke the +START +macro. Your new chapter will begin on a fresh page and behave +as expected. +

+COLLATE assumes you are collating documents/files +with similar type-style parameters hence there's no need for +PRINTSTYLE to appear after COLLATE, +although if you're collating documents that were created as separate +files, chances are the PRINTSTYLE's already there. +

+ +Two words of caution: +

    +
  1. Do not collate documents of differing + PRINTSTYLES (i.e. don't try to + collate a TYPESET document and TYPEWRITE document). +
  2. Use DOC_FAMILY instead of + FAMILY if, for some reason, you want + to change the family of all the document elements after + COLLATE. FAMILY, by + itself, will change the family of paragraph text only. +
+

+ + + +


+ +

Collate document files

+
+ +Macro: COLLATE + +

+The most basic (and most likely) collating situation looks like +this: +

+

+	.COLLATE
+	.CHAPTER 17
+	.START
+
+ +A slightly more complex version of the same thing, for chapters +that require their own titles, looks like this: +

+

+	.COLLATE
+	.CHAPTER_TITLE "Geek Fatigue: Symptoms and Causes"
+	.START
+
+ +NOTE: See the +two words of caution, +above. +

+ +


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/refer.html b/contrib/mom/momdoc/refer.html new file mode 100644 index 0000000..bda1e4b --- /dev/null +++ b/contrib/mom/momdoc/refer.html @@ -0,0 +1,1482 @@ + + + + +Mom -- Bibliographies and References + + + + + +Next   +Prev   +Back to Table of Contents + + +

+ Bibliographies and references +

+

+Introduction to bibliographies and references +
+Tutorial +

+
+Index of bibliography and reference macros +

+ + +

Introduction to bibliographies and references

+ + +Mom provides the ability to automatically format +and generate bibliography pages, as well as footnote or endnote +bibliographic references, or references embedded in text. She +accomplishes this by working in conjunction with a special +groff program called "refer". +

+refer is a groff +"pre-processor", which is to say that it scans your files looking +for very specific commands (i.e. lines that begin with a period +[dot], just like macros and document element tags). If the +commands aren't there, refer can't do it's job, +and neither can mom. The scanning is done +before any actual mom processing +occurs. +

+refer is a program that's been around for a long +time. It's powerful and has many, many features. Unfortunately, +the manpage (man refer), while complete and accurate, is +dense and not a good introduction to refer. (It's +a classic manpage Catch-22: the information it contains is most +useful only after you already grasp it.) +

+In order to get mom users up and running with +refer, this section of mom's +documentation focuses exclusively, in a recipe-like manner, on +what you need to know to use refer satisfactorily +in conjunction with mom. The information and +instructions are not to be taken as +a manual or tutorial on full refer usage. Much has +been left out, on purpose. +

+It is tempting to provide two levels of documentation, one for +users familiar with refer and one for newcomers +to groff and mom, but such an +approach may muddy the waters for newcomers. Mom's +allegiance, first and foremost, is to newcomers. If you're already +a refer user, the information herein will be useful +for adapting your current refer usage to +mom's way of doing things. If you've never used +refer, the information is essential, and, in many +cases, may be all you need. +

+(For the benefit of old groff-hands: refer +support in mom is heavily based on the +refer module of the ms macros. The choice +was deliberate so that those wishing to play around with +mom's bibliography formatting style would be +tinkering with the familiar.) +

+refer requires first that you create a +bibliographic database. From the information contained in the +database, mom formats and generates bibliographies +and references in MLA (Modern Language Association) style. MLA +style is clean, contemporary and flexible, and is widely used in +the humanities, where the range of material that has to be +referenced can run from simple books to live interviews and film. +

+Once you have created your database, you instruct +refer (and mom) to access entries +in it by supplying keywords from the entries. Depending on what +you've instructed mom to do, she will put the +entries--fully and properly formatted with respect to order, punctuation +and italicization--in footnotes, endnotes, or a full bibliography. +

+I encourage anyone interested in what MLA style looks like--and, by +extension, how your bibliographies and references will look after +mom formats them--to check out +

+

+	http://www.aresearchguide.com/12biblio.html
+
+ +or any other website or reference book on MLA style. +

+NOTE: MLA style requires that second and +subsequent lines of individual references be indented. Mom +takes care of this for you with a default indent, which +can be changed with the macro +INDENT_REFS. + + +

Tutorial

+ +
    +
  1. Creating a refer database +
  2. Required "refer" commands +
  3. Accessing references +
  4. Telling mom where to put references +
  5. Creating bibliography pages +
  6. Invoking groff with mom and refer +
+

+ +

1. Creating a refer database

+

+The first step in using refer with +mom is setting up your bibliographic database. +The database is a file containing separate entries for each +reference you want to access from your mom files. +The file is not a "mom" file; it is a separate database. +You may set up individual databases for individual documents, or +create a large database that contains all the references you'll +ever need. +

+Entries ("records") in the database file are separated from each +other by a single, blank line. The records themselves are composed +of single lines ("fields") with no blank lines between them. Each +field begins with a percent sign and a single letter (the "field +identifier") e.g. %A or %T. The letter identifies what part of a +bibliographic entry the field refers to: Author, Title, Publisher, +Date, etc. After the field identifier comes a single space, +followed by the information appropriate to field. No punctuation +should go at the ends of fields; mom adds what's +correct automatically. Do note, however, that author(s) (%A) +requires that you enter the author information exactly as you wish +it to come out (minus the period), including the comma after the +first author's last name. +

+Here's a sample database containing two records so you can +visualize what the above paragraph says: +

+

+%A Schweitzer, Albert
+%A C.M. Widor
+%T J.S. Bach
+%l Ernest Newman
+%V Vol 2
+%C London
+%I Adam and Charles Black
+%D 1923
+%O 2 vols
+%K bach vol 2
+
+%A Schaffter, Peter
+%T The Schumann Proof
+%C Toronto
+%I RendezVous Press
+%D 2004
+%K schumann schaffter
+
+ +The order in which you enter fields doesn't matter. +mom and refer will re-arrange +them in the correct order for you. +

+The meaning of the letters follows. There are, with +refer, quite a few--all uppercase--which have, over +time, come to be "standard". Mom respects these. +However, she adds to the list (mostly the lowercase letters). +

+

+	%A Author           -- additional authors may be entered on separate %A
+	                       lines as in first entry of the sample, above; mom 
+	                       and refer will figure out what to do with multiple
+	                       authors according to MLA rules
+	%T Title            -- either the primary title (e.g. of a book), or the
+	                       title of an article (e.g. within a book or
+	                       journal or magazine)
+	%B Book title       -- the title of a book when %T contains the title
+	                       of an article; otherwise, use %T for book
+	                       titles
+	%R Report number    -- for technical reports
+	%J Journal name     -- the name of a journal or magazine when %T
+	                       contains the title of an article
+	%E Editor           -- additional editors may be entered on separate %E
+	                       lines (like authors); mom and refer will figure
+	                       out what to do with them according to MLA rules
+	%e Edition          -- the number of name of a specific edition
+	                       (e.g. Second, 2nd, Collector's, etc.)
+	%V Volume           -- volume number of a journal or series of books
+	%N Journal number   -- journal or magazine number
+	%S Series           -- series name for books or journals that are part of
+	                       a series
+	%C City             -- the city of publication
+	%I Publisher        -- the publisher; %I stands for "Issuer"
+	%D Publication date
+	%P Page number(s)   -- enter page ranges as, e.g., 22-25
+	%G Gov't.
+	   ordering number  -- for government publications
+	%O Other            -- additional information or comments you want
+	                       to appear at the end of the reference
+	%K Keywords         -- any words that will clear up ambiguities
+	                       resulting from database entries that
+	                       contain, say, the same author or the
+	                       same title
+	%d original
+	   publication date -- if different from the date
+	                                   of publication
+	%a additions        -- for books, any additions to the original work,
+					       such as the preface to a new edition or a new
+	                       introduction
+	%t reprint title    -- if different from a work's original title
+	%l translator       -- if the translator is not the editor; if more
+	                        than one translator, this field should contain
+	                        all the names, with appropriate punctuation
+	%r translator
+	   and editor       -- if tr. and ed. are one in the same;
+	%s site name        -- for web sites, the site name
+	%c content
+	   of site          -- for web sites, the content, if unclear
+	                       (i.e. advertisement, cartoon, blog)
+	%o organization     -- for web sites, the organization, group or
+	                       sponsor of the site
+	%a access date      -- for a website, the date you accessed it
+	%u URL              -- for websites, the full URL of the site
+
+ +
+Tip: If you have hyphenation turned on in your +document (you probably do), mom will hyphenate +your references. This can be a problem because references +typically contain several proper names. Proper names shouldn't be +hyphenated. The solution is to prepend to any proper name in the +database the groff +discretionary hyphen +character, \%, like this: +

+

+	%A Hill, \%Reginald
+
+ +Alternatively, you can turn hyphenation off entirely in +references with the macro, +HYPHENATE_REFS OFF. +

+ +

2. Required "refer" commands

+

+Having set up your database, you now need to put some +refer-specific commands at the top of your +mom file. You cannot skip this step, nor can you +"source" these commands with the groff +primitive, +.so. They must +appear, exactly as shown, in every file requiring bibliographic +references. +

+refer commands are introduced with a single +line containing .R1, and concluded with a single line +containing .R2. What you put between the .R1 +and .R2 lines are the commands themselves. The commands +should be entered one per line, in lowercase letters, with +no initial period (dot). +

+Here's an example: +

+

+	.R1
+	no-label-in-text
+	no-label-in-reference
+	.R2
+
+ +There are an awful lot of refer commands. We will +focus only on those required to get mom cooperating +with refer. If you're interested, study the +refer manpage to discover what other commands are +available and how to manipulate them. +

+At a minimum, all mom files accessing +a bibliographic database must contain the following +refer commands, exactly as shown: +

+ +

+.R1
+no-label-in-text
+no-label-in-reference
+join-authors ", and " ", " ", and "
+database <full path to the database>
+.R2
+
+ +The first two commands tell refer to let +mom handle everything associated with footnote +and endnote markers, both in the body of the document, and in the +footnotes/endnotes themselves. +

+The third command is required for mom to handle +multiple authors in proper, MLA style. +

+The last command, database, assumes you have created +your own database, and do not otherwise have a system-wide +"default" database. "...full path to the database" means the full +path including the database filename, e.g. +/home/user/refer/my_database. +

If you're already a refer user, feel free to +enter whatever refer commands are necessary to +access the database(s) you want. +

+With the above refer block, you can embed +references directly into the text of your document, or have them +output as footnotes or endnotes. If you want to "collect" +references for later output on a bibliography page, the block must +read: +

+

+.R1
+no-label-in-text
+no-label-in-reference
+join-authors ", and " ", " ", and "
+database <full path to the database>
+sort
+accumulate
+.R2
+
+ +

3. Accessing references

+

+References are accessed by putting keywords, all on one line, +between the refer commands .[ and +.]. Both of these commands must appear on separate +lines, by themselves, like this: +

+

+	.[
+	keyword(s)
+	.]
+
+ +Keywords are any word, or set of words, that identify a database +record (i.e. a reference) unambiguously. (refer +doesn't like ambiguity.) +

+If, for example, you want to reference a book by Ray Bradbury, +and the database contains only one book by Bradbury, a suitable +keyword would be "Bradbury". If your database contains several +books by Bradbury, say, Fahrenheit 451 and The Martian +Chronicles, you could reference them with the keywords, "451" +and "Martian". If, in addition to the two books by Bradbury, you +also had one whose title was The Martian Mission, suitable +keywords to reference The Martian Chronicles might be: +

+

+	.[                or    .[                   or  .[
+	Bradbury Martian        Bradbury Chronicles      Martian Chronicles
+	.]                      .]                       .]
+
+ +The database field identifier, %K, lets you create special keywords +for references. This can be very handy if you need both a "short" +and a "long" reference to the same work. The short reference might +be used in footnotes; the long one in a bibliography. Consider the +following: +

+

+	%A Isherwood, Christopher      %A Isherwood
+	%T Mr. Norris Changes Trains   %T Mr. Norris Changes Trains
+	%d 1935                        %K Nor short
+	%t The Last of Mr. \%Norris
+	%a Intro. Tom Crawford
+	%C New York
+	%I New Directions
+	%D 1945
+	%K Norris
+
+
+ +To access the shorter reference, you'd do +

+

+	.[
+	Nor short
+	.]
+
+ +To access the longer one, you'd do +
+	.[
+	Norris
+	.]
+
+ +

4. Telling mom where to put references

+

+Mom provides several mechanisms for outputting +references where you want. +

+

Embedding references in the document body

+

+References may be embedded in the document body, surrounded by +parentheses, square brackets, or braces. Use whichever you prefer, +following the recipes below. +

+

+	Parentheses    Square brackets    Braces
+	-----------    ---------------    ------
+
+	.REF(          .REF[              .REF{
+	.[             .[                 .[
+	keyword(s)     keyword(s)         keyword(s)
+	.]             .]                 .]
+	.REF)          .REF]              .REF}
+
+ +

Footnote or endnote references

+

+Most times, you'll probably want references in either footnotes or +endnotes. Mom provides a simple mechanism whereby +you can choose which, or even switch back and forth. The primary +tag is +REF, which is used like this: +

+

+	.REF
+	.[
+	keyword(s)
+	.]
+	.REF
+
+ +REF collects references and outputs them +where you say with the macros, +FOOTNOTE_REFS +or +ENDNOTE_REFS. +Neither +FOOTNOTE_REFS nor ENDNOTE_REFS +requires an argument. All they do is tell REF, +whenever it's invoked, where to put the references. +

+A recipe for footnote references looks like this: +

+	.FOOTNOTE_REFS
+	.REF
+	.[
+	keyword(s)
+	.]
+	.REF
+
+ +When FOOTNOTE_REFS are enabled, REF +behaves identically to +FOOTNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for FOOTNOTE. +

+The reference between the first and second REF +will be treated as a footnote, as will all subsequent +REF pairs unless you invoke the macro, +ENDNOTE_REFS. +

+A recipe for endnote references looks like this: +

+	.ENDNOTE_REFS
+	.REF
+	.[
+	keyword(s)
+	.]
+	.REF
+
+ +The reference between the first and second REF +will be treated as an endnote, as will all subsequent +REF pairs unless you invoke the macro, +FOOTNOTE_REFS. +

+When ENDNOTE_REFS are enabled, REF +behaves identically to +ENDNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for ENDNOTE. +

+The innate flexibility of this scheme allows you to have both +footnote references and endnote references in the same document. +This would be desirable if, say, you wanted "short" references in +footnotes, and complete references in endnotes. +

+ +

Collected references

+

+Sometimes, you may want to put references in input text near +sections of text to which they pertain, but not actually want +them output until later (typically, on a bibliography page). +REF is used for this, too, but you have to make +sure your refer commands block is set up properly. +The recipe for this is: +

+ +

+.R1
+no-label-in-text
+no-label-in-reference
+join-authors ", and " ", " ", and "
+database <full path to the database>
+sort
+accumulate
+.R2
+
+ +After this set up, and provided you don't issue a +FOOTNOTE_REFS or ENDNOTE_REFS +command, all reference between REF pairs will be +collected for later output. +

+As a precaution, mom will issue a message the +first time you call .REF if neither +FOOTNOTE_REFS nor ENDNOTE_REFS is +in effect. If collected references are what you want, and you have +set up your .R1 - .R2 block as above, you may +safely ignore the message. +

+LIMITATION: You cannot combine "collected" +references (plain REF) with REFs +that are instructed to go into footnotes (with +FOOTNOTE_REFS) or endnotes (with +ENDNOTE_REFS). This is a limitation imposed by +refer, not mom. + +

5. Creating bibliography pages

+

+Bibliography pages are separate pages, like endnotes, on which +complete bibliographies are output. And, like endnotes pages, just +about every element on them can be designed to your specifications +with control macros. (See +Control macros for bibliographies.) +A bibliography page that uses mom's defaults +begins with the macro, +BIBLIOGRAPHY, +like this: +

+

+	.BIBLIOGRAPHY
+
+ +

+Following BIBLIOGRAPHY, you have three choices of +how to proceed. +

+If you have elected to have references collected from within the +body of a document (see above, +Collected references, +for instructions), which assumes you have a refer +command block like the one +here +at the top of your document, you need only do +

+

+	.BIBLIOGRAPHY
+	.[
+	$LIST$
+	.]
+
+ +If you want to create the bibliography by hand (which may be the +case if you've used footnote and/or endnote references throughout +your document), follow this recipe, which assumes you already have a +refer block like the one +here +at the top of your document: +

+

+	.BIBLIOGRAPHY
+	.R1
+	sort
+	accumulate
+	.R2
+	.[          -+
+	keyword(s)   |
+	.]           | "keyword(s)" are keywords identifying the
+	.[           | particular bibliographic reference you want
+	keyword(s)   | from your database.  Order doesn't matter here;
+	.]           | the refer command, sort, takes care of that.
+	.[           |
+	keyword(s)   |
+	.]          -+
+	.[
+	$LIST$
+	.]
+
+ +Your final choice is to output your whole database. Again, +assuming you have a refer block like the one +here at the top of your file, you need +only do: +

+

+	.BIBLIOGRAPHY
+	.R1
+	bibliography <full path to database>
+	.R2
+
+ +If you haven't put a refer block in +your file already, you can put the whole thing after +BIBLIOGRAPHY, like this: +

+

+	.BIBLIOGRAPHY
+	.R1
+	no-label-in-text                       -+
+	no-label-in-reference                   | These are actually optional
+	database <full path to the database>   -+ 
+	join-authors ", and " ", " ", and "
+	bibliography <full path to database>
+	.R2
+
+ +Whichever option you choose, mom will output a +full bibliography page, complete with a title (BIBLIOGRAPHY by +default, but that can be changed). + +

6. Invoking groff with mom and refer

+

+So, now you've got a document, formatted properly to use +references processed with refer, what do you do to +output the document? +

+It's simple. Instead of invoking groff with just +the -mom option, as explained +here, +invoke groff with the -R option as well, like this: +

+

+	groff -R -mom filename
+
+ +
+ +

+

Index of bibliography and reference macros

+ +

+ + + +


+

Marking off references for footnotes, endnotes, or collection

+

+ +Tag: REF +

+The macro, REF, tells mom that +what follows is refer-specific, a +keyword-identified reference from a +refer database. Depending on whether you've +issued a +FOOTNOTE_REFS +or +ENDNOTE_REFS +instruction, REF also tells mom +where to place the reference. If FOOTNOTE_REFS, +the reference will be formatted and placed in a footnote. If +ENDNOTE_REFS, the reference will be collected for +output as an endnote. If you have issued neither instruction, the +reference will be collected for later output, most likely on a +bibliography page. +

+Before you use REF, you must create a +refer block containing refer +commands (see +Required refer commands +in the tutorial, above). +

+REF usage always looks like this: +

+

+	.REF
+	.[
+	keyword(s)
+	.]
+	.REF
+
+ +Notice that REF "brackets" the +refer call, and never takes an argument. +

+What REF really is is a convenience. One could, +for example, put a reference in a footnote by doing +

+

+	.FOOTNOTE
+	.[
+	keyword(s)
+	.]
+	.FOOTNOTE OFF
+
+ +However, if you have a lot of references going into footnotes (or +endnotes), it's much shorter to type .REF/.REF than +.FOOTNOTE/.FOOTNOTE OFF. It also helps you +distinguish--visually, in your input file--between footnotes (or +endnotes) which are references, and footnotes (or endnotes) which +are explanatory, or expand on the text. +

+Additional arguments: If you're using +REF to put references in footnotes and your +footnotes need to be indented, you may (indeed, should) pass +REF the same arguments used to indent footnotes. +See +FOOTNOTE. +

+Note: +When REF is used with +FOOTNOTE_REFS, +it behaves identically to +FOOTNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for FOOTNOTE. +

+When REF is used with +ENDNOTE_REFS, +it behaves identically to +ENDNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for ENDNOTE. + +
+ + + +


+

Instruct REF to put references in footnotes

+

+ +Macro: FOOTNOTE_REFS +

+FOOTNOTE_REFS is an instruction to +REF, +saying, "put all subsequent references bracketed by the +REF macro into footnotes." You invoke it by +itself, with no argument. +

+When FOOTNOTE_REFS is in effect, regular +footnotes, (i.e. those introduced with .FOOTNOTE and +terminated with .FOOTNOTE OFF) continue to behave +normally. +

+You may switch between FOOTNOTE_REFS and +ENDNOTE_REFS +at any time. +

+If you have a lot of footnote references, and are identifying +footnotes by line number rather than by markers in the text, you may +want to enable +FOOTNOTES_RUN_ON +in conjunctions with FOOTNOTE_REFS. + +
+ + + +


+

Instruct REF to put references in endnotes

+

+ +Macro: ENDNOTE_REFS +

+ENDNOTE_REFS is an instruction to +REF, +saying, "add all subsequent references bracketed by the +REF macro to endnotes." You invoke it by +itself, with no argument. +

+When ENDNOTE_REFS is in effect, +mom continues to format regular endnotes, (i.e. +those introduced with .ENDNOTE and terminated with +.ENDNOTE OFF) in the normal way. +

+You may switch between ENDNOTE_REFS and +FOOTNOTE_REFS +at any time. + +
+ + + +


+

References embedded in text

+

+ +Macro pair: REF(  ...  REF) +
+Macro pair: REF[  ...  REF] +
+Macro pair: REF{  ...  REF} +

+You may sometimes want to embed references directly into the body +of your documents, typically, but not always, inside parentheses. +Mom makes this possible through the use of the +REF<bracket type> macros. +

+All three macro pairs, above, are invoked the same way, namely by +introducing the reference with the first ("open") macro of +the REF<bracket type> pair, and +terminating it with the second ("close") +REF<bracket type> of the pair. For +example +

+

+	.REF(
+	.[
+	keyword(s)
+	.]
+	.REF)
+
+ +will embed a reference in the body of your document, surrounded by +parentheses. .REF[ ... .REF] will +surround the reference with square brackets. +.REF{ ... .REF} will surround it with +curly braces. +
+ + + +
+

Manage the second-line indent of references

+

+ +Macro: INDENT_REFS FOOTNOTE | ENDNOTE | BIBLIO <indent> +
+*<indent> requires a unit of measure +

+Proper MLA-style references should have their second, and subsequent +lines, if any, indented. Since mom formats +references in MLA style, she automatically indents second lines. +By default, the indent for the second line of references, +regardless of whether the references appear in footnotes, endnotes, +or bibliographies, is 1.5 +ems +for +PRINSTYLE +TYPESET +and 2 ems for +PRINSTYLE +TYPEWRITE. +

+If you'd like to change the indent for footnotes, endnotes or +bibliographies, just invoke INDENT_REFS with a +first argument telling mom for which you want the +indent changed, and a second argument saying what you'd like the +indent to be. For example, if you want the second-line indent of +references on a bibliography page to be 3 +picas, +

+

+	.INDENT_REFS BIBLIO 3P
+
+ +is how you'd set it up. +

+Tip: if you are identifying endnotes by line +number +(ENDNOTE_MARKER_STYLE LINE) +and you have instructed mom to put references +bracketed by +REF +into endnotes (with +ENDNOTE_REFS), +you will probably want to adjust the second-line indent for +references in endnotes, owing to the way mom +formats line-numbered endnotes. Study the output of such +documents to see whether an indent adjustment is required. +
+ + + +


+

Enable/disable hyphenation of references

+

+ +Macro: HYPHENATE_REFS <toggle> +

+If you have hyphenation turned on for a document (see HY), +and in most cases you probably do, mom will +hyphenate references bracketed by the +REF +macro. Since references typically contain quite a lot of proper +names, which shouldn't be hyphenated, you may want to disable +hyphenation for references. +

+HYPHENATE_REFS is a toggle macro; +invoking it by itself will turn automatic hyphenation of +REF-bracketed references on (the default). +Invoking it with any other argument (OFF, +NO, X, etc.) will disable +automatic hyphenation for references bracketed by +REF. +

+An alternative to turning reference hyphenation off is to prepend +to selected proper names in your refer database +the groff +discretionary hyphen +character, \%. (See +here +in the tutorial for an example.) +

+Note: references embedded in the body of a document +with +REF<bracket type> +are considered part of +running text, +and are hyphenated (or not) according to whether hyphenation +is turned on or off for running text. Therefore, if you want to +disable hyphenation for such references, you must do so +temporarily, with HY, like this: +

+

+	.HY OFF
+	.REF(
+	.[
+	keyword(s)
+	.]
+	.REF)
+	.HY
+
+ +Alternatively, sprinkle your database fields liberally with +\%. +
+ + + +
+

Begin a bibliography page

+

+ +Macro: BIBLIOGRAPHY +
+

+If you want to append a bibliography to your document, all you need +do is invoke BIBLIOGRAPHY at the place you want +it. BIBLIOGRAPHY breaks to a new page, prints the +title (BIBLIOGRAPHY by default, but that can be changed), and awaits +refer instructions. How to create bibliographies +is covered in the tutorial section, +Creating bibliography pages. +

+See the +Bibliography page style control macros +for macros to tweak, design and control the appearance of +bibliography pages. +
+ + + +


+

Plain, or numbered list bibliography

+

+ +Macro: BIBLIOGRAPHY_TYPE PLAIN | LIST [ <list separator> ] [ <list prefix> ] +

+Mom offers two styles of bibliography output: plain, +or numbered list style. With PLAIN, bibliography +entries are output with no enumerators. With LIST, +each entry is numbered. +

+Entering .BIBLIOGRPHY_TYPE PLAIN gives you a plain +bibliography. +

+Entering .BIBLIOGRAPHY_TYPE LIST gives you an enumerated +bibliography. The two optional arguments, +<list separator> and +<list prefix> have the same meaning as +the equivalent arguments to +LIST +(i.e. <separator> and <prefix>). +

+You may enter BIBLIOGRAPHY_TYPE either before or +after BIBLIOGRAPHY. It must, however, always come +before the refer command to output bibliographies. +(See the tutorial section, +Creating bibliography pages, +for instructions on how to output bibliographies.) +

+Mom's default BIBLIOGRAPHY_TYPE +is LIST, with a period (dot) as the separator, and +no prefix. + +
+ + + +


+

Bibliography page style control

+ +

+Mom processes bibliography pages in a manner very +similar to the way she processes endnotes pages. The bibliography +page control macros, therefore, behave in the same way as their +endnotes pages equivalents. +
+

    +
  1. General bibliography page style control + +
  2. Bibliography pages header/footer control + +
  3. Bibliography page head (i.e. the title at the top) control + + +
+
+ +

1. General bibliography page style control

+ +

*Bibliography family/font/quad

+

+See +Arguments to the control macros. +

+

+.BIBLIOGRAPHY_FAMILY    default = prevailing document family; default is Times Roman
+.BIBLIOGRAPHY_FONT      default = roman
+.BIBLIOGRAPHY_QUAD*     default = justified
+
+*Note: BIBLIOGRAPHY_QUAD must be set to either L or J
+
+ + + +

*Bibliography point size

+

+Macro: BIBLIOGRAPHY_PT_SIZE <base type size of bibliography> + +

+Unlike most other control macros that deal with size of document +elements, BIBLIOGRAPHY_PT_SIZE takes as its argument an +absolute value, relative to nothing. Therefore, the argument represents +the size of bibliography type in +points, +unless you append an alternative +unit of measure. +For example, +

+

+	.BIBLIOGRAPHY_PT_SIZE 12
+
+ +sets the base point size of type on the bibliography page to 12 +points, whereas +

+

+	.BIBLIOGRAPHY_PT_SIZE .6i
+
+ +sets the base point size of type on the bibliography page to 1/6 of an +inch. +

+The type size set with BIBLIOGRAPHY_PT_SIZE is the size of +type used for the text of the bibliographies, and forms the basis from which +the point size of other bibliography page elements is calculated. +

+The default for +PRINTSTYLE TYPESET +is 12.5 points (the same default size used in the body of the document). +

+ + + +

*Bibliography lead

+

+Macro: BIBLIOGRAPHY_LEAD <base leading of bibliographies> [ ADJUST ] +
+*Does not require a unit of measure; points is assumed + +

+Unlike most other control macros that deal with leading of document +elements, BIBLIOGRAPHY_LEAD takes as its argument an +absolute value, relative to nothing. Therefore, the argument represents +the +leading +of endnotes in +points +unless you append an alternative +unit of measure. +For example, +

+

+	.BIBLIOGRAPHY_LEAD 14
+
+ +sets the base leading of type on the bibliography page to 14 +points, whereas +

+

+	.BIBLIOGRAPHY_LEAD .5i
+
+ +sets the base leading of type on the bibliography page to 1/2 inch. +

+If you want the leading of bibliographies adjusted to fill the page, +pass BIBLIOGRAPHY_LEAD the optional argument +ADJUST. (See +DOC_LEAD_ADJUST +for an explanation of leading adjustment.) +

+The default for +PRINTSTYLE TYPESET +is 14 points, adjusted. +

+NOTE: Even if you give mom a +DOC_LEAD_ADJUST OFF command, she will still, by +default, adjust bibliography leading. You MUST enter +BIBLIOGRAPHY_LEAD <lead> with no +ADJUST argument to disable this default behaviour. +

+ + + +

*Singlespace bibliographies (TYPEWRITE only)

+

+Macro: SINGLESPACE_BIBLIOGRAPHY <toggle> + +

+If your +PRINTSTYLE +is TYPEWRITE and you use TYPEWRITE's default +double-spacing, bibliographies are double-spaced. If your document +is single-spaced, bibliographies are single-spaced. +

+If, for some reason, you'd prefer that bibliographies be single-spaced +in an otherwise double-spaced document (including double-spaced +collated +documents), invoke SINGLESPACE_BIBLIOGRAPHY with +with no argument. +

+ + + +

*Adjusting the space between bibliography entries

+

+Macro: BIBLIOGRAPHY_SPACING <amount of space> +
+*Requires a unit of measure + +

+By default, mom inserts 1 linespaces between +bibliography entries on bibliography pages. If you'd prefer she +add a different amount of space, instruct her to do so with the +macro, BIBLIOGRAPHY_SPACING. Say, for example, +you'd prefer only 1/2 linespace. That would be done with +

+

+	.BIBLIOGRAPHY_SPACING .5v
+
+ +As with endnotes pages, owing to the space inserted between bibliography +entries, bibliography pages may have hanging bottom margins. +Unlike endnotes pages, mom is sad to report that +there's nothing you can do about this, except a) pray things work +out, or b) set your BIBLIOGRAPHY_SPACING to zero. + + + +

*Turning off column mode during bibliography output

+

+Macro: BIBLIOGRAPHY_NO_COLUMNS <toggle> + +

+By default, if your document is +set in columns, +mom sets the bibliographies in columns, too. However, +if your document is set in columns and you'd like the bibliographies not +to be, just invoke BIBLIOGRAPHY_NO_COLUMNS with no +argument. The bibliography pages will be set to the full page measure +of your document. +

+If you output bibliographies at the end of each document in a +collated +document set in columns, column mode will automatically +be reinstated for each document, even with +BIBLIOGRAPHY_NO_COLUMNS turned on. +

+ + + +

*Bibliography-page page numbering style

+

+Macro: BIBLIOGRAPHY_PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha + +

+Use this macro to set the page numbering style of bibliography pages. +The arguments are identical to those for +PAGENUM_STYLE. +The default is digit. You may want to change it +to, say, alpha, which you would do with +

+

+	.BIBLIOGRAPHY_PAGENUM_STYLE alpha
+
+ + + +

*Setting the first page number of bibliography pages

+

+Macro: BIBILOGRAPHY_FIRST_PAGENUMBER <page # that appears on page 1 of bibliographies> + +

+Use this macro with caution. If all bibliographies for several +collated +documents are to be output at once, i.e. not at the end of each +separate doc, BIBLIOGRAPHY_FIRST_PAGENUMBER tells +mom what page number to put on the first page of +the bibliography. +

+If you set BIBLIOGRAPHY_FIRST_PAGENUMBER in collated +documents where the bibliographies are output after each separate doc, +you have to reset every separate document's first page number after +COLLATE +and before +START. +

+ + + +

*Omitting a page number on the first page of bibliographies

+

+Macro: BIBLIOGRAPHY_NO_FIRST_PAGENUM <toggle> + +

+This macro is for use only if FOOTERS are on. It +tells +BIBLIOGRAPHY +not to print a page number on the first bibliography page. +Mom's default is to print the page number. +

+ + + +

*Suspending pagination of bibliography pages

+

+Macro: SUSPEND_PAGINATION +
+Macro: RESTORE_PAGINATION + +

+SUSPEND_PAGINATION doesn't take an argument. +Invoked immediately prior to +BIBLIOGRAPHY, +it turns off pagination for the duration of the bibliography. +Mom continues, however to increment page numbers +silently. +

+To restore normal document pagination after bibliographies, invoke +RESTORE_PAGINATION (again, with no argument) +immediately after you've finished with your bibliography. + +

2. Bibliography page header/footer control

+

+ +If you wish to modify what appears in the header/footer that appears +on bibliography pages, make the changes before you invoke +BIBLIOGRAPHY, +not afterwards. +

+Except in the case of +DOCTYPE CHAPTER, +mom prints the same header or footer used throughout +the document on bibliography pages. Chapters get treated differently +in that, by default, mom does not print the +header/footer centre string (normally the chapter number or chapter +title.) In most cases, this is what you want. However, should you +not want mom to remove the centre string from +the bibliography pages headers/footers, invoke +BIBLIOGRAPHY_HEADER_CENTER +with no argument. +

+An important change you may want to make is to put the word +"Bibliography" in the header/footer centre position. +To do so, do +

+

+	.HEADER_CENTER "Bibliography"
+	           or
+	.FOOTER_CENTER "Bibliography"
+
+ +prior to invoking .BIBLIOGRAPHY. If your +DOCTYPE +is CHAPTER, you must also invoke +BIBLIOGRAPHY_HEADER_CENTER +for the HEADER_CENTER to appear. +

+ +

*Bibliography page header/footer centre string

+

+Macro: BIBLIOGRAPHY_HEADER_CENTER toggle + +

+If your +DOCTYPE +is CHAPTER and you want mom to include +a centre string in the headers/footers that appear on bibliography pages, +invoke BIBLIOGRAPHY_HEADER_CENTER (or +BIBLIOGRAPHY_FOOTER_CENTER) with no argument. +Mom's default is NOT to print the centre string. +

+If, for some reason, having enabled the header/footer centre string +on bibliography pages, you wish to disable it, invoke the same macro +with any argument (OFF, QUIT, Q, X...). +

+ +

*Allow headers on bibliography pages

+

+Macro: BIBLIOGRAPHY_ALLOWS_HEADERS <none> | ALL + +

+By default, if HEADERS are on, mom +prints page headers on all bibliography pages except the first. If you +don't want her to print headers on bibliography pages, do +

+

+	.BIBLIOGRAPHY_ALLOWS_HEADERS OFF
+
+ +If you want headers on every page including the first, do +

+

+	.BIBLIOGRAPHY_ALLOWS_HEADERS ALL
+
+ +NOTE: If FOOTERS are on, +mom prints footers on every bibliography page. This is +a style convention. In mom, there is no such beast +as BIBLIOGRAPHY_ALLOWS_FOOTERS OFF. +

+ +

3. Bibliography page first page head (title) control

+ + + +

*Bibliography pages first page head (title) string

+

+Macro: BIBLIOGRAPHY_STRING "<head to print at the top of bibliography pages>" + +

+By default, mom prints the word "BIBLIOGRAPHY" +as a head at the top of the first page of a bibliography. If you want her +to print something else, invoke BIBLIOGRAPHY_STRING with +the bibliography page head you want, surrounded by double-quotes. If +you don't want a head at the top of the first bibliography page, invoke +BIBLIOGRAPHY_STRING with a blank argument (either two +double-quotes side by side -- "" -- or no argument +at all). +

+ + + +

*Bibliography page first page head (title) control

+

+See +Arguments to the control macros. +

+

+.BIBLIOGRAPHY_STRING_FAMILY    default = prevailing document family; default is Times Roman
+.BIBLIOGRAPHY_STRING_FONT      default = bold
+.BIBLIOGRAPHY_STRING_SIZE*     default = +1
+.BIBLIOGRAPHY_STRING_QUAD      default = centred
+
+*Relative to the size of the bibliography text (set with BIBLIOGRAPHY_PT_SIZE)
+
+ + + +

*Bibliography-page head (title) underscoring

+

+Macro: BIBLIOGRAPHY_STRING_UNDERSCORE toggle | 2 + +

+Invoked by itself, BIBLIOGRAPHY_STRING_UNDERSCORE will +underscore the bibliography page head. Invoked with the argument 2 +(i.e. the digit 2), BIBLIOGRAPHY_STRING_UNDERSCORE will +double-underscore the head. Invoked with any other argument, the macro +disables underscoring of the head. +

+Mom's default is to double-underscore the +head, therefore if you want no underscoring, you must insert +.BIBLIOGRAPHY_STRING_UNDERSCORE OFF (or QUIT, X, NO, +NONE, etc.) into your document prior to outputting a +bibliography with +BIBLIOGRAPHY. + + + +

*Bibliography-page head (title) automatic capitalization

+

+Macro: BIBLIOGRAPHY_STRING_CAPS toggle + +

+Invoked by itself, BIBLIOGRAPHY_STRING_CAPS will +automatically capitalize the bibliography page head. Invoked with any +other argument, the macro disables automatic capitalization of the +head. +

+If you're generating a table of contents, you may want the +bibliography page head string in caps, but the toc entry in caps/lower +case. If the argument to +BIBLIOGRAPHY_STRING +is in caps/lower case and BIBLIOGRAPHY_STRING_CAPS is +on, this is exactly what will happen. +

+Mom's default is to capitalize the bibliography-page +head string. +

+ +
+ +


+Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/reserved.html b/contrib/mom/momdoc/reserved.html new file mode 100644 index 0000000..ab8eeb1 --- /dev/null +++ b/contrib/mom/momdoc/reserved.html @@ -0,0 +1,2200 @@ + + + + +Mom -- List of reserved words + + + + + +Prev   Back to Table of Contents +

+ + + +

LIST OF RESERVED WORDS

+ +

The following is a list of "reserved" words used by +mom. Before changing the name of any macro or +document element tag with +ALIAS, +I strongly recommend doing a search of this page for your proposed +new name. If you find it in the left hand column, DON'T USE IT. +Choose something else instead. +

+Anyone interested in playing around inside mom's macro +file (om.tmac) will find this list useful as well since it lists all +(I hope) the macros, strings, diversions and number registers +mom uses, along with brief descriptions of their +functions. +

+

+TYPESETTING
+===========
+
++++MACROS+++
+
+Page layout
+-----------
+PAGELENGTH  Page width
+PAGE        Page width/length; left, right, top, bottom margins
+PAGEWIDTH   Page width
+PAPER       Letter, legal, or A4
+
+B_MARGIN  Space to leave at page bottom
+L_MARGIN  Page offset
+R_MARGIN  Line length as a function of
+          pagewidth minus pageoffset minus rightmargin
+T_MARGIN  Advance lead from page top
+
+Page control
+------------
+DO_B_MARGIN  Margin at bottom of page; trap-invoked
+DO_T_MARGIN  Margin at top of page; trap-invoked
+
+Style
+-----
+COLOR          Change color of text to predefined value
+CONDENSE       Set percentage of pseudo-condense (alias of
+               CONDENSE_OR_EXTEND)
+EXTEND         Set percentage of pseudo-extend (alias of
+               CONDENSE_OR_EXTEND)
+FAMILY         Family
+FT             Font
+FALLBACK_FONT  Font to use whenever FAMILY or FT errors occur
+LL             Line length
+LS             Leading (.vs)
+NEWCOLOR       Define a text color
+PT_SIZE        Point size
+SETBOLDER      Set degree of emboldening (pseudo-bold) in units
+SETSLANT       Set degree of pseudo-italic
+XCOLOR         Initialize a color from rgb.txt
+
+Autolead
+--------
+AUTOLEAD  Always lead n points more than .PT_SIZE
+
+Flush
+-----
+JUSTIFY  Justified text
+QUAD     Filled text, left, right, or centre
+
+Quad
+----
+CENTER  Non-filled text, centre
+LEFT    Non-filled text, left
+RIGHT   Non-filled text, right
+
+Hyphenation
+-----------
+HY      Turn hyphenation on/off, or set LINES, MARGIN, SPACE
+HY_SET  Set LINES, MARGIN, SPACE in a single command
+
+Advanced style
+--------------
+KERN       Turn automatic kerning on or off
+LIGATURES  Turn ligatures on or off
+SS         Sentence space control
+WS         Word space control
+
+Line breaks
+-----------
+BR      Alias of br
+EL      Breaks line but doesn't advance
+SPACE   Alias of sp
+SPREAD  Alias of brp
+
+Ald/rld
+-------
+ALD  Advance lead
+RLD  Reverse lead
+
+Indents
+-------
+HI   Indent hang
+IB   Indent both
+IBX  Indent both off
+IL   Indent left
+ILX  Indent left off
+IQ   Indents off
+IR   Indent right
+IRX  Indent right off
+IX   Indents off -- deprecated
+TI   Indent temporary
+
+Tabs
+----
+ST       String tab
+TAB_SET  Tab Set
+TN       Tab Next
+TQ       Tab Quit
+
+MCO      Turn on multi-column mode
+MCR      Return to top of column
+MCX      Turn off multi-column mode
+
+Underscore
+----------
+UNDERSCORE   Underscores words or phrases
+UNDERSCORE2  Double underscores words or phrases
+
+Underline
+---------
+UNDERLINE  Underlines whole passages (Courier only)
+
+Smart Quotes
+------------
+SMARTQUOTES  Turns smart quotes on or off
+
+Misc + Support
+--------------
+BR_AT_LINE_KERN  Deposit a break before RW and WE
+CAPS             Convert u/lc to UC
+COMMENT          Don't print lines till COMMENT OFF (alias of SILENT)
+DROPCAP_ADJUST   Points (poss. fractional) to add/subtract
+                 from drop caps
+DROPCAP          Create drop cap
+DROPCAP_FAMILY   Drop cap family
+DROPCAP_FONT     Drop cap font
+DROPCAP_GUTTER   Drop cap gutter
+DROPCAP_OFF      Support only; restores .in if there was one
+ESC_CHAR         Alias for .ec
+EW               Extra white -- loosen overall line kern
+                 (character spacing)
+LEADER_CHARACTER Sets leader character
+PAD              Insert padding spaces at marked places
+PADMARKER        Sets character to use instead of # in PAD
+PRINT            Simply prints args passed to it; keeps my code
+                 indented nicely
+RW               Reduce white -- tighten overall line kern
+                 (character spacing)
+SILENT           Don't print lines till SILENT OFF
+SIZESPECS        Get cap-height, x-height and descender depth for
+                 current point size
+TRAP             Turn traps off or on
+
++++DIVERSIONS+++
+
+NO_FLASH    Diverts output of SILENT or COMMENT so they don't print
+NULL        Diverts SIZESPECS in PRINT_HDRFTR so it doesn't screw up
+            FOOTER and FOOTNOTE processing when FOOTERS are on
+PAD_STRING  Diverts $PAD_STRING for processing
+TYPESIZE    Diverts SIZESPECS routine so it doesn't print
+
++++NUMBER REGISTERS+++
+
+#ABORT_FT_ERRORS        Abort on FT errors? (toggle)
+#ALD                    ALD value
+#ARGS_TO_LIST           Tells LIST whether LIST was invoked with a legal
+                        arg; controls LIST OFF processing
+#ARGS_TO_SQ             Tells SMARTQUOTES whether it was invoked with a
+                        legal arg; controls SMARTQUOTES OFF
+                        processing
+#AUTOLEAD_FACTOR        Using FACTOR arg to AUTOLEAD? (toggle)
+#AUTO_LEAD              Using autolead? (toggle)
+#AUTO_LEAD_VALUE        Auto leading value
+#BL_INDENT              Value of left indent when IB
+#B_MARGIN               Bottom margin
+#BOLDER_UNITS           # of units to embolden type
+#BR_INDENT              Value of right indent when IB
+c                       column mark
+#CONDENSE               Are we in pseudo-condense mode? (toggle)
+#CONDENSE_WAS_ON        For restoring \*[COND] in DROPCAP
+#COND_WIDTH             Width of pseudo-condensed type
+                        (pointsize x $COND_PERCENT)
+#CURRENT_L_LENGTH       Current line length at first invocation of LIST;
+                        like #ORIG_L_LENGTH
+#CURRENT_TAB            Current tab number
+#DC_GUT                 Width of dropcap gutter
+#DEGREES                # of degrees slant for pseudo-italic
+#ENUMERATOR<n>          Number register enumerator for depth <n> in lists 
+#EXT_WIDTH              Width of pseudo-extended type
+                        (pointsize x $EXT_PERCENT)
+#EXTEND                 Are we in pseudo-extend mode? (toggle)
+#EXTEND_WAS_ON          For restoring \*[EXT] in DROPCAP
+#FILL_MODE              Are we in fill mode (i.e. \n(.u=1)? (toggle)
+#H_INDENT               Value of left indent when IH
+#HL_INDENT              Value of the hang when IH
+#HYPHENATE              Hyphenation on? (toggle)
+#HY_SET                 Did we manually set hyphenation parameters?
+                        (toggle)
+#IN_TAB                 Are we in a tab? (toggle)
+                        Set in macro TAB; used in ST to determine
+                        whether to add #ST_OFFSET to #ST<#>_OFFSET
+#INDENT_ACTIVE          Indicates whether an indent is active (toggle)
+#INDENT_BOTH_ACTIVE     Toggle
+#INDENT_LEFT_ACTIVE     Toggle
+#INDENT_RIGHT_ACTIVE    Toggle
+#INDENT_STYLE_BOTH      Indicates IB when #INDENT_ACTIVE=1 (toggle)
+#INDENT_STYLE_HANG      Indicates IH when #INDENT_ACTIVE=1 (toggle)
+#INDENT_STYLE_LEFT      Indicates IL when #INDENT_ACTIVE=1 (toggle)
+#INDENT_STYLE_RIGHT     Indicates IR when #INDENT_ACTIVE=1 (toggle)
+#INDENT_STYLE_TEMP      Indicates IT when #INDENT_ACTIVE=1 (toggle)
+#IX_WARN                Toggles to 1 the first time IX is user-invoked
+#JUSTIFY                In EW/RW, when BR_AT_LINE_KERN, whether to
+                        break or break-spread preceding line (toggle)
+#KERN                   Kern on? (toggle)
+#LAST_TAB               Last tab number set in multi-columns
+#LEAD                   Leading (alias)
+#LIGATURES              Ligatures on? (toggle)
+#LIST_INDENT<n>         Left indent of list <n>
+#L_INDENT               Value of left indent
+#L_LENGTH               Line length
+#L_MARGIN               Page offset if set with LMARGIN;
+                        if .po used, \n(.o returns page offset
+#LOOP                   #LOOP=1 if a while loop executes; otherwise 0.
+#NEXT_DEPTH_BACK        Next list level back in lists
+#NEXT_TAB               Current tab number + 1 (used in TN)
+#NEXT_TAB               Next tab in an n+1 sequence
+#OLD_LEAD               Lead in effect prior to changing it with .vs
+                        in .LS
+#OPEN_CLOSE             Manipulates character " to print `` or ''
+#ORIGINAL_L_LENGTH      Used in LIST for IB processing; holds \n(.l
+p                       Output line horiz position at end of
+                        $PAD_STRING
+#PAD_COUNT              Number of times # was included in arg to PAD
+#PAD_LIST_DIGITS        Pad list digits to the left? (toggle)
+#PAD_SPACE              Size of padding space
+#PAGE_LENGTH            Page length (alias)
+#PAGE_WIDTH             Page width
+#PP_ACTIVE              Are we in the context of a para? (toggle)
+#PRINT_FOOTER_ON_PAGE_1 (toggle)
+#PSEUDO_FILL            Signals that LEFT, RIGHT or CENTER is
+                        in effect (toggled off, i.e. to 0, when
+                        QUAD  or JUSTIFY is called)
+#PT_SIZE                Point size (fractional) in units (alias)
+#Q_AT_TOP               Does a quote start at the top of a new page?
+                        (toggle)
+#QUAD                   In autoquad mode? (toggle)
+#QUIT                   Tells LIST whether to exit lists completely
+                        (toggle)
+#REMOVE                 Used in LIST OFF cleanup
+#RESTORE_LEAD           Lead value in effect prior to AUTOLEAD
+#RESTORE_LINE_LENGTH    Restores actual line length in RULE
+#RESTORE_LN_NUMBER      Start linenumbering again with stored
+                        #NEXT_LN? (toggle)
+#RESTORE_PT_SIZE        Stores current point size (in units) prior
+                        to underscore
+#R_INDENT               Value of right indent
+#R_MARGIN               Right margin
+#RESTORE_PREV_INDENT    Tells LIST OFF what kind of indent was active
+                        prior to first invocation of LIST
+#RLD                    RLD value
+#SILENT                 Is silent on? (toggle)
+#SIZE_FOR_PAD           Used to ensure that the size in effect prior
+                        to PAD is restored at the start of every
+                        iteration of $PAD_STRING
+#SLANT_ON               Is SLANT on? (toggle)
+#SMART_QUOTES           Smartquotes on? (toggle)
+#SPACE_TO_END           Whitespace at end of string passed to PAD
+#ST<#>_LENGTH           Length of ST<#>; calculated during ST <#>
+#ST<#>_MARK             Page offset of autotab <#> at ST<#>X
+#ST_NUM                 Incrementing counter for autotab identification
+#ST_OFFSET              Offset (from current tab) to add to #ST<#>_OFFSET
+                        when calculating string indents set from within
+                        tabs
+#ST<#>_OFFSET           Indent of autotab <#> (page offset)
+#STORED_L_INDENT        Current left indent at first invocation of LIST
+#STORED_R_INDENT        Current right indent at first invocation of LIST
+#STORED_BL_INDENT       Current "both, left" indent at first invocation
+                        of LIST
+#STORED_BR_INDENT       Current "both, right" indent at first invocation
+                        of LIST
+#STORED_HL_INDENT       Current hanging indent at first invocation
+                        of LIST
+#STORED_T_INDENT        Current temporary indent at first invocation
+                        of LIST
+#T_INDENT               Value of temporary indent
+#T_MARGIN               Top margin
+#TAB_ACTIVE             Are we in a tab? (toggle)
+#TAB_NUMBER             Tab number
+#TAB_OFFSET             Tab indent
+#TOP                    Set to 1 in T_MARGIN, DO_T_MARGIN and ALD; tells
+                        the first LS or AUTOLEAD on a page to maintain
+                        the baseline position prior to the LS call
+#TOP_BASELINE_ADJ       Amount by which to adjust the baseline position
+                        of the first line on the page if an LS or AUTOLEAD
+                        request differs from the lead current at the end of
+                        the previous page
+#TOTAL_LISTS            Total number of lists in a nest
+#USER_SET_L_LENGTH      Did user invoke LL? (toggle)
+#USER_SET_TITLE_ITEM    Did user invoke TOC_TITLE_ENTRY?
+u                       Horiz position of start of underscore
+
++++STRINGS+++
+
+$COND_PERCENT        Percentage by which to pseudo-condense type
+$COLOR_SCHEME        Color scheme used in NEWCOLOR
+$CURRENT_QUAD        Restores current quad value in RULE
+$CURRENT_TAB         Current tab number
+$DC_ADJUST           +|- # of points to subtract from dropcap
+$DC_FAM              Drop cap family
+$DC_FT               Drop cap font
+$ENUMERATOR<n>       String enumerator for depth <n> in lists 
+$EXT_PERCENT         Percentage by which to pseudo-extend type
+$FAMILY              Family
+$FAMILY_FOR_PAD      Used to ensure that the family in effect prior
+                     to PAD is restored at the start of every
+                     iteration of $PAD_STRING
+$FONT                Font
+$FONT_FOR_PAD        Used to ensure that the font in effect prior
+                     to PAD is restored at the start of every
+                     iteration of $PAD_STRING
+$PAD_MARKER          Character to mark off padding in PAD
+$PAD_STRING          Arg passed to PAD
+$QUAD_VALUE          Quad value (left, right, centre, justify)
+$QUOTE0              Open quotation marks
+$QUOTE1              Close quotation marks
+$RESTORE_COND        Restores the pseudo-condense value in effect
+                     prior to DROPCAP
+$RESTORE_EXT         Restores the pseudo-extend value in effect
+                     prior to DROPCAP
+$RESTORE_FAM         Used to restore the family in effect
+                     prior to DROPCAP
+$RESTORE_FT          Used to restore the font/fontstyle in effect
+                     prior to DROPCAP
+$RESTORE_PT_SIZE     Used to restore the point size of normal
+                     running text after a dropcap
+$RESTORE_QUAD_VALUE  Quad value for use in restoring L, R, C, J
+                     (after tabs)
+$SAVED_STYLE         Current style, if there is one (used in FAMILY)
+$SEPARATOR<n>        Separator for depth <n> in lists
+$SS_VAR              Holds + or - sentence space value
+$ST<#>_FILL          Always QUAD if QUAD passed to ST <#>
+$ST<#>_QUAD_DIR      Quad direction supplied to ST for <#>
+$TAB_NUMBER          Argument passed to TAB macro to call TAB# macro
+                     created in TAB_SET
+$WS_CONSTANT         12; used to hold groff default wordspace
+$WS                  Holds WS value; concatenation of WS_CONSTANT and
+                     WS_VAR
+$WS_VAR              + or - value to add to $WS_CONSTANT
+BLACK                Pre-defined black color
+black                Pre-defined black color
+WHITE                Pre-defined white color
+white                Pre-defined white color
+
++++ALIASES+++
+
+ALIAS         als
+ALIASN        aln
+BR            br
+CENTRE        CENTER
+COLOUR        COLOR
+COMMENT       SILENT
+CONDENSE      CONDENSE_OR_EXTEND
+EXTEND        CONDENSE_OR_EXTEND
+FAM           FAMILY
+FT            FONT
+HYPHENATE     HY
+HYPHENATION   HY
+LIG           LIGATURES
+LL            LINE_LENGTH
+MAC           de
+NEW_PAGE      bp
+NEWCOLOUR     NEWCOLOR
+NEWPAGE       NEW_PAGE
+PAGELENGTH    PAGE_LENGTH
+PAGE_LENGTH   pl
+PAGEWIDTH     PAGE_WIDTH
+SPREAD        brp
+SP            sp
+STRING        ds
+TABSET        TAB_SET
+TB            TAB
+TI            IT
+UNDERSCORE_2  UNDERSCORE2
+XCOLOUR       XCOLOR
+
++++ALIASES FOR NUMBER REGISTERS+++
+
+#DIVER_DEPTH    dn   -- diversion depth
+#DIVER_WIDTH    dl   -- diversion width
+#INDENT         .i   -- value of current indent
+#LEAD           .v   -- line space (.vs, not .ls)
+#L_LENGTH       .l   -- line length
+#NUM_ARGS       .$   -- number of arguments passed to a macro
+#PAGE_LENGTH    .p   -- page length
+#PT_SIZE        .ps  -- current point size (fractional) in units
+#TRAP_DISTANCE  .t   -- distance to next trap
+
++++INLINE ESCAPES+++
+
+BCK          Inline backward horizontal movement
+BOLDER       Pseudo-bold on
+BOLDERX      Pseudo-bold off
+BP           Back points (horizontal movement)
+BU           Back units (inline pairwise kerning)
+COND_FOR_SUP Pseudo-condense string for use with superscripts
+             (called with CONDSUP)
+COND_FOR_SUP Pseudo-extend string for use with superscripts (called
+             with EXTSUP)
+COND         Pseudo-condense type
+CONDX        Pseudo-condense off
+CONDSUP      Pseudo-condensed superscript (using value set with
+             CONDENSE)
+CONDSUPX     Pseudo-condensed superscript off
+DOWN         Inline downward vertical movement
+EXT          Pseudo-extend type
+EXTX         Pseudo-extend off
+EXTSUP       Pseudo-extended superscript
+EXTSUPX      Pseudo-extended superscript off
+FP           Forward points (horizontal movement)
+FU           Forward units (inline pairwise kerning)
+FWD          Inline forward horizontal movement
+LEADER       Deposit leader to end of current LL or TAB
+RULE         Draw a rule to the full measure of the current line or
+             tab length
+SLANT        Slant (pseudo-italic on
+SLANTX       Slant off
+ST<#>        String tab end marker
+ST<#>        String tab start marker
+SUP          Superscript
+SUPX         Superscript off
+UP           Inline upward vertical movement
+
++++SPECIAL CHARACTERS+++
+
+FEET         The foot character \(fm
+INCH         The inch character \(fm\(fm
+
+------------------------------------------------------------------------
+
+DOCUMENT PROCESSING
+===================
+
++++MACROS+++
+
+Document info
+-------------
+AUTHOR          Author
+CHAPTER         Chapter number
+CHAPTER_TITLE   Chapter title
+COPYRIGHT       Copyright info (covers only)
+DOCTITLE        Overall doc title (for collated docs)
+DRAFT           Draft number
+MISC            Misc info (covers only)
+REVISION        Revision number
+SUBTITLE        Doc subtitle
+TITLE           Doc title
+
+Covers
+------
+COVER               What goes on cover
+COVERS              Whether covers get printed (toggle)
+COVER_ADVANCE       Set vertical start position of cover material
+COVER_LEAD          Overall leading of covers
+COVERTITLE          User-defined cover title string
+DOC_COVER           What goes on doc cover
+DOC_COVERS          Whether doc covers get printed
+DOC_COVER_ADVANCE   Set vertical start position of doc cover material
+DOC_COVER_LEAD      Overall leading of doc covers
+DOC_COVERTITLE      User-defined doc cover title string
+
+Document style
+--------------
+COPYSTYLE     Output style (DRAFT or FINAL)
+DEFAULTS      In START, sets defaults
+DOCTYPE       Kind of doc (DEFAULT, CHAPTER, NAMED, LETTER)
+PAGENUMBER    Page number that appears on 1st page of doc
+PAPER         Paper size (LETTER, LEGAL, A4)
+PRINTSTYLE    Print style (TYPEWRITE or TYPESET)
+NUMBER_LINES  Number output lines in the left margin
+
+Document tags and macros
+------------------------
+ADD_SPACE               Special macro to add space to the top of a pages after
+                        page 1; must be preceded by NEWPAGE
+BIBLIOGRAPHY            Begin a bibliography page
+BIBLIOGRAPHY_TYPE       LIST or PLAIN
+BLOCKQUOTE              Block-indented, quoted text
+COL_BREAK               Breaks and spreads line before invocation; moves to
+                        next column on page or 1st col of next page.  An alias
+                        of COL_NEXT.
+COL_NEXT                Moves to next column on page or 1st col of next page
+ENDNOTE                 Endnote
+ENDNOTE_REFS            Send REFs to endnotes
+ENDNOTES                Output endnotes
+EPIGRAPH                Epigraph before 1st para 
+FINIS                   Prints --END--
+FOOTNOTE                Collects footnotes in text for printing at bottom of page
+FOOTNOTE_REFS           Send REFs to footnotes
+HEAD                    Section title (main heads)
+HYPHENATE_REFS          Turn on/off hyphenation of REF references
+ITEM                    Begin a list item
+LINEBREAK               Break between narrative sections
+LIST                    Initialize a list
+MN                      Margin note
+MN_INIT                 Initialize parameters for margin notes
+NUMBER_LINES            Number text lines
+NUMBER_BLOCKQUOTE_LINES Number blockquote lines
+NUMBER_QUOTE_LINES      Number quote lines
+PAD_LIST_DIGITS         Leave space for two-numeral digit enumerators
+                        in a list
+PARAHEAD                Paragraph head
+PP                      Paragraph
+QUOTE                   Poetic or line for line quotes
+REF                     Wrapper around FOOTNOTE or ENDNOTE, depending
+                        on FOOTNOTE_REFS or ENDNOTE_REFS
+REF(                    Begin embedded reference, parens
+REF)                    End embedded reference, parens
+REF[                    Begin embedded reference, square brackets
+REF]                    End embedded reference, square brackets
+REF{                    Begin embedded reference, braces
+REF}                    End embedded reference, braces
+REF_INDENT              Amount of 2nd line indent of references for
+                        footnote, endnote or bibliography refs
+RESET_LIST              Reset digit or alpha list enumerator
+SHIFT_LIST              Move a list over to the right
+START                   Sets doc defaults and prints info collected
+                        with doc info macros
+SUBHEAD                 Subheads
+
+Headers/footers
+---------------
+BREAK_QUOTE          Manually break a footnoted quote that crosses
+                     a page/column
+DO_FOOTER            Prints footer (after footnote processing, if any)
+FOOTER_ON_FIRST_PAGE Print footer on first page? (toggle)
+FOOTER               Trap-invoked footer macro
+HEADER               Trap-invoked header macro
+PAGINATE             Turns page numbering on or off (doc default=on)
+PAGINATE_TOC         Turns pagination of toc on or off (default=on)
+RECTO_VERSO          Enables switch HEADER_LEFT and HEADER_RIGHT on
+                     alternate pages
+
+Alter doc "look" and/or change defaults
+---------------------------------------
+***General***
+
+ALWAYS_FULLSPACE_QUOTES  Fullspace quotes instead of default
+                         1/2 spacing them.
+ATTRIBUTE_STRING         What to print before author (default is "by")
+CHAPTER_STRING           What to print whenever the word "chapter"
+                         is required
+COLUMNS                  Print in columns
+DOC_FAMILY               Overall doc family
+DOCHEADER                Print doc header?
+DOCHEADER_ADVANCE        Start position of docheader (relative to top
+                         of page)
+DOCHEADER_LEAD           +|- value applied to #DOC_LEAD to in/decrease
+                         leading of doc header
+DOC_LEAD_ADJUST          Adjust #DOC_LEAD to fill page to #B_MARGIN
+DOC_LEAD                 Overall doc leading
+DOC_LEFT_MARGIN          Doc left margin
+DOC_LINE_LENGTH          Doc line length
+DOC_PT_SIZE              Overall doc point size
+DOC_RIGHT_MARGIN         Doc right margin
+DOC_TITLE                Overall doc title that gets printed in
+                         headers/footers (mostly for use with collated
+                         docs where each doc is an article with a
+                         different title
+DRAFT_STRING             What to print whenever the word "draft" is
+                         required
+DRAFT_WITH_PAGENUMBER    Attach draft/revision info to page number
+                         (instead of putting it HEADER centre)
+REVISION_STRING          What to print whenever the word "revision"
+                         is required
+
+***Covers***
+
+COVER_ADVANCE            Vertical place on page to start outputting
+                         cover material
+COVER_LEAD               Lead in/decrease for cover pages
+DOC_COVER_ADVANCE        Vertical place on page to start outputting
+                         doc cover material
+DOC_COVER_LEAD           Lead in/decrease for doc cover pages
+
+***Epigraphs and finis***
+
+EPIGRAPH_AUTOLEAD        Autolead value for epigraphs
+EPIGRAPH_INDENT          Value by which to multiply PP_INDENT for
+                         block epigraphs
+FINIS_STRING             What to print when FINIS is invoked
+
+***Footnotes***
+
+FOOTNOTE_AUTOLEAD             Autolead to use in footnotes
+FOOTNOTE_LINENUMBER_BRACKETS  Brackets for footnote linenumbers
+FOOTNOTE_LINENUMBER_SEPARATOR Separator for footnote linenumbers
+FOOTNOTE_MARKERS              Turns footnote markers on or off
+FOOTNOTE_MARKER_STYLE         STAR or NUMBER; default=STAR
+FOOTNOTE_RULE_ADJ             # of points to raise footnote rule from its
+                              baseline
+FOOTNOTE_RULE_LENGTH          Length of footnote separator rule
+FOOTNOTE_RULE                 Turns printing of fn separator rule on or off;
+                              default is on
+FOOTNOTE_SPACING              Post footnote item spacing
+FOOTNOTES_RUN_ON              Run footnotes on (line numbering mode only)
+RESET_FOOTNOTE_NUMBER         Reset fn# to 1, or, if arg PAGE, reset
+                              automatically to 1 on every page
+RUNON_WARNING                 Utility macro; warns if FOOTNOTES_RUN_ON
+                              was called when fn marker style is STAR or NUMBER
+
+***Endnotes***
+
+ENDNOTE_LEAD                 Leading for endnotes page
+ENDNOTE_LINENUMBER_BRACKETS  Brackets around line numbers identifying
+                             endnotes and text
+ENDNOTE_LINENUMBER_GAP       Amount of space to leave between line
+ENDNOTE_LINENUMBER_SEPARATOR Separator between line numbers identifying
+                             endnotes and the endnote item text
+                             endnotes and text
+ENDNOTE_MARKER_STYLE         NUMBER or LINE
+ENDNOTE_NUMBERS_ALIGN_RIGHT  Hang endnote numbers and align right
+ENDNOTE_NUMBERS_ALIGN_LEFT   Don't hang endnote numbers and align left
+ENDNOTE_PARA_INDENT          First line indent of paras in multi-para
+                             endnotes
+ENDNOTE_PARA_SPACE           Whether to space paras in multi-para endnotes
+ENDNOTE_PT_SIZE              Base point size for endnotes page
+ENDNOTE_STRING               Endnotes page head
+ENDNOTE_STRING_CAPS          Capitalize the endnotes string
+ENDNOTE_STRING_UNDERSCORE    Underscoring of endnotes page head
+ENDNOTE_TITLE                Endnotes identifying title
+ENDNOTE_TITLE_SPACE          Distance from top of page to endnotest title
+ENDNOTE_TITLE_UNDERSCORE     Underscoring of endnotes identifying title
+ENDNOTES_ALLOWS_HEADERS      Page headers on endnotes pages? (toggle)
+ENDNOTES_FIRST_PAGENUMBER    Page number to appear on page 1 of endnotes
+                             pages
+ENDNOTES_HDRFTR_CENTER       Print header/footer centre string on endnotes
+                             pages?
+ENDNOTES_HEADER_CENTER       Print header centre string on endnotes pages?
+ENDNOTES_FOOTER_CENTER       Print footer centre string on endnotes pages?
+ENDNOTES_NO_COLUMNS          Turn columnar mode off for endnotes pages
+ENDNOTES_NO_FIRST_PAGENUM    Don't print a pagenumber on page 1 of
+                             endnotes.
+ENDNOTES_PAGENUM_STYLE       Set numbering style for endnotes pages page
+                             numbers
+SINGLESPACE_ENDNOTES         Single space TYPEWRITE endnotes
+
+***Bibliographies***
+
+BIBLIOGRAPHY_ALLOWS_HEADERS    Allow headers on bib pages
+BIBLIOGRAPHY_FIRST_PAGENUMBER  Starting page number for bibliographies
+BIBLIOGRAPHY_HDRFTR_CENTER     Header/footer center string for bib pages
+BIBLIOGRAPHY_LEAD              Base lead of bib pages
+BIBLIOGRAPHY_NO_COLUMNS        De-columnize bibliographies
+BIBLIOGRAPHY_NO_FIRST_PAGENUM  Don't print a page number on the first
+                               page of bibliographies
+BIBLIOGRAPHY_PAGENUM_STYLE     Format for bib pages page numbering
+BIBLIOGRAPHY_PT_SIZE           Base point size for bib pages
+BIBLIOGRAPHY_SPACING           Post bib entry space
+BIBLIOGRAPHY_STRING            String for bib title
+BIBLIOGRAPHY_STRING_CAPS       Capitalize bib title string
+BIBLIOGRAPHY_STRING_UNDERSCORE Underscore bib title string
+SINGLESPACE_BIBLIOGRAPHY       Singlespace bibs if PRINTSTYLE TYPEWRITE
+
+***Headers and footers***
+
+FOOTER_COLOR             Footer color
+FOOTER_GAP               Distance between running text and footer
+FOOTER_MARGIN            Distance from footer to bottom of page
+FOOTERS                  Turns footers on or off
+HDRFTR_CENTER            String to go in centre part of header/footer;
+                         default doctype 
+HDRFTR_CENTER_CAPS       Centre part of header/footer in caps? (toggle)
+HDRFTR_CENTER_PAD        Pad hdrftr CENTER left or right by specified
+                         amount
+HDRFTR_GAP               Distance from header/footer to running text
+HDRFTR_LEFT_CAPS         Left part of header/footer in caps? (toggle)
+HDRFTR_LEFT              String to go in left part of header/footer;
+                         default is AUTHOR_1
+HDRFTR_LEFT              The header/footer left string
+HDRFTR_MARGIN            Distance from top of page to header
+HDRFTR_PLAIN             Header/footer fam/ft/ps all same as running
+                         text
+HDRFTR_RECTO             User-defined, single string recto
+                         header/footer
+HDRFTR_RIGHT_CAPS        Right part of header/footer in caps? (toggle)
+HDRFTR_RIGHT             The header/footer right string
+HDRFTR_RULE_GAP          Space between header/footer and header/footer
+                         rule
+HDRFTR_RULE_INTERNAL     Prints the header/footer rule
+HDRFTR_RULE              Turns header/footer rule on or off
+                         When invoked internally, prints the rule.
+HDRFTR_VERSO             User-defined, single string verso
+                         header/footer
+HEADERS                  Turns headers on or off
+SWITCH_HDRFTR            Switch HDRFTR_LEFT and HDRFTR_RIGHT
+
+***Page numbering***
+
+PAGENUM_HYPHENS          Turns on/off hyphens surrounding page numbers
+PAGENUM_ON_FIRST_PAGE    Print page number on first page when footers
+                         are on (toggle)
+PAGENUM_POS              Controls placement of page numbers;
+                         default=bottom/centred
+PAGENUM_SIZE             How much to in/decrease point size of page
+                         numbers*
+PAGENUM_STYLE            Page # in roman, Arabic, or alphabetic
+RESTORE_PAGINATION       Restore pagination after outputting non-
+                         paginated endnotes.
+SUSPEND_PAGINATION       Suspend pagination prior to outputting
+                         endnotes
+
+***Heads***
+
+HEADER_GAP               Space between header and running text
+HEADER_MARGIN            Space from top of page to header
+HEAD_CAPS                Print section titles in caps? (toggle)
+HEAD_SPACE               Give HEADs 2 line-spaces before. If OFF,
+                         only 1.  Default is on.
+HEAD_UNDERLINE           Underline section titles? (toggle)
+NUMBER_HEADS             Print head numbers
+RESET_HEAD_NUMBER        Reset head number
+
+***Subheads***
+
+NUMBER_SUBHEADS          Print subhead numbers
+RESET_SUBHEAD_NUMBER     Reset subhead number
+
+***Para heads***
+
+NUMBER_PARAHEADS         Print parahead numbers
+PARAHEAD_INDENT          How much to indent paraheads
+RESET_PARAHEAD_NUMBER    Reset parahead number
+
+***Paragraphs***
+
+INDENT_FIRST_PARAS       Indent 1st paras? (doc default=not indented) 
+PARA_INDENT              Size of para indent
+PARA_SPACE               Put a line space before paras
+PP_FONT                  Overall doc font
+
+***Quotes***
+
+Q_FITS                  Utility macro for DO_QUOTE
+Q_NOFIT                 Utility macro for DO_QUOTE
+QUOTE_AUTOLEAD          Leading of (block)quotes
+
+***Line/section breaks***
+
+LINEBREAK_CHAR           Linebreak character, iterations and positioning
+
+***Printstyle TYPEWRITE***
+
+ITALIC_MEANS_ITALIC      For TYPEWRITE; render .FT I in italic.
+SLANT_MEANS_SLANT        In TYPEWRITE, render \*[SLANT] as slant
+UNDERLINE_ITALIC         In TYPEWRITE, render .FT I as underlined
+UNDERLINE_QUOTES         In TYPEWRITE, underline quotes? (toggle)
+UNDERLINE_SLANT          In TYPEWRITE, render \*[SLANT] as underlined
+
+***Table of contents***
+
+TOC_APPENDS_AUTHORS      Appends author(s) to toc doc title entries
+TOC_LEAD                 Leading of toc pages
+TOC_PADDING              Number of placeholders for toc entries page
+                         numbers
+TOC_HEAD_INDENT          Indent of toc head entries
+TOC_HEADER_STRING        TOC header string (default=Contents)
+TOC_PAGENUM_STYLE        Page numbering style (hdrftr nums) of
+                         toc pages
+TOC_RV_SWITCH            Switch L/R margins of toc pages
+TOC_PARAHEAD_INDENT      Indent of toc parahead entries
+TOC_SUBHEAD_INDENT       Indent of toc subhead entries
+TOC_TITLE_ENTRY          User supplied toc doc title entry
+TOC_TITLE_INDENT         Indent of toc doc title entries
+
+***Aliases for headers and footers***
+HEADER_SIZE           HDRFTR_SIZE
+HEADER_RIGHT_PS       HDRFTR_RIGHT_SIZE
+HEADER_RIGHT_SIZE     HDRFTR_RIGHT_SIZE
+HEADER_RIGHT_FAM      HDRFTR_RIGHT_FAMILY
+HEADER_RIGHT_FAMILY   HDRFTR_RIGHT_FAMILY
+HEADER_RIGHT_FONT     HDRFTR_RIGHT_FONT
+HEADER_RIGHT_FT       HDRFTR_RIGHT_FONT
+HEADER_LEFT_PS        HDRFTR_LEFT_SIZE
+HEADER_LEFT_SIZE      HDRFTR_LEFT_SIZE
+HEADER_LEFT_FAM       HDRFTR_LEFT_FAMILY
+HEADER_LEFT_FAMILY    HDRFTR_LEFT_FAMILY
+HEADER_LEFT_FONT      HDRFTR_LEFT_FONT
+HEADER_LEFT_FT        HDRFTR_LEFT_FONT
+HEADER_CENTRE_PS      HDRFTR_CENTER_SIZE
+HEADER_CENTRE_SIZE    HDRFTR_CENTER_SIZE
+HEADER_FAM            HDRFTR_FAMILY
+HEADER_FAMILY         HDRFTR_FAMILY
+HEADER_CENTRE_FAM     HDRFTR_CENTER_FAMILY
+HEADER_CENTRE_FAMILY  HDRFTR_CENTER_FAMILY
+HEADER_CENTRE_FONT    HDRFTR_CENTER_FONT
+HEADER_CENTRE_FT      HDRFTR_CENTER_FONT
+HEADER_CENTER_PS      HDRFTR_CENTER_SIZE
+HEADER_CENTER_SIZE    HDRFTR_CENTER_SIZE
+HEADER_CENTER_FAM     HDRFTR_CENTER_FAMILY
+HEADER_CENTER_FAMILY  HDRFTR_CENTER_FAMILY
+HEADER_CENTER_FONT    HDRFTR_CENTER_FONT
+HEADER_CENTER_FT      HDRFTR_CENTER_FONT
+FOOTER_SIZE           HDRFTR_SIZE
+FOOTER_RIGHT_PS       HDRFTR_RIGHT_SIZE
+FOOTER_RIGHT_SIZE     HDRFTR_RIGHT_SIZE
+FOOTER_RIGHT_FAM      HDRFTR_RIGHT_FAMILY
+FOOTER_RIGHT_FAMILY   HDRFTR_RIGHT_FAMILY
+FOOTER_RIGHT_FONT     HDRFTR_RIGHT_FONT
+FOOTER_RIGHT_FT       HDRFTR_RIGHT_FONT
+FOOTER_LEFT_PS        HDRFTR_LEFT_SIZE
+FOOTER_LEFT_SIZE      HDRFTR_LEFT_SIZE
+FOOTER_LEFT_FAM       HDRFTR_LEFT_FAMILY
+FOOTER_LEFT_FAMILY    HDRFTR_LEFT_FAMILY
+FOOTER_LEFT_FONT      HDRFTR_LEFT_FONT
+FOOTER_LEFT_FT        HDRFTR_LEFT_FONT
+FOOTER_CENTRE_PS      HDRFTR_CENTER_SIZE
+FOOTER_CENTRE_SIZE    HDRFTR_CENTER_SIZE
+FOOTER_FAM            HDRFTR_FAMILY
+FOOTER_FAMILY         HDRFTR_FAMILY
+FOOTER_CENTRE_FAM     HDRFTR_CENTER_FAMILY
+FOOTER_CENTRE_FAMILY  HDRFTR_CENTER_FAMILY
+FOOTER_CENTRE_FT      HDRFTR_CENTER_FONT
+FOOTER_CENTER_PS      HDRFTR_CENTER_SIZE
+FOOTER_CENTER_SIZE    HDRFTR_CENTER_SIZE
+FOOTER_CENTER_FAM     HDRFTR_CENTER_FAMILY
+FOOTER_CENTER_FAMILY  HDRFTR_CENTER_FAMILY
+FOOTER_CENTER_FONT    HDRFTR_CENTER_FONT
+FOOTER_CENTER_FT      HDRFTR_CENTER_FONT
+
+   *relative to #DOC_PT_SIZE
+  **relative to overall ps of headers as set by HEADER_SIZE
+ ***relative to overall ps of endnotes pages
+****relative to overall ps of toc pages
+
++++LETTER MACROS+++
+
+CLOSING      Closing (i.e. Yours truly,)
+DATE         Date for letters
+FROM         Addresser's name and address
+GREETING     Full salutation (e.g. Dear John Smith,)
+NO_SUITE     Remove suite page numbers from bottom of letter pages
+TO           Addressee's name and address
+ALL_DONE     .em (the "end macro") for letters
+
++++SUPPORT+++
+
+CHECK_INDENT         Applies indents to doc elements inside ev's
+                     (head, subhead, etc)
+CLEANUP_DEFAULTS     Removes selected rregisters and strings
+                     from DEFAULTS after START
+DO_COVER             Formats and outputs covers
+DO_DOC_COVER         Formats and outputs doc covers
+D0_QUOTE             Outputs quotes with space adjustments before
+                     and after
+DIVER_FN_1_PRE  -+     
+DIVER_FN_2_PRE   |   Manage footnotes called inside diversions
+                 |   QUOTE, BLOCKQUOTE and EPIGRAPH
+DIVER_FN_2_POST -+
+DIVERT_FN_LEFTOVER   Diverts excess fn stored in FN_OVERFLOW into
+                     FOOTNOTE
+DIVERT_FN_OVERFLOW   Diverts excess fn stored in FN_OVERFLOW when
+                     FN_DEFER into FOOTNOTE
+DO_EPIGRAPH          Outputs epigraphs with space adjustments before
+                     and after
+FN_OVERFLOW_TRAP     Fixed at B_MARGIN; if footnotes run longer than
+                     B_MARGIN, diverts excess into FN_OVERFLOW
+GET_ROMAN_INDENT     Figures out amount of space to reserve
+                     for roman numerals in lists
+HDRFTR_RULE          Prints rule under header or over footer
+MN_OVERFLOW_TRAP     Trap-invoked macro to collect margin note
+                     overflows
+PRINT_FOOTNOTE_RULE  An alias of PRINT_FOOTNOTE; prints footnote
+                     separator rule
+PRINT_HDRFTR         Prints header/footer (trap invoked)
+PRINT_PAGE_NUMBER    Invoked in HEADER or FOOTER
+PRINT_USERDEF_HDRFTR Prints user defined, single string recto/verso
+                     header/footer
+PROCESS_SHIM         Calculates #SHIM when \n(.d is lower on the
+                     page than #T_MARGIN
+PROCESS_FN_IN_DIVER  Processes footnotes gathered in a diversion (called
+                     at page/column breaks)
+REMOVE_INDENT        Removes indents set with CHECK_INDENT
+Q_FITS               Handles spacing of quotes when quote fits on the page
+Q_NOFIT              Handles spacing of quotes when quote does not fit on
+                     the page
+QUIT_LISTS           Exit lists cleanly and completely
+SET_LIST_INDENT      Restore indent of a prev. level of list
+SHIM                 Advance to next "legal" baseline
+TERMINATE            .em that ensures deferred footnotes get output
+                     on final pages
+TRAPS                Sets hdrftr traps; optionally adjusts #DOC_LEAD
+                     to fill page to #B_MARGIN
+TYPEWRITER           Sets family (C), font (R) and point size (12)
+                     for PRINTSTYLE TYPEWRITE
+VFP_CHECK            Trap-sprung macro 1 legal baseline higher than
+                     where FOOTER will be sprung; checks whether
+                     there is, in fact, just enough room for
+                     another line of running text to be added to
+                     the page without jamming footnotes too close
+                     to running text.
+
++++DIVERSIONS+++
+
+B_QUOTE           Block (indented) quote text
+CLOSING           Closing (i.e. Yours truly,)
+EPI_TEXT          Epigraph text
+END_NOTES         Endnotes text
+FN_IN_DIVER       Footnotes gathered from inside a diversion
+FN_OVERFLOW       Excess footnotes when B_MARGIN is reached
+FOOTNOTES         Text of footnotes
+GREETING          Full salutation (e.g. Dear John Smith,)
+LETTERHEAD<n>     Date, addresser, addressee or greeting;
+                  <n> is from 1 to 4, supplied by #FIELD
+P_QUOTE           Line for line (poetic) quote text
+RUNON_FOOTNOTES   Special diversion for run-on footnotes
+RUNON_FN_IN_DIVER Special diversion for run-on footnotes inside
+                  (block)quotes
+TOC_ENTRIES       TOC entries
+
++++NUMBER REGISTERS+++
+
+#1ST_FN_VP_ADJ             An adjustment factor that ensures VFP
+                           doesn't fall below what should be the
+                           correct last printed line of running
+                           text
+#ADD_BREAK                 Instructs FOOTNOTEs and ENDNOTEs to add
+                           a break afer processing a footnote if
+                           we're not in fill mode
+#ADJ_BIB_LEAD              Adjust BIB_LEAD? (toggle)
+#ADJ_DOC_LEAD              Adjust DOC_LEAD? (toggle)
+#ADJ_TOC_LEAD              Adjust TOC_LEAD? (toggle)
+#ARG_NUM                   Keeps track of number of args passed to a
+                           macro
+#ARGS_TO_LIST              Was LIST passed some args? (toggle)
+#AUTHOR_[n]                Strings passed to AUTHOR
+#AUTHOR_LINES              # of lines of authors in doc header; odd=0
+                           even=1
+#AUTHOR_NUM                Keeps track of user-defined string
+                           AUTHOR_<#> in AUTHOR
+#AUTHORS                   Equals final value of AUTHOR_NUM;
+                           used for authors in doc header
+#BASELINE_MARK             In PP, the vertical position on the page
+                           (when paragraph spacing is on) after a
+                           quote or blockquote has been output and
+                           the post-quote space has been added.
+#BMARG                     Position of unvarying bottom margin
+                           during doc processing; required for
+                           collecting footnotes inside diversions
+#BIB_ALLOWS_HEADERS        Put headers on bib pages? (toggle)
+#BIB_ALLOWS_HEADERS_ALL    Put headers on all bib pages? (toggle)
+#BIB_FIRST_PAGE            Tells PRINT_PAGE_NUMBER about bibliography
+                           first page number
+#BIB_FIRST_PN              Starting pagenumber for bibliographies
+#BIB_HDRFTR_CENTER         Put a center string in bib page headers?
+                           (toggle)
+#BIB_LEAD                  Bibliography lead, expressed in points
+#BIB_LIST                  Output bibs in list style? (toggle)
+#BIB_NO_COLS               De-columnize bibliographies? (toggle)
+#BIB_NO_FIRST_PN           Put a page number on the first page of
+                           bibliographies? (toggle)
+#BIB_SINGLESPACE           Single-space TYPEWRITE bibliographies? (toggle)
+#BIB_SPACE                 Post item space for bibliography pages
+#BIB_STRING_CAPS           Capitalize bib title? (toggle)
+#BIB_STRING_UNDERSCORE     Underscore bib title? 0=no; 1=yes; 2=double
+#BIB_PS                    Base point size for bibliography pages expressed
+                           in points
+#BIBLIOGRAPHY              Are we doing a bib page? (toggle)
+#BQ_AUTOLEAD               Register created by BLOCKQUOTE_AUTOLEAD
+#BQ_LEAD                   Leading of blockquotes
+#BQUOTE_COLOR              Colored blockquotes? (toggle)
+#BQUOTE_LN                 Number blockquotes? (toggle)
+#BROKEN_QUOTE              Did we invoke BREAK_QUOTE? (toggle)
+#CAP_HEIGHT_ADJUST         Tallest cap height of strings LEFT, CENTER,
+                           and RIGHT in footers; used to place rule
+                           over footer
+#CAPS_WAS_ON               In HDRFTR, to re-enable running text CAPS
+                           (toggle)
+#CENTER_CAP_HEIGHT         Cap height of CENTER string in
+                           headers/footers
+#CHAPTER_TITLE_COLOR       Colored chapter title? (toggle)
+#CLOSING                   Is there a closing (for letters)? 1=yes
+#COL_L_LENGTH              Line length of columns
+#COL_NEXT                  Was COL_NEXT invoked? (toggle; used in
+                           FOOTER)
+#COL_NUM                   Incrementing counter of num of columns;
+                           for use with #COL_<#>_L_MARGIN
+#COL_TOTAL                 #COL_L_LENGTH + #GUTTER; used to calculate
+                           #COL_<#>_L_MARGIN
+#COLLATED_DOC              If 1, instructs TOC that this is a collated
+                           doc
+#COLUMNS                   Are columns turned on? (toggle)
+#COLUMNS_WERE_ON           Stores columnar state prior to outputting
+                           endnotes in no-columns mode
+#COPY_STYLE                1=draft, 2=final
+#COUNTERS_RESET            Tells FOOTNOTE if fn counters have
+                           been reset because of footnotes gathered
+                           inside a diversion
+#COVER_COLOR               Colored cover? (toggle)
+#COVER_START_POS           Vertical starting pos of cover material
+#COVER_TITLE_COLOR         Colored cover title? (toggle)
+#COVER_SUBTITLE_COLOR      Colored cover subtitle? (toggle)
+#COVER_ATTRIBUTE_COLOR     Colored cover attribution string? (toggle)
+#COVER_AUTHOR_COLOR        Colored cover author(s)? (toggle)
+#COVER_DOCTYPE_COLOR       Colored cover doctype? (toggle)
+#COVER_COPYRIGHT_COLOR     Colored cover copyright line? (toggle)
+#COVER_MISC_COLOR          Colored cover misc line? (toggle)
+#CURRENT_V_POS             \n(.d ; used in SHIM
+#COVERS                    Print covers? (toggle)
+#DATE_FIRST                Was .DATE invoked as first letter
+                           header after .START? (toggle)
+dc                         "mark" register for document columns
+#DIVER_FN                  Register that tells FOOTNOTE whether to
+                           "move" or "defer" a footnote collected
+                           inside a diversion
+#DEFER_BIB_SPACING         Tells DEFAULTS to do BIBLIOGRAPHY_SPACING
+                           if it was called before START
+#DEFER_PAGINATION          Tells COLLATE to restore pagination (from
+                           RESTORE_PAGINATION
+#DELAY_SHIM                Instructs DO_QUOTE to delay SHIM when quote
+                           falls at the top of a page
+#DEPTH_1                   Doc header depth with lead adjustment
+                           (#DOCHEADER_LINES * #DOCHEADER_LEAD)
+#DEPTH_2                   Doc header depth without lead adjustment
+                           (#DOCHEADER_LINES * #DOC_LEAD)
+#DEPTH_TO_B_MARGIN         Page length minus #B_MARGIN
+#DIVERSIONS_HY_MARGIN      A reasonable value for .hym applied to
+                           QUOTE, BLOCKQUOTE and EPIGRAPH to
+                           avoid excessive hyphenation if these are
+                           set quad left
+#DIVERTED                  Set to 1 in DIVERT_FN_OVERFLOW; reset
+                           subsequently in FOOTNOTES when called by
+                           PROCESS_FN_LEFTOVER to 2 or 3 for use by
+                           FOOTER to decide whether to in/decrease
+                           #FN_DEPTH when outputting footnotes
+#DOCHEADER_ADVANCE         Distance from top-of-page to baseline of
+                           docheader
+#DOCHEADER_COLOR           Colored docheader? (toggle)
+#DOCHEADER_LEAD            Lead of doc header
+                           (#DOC_LEAD + #DOCHEADER_LEAD_ADJ)
+#DOCHEADER_SPACE_ADJ       Lead difference between #DEPTH_1 and
+                           #DEPTH_2
+#DOC_COVER_START_POS       Vertical starting pos of doc cover material
+#DOC_COVERS                Print doc covers? (toggle)
+#DOC_COVER_COLOR           Colored cover? (toggle)
+#DOC_COVER_START_POS       Vertical starting pos of cover material
+#DOC_COVER_TITLE_COLOR     Colored doc cover title? (toggle)
+#DOC_COVER_SUBTITLE_COLOR  Colored doc cover subtitle? (toggle)
+#DOC_COVER_ATTRIBUTE_COLOR Colored doc cover attribution string? (toggle)
+#DOC_COVER_AUTHOR_COLOR    Colored doc cover author(s)? (toggle)
+#DOC_COVER_DOCTYPE_COLOR   Colored doc cover doctype? (toggle)
+#DOC_COVER_COPYRIGHT_COLOR Colored doc cover copyright line? (toggle)
+#DOC_COVER_MISC_COLOR      Colored doc cover misc line? (toggle)
+#DOC_HEADER                Whether to print a doc header (toggle)
+#DOC_LEAD_ADJ              Incrementing value (in units) added to
+                           #DOC_LEAD to fill page to #B_MARGIN
+#DOC_LEAD                  Leading used in body
+#DOC_L_LENGTH              Global L_LENGTH
+#DOC_L_MARGIN              Global L_MARGIN
+#DOC_LR_MARGIN_TMP         In HEADER, if RECTO_VERSO=1, temporarily
+                           holds DOC_L_MARGIN during page margin switch
+#DOC_PT_SIZE               Point size used for body text
+#DOC_R_MARGIN              Global R_MARGIN
+#DOCS                      Always 1 after START
+#DOC_TYPE                  1=default, 2=chapter, 3=named, 4=letter
+#DOING_COVER               Tells PRINT_AUTHORS that it's printing
+                           the authors for a cover or doc cover
+#DONE_ONCE                 Keeps track of how many times footnotes
+                           have been collected inside the same diversion
+#DONT_RULE_ME              Rule this (apparent) first footnote? (toggle)
+#DIVER_LN_OFF              Turn linenumbering off in (block)quotes?
+                           (toggle)
+#DRAFT_WITH_PAGENUM        Are we attaching draft/revision info to page
+                           number? (toggle)
+#EM_ADJUST                 Amount to raise \(em at END
+#EN_ALLOWS_HEADERS         Put page headers on endnotes pages? (toggle)
+#EN_ALLOWS_HEADERS_ALL     Put page headers on all endnotes pages?
+                           (toggle)
+#EN_BQ_AUTOLEAD            Register created by EN_BLOCKQUOTE_AUTOLEAD
+#EN_BQ_LEAD                Leading of blockquotes on endnotes pages
+#EN_FIGURE_SPACE           Width of \0, for use with formatting endnotes
+#EN_FIRST_PAGE             Tells PRINT_PAGE_NUMBER about endnotes
+                           first page number
+#EN_FIRST_PN               Page number that appears on page 1 of
+                           endnotes pages.
+#EN_HDRFTR_CENTER          Should we print centre string of
+                           headers/footers on endnotes pages? (toggle)
+#EN_LEAD                   Lead of endnotes
+#EN_LN_BRACKETS            Are we using brackets for line-numbered
+                           endnotes (toggle)
+#EN_LN_SEP                 Are we using a separator for line-numbered
+                           endnotes (toggle)
+#EN_MARK                   \n(ln when \*[EN-MARK] is called
+#EN_MARK_2                 \n(ln when ENDNOTE is called
+#EN_MARKER_STYLE           1=NUMBER; 2=LINE
+#EN_NO_COLS                Do not set endnotes in columns? (toggle)
+#EN_NO_FIRST_PN            Put pagenumber on 1st page of endnotes?
+                           (toggle)
+#EN_NUMBERS_ALIGN_RIGHT    Hang and align endnote numbers right?
+                           (toggle)
+#EN_NUMBERS_ALIGN_LEFT     Align endnote numbers with left margin?
+                           (toggle)
+#EN_NUMBERS_PLACEHOLDERS   Number of placeholders when endnote numbers
+                           hang and align right
+#EN_NUMBER_L_LENGTH        Line length for endnote numbers when they're
+                           right aligned
+#EN_PP_INDENT              First line indent of paras in multi-para
+                           endnotes
+#EN_PP_SPACE               Space multi-paras in endnotes? (toggle)
+#EN_PS                     ps of endnotes
+#EN_Q_AUTOLEAD             Register created by EN_QUOTE_AUTOLEAD
+#EN_Q_LEAD                 Leading of quotes on endnotes pages
+#EN_REF                    Put REFs in endnotes? (toggle)
+#EN_SINGLESPACE            Single space endnotes pages? (toggle)
+#EN_STRING_CAPS            Should ENDNOTES capitalize the endnotes
+                           string? (toggle)
+#EN_STRING_UNDERSCORE      Underscore endnotes page head? (toggle)
+#EN_TITLE_UNDERSCORE       Underscore endnotes document identifier?
+                           (toggle)
+#EN_TEXT_INDENT            Page offset for text of endnotes when
+                           numbers right align
+#END_QUOTE                 For PP=0 indenting; did we just end a quote?
+                           (toggle)
+#ENDNOTE                   Are we in an endnote? (toggle)
+#ENDNOTE_REFS              Are REFs going to endnotes? (toggle)
+#ENDNOTES                  Are we in an endnote (for FOOTERs; toggle)
+#EPI_ACTIVE                Are we in an epigraph? (toggle)
+#EPI_COLOR                 Colored epigraphs? (toggle)
+#EPI_DEPTH                 Depth of epigraph from first baseline to
+                           last
+#EPI_FITS                  Does epigraph fit on page/column? (toggle)
+#EPIGRAPH                  Did we have an epigraph? (toggle) 
+#EPI_LEAD_DIFF             Difference between #DOC_LEAD and #EPI_LEAD
+#EPI_LEAD                  Leading of epigraph; set by AUTOLEAD
+#EPI_LINES_EVEN            Even # of lines at end of epi crossing page in
+                           TYPEWRITE (d-spaced)?
+#EPI_LINES                 Number of lines in the epigraph
+#EPI_LINES_TO_END          Number of epigraph lines remaining after
+                           footer trap is sprung
+#EPI_LINES_TO_TRAP         Number of epigraph lines till footer trap is
+                           sprung
+#EPI_L_LENGTH              Epigraph line length
+#EPI_OFFSET                Left margin of epigraphs
+#EPI_OFFSET_VALUE          Epigraph indent as a function of page offset
+#EPI_ON                    Are we in an epigraph? (toggle)
+#EPI_WHITESPACE            Space after epigraph to compensate for
+                           epigraph leading
+#FIELD                     Incrementing register tacked onto LETTERHEAD
+#FINIS                     Was FINIS invoked? (toggle)
+#FINIS_COLOR               Colored FINIS? (toggle)
+#FN_AUTOLEAD               Autolead value of footnotes
+#FN_BL_INDENT              Left indent of INDENT BOTH in footnotes
+#FN_BR_INDENT              Right indent of INDENT BOTH in footnotes
+#FN_COUNT                  Which fn marker to print; also to
+                           tell mom to reserve space for and print
+                           the rule above footnotes
+#FN_COUNT_AT_FOOTER        The FN_COUNT after FOOTNOTES has been
+                           output in FOOTER
+#FN_COUNT_FOR_COLS         Holds a separate footnote count for columns
+                           (so they don't reset to 0 1 until page break)
+#FN_DEFER                  Defer footnote to next page/column? (toggle)
+                           If 0, don't defer.
+#FN_DEFER_SPACE            Whether to deposit space before
+                           footnote 1 because there's a deferred
+                           footnote on the page
+#FN_DEPTH                  Depth of footnote diversion(s)
+#FN_FOR_EPI                Signals to epigraph that a footnote is being
+                           processed
+#FN_GAP                    When there are footnotes on a page, the
+                           difference between where FOOTER will be
+                           sprung and the next legal baseline.
+                           Used in VFP_CHECK.
+#FN_LEAD                   Lead in footnotes after FN_AUTOLEAD is
+                           applied
+#FN_L_INDENT               Left indent of INDENT LEFT in footnotes
+#FN_LINES                  Number of lines in fn; used to calculate
+                           fn depth
+#FN_LN_BRACKETS            Are footnote linenumber brackets being used?
+                           (toggle)
+#FN_LN_SEP                 Is a footnote linenumber separator being used?
+                           (toggle)
+#FN_MARK                   \n(ln when \*[FN-MARK] is called
+#FN_MARK_2                 \n(nl when FOOTNOTE is called
+#FN_MARKERS                Print footnote markers? (toggle)
+#FN_MARKER_STYLE           1=STAR; 2=NUMBER
+#FN_NUMBER                 The footnote number attached to running text
+                           (and fns) when numbers instead of
+                           star/dagger is being used for footnootes
+                           numbers
+#FN_OVERFLOW_TRAP_POS      The register that sets the position of
+                           trap FN_OVERFLOW_TRAP.
+#FN_R_INDENT               Right indent of INDENT RIGHT in footnotes
+#FN_REF                    Put REFs in footnotes? (toggle)
+#FN_RULE_ADJ               # of points to raise footnote separator from
+                           its baseline
+#FN_RULE_LENGTH            Length of footnote separator rule
+#FN_RULE                   Print fn rule? (toggle)
+#FN_SPACE                  Post footnote space
+#FN_WAS_DEFERED            Tells HEADER about a deferred footnote
+#FOOTER_DIFF               In TRAPS, the difference between the
+                           original #B_MARGIN and #VISUAL_B_MARGIN
+#FOOTER_GAP                Amount of space between end of text and
+                           page #
+#FOOTER_MARGIN             Amount of space between page # and bottom
+                           of page
+#FOOTER_POS                Position of footer trap (required for
+                           collecting footnotes inside a diversion)
+#FOOTERS_ON                Are we using footers? (toggle)
+#FOOTERS_WERE_ON           Were footers on? - used in FINIS and BLANKPAGE
+                           (toggle)
+#FOOTNOTE_COLOR            Colored footnotes? (toggle)
+#FROM_DIVERT_FN            Signals to FOOTNOTE, when run from
+                           within DIVERT_FN_LEFTOVER, to set #SPACE_REMAINING
+                           to the total area allowable for running text
+#FROM_FOOTER               In col to col footnote processing, tells
+                           FOOTNOTE that FOOTNOTES was output from
+                           FOOTER.
+#FROM_HEADER               In col to col footnote processing, tells
+                           FOOTNOTE that FOOTNOTES was output from
+                           HEADER.
+#FULLSPACE_QUOTES          Should we fullspace quotes? (toggle)
+#GET_DEPTH                 Signals to FOOTNOTE that it should
+                           measure the depth of current footnotes
+                           plus the most recently added one, except
+                           where the footnote is to be deferred to
+                           the next page or column
+#GUTTER                    Width of gutter between columns
+#HDRFTR_CENTER_CAPS        CENTER part of header/footer in caps?
+                           (toggle; default=off)
+#HDRFTR_COLOR              Colored headers/footers? (toggle)
+#HDRFTR_CTR_PAD_LEFT       Amount of hdrftr CENTER padding on the left
+#HDRFTR_CTR_PAD_RIGHT      Amount of hdrftr CENTER padding on the right
+#HDRFTR_CTR_PAD_TMP        Temp storage of left hdrftr CENTER padding
+                           (for recto/verso switch)
+#HDRFTR_HEIGHT             Cap height of $HDRFTR_RECTO/$HDRFTR_VERSO
+                           strings
+#HDRFTR_LEFT_CAPS          Left part of header/footer in caps?
+                           (toggle; default=off)
+#HDRFTR_RIGHT_CAPS         Right part of header/footer in caps?
+                           (toggle; default=on)
+#HDRFTR_RULE_COLOR         Colored header/footer rule? (toggle)
+#HDRFTR_RULE_GAP           Space between header/footer and
+                           header/footer rule
+#HDRFTR_RULE               Print head/footer rule? (toggle)
+#HDRFTR_TMP_CAPS_SWITCH    Temporarily holds HDRFTR_LEFT_CAPS value if
+                           #SWITCH_HDRFTR=1
+#HEAD                      1=main/section head 2=subhead
+#HEAD_CAPS                 Print section titles in caps? (toggle)
+#HEAD_COLOR                Colored heads? (toggle)
+#HEADER_GAP                Distance from header to running text
+#HEADER_MARGIN             Distance from top of page to header
+#HEADERS_ON                Headers on? (toggle)
+#HEADER_STATE              Saves header state in COLLATE for use in
+                           START after COLLATE
+#HEADERS_WERE_ON           Were headers on? - used in BLANKPAGE (toggle)
+#HEAD_NUM                  Head number
+#HEAD_SPACE                2 line spaces before heads?
+                           (toggle; 1=yes, 0=no)
+#HORIZ_MARK                Horizontal 
+#HOW_MANY                  Number of blank pages to output
+#IGNORE                    Should we ignore this macro? Set to 1 in
+                           TYPEWRITE.
+#IN_BIB_LIST               Tells ITEM we're doing a bibliography in
+                           list style
+#INDENT_FIRST_PARAS        Indent first paras? (toggle)
+#INDENT_FIRSTS             Tells footnotes to leave INDENT_FIRST_PARAS
+                           alone if it's on for running text.
+#ITALIC_MEANS_ITALIC       For TYPEWRITE.  1=yes; 0=no
+#L_LENGTH_FOR_EPI          Stores line length at top of doc for use
+                           with EPIGRAPH when columns are on
+#L_MARGIN_DIFF             Difference between DOC_L_MARGIN and
+                           L_MARGIN
+#LEFT_CAP_HEIGHT           Cap height of left string in headers/footers
+#LEGAL_BASELINE            Calculates vert. position of next legal
+                           baseline in SHIM
+#LETTER_STYLE              1=BUSINESS 2=PERSONAL
+#LINEBREAK                 Did we have a linebreak? (toggle)
+#LINEBREAK_COLOR           Colored linebreak? (toggle)
+#LINENUMBERS               Holds various states of line-numbering when
+                           line numbering is enabled
+#LINES_PER_PAGE            # of lines (at DOC_LEAD) that fit on
+                           page after #B_MARGIN is set
+#LN                        Are line numbers on? (toggle)
+#MISC_<n>            Used to print "next" misc lines in DO_COVER
+#MISC_NUM                  Number of MISC lines
+#MISCS                     =#MISC_NUM in DO_COVER
+#MN_OVERFLOW_LEFT          If 1, left margin note text overflows
+#MN_OVERFLOW_RIGHT         If 1, right margin note text overflows
+#n%_AT_PAGENUM_SET         Page # from n% when PAGENUMBER invoked
+#NEEDS_SPACE               Instruct FOOTNOTE, when called by
+                           PROCESS_FN_IN_DIVER, that if the footnote
+                           had to be deferred, the VFP must be
+                           raised by 1v (set in DIVER_FN_2_PRE)
+#NEXT_AUTHOR               Supplies correct digit to AUTHOR_<#>
+                           when printing authors in doc header
+#NEXT_LN                   Next linenumber when \n(ln has to be stored
+                           because linenumbering suspended
+#NEXT_MISC                 Incrementing counter for misc lines in
+                           DO_COVER
+#NO_BACK_UP                Instructs FN_OVERFLOW_TRAP not to
+                           subtract 1 line of footnote lead from
+                           FN_OVERFLOW in a PREV_FN_DEFERRED
+                           situation.
+#NO_SPACE                  When para spacing is active, instructs
+                           PP not to add space after a quote or blockquote.
+#NO_TRAP_RESET             Should we reset page traps? (toggle)
+#NUM_AUTHORS               # of authors mod 2 to test if odd or even
+                           # of authors
+#NUM_MISCS                 Number of args passed to MISC
+#NUMBER_HEAD               Are heads numbered? (toggle)
+#NUMBER_PH                 Are paraheads numbered? (toggle)
+#NUMBER_SH                 Are subheads numbered? (toggle)
+#NUM_COLS                  Number of columns per page
+#NUM_FIELDS                Incrementing register used to match
+                           #TOTAL_FIELDS
+#OK_PROCESS_LEAD           Initial processing of TOC and endnote
+                           leading is deferred until OK_PROCESS_LEAD=1
+#ORIGINAL_B_MARGIN         The value for #B_MARGIN as set by the
+                           macro B_MARGIN
+#ORIGINAL_DOC_LEAD         The lead for PRINT_STYLE 1 as set in
+                           PRINTSTYLE; required so that PRINT_STYLE 1
+                           footnotes have an unadjusted lead of
+                           12 points
+#OVERFLOW                  Signals to FOOTNOTE that some of the
+                           footnote text won't fit on the page
+#PAGE_NUM_ADJ              What to add to n% to get #PAGENUMBER
+#PAGENUMBER                The page number
+#PAGENUM_STYLE_SET         Did we set pagenumber style? (toggle)
+#PAGE_NUM_H_POS            1=left 2=CENTER 3=right; default=2
+#PAGE_NUM_COLOR            Colored pagenumbers? (toggle)
+#PAGE_NUM_HYPHENS          Print hyphens surrounding page numbers?
+                           (toggle)
+#PAGE_NUM_HYPHENS_SET      Did user set (or unset) hyphens around page
+                           numbers? (toggle)
+#PAGE_NUM_POS_SET          Did user set page number position? (toggle)
+#PAGE_NUM_SET              Test if PAGE_1_NUM was used to set 1st page
+                           number
+#PAGE_NUMS                 Print page numbers? (toggle)
+#PAGE_NUM_V_POS            1=top 2=bottom; default=2
+#PAGE_TOP                  \n(nl after HEADER completes itself
+#PH_COLOR                  Colored paraheads? (toggle)
+#PH_NUM                    Parahead number
+#PAGE_POS                  Exact position on page during a diversion
+                           (required for collecting footnotes inside
+                           a diversion)
+#PAGINATE_TOC              Is toc pagination on? (toggle)
+#PAGINATE_WAS_ON           Keeps track of pagination state while
+                           outputting blank pages
+#PAGINATION_STATE          Saves pagination state in COLLATE for use in
+                           START after a COLLATE
+#PAGINATION_WAS_ON         Was pagination on? - used in FINIS (toggle)
+#PP                        0 at first para; auto-increments
+#PP_AT_PAGE_BREAK          # of last (incl. partial) para on page
+#PP_INDENT                 How much to indent paras
+#PP_SPACE                  Put space before paras? (toggle)
+#PP_SPACE_SUSPEND          Suspend para spacing for blockquotes and
+                           epigraphs
+#PP_STYLE_PREV             In footnotes, stores PP style in effect
+                           prior to invoking FOOTNOTE
+#PP_STYLE                  Regular para=1; quote or epi para=2
+#PRINT_PAGENUM_ON_PAGE_1   Should we print the page number on first
+                           page of doc when footers are on? (toggle)
+#PRINT_STYLE               Typewrite=1, typeset=2
+#PT_SIZE_IN_UNITS          Stored value of \n[.ps] from last time
+                           PT_SIZE was called
+#Q_AUTOLEAD                Register created by QUOTE_AUTOLEAD
+#Q_DEPTH                   Depth of quote
+#Q_FITS                    Does this quote fit on one page/column?
+                           (toggle)
+#Q_LEAD                    Leading of quotes
+#Q_LEAD_DIFF               Difference between leading of running text
+                           and the leading used in quotes/blockquotes
+#Q_LEAD_REAL               Leading of quotes and blockquotes saved at the
+                           ends of their respective diversions
+#Q_L_LENGTH                Line length of quotes
+#Q_OFFSET                  Page offset for quotes
+#Q_OFFSET_VALUE            Factor by which to multiply PP_INDENT to
+                           offset quotes
+#Q_PARTIAL_DEPTH           The amount of a quote/blockquote that fits at
+                           the bottom of a page when a quote/blockquote
+                           spans pages
+#Q_PP                      In PP, stores para # in QUOTE.  Removed in
+                           ENDQUOTE.
+#Q_SPACE_ADJ               The flexible amount of whitespace to add before
+                           and after a quote/blockquote
+#Q_TOP                     Vertical place on page that a quote starts
+#QUOTE                     1=PQUOTE, 2=BQUOTE
+#QUOTE_COLOR               Color quotes (poetic)? (toggle)
+#QUOTE_LN                  Linenumber quotes? (toggle)
+#RECTO_VERSO               Switch HEADER_LEFT and HEADER_RIGHT on
+                           alternate pages? (toggle); default=0
+#REF_HYPHENATE             Hyphenate REFs? (toggle)
+#REF_WARNING               Have we issued a ref warning? (toggle)
+#REPEAT                    Number of times to repeat linebreak
+                           character
+#RESERVED_SPACE            Just enough room to put 1 more line of
+                           footnotes on the page
+#RESET_EN_PP               Holds value of register #EN_PP_INDENT
+#RESET_FN_COUNTERS         1 = "moved" footnote collected in a diversion
+                           2 = "deferred" fn collected in a diversion
+#RESET_FN_NUMBER           Should fn# start at 1 on every page?
+                           (toggle)
+#RESET_L_LENGTH            Stores current line length when necessary
+#RESET_PARA_SPACE          Holds current value of toggle register
+                           #PP_SPACE
+#RESET_PP_INDENT           Stores value of PP_INDENT when necessary
+#RESET_QUOTE_SPACING       Stores value of toggle register
+                           #FULLSPACE_QUOTES (used in endnotes)
+#RESTORE_DOC_LEAD          Holds value of current doc lead (used in
+                           endnotes)
+#RESTORE_HY                Restore hyphenation after .][? (toggle)
+#RESTORE_OFFSET            Page offset at moment footer trap is sprung;
+                           not currently used
+#RESTORE_TOC_PN_PADDING    Saves #TOC_PN_PADDING in TOC prior to
+                           processing $FIRST_DOC_TITLE
+#RIGHT_CAP_HEIGHT          Cap height of right string in
+                           headers/footers
+#RULED                     Tells FOOTNOTE if a rule (or space has been
+                           put above the first footnote on the page
+#RUNON_FN_IN_DIVER         If #LN=1, if we're in a (block)quote, instructs
+                           FOOTNOTE to unformat diversion RUNON_FN_IN_DIVER
+#RUNON_FOOTNOTES           If #LN=1, instructs FOOTNOTE to unformat
+                           diversion RUNON_FOOTNOTES
+#RUN_ON                    Are we using run-on footnotes? (toggle)
+#SAVED_DIVER_FN_COUNT      In the case of a footnote inside a
+                           diversion that should be treated as a
+                           "normal" footnote, FOOTNOTE needs to
+                           distinguish between a "normal" deferred
+                           footnote (always the 1st footnote on the
+                           page) and one that only looks as if
+                           it should be deferred, when, in fact,
+                           it's an overflow; this register lets
+                           FOOTNOTE know whether the diversion
+                           footnote is, in fact, the first on the
+                           page.
+#SAVED_FN_COUNT            #FN_COUNT+1 prior to +#FN_COUNT; used
+                           in FOOTNOTES while gathering fns inside
+                           diversions
+#SAVED_FN_COUNT_FOR_COLS   #FN_COUNT_FOR_COLS+1 prior to
+                           +#FN_COUNT_FOR_COLS; used in FOOTNOTES
+                           while gathering fns inside diversions
+#SAVED_FN_DEPTH_1          Footnote depth prior to adding footnote
+                           diversion depth to FN_DEPTH; used when
+                           footnote text will overflow
+#SAVED_FN_DEPTH_2          Footnote depth after to adding footnote
+                           diversion depth to FN_DEPTH; used when
+                           footnote text will overflow
+#SAVED_FOOTER_POS          Position of FOOTER in DO_QUOTE (hack)
+#SAVED_LEAD                In FOOTER and DO_FOOTER, stores the
+                           lead in effect prior to outputting
+                           FOOTNOTES or performing either
+                           PROCESS_FN_LEFTOVER or
+                           PROCESS_FN_IN_DIVERSION; both the
+                           diversion FOOTNOTES and the two macros
+                           have, for PRINT_STYLE 2, an AUTOLEAD
+                           call, which requires that an LS be
+                           performed with the #SAVED_LEAD in
+                           order to remove register #AUTO_LEAD or
+                           #AUTO_LEAD_FACTOR.
+#SEP_TYPE                  Set to 1 if LIST separator is ( or [ or {
+#SH_LEAD_ADJUST            #DOC_LEAD/8 (TYPESET) or /2 (TYPEWRITE)
+                           (used for subhead spacing)
+#SH_NUM                    Subhead number
+#SHIM                      Amount of lead required to advance to
+                           next legal baseline
+#SILENT_BQUOTE_LN          "Silently" linenumber blockquotes? (toggle)
+#SILENT_QUOTE_LN           "Silently" linenumber quotes? (toggle)
+#SINGLE_SPACE              Is TYPEWRITE in single space mode? (toggle)
+#SKIP_FOOTER               If 1, instructs DO_FOOTER to do nothing
+                           if B_MARGIN falls below FOOTER_MARGIN
+#SLANT_MEANS_SLANT         For TYPEWRITE.  1=yes; 0=no
+#SLANT_WAS_ON              Keeps track of SLANT when it needs to go off
+                           for a while
+#SPACE_REMAINING           Space remaining to footer trap; used to
+                           decide whether or not to defer a footnote
+#SR_ADJ_FACTOR             An adjustment factor that compensates
+                           for the fact that #SPACE_REMAINING
+                           sometimes reports a fractionally larger
+                           space than is actually available for
+                           footnote text.
+#START                     If 1, signals completion of START
+#START_FOR_FOOTERS         Toggle set in START; signals to
+                           PRINT_HDRFTR that START has been invoked,
+                           allowing PRINT_HDRFTR to decide whether or
+                           not to print a footer on page 1
+#START_FOR_MNinit          If 1, defer processing MN_INIT until #START
+#STORED_PP_INDENT          Temporarily holds value of #PP_INDENT
+#SUITE                     Current page number (for letters)
+#SUP_PT_SIZE               Point size of superscript
+#SUSPEND_PAGINATION        Suspend pagination prior to endnotes?
+#SWITCH_HDRFTR             Switch HDRFTR_LEFT and HDRFTR_RIGHT?
+                           (toggle)
+#T_MARGIN_LEAD_ADJ         \n(.v-12000; ensures critically accurate
+                           placement of first lines on pages when
+                           doc processing is not being used and
+                           a T_MARGIN has been set
+#TAB_OFFSET#               "#" at the end is from $CURRENT_TAB
+#TERMINATE                 Has TERMINATE been called? (toggle)
+#TOC_AUTHORS               Whether to append author(s) to toc doc
+                           title entries (toggle)
+#TOC_ENTRY_PN              Current page number when a toc entry is
+                           collected
+#TOC_FIRST_PAGE            If 1, tells PRINT_PAGE_NUMBER that this
+                           is the first page of the toc
+#TOC_LEAD                  Leading of toc pages
+#TOC_PN_PADDING            Max. # of placeholders for toc entries
+                           page numbers
+#TOC_PS                    Point size of toc pages
+#TOC_RV_SWITCH             Switch L/R margins of toc pages
+#TOC_HEAD_INDENT           Indent of toc head entries
+#TOC_HEAD_SIZE_CHANGE      ps in/decrease of toc head entries****
+#TOC_PH_INDENT             Indent of toc parahead entries
+#TOC_PH_SIZE_CHANGE        ps in/decrease of toc parahead entries****
+#TOC_SH_INDENT             Indent of toc subhead entries
+#TOC_SH_SIZE_CHANGE        ps in/decrease of toc subhead entries****
+#TOC_TITLE_INDENT          Indent of toc doc title entries
+#TOC_TITLE_SIZE_CHANGE     ps in/decrease of toc doc title entries****
+#TOTAL_FIELDS              Total number of letter header fields
+#UNDERLINE_ITALIC          For TYPEWRITE.  1=yes; 0=no
+#UNDERLINE_QUOTE           Underline pquotes? (toggle)
+#UNDERLINE_SLANT           For TYPEWRITE.  1=yes; 0=no
+#UNDERLINE_WAS_ON          In HEADER to re-enable running text
+                           UNDERLINE (toggle)
+#USERDEF_HDRFTR            User defined single string recto/verso
+                           header/footer? (toggle)
+#USERDEF_HDRFTR_RECTO_QUAD 1=left, 2=CENTER, 3=right
+#USERDEF_HDRFTR_VERSO_QUAD 1=left, 2=CENTER, 3=right
+#USER_DEF_HEADER_CENTER    User defined CENTER title? (1=yes);
+                           used in COPYSTYLE
+#USER_DEF_HEADER_LEFT      User defined CENTER title? (1=yes);
+                           used in COPYSTYLE
+#USER_DEF_HEADER_RIGHT     User defined CENTER title? (1=yes);
+                           used in COPYSTYLE
+#VARIABLE_FOOTER_POS       Wandering trap position for processing
+                           footnotes and footers; pos depends on
+                           footnotes
+#VISUAL_B_MARGIN           Set in TRAPS, what \n(nl would report
+                           on the last line of running text before
+                           FOOTER is sprung.
+#VFP_DIFF                  #FN_DEPTH minus #SAVED_FN_DEPTH; the
+                           number of footnote lines that will fit
+                           on the page when there will be over, and
+                           therefore the amount by which to raise
+                           the VFP for footnotes with overflow after
+                           the 1st footnote.
+y                          Vertical position stored with mk in hdrftrs.
+ 
++++STRINGS+++
+
+$1ST_LETTER                      First letter of first arg to LIST
+$ADJUST_BIB_LEAD                 2nd arg to BIBLIOGRAPHY_LEAD; if not blank
+                                 adjust bib leading
+$ATTRIBUTE_STRING               "by" line in doc header
+$AUTHOR_1...9                    Document author(s)
+$AUTHOR_FAM                      Family to use for author in doc header
+$AUTHOR_FT                       Font to use for author in doc header
+$AUTHOR_SIZE_CHANGE              ps in/decrease of author in doc header*
+$AUTHOR_PT_SIZE                  Absolute ps of authors
+$BIB_FAM                         Bibliography page family
+$BIB_FT                          Bibliography page font
+$BIB_LEAD                        Base leading for bibliographies
+$BIB_LIST_SEPARATOR              Separator between enumerator and text
+                                 when outputting bibliographies in LIST style
+$BIB_LIST_PREFIX                 Prefix before enumerator when outputting
+                                 bibliographies in LIST style
+$BIB_PN_STYLE                    Format of bibliography page numbers
+$BIB_SPACE                       Post entry space for bibliographies
+$BIB_STRING                      Bibliography title string
+$BIB_STRING_FAM                  Bib title family
+$BIB_STRING_FT                   Bib title font
+$BIB_STRING_QUAD                 Bib title quad
+$BIB_STRING_SIZE_CHANGE          Bib title size (+ or -)
+$BQ_LN_GUTTER                    Gutter between line numbers and bquotes in
+                                 bquotes
+$BQUOTE_COLOR                    Blockquote color
+$BQUOTE_FAM                      Family to use for blockquotes
+$BQUOTE_FT                       Font to use for blockquotes
+$BQUOTE_QUAD                     Quad value for blockquotes
+$BQUOTE_SIZE_CHANGE              ps in/decrease of blockquotes*
+$CENTER_TITLE                    What to put in the middle of header
+                                 title
+$CHAPTER                         The chapter number
+$CHAPTER_STRING                  What to print whenever the word
+                                 "chapter" is required
+$CHAPTER_TITLE                   Chapter title (if there is one)
+$CHAPTER_TITLE_FAM               Family of chapter title
+$CHAPTER_TITLE_FT                Font of chapter title
+$CHAPTER_TITLE_SIZE_CHANGE       ps in/decrease of chapter title*
+$CHAPTER_TITLE_PT_SIZE           Absolute ps of chapter title
+$CHAPTER_TITLE_COLOR             Color of chapter title
+$COPYRIGHT_FAM                   Copyright line family
+$COPYRIGHT_FT                    Copyright line font
+$COPYRIGHT_SIZE_CHANGE           Copyright line size*
+$COPYRIGHT_COLOR                 Copyright line color
+$COPYRIGHT_QUAD                  Copyright line quad direction
+$COPY_STYLE                      DRAFT or FINAL
+$COVER_FAM                       Overall cover family
+$COVER_COLOR                     Overall cover color
+$COVER_TITLE                     User-defined cover title string
+$COVER_TITLE_FAM                 Cover title family
+$COVER_TITLE_FT                  Cover title font
+$COVER_TITLE_SIZE_CHANGE         Cover title size*
+$COVER_TITLE_COLOR               Cover title color
+$COVER_SUBTITLE_FAM              Cover subtitle family
+$COVER_SUBTITLE_FT               Cover subtitle font
+$COVER_SUBTITLE_SIZE_CHANGE      Cover subtitle size*
+$COVER_SUBTITLE_COLOR            Cover subtitle color
+$COVER_ATTRIBUTE_COLOR           Cover attribution string color
+$COVER_AUTHOR_FAM                Cover author(s) family
+$COVER_AUTHOR_FT                 Cover author(s) font
+$COVER_AUTHOR_SIZE_CHANGE        Cover author(s) size*
+$COVER_AUTHOR_COLOR              Cover author(s) color
+$COVER_DOCTYPE_FAM               Cover doctype family
+$COVER_DOCTYPE_FT                Cover doctype font
+$COVER_DOCTYPE_SIZE_CHANGE       Cover doctype size*
+$COVER_DOCTYPE_COLOR             Cover doctype color
+$COVER_COPYRIGHT_FAM             Cover copyright family
+$COVER_COPYRIGHT_FT              Cover copyright font
+$COVER_COPYRIGHT_SIZE_CHANGE     Cover copyright size*
+$COVER_COPYRIGHT_COLOR           Cover copyright color
+$COVER_MISC_FAM                  Cover misc family
+$COVER_MISC_FT                   Cover misc font
+$COVER_MISC_SIZE_CHANGE          Cover misc size*
+$COVER_MISC_COLOR                Cover misc color
+$CURRENT_EV                      \n[.ev] at REF_BRACKETS_START
+$DOC_COVER_FAM                   Overall doc cover family
+$DOC_COVER_COLOR                 Overall doc cover color
+$DOC_COVER_TITLE                 User-defined doc cover title string
+$DOC_COVER_TITLE_FAM             Doc cover title family
+$DOC_COVER_TITLE_FT              Doc cover title font
+$DOC_COVER_TITLE_SIZE_CHANGE     Doc cover title size*
+$DOC_COVER_TITLE_COLOR           Doc cover title color
+$DOC_COVER_SUBTITLE_FAM          Doc cover subtitle family
+$DOC_COVER_SUBTITLE_FT           Doc cover subtitle font
+$DOC_COVER_SUBTITLE_SIZE_CHANGE  Doc cover subtitle size*
+$DOC_COVER_SUBTITLE_COLOR        Doc cover subtitle color
+$DOC_COVER_ATTRIBUTE_COLOR       Doc cover attribution string color
+$DOC_COVER_AUTHOR_FAM            Doc cover author(s) family
+$DOC_COVER_AUTHOR_FT             Doc cover author(s) font
+$DOC_COVER_AUTHOR_SIZE_CHANGE    Doc cover author(s) size*
+$DOC_COVER_AUTHOR_COLOR          Doc cover author(s) color
+$DOC_COVER_DOCTYPE_FAM           Doc cover doctype family
+$DOC_COVER_DOCTYPE_FT            Doc cover doctype font
+$DOC_COVER_DOCTYPE_SIZE_CHANGE   Doc cover doctype size*
+$DOC_COVER_DOCTYPE_COLOR         Doc cover doctype color
+$DOC_COVER_COPYRIGHT_FAM         Doc cover copyright family
+$DOC_COVER_COPYRIGHT_FT          Doc cover copyright font
+$DOC_COVER_COPYRIGHT_SIZE_CHANGE Doc cover copyright size*
+$DOC_COVER_COPYRIGHT_COLOR       Doc cover copyright color
+$DOC_COVER_MISC_FAM              Doc cover misc family
+$DOC_COVER_MISC_FT               Doc cover misc font
+$DOC_COVER_MISC_SIZE_CHANGE      Doc cover misc size*
+$DOC_COVER_MISC_COLOR            Doc cover misc color
+$DOC_FAM                         Predominant font family used in the
+                                 document
+$DOC_QUAD                        Quad used for body text (justified or
+                                 left) 
+$DOC_TITLE                       Overall doc title that gets printed in
+                                 headers/footers (mostly for use with
+                                 collated docs where each doc is an
+                                 article with a different title)
+$DOC_TYPE                        Document type (default, chapter, named,
+                                 letter)
+$DOCHEADER_COLOR                 Color of docheader
+$DOCHEADER_FAM                   Family used for all parts of the docheader
+$DOCHEADER_LEAD_ADJ              +|- value applied to #DOC_LEAD to
+                                 in/decrease leading of doc header
+$DOCTYPE_FAM                     Family to use for DOCTYPE string in
+                                 doc header
+$DOCTYPE_FT                      Font to use for DOCTYPE string in
+                                 doc header
+$DOCTYPE_SIZE_CHANGE             ps in/decrease of DOCTYPE string in
+                                 doc header*
+$DOCTYPE_PT_SIZE                 Absolute ps of DOCTYPE
+$DRAFT                           The draft number (string valued)
+$DRAFT_STRING                    What to print whenever the word "draft"
+                                 is required
+EN_MARK                          Inline, gets #EN_MARK (\(ln)
+$EN_CLOSE_BRACKET                Close bracket for line-number enumerated
+                                 endnotes
+$EN_FAMILY                       Family for endnotes
+$EN_FT                           Font for endnotes
+$EN_LINENUMBER                   String to print for line-number enumerators
+                                 in line-numbered endnotes
+$EN_LN_FAM                       Family for line-numbers in line-number
+                                 identified endnotes
+$EN_LN_FT                        Font for line-numbers in line-number
+                                 identified endnotes
+$EN_LN_GAP                       Gap to leave in initial endnote lines
+                                 between line-number identifies and text
+$EN_OPEN_BRACKET                 Open bracket for line-number enumerated
+                                 endnotes
+$EN_LN_SIZE_CHANGE               Size change (+ or -) for line-numbers in
+                                 line-number identified endnotes
+$EN_PN_STYLE                     Pagenumbering style for endnotes pages
+$EN_QUAD                         Quad for endnotes
+$EN_STRING                       Endnotes page head
+$EN_STRING_FAM                   Endnotes page head family
+$EN_STRING_FT                    Endnotes page head font
+$EN_STRING_QUAD                  Endnotes page head quad direction
+$EN_STRING_SIZE_CHANGE           Endnotes page head size***
+$EN_TITLE                        Endnote document identifier
+$EN_TITLE_FAM                    Endnote document identifier family
+$EN_TITLE_FT                     Endnote document identifier font
+$EN_TITLE_QUAD                   Endnote document identifier quad
+                                 direction
+$EN_TITLE_SIZE_CHANGE            Endnote document identifier size***
+$EN_NUMBER_FAM                   Endnote numbering family
+$EN_NUMBER_FT                    Endnote numbering font
+$EN_NUMBER_SIZE_CHANGE           Endnote numbering size***
+$EPI_AUTOLEAD                    Autolead value (decimals ok) of
+                                 epigraphs
+$EPI_COLOR                       Color of epigraphs
+$EPI_FAM                         Family to use in epigraphs
+$EPI_FT                          Font to use in epigraphs
+$EPI_QUAD                        Quad in block-style epigraphs
+                                 (justified or left)
+$EPI_SIZE_CHANGE                 ps in/decrease of epigraphs*
+$EVAL_BIB_SPACE                  Temporary string to find out if the
+                                 arg to BIBLIOGRAPHY_SPACING ended in "v"
+$FINIS_COLOR                     Color of FINIS string
+$FINIS_STRING                    What to print when FINIS macro is
+                                 invoked
+$FIRST_DOC_TITLE                 1st doc's title captured in COLLATE
+FN_MARK                          Inline, gets #FN_MARK (\n(ln)
+$FN_CLOSE_BRACKET                Close bracket for line-number identified
+                                 footnotes
+$FN_FAM                          Family used in footnotes
+$FN_FT                           Font used in footnotes
+$FN_LINENUMBER                   String to print before footnotes when
+                                 line-numbering enabled for footnotes
+$FN_LN_SEP                       Separator after line-number identified
+                                 footnotes
+$FN_OPEN_BRACKET                 Open bracket for line-number identified
+                                 footnotes
+$FN_QUAD                         Quad used in footnotes
+$FN_SIZE_CHANGE                  ps in/decrease of footnotes*
+$FOOTNOTE_COLOR                  Footnote color
+$HDRFTR_CENTER                   What to put in CENTER part of headers;
+                                 default doctype
+$HDRFTR_CENTER_FAM               Family of CENTER part of headers
+$HDRFTR_CENTER_FT                Font of centre part of headers
+$HDRFTR_CENTER_NEW               HDRFTR_CENTER after the start of TOC;
+                                 defined in HDRFTR_CENTER if
+                                 HDRFTR_CENTER is called as
+                                 FOOTER_CENTER
+$HDRFTR_CENTER_OLD               HDRFTR_CENTER just prior to start of
+                                 TOC; defined in HDRFTR_CENTER if
+                                 HDRFTR_CENTER is called as
+                                 FOOTER_CENTER
+$HDRFTR_CENTER_SIZE_CHANGE       ps in/decrease of centre title in
+                                 headers**
+$HDRFTR_COLOR                    Color of headers/footers
+$HDRFTR_FAM                      Family to use in headers
+$HDRFTR_LEFT_FAM                 Family of left part of headers
+$HDRFTR_LEFT_FT                  Font of left part of headers
+$HDRFTR_LEFT_SIZE_CHANGE         ps in/decrease of author in headers**
+$HDRFTR_LEFT                     What to put in left part of headers;
+                                 default author
+$HDRFTR_RIGHT_FAM                Family of right part of headers
+$HDRFTR_RIGHT_FT                 Font of right part of headers
+$HDRFTR_RIGHT_SIZE_CHANGE        ps in/decrease of right part of
+                                 headers**
+$HDRFTR_RIGHT                    What to put in right part of headers;
+                                 default title
+$HDRFTR_SIZE_CHANGE              ps in/decrease of headers*
+$HDRFTR_TMP_SIZE_CHANGE_SWITCH   Temporarily holds
+                                 HDRFTR_LEFT_SIZE_CHANGE if
+                                 #SWITCH_HDRFTRS=1
+$HDRFTR_TMP_SWITCH               Temporarily holds HDRFTR_LEFT if
+                                 #SWITCH_HDRFTRS=1
+$HEAD_COLOR                      Head color
+$HEAD_FAM                        Family to use for section titles
+$HEAD_FT                         Font to use for section titles
+$HEAD_QUAD                       Quad value of section titles
+$HEAD_SIZE_CHANGE                ps in/decrease of section titles*
+$LINEBREAK_CHAR                  Character that marks line breaks
+$LINEBREAK_CHAR_V_ADJ            +|- amount by which to raise/lower
+                                 linebreak character
+$LAST_CHAR                       Temporary string used to discover whether
+                                 user has remembered to put a digit after
+                                 ROMAN or roman in arg to LIST
+$LINEBREAK_COLOR                 Linebreak color
+$LIST_ARG_1                      The first arg to LIST (minus digits if
+                                 ROMAN or roman
+$LN_GUTTER                       Gutter to leave between line numbers
+                                 and text
+$LN_INC                          2nd arg to NUMBER_LINES as a string
+$LN_NUM                          1st arg to NUMBER_LINES as a string
+$MISC_COLOR                      Misc line color
+$MISC_QUAD                       Misc line quad
+PAGE#                            For use in hdrftr strings where page #
+                                 is needed; \*[PAGE]
+$PAGENUM_COLOR                   Page number color
+$PAGENUM_STYLE                   String passed to PAGENUM_STYLE
+$PAGE_NUM_FAM                    Family of page numbers
+$PAGE_NUM_FT                     Font of page numbers
+$PAGE_NUM_SIZE_CHANGE            ps in/decrease of page numbers
+$PAPER                           Paper size (LETTER, A4, LEGAL);
+                                 default=LETTER
+$PH_COLOR                        Parahead color
+$PP_FT                           Font used in paragraphs
+$ROMAN_WIDTH                     The digit(s) appended to ROMAN or
+                                 roman LIST args
+$Q_LN_GUTTER                     Gutter between linenumbers and quotes
+                                 in quotes
+$QUOTE_COLOR                     Quote (poetic) color
+$QUOTE_FAM                       Family to use for pquotes
+$QUOTE_FT                        Font to use for pquotes
+$QUOTE_SIZE_CHANGE               ps in/decrease of pquotes*
+$REF_BIB_INDENT                  2nd line indent value for references in
+                                 bibliographies
+$REF_EN_INDENT                   2nd line indent value for references in
+                                 endnotes
+$REF_FN_INDENT                   2nd line indent value for references in
+                                 footnotes
+$RESTORE_SS_VAR                  Saves \*[$SS_VAR] for use with ref*build
+#REVISION                        The revision number (string valued)
+$REVISION_STRING                 What to print whenever the word
+                                 "revision" is required
+$SH_FAM                          Family to use in subheads
+$SH_FT                           Font to use in subheads
+$SH_SIZE_CHANGE                  ps in/decrease of subheads*
+$SH_COLOR                        Subhead color
+$SUBTITLE                        Document subtitle
+$SUBTITLE_FAM                    Family to use for subtitle in doc
+                                 header
+$SUBTITLE_FT                     Font to use for subtitle in doc header
+$SUBTITLE_SIZE_CHANGE            ps in/decrease of subtitle*
+$SUBTITLE_PT_SIZE                Absolute ps of subtitle
+$SUITE                           The #SUITE number register
+$TITLE                           Document title
+$TITLE_FAM                       Family to use for title in doc header
+$TITLE_FT                        Font to use for title in doc header
+$TITLE_PT_SIZE                   Absolute point size of title in docheader
+$TITLE_SIZE_CHANGE               ps in/decrease of title in doc header*
+$TOC_AUTHORS                     What to print after toc doc title entry
+                                 if #TOC_AUTHORS=1
+$TOC_FAM                         Family to use on toc pages
+$TOC_HEAD_FAM                    Family of toc head entries
+$TOC_HEAD_FT                     Font of toc head entries
+$TOC_HEAD_ITEM                   A head as collected for TOC_ENTRIES
+$TOC_HEADER_FAM                  Family to use for "Contents"
+$TOC_HEADER_FT                   Font to use for "Contents"
+$TOC_HEADER_QUAD                 Quad direction of "Contents"
+$TOC_HEADER_SIZE                 ps in/decrease of "Contents"****
+$TOC_HEADER_STRING               Header string of first toc page
+$TOC_PN                          Sets up toc leaders + entry pn
+                                 (typeset)
+$TOC_PN_FAM                      Family for toc entries page numbers
+$TOC_PN_FT                       Font for toc entries page numbers
+$TOC_PN_SIZE_CHANGE              ps in/decrease of toc entries page
+                                 numbers
+$TOC_PN_STYLE                    Page-numbering style of toc pages
+$TOC_PN_TYPEWRITE                Sets up toc leaders + entry pn
+                                 (typewrite)
+$TOC_PH_FAM                      Family of toc parahead entries
+$TOC_PH_FT                       Font of toc parahead entries
+$TOC_PARAHEAD_ITEM               A parahead collected for TOC_ENTRIES
+$TOC_SH_FAM                      Family of toc subhead entries
+$TOC_SH_FT                       Font of toc subhead entries
+$TOC_SH_ITEM                     A subhead collected for TOC_ENTRIES
+$TOC_TITLE_FAM                   Family of toc doc title entries
+$TOC_TITLE_FT                    Font of toc doc title entries
+$USER_SET_TITLE_ITEM             User defined toc doc title entry as
+                                 set by TOC_TITLE_ENTRY
+$UR_PAGINATION_STYLE             Pagination style prior to endnotes
+$USERDEF_HDRFTR_RECTO            User defined header/footer recto string
+$USERDEF_HDRFTR_VERSO            User defined header/footer verso string
+
+   *relative to #DOC_PT_SIZE
+  **relative to overall ps of headers as set by HEADER_SIZE
+ ***relative to overall ps of endnotes
+****relative to overall ps of toc pages
+
++++PREPROCESSOR KEYWORDS+++
+
+(eqn)
+EQ
+EN
+
+(grn)
+GS
+GE
+GF
+
+(pic)
+PS
+PE
+
+(refer)
+R1
+R2
+[
+]
+
+(tbl)
+TS
+TE
+TH
+
+(grap)
+G1
+G2
+
+(ideal)
+IS
+IE
+
+(chem)
+cstart
+cend
+
++++ALIASES+++
+
+Please note:
+
+Prior to version 1.1.9, all macros that included the word COLOR had
+aliases that used COLOUR instead.  This convenience has now been
+removed, in an effort to reduce the size of the om.tmac file.
+
+Furthermore, if you want the convenience, you'll have to edit the
+om.tmac file.  Simply aliasing, say, HEAD_COLOR as HEAD_COLOUR will
+not work, owing to significant changes in the handling of
+docelement control macros that end in _COLOR.
+
++++The following are for convenience, and header/footer management+++
+
+BREAK_BLOCKQUOTE      BREAK_QUOTE
+BREAK_CITATION        BREAK_QUOTE
+BREAK_CITE            BREAK_QUOTE
+CITATION              BLOCKQUOTE
+CITE                  BLOCKQUOTE
+COL_BREAK             COL_NEXT
+DOC_FAM               DOC_FAMILY
+DOC_LLENGTH           DOC_LINE_LENGTH
+DOC_L_LENGTH          DOC_LINE_LENGTH
+DOC_L_MARGIN          DOC_LEFT_MARGIN
+DOC_LMARGIN           DOC_LEFT_MARGIN
+DOC_LS                DOC_LEAD
+DOC_PS                DOC_PT_SIZE
+DOC_R_MARGIN          DOC_RIGHT_MARGIN
+DOC_RMARGIN           DOC_RIGHT_MARGIN
+FOOTER_CENTER_CAPS    HDRFTR_CENTER_CAPS
+FOOTER_CENTER         HDRFTR_CENTER
+FOOTER_CENTRE_CAPS    HDRFTR_CENTER_CAPS
+FOOTER_CENTRE         HDRFTR_CENTER
+FOOTER_LEFT_CAPS      HDRFTR_LEFT_CAPS
+FOOTER_LEFT           HDRFTR_LEFT
+FOOTER_PLAIN          HDRFTR_PLAIN
+FOOTER_RECTO          HDRFTR_RECTO
+FOOTER_RIGHT_CAPS     HDRFTR_RIGHT_CAPS
+FOOTER_RIGHT          HDRFTR_RIGHT
+FOOTER_RULE_GAP       HDRFTR_RULE_GAP
+FOOTER_RULE           HDRFTR_RULE
+FOOTER_VERSO          HDRFTR_VERSO
+HDRFTR_RULE_INTERNAL  HDRFTR_RULE
+HEADER_CENTER_CAPS    HDRFTR_CENTER_CAPS
+HEADER_CENTER         HDRFTR_CENTER
+HEADER_CENTRE_CAPS    HDRFTR_CENTER_CAPS
+HEADER_CENTRE         HDRFTR_CENTER
+HEADER_LEFT_CAPS      HDRFTR_LEFT_CAPS
+HEADER_LEFT           HDRFTR_LEFT
+HEADER_PLAIN          HDRFTR_PLAIN
+HEADER_RECTO          HDRFTR_RECTO
+HEADER_RIGHT_CAPS     HDRFTR_RIGHT_CAPS
+HEADER_RIGHT          HDRFTR_RIGHT
+HEADER_RULE_GAP       HDRFTR_RULE_GAP
+HEADER_RULE           HDRFTR_RULE
+HEADER_VERSO          HDRFTR_VERSO
+PAGENUM               PAGENUMBER
+PAGINATION            PAGINATE
+PP_FT                 PP_FONT
+PRINT_FOOTNOTE_RULE   FOOTNOTE_RULE
+SWITCH_FOOTERS        SWITCH_HDRFTR
+SWITCH_HEADERS        SWITCH_HDRFTR
+TOC_LS                TOC_LEAD
+TOC_PS                TOC_PT_SIZE
+
++++The following are used for docelement type-style control+++
+
+AUTHOR_FAMILY                 _FAMILY
+AUTHOR_FONT                   _FONT
+AUTHOR_SIZE                   _SIZE
+BIBLIOGRAPHY_FAMILY           _FAMILY
+BIBLIOGRAPHY_FONT             _FONT
+BIBLIOGRAPHY_FOOTER_CENTER    BIBLIOGRAPHY_HDRFTR_CENTER
+BIBLIOGRAPHY_FOOTER_CENTRE    BIBLIOGRAPHY_HDRFTR_CENTRE
+BIBLIOGRAPHY_HEADER_CENTER    BIBLIOGRAPHY_HDRFTR_CENTER
+BIBLIOGRAPHY_HEADER_CENTRE    BIBLIOGRAPHY_HDRFTR_CENTRE
+BIBLIOGRAPHY_QUAD             _QUAD
+BIBLIOGRAPHY_STRING_FAMILY    _FAMILY
+BIBLIOGRAPHY_STRING_FONT      _FONT
+BIBLIOGRAPHY_STRING_QUAD      _QUAD
+BIBLIOGRAPHY_STRING_SIZE      _SIZE
+BLOCKQUOTE_AUTOLEAD           Q_AUTOLEAD
+BLOCKQUOTE_AUTOLEAD           QUOTE_AUTOLEAD
+BLOCKQUOTE_COLOR              _COLOR
+BLOCKQUOTE_FAMILY             _FAMILY
+BLOCKQUOTE_FONT               _FONT
+BLOCKQUOTE_QUAD               _QUAD
+BLOCKQUOTE_SIZE               _SIZE
+CHAPTER_TITLE_COLOR           _COLOR
+CHAPTER_TITLE_FAMILY          _FAMILY
+CHAPTER_TITLE_FONT            _FONT
+CHAPTER_TITLE_SIZE            _SIZE
+COVER_ATTRIBUTE_COLOR         _COLOR
+COVER_AUTHOR_COLOR            _COLOR
+COVER_AUTHOR_FAMILY           _FAMILY
+COVER_AUTHOR_FONT             _FONT
+COVER_AUTHOR_SIZE             _SIZE
+COVER_COLOR                   _COLOR
+COVER_COPYRIGHT_COLOR         _COLOR
+COVER_COPYRIGHT_FAMILY        _FAMILY
+COVER_COPYRIGHT_FONT          _FONT
+COVER_COPYRIGHT_QUAD          _QUAD
+COVER_COPYRIGHT_SIZE          _SIZE
+COVER_DOCTYPE_COLOR           _COLOR
+COVER_DOCTYPE_FAMILY          _FAMILY
+COVER_DOCTYPE_FONT            _FONT
+COVER_DOCTYPE_SIZE            _SIZE
+COVER_FAMILY                  _FAMILY
+COVER_MISC_COLOR              _COLOR
+COVER_MISC_QUAD               _QUAD
+COVER_SUBTITLE_COLOR          _COLOR
+COVER_SUBTITLE_FAMILY         _FAMILY
+COVER_SUBTITLE_FONT           _FONT
+COVER_SUBTITLE_SIZE           _SIZE
+COVER_TITLE_COLOR             _COLOR
+COVER_TITLE_FAMILY            _FAMILY
+COVER_TITLE_FONT              _FONT
+COVER_TITLE_SIZE              _SIZE
+DOC_COVER_ATTRIBUTE_COLOR     _COLOR
+DOC_COVER_AUTHOR_COLOR        _COLOR
+DOC_COVER_AUTHOR_FAMILY       _FAMILY
+DOC_COVER_AUTHOR_FONT         _FONT
+DOC_COVER_AUTHOR_SIZE         _SIZE
+DOC_COVER_COLOR               _COLOR
+DOC_COVER_COPYRIGHT_COLOR     _COLOR
+DOC_COVER_COPYRIGHT_FAMILY    _FAMILY
+DOC_COVER_COPYRIGHT_FONT      _FONT
+DOC_COVER_COPYRIGHT_QUAD      _QUAD
+DOC_COVER_COPYRIGHT_SIZE      _SIZE
+DOC_COVER_DOCTYPE_COLOR       _COLOR
+DOC_COVER_DOCTYPE_FAMILY      _FAMILY
+DOC_COVER_DOCTYPE_FONT        _FONT
+DOC_COVER_DOCTYPE_SIZE        _SIZE
+DOC_COVER_FAMILY              _FAMILY
+DOC_COVER_MISC_COLOR          _COLOR
+DOC_COVER_MISC_QUAD           _QUAD
+DOC_COVER_SUBTITLE_COLOR      _COLOR
+DOC_COVER_SUBTITLE_FAMILY     _FAMILY
+DOC_COVER_SUBTITLE_FONT       _FONT
+DOC_COVER_SUBTITLE_SIZE       _SIZE
+DOC_COVER_TITLE_COLOR         _COLOR
+DOC_COVER_TITLE_FAMILY        _FAMILY
+DOC_COVER_TITLE_FONT          _FONT
+DOC_COVER_TITLE_SIZE          _SIZE
+DOCHEADER_COLOR               _COLOR
+DOCHEADER_FAMILY              _FAMILY
+DOC_QUAD                      _QUAD
+DOCTYPE_FAMILY                _FAMILY
+DOCTYPE_FONT                  _FONT
+DOCTYPE_SIZE                  _SIZE
+ENDNOTE_BLOCKQUOTE_AUTOLEAD   Q_AUTOLEAD
+ENDNOTE_BLOCKQUOTE_AUTOLEAD   QUOTE_AUTOLEAD
+ENDNOTE_FAMILY                _FAMILY
+ENDNOTE_FONT                  _FONT
+ENDNOTE_LINENUMBER_FAMILY     _FAMILY
+ENDNOTE_LINENUMBER_FONT       _FONT
+ENDNOTE_LINENUMBER_SIZE       _SIZE
+ENDNOTE_NUMBER_FAMILY         _FAMILY
+ENDNOTE_NUMBER_FONT           _FONT
+ENDNOTE_NUMBER_SIZE           _SIZE
+ENDNOTE_QUAD                  _QUAD
+ENDNOTE_QUOTE_AUTLOEAD        Q_AUTOLEAD
+ENDNOTE_QUOTE_AUTOLEAD        QUOTE_AUTOLEAD
+ENDNOTE_STRING_FAMILY         _FAMILY
+ENDNOTE_STRING_FONT           _FONT
+ENDNOTE_STRING_QUAD           _QUAD
+ENDNOTE_STRING_SIZE           _SIZE
+ENDNOTE_TITLE_FAMILY          _FAMILY
+ENDNOTE_TITLE_FONT            _FONT
+ENDNOTE_TITLE_QUAD            _QUAD
+ENDNOTE_TITLE_SIZE            _SIZE
+EPIGRAPH_COLOR                _COLOR
+EPIGRAPH_FAMILY               _FAMILY
+EPIGRAPH_FONT                 _FONT
+EPIGRAPH_QUAD                 _QUAD
+EPIGRAPH_SIZE                 _SIZE
+FINIS_COLOR                   _COLOR
+FOOTNOTE_COLOR                _COLOR
+FOOTNOTE_FAMILY               _FAMILY
+FOOTNOTE_FONT                 _FONT
+FOOTNOTE_QUAD                 _QUAD
+FOOTNOTE_SIZE                 _SIZE
+HDRFTR_CENTER_FAMILY          _FAMILY
+HDRFTR_CENTER_FONT            _FONT
+HDRFTR_CENTER_SIZE            _SIZE
+HDRFTR_COLOR                  _COLOR
+HDRFTR_FAMILY                 _FAMILY
+HDRFTR_LEFT_FAMILY            _FAMILY
+HDRFTR_LEFT_FONT              _FONT
+HDRFTR_LEFT_SIZE              _SIZE
+HDRFTR_RIGHT_FAMILY           _FAMILY
+HDRFTR_RIGHT_FONT             _FONT
+HDRFTR_RIGHT_SIZE             _SIZE
+HDRFTR_RULE_COLOR             _COLOR
+HDRFTR_SIZE                   _SIZE
+HEAD_COLOR                    _COLOR
+HEAD_FAMILY                   _FAMILY
+HEAD_FONT                     _FONT
+HEAD_QUAD                     _QUAD
+HEAD_SIZE                     _SIZE
+LINEBREAK_COLOR               _COLOR
+MISC_COLOR                    _COLOR
+MISC_QUAD                     _QUAD
+PAGENUM_COLOR                 _COLOR
+PAGENUM_FAMILY                _FAMILY
+PAGENUM_FONT                  _FONT
+PARAHEAD_COLOR                _COLOR
+PARAHEAD_FAMILY               _FAMILY
+PARAHEAD_FONT                 _FONT
+PARAHEAD_SIZE                 _SIZE
+QUOTE_COLOR                   _COLOR
+QUOTE_FAMILY                  _FAMILY
+QUOTE_FONT                    _FONT
+QUOTE_INDENT                  _INDENT
+QUOTE_SIZE                    _SIZE
+REF_INDENT                    INDENT_REFS
+REF)                          REF_BRACKETS_END
+REF]                          REF_BRACKETS_END
+REF}                          REF_BRACKETS_END
+REF(                          REF_BRACKETS_START
+REF[                          REF_BRACKETS_START
+REF{                          REF_BRACKETS_START
+SUBHEAD_COLOR                 _COLOR
+SUBHEAD_FAMILY                _FAMILY
+SUBHEAD_FONT                  _FONT
+SUBHEAD_SIZE                  _SIZE
+SUBTITLE_COLOR                _COLOR
+SUBTITLE_FAMILY               _FAMILY
+SUBTITLE_FONT                 _FONT
+SUBTITLE_SIZE                 _SIZE
+TITLE_COLOR                   _COLOR
+TITLE_FAMILY                  _FAMILY
+TITLE_FONT                    _FONT
+TITLE_SIZE                    _SIZE
+TOC_FAM                       _FAMILY
+TOC_FAMILY                    _FAMILY
+TOC_HEADER_FAMILY             _FAMILY
+TOC_HEADER_FONT               _FONT
+TOC_HEADER_QUAD               _QUAD
+TOC_HEADER_SIZE               _SIZE
+TOC_HEAD_FAMILY               _FAMILY
+TOC_HEAD_FONT                 _FONT
+TOC_HEAD_SIZE                 _SIZE
+TOC_PARAHEAD_FAMILY           _FAMILY
+TOC_PARAHEAD_FONT             _FONT
+TOC_PARAHEAD_SIZE             _SIZE
+TOC_PN_FAMILY                 _FAMILY
+TOC_PN_FONT                   _FONT
+TOC_PN_SIZE                   _SIZE
+TOC_PT_SIZE                   _SIZE
+TOC_SUBHEAD_FAMILY            _FAMILY
+TOC_SUBHEAD_FONT              _FONT
+TOC_SUBHEAD_SIZE              _SIZE
+TOC_TITLE_FAMILY              _FAMILY
+TOC_TITLE_FONT                _FONT
+TOC_TITLE_SIZE                _SIZE
+
+ +
+Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/toc.html b/contrib/mom/momdoc/toc.html new file mode 100644 index 0000000..5157404 --- /dev/null +++ b/contrib/mom/momdoc/toc.html @@ -0,0 +1,329 @@ + + + + +Mom, version 1.3-a -- Table of Contents + + + + + +

Table of Contents for mom, version 1.3-a

+ +The table of contents has grown quite large. If you've been using +mom for a while, you might prefer the +Quick Reference Guide. +

+If you're new to mom, click on any link in the +Quick Table of Contents +to go to the +appropriate section of the Full Table of Contents. +

+Or click +here +to go directly to the Full Table of Contents. +

+


+ +

Quick Table of Contents

+INTRODUCTORY STUFF + +TYPESETTING WITH MOM + +

+DOCUMENT PROCESSING WITH MOM +

+
+
+ +

Full Table of Contents

+ + +
  • 1. WHAT IS MOM? + + +
  • 2. DEFINITIONS OF TERMS USED IN THIS MANUAL + + +
  • 3. USING MOM + + +
  • 4. THE TYPESETTING MACROS + + + +
  • 5. DOCUMENT PROCESSING WITH MOM + + +
  • 6. QUICK REFERENCE GUIDE TO MOM +

    + +

  • 7. APPENDICES + + + + diff --git a/contrib/mom/momdoc/typemacdoc.html b/contrib/mom/momdoc/typemacdoc.html new file mode 100644 index 0000000..bedd031 --- /dev/null +++ b/contrib/mom/momdoc/typemacdoc.html @@ -0,0 +1,235 @@ + + + + +Mom -- Typesetting macros in document processing + + + + + +Next   +Prev   +Back to Table of Contents +

    + + + +

    USING TYPESETTING MACROS DURING DOCUMENT PROCESSING

    + + +During document processing, most of the +typesetting macros +affect type in the document globally. For example, if you turn kerning +off, pairwise kerning is disabled not only in paragraphs, but +also in headers, footers, quotes, and so on. +

    +Typesetting macros that alter margins and line lengths affect +running text +globally (or at least try to), but leave headers/footers and footnotes +alone. (To indent footnotes, see the full explanation of the +FOOTNOTE +macro.) +

    +Mom's tabs +(both +typesetting tabs +and +string tabs) +behave as expected in running text during document processing. Tab +structures that do not exceed the line length of running text are +preserved sensibly from page to page, and, if +COLUMNS +are enabled, from column to column. +

    +Some typesetting macros, however, when used during document +processing, behave in special ways. These are the macros that deal +with the basic parameters of type style: horizontal and vertical +margins, line length, +family, +font, +point size, +leading, +and +quad. + +

    +Mom assumes that any changes to these parameters +stem from a temporary need to set type in a style different from that +provided by mom's +document element tags. +In other words, you need to do a bit of creative typesetting in the +middle of a document. +

    +The following lists those typesetting macros whose behaviour during +document processing requires some explanation. +(Please refer to +Top and bottom margins in document processing +for information on how mom interprets +T_MARGIN +and +B_MARGIN +in document processing. Additionally, see +ADD_SPACE +if you encounter the problem of trying to get mom +to put space at the tops of pages after the first.) + +

    +MACRO           EFFECT DURING DOCUMENT PROCESSING
    +-----           ---------------------------------
    +
    +L_MARGIN        *The left margin of all running text
    +                 assumes the new value.
    +
    +                *The line length remains unaltered.
    +
    +                *The header and footer left margin
    +                 remain at the current document default.
    +
    +                (You won't use this often by itself.  Most
    +                 likely, you'll use it in combination with
    +                 R_MARGIN or LL.)
    +
    +R_MARGIN        *The right margin of all running text
    +                 assumes the new value.  In other words,
    +                 the line length is altered.
    +
    +                *The header and footer right margin
    +                 remain at the current document default.
    +
    +LL              *The line length of all running text
    +                 is set to the new value.
    +
    +                *The header and footer line length remain
    +                 at the current document default.
    +
    +FAMILY          *Changes family for the duration of the
    +                 current tag only.  As soon as another document
    +                 element tag is invoked, the family reverts to
    +                 the current default for the new tag.
    +
    +FT              *Changes font for the duration of the
    +                 current tag only.  As soon as another document
    +                 element tag is entered, the font reverts
    +                 to the current default for the new tag.
    +
    +                 N.B. -- \*[SLANT] and \*[BOLDER] affect
    +                 paragraph text, and remain in effect for all
    +                 paragraphs until turned off.  If you want to
    +                 use them in a macro that takes a string
    +                 argument, include the escape in the string.
    +                 \*[COND] and \*[EXT] behave similarly.
    +
    +PT_SIZE         *Changes point size for the duration of the
    +                 current tag only.  As soon as another document
    +                 element tag is entered, the point size reverts
    +                 to the current document default for the new
    +                 tag.
    +
    +LS              *Changes line space for the duration of the
    +                 current tag only.  As soon as another document
    +                 element tag is entered, the line space reverts to
    +                 the current document default for the new
    +                 tag.
    +
    +                 Using LS to temporarily change leading within a
    +                 document will almost certainly result in a bottom
    +                 margin that doesn't align with the bottom margin
    +                 of subsequent pages.  You'll need to use the SHIM
    +                 macro to get mom back on track when you're ready
    +                 to return to the document's default leading.
    +
    +QUAD            *Changes quad for the duration of the
    +                 current tag only.  As soon as another document
    +                 element tag is entered, the quad reverts to
    +                 the current document default for the new
    +                 tag.
    +
    +                 N.B. -- Line-for-line quadding macros
    +                 (LEFT, CENTER, RIGHT) are also temporary,
    +                 overridden by the QUAD value of any subsequent
    +                 document element tag.
    +
    +
    + + + + +

    Top and bottom margins in document processing

    +
    + +Normally, mom establishes the top and bottom margins +of +running text +in documents from the values of HEADER_MARGIN + +HEADER_GAP and FOOTER_MARGIN + FOOTER_GAP +respectively. However, if you invoke +T_MARGIN +or +B_MARGIN +either before or after +START, +they set the top and bottom margins of running text irrespective +of HEADER_GAP and FOOTER_GAP. +

    +Put another way, in document processing, T_MARGIN +and B_MARGIN set the top and bottom margins of +running text, but have no effect on the placement of +headers, +footers, +or page numbers. + + +

    ADD_SPACE

    + + +

    +Occasionally, you may want to insert space before the start of +running text +on pages after the first. +

    +You might have tried using +ALD +or +SPACE +and found it did nothing. This is because mom +normally inhibits any extra space before the start of running text +on pages after the first. +

    +If you need the space, you must use the macro, +ADD_SPACE, in conjuction with +NEWPAGE. +ADD_SPACE takes as its single argument the +distance you want mom to advance from the normal +baseline position at the top of the page. A +unit of measure +is required. + +

    +For example, say you wanted to insert 2 inches of space before the +start of running text on a page other than the first. You'd +accomplish it with + +

    +

    +	.NEWPAGE
    +	.ADD_SPACE 2i
    +
    + +which would terminate your current page, break to a new page, +print the header (assuming headers are on) and insert 2 inches of +space before the start of running text. +

    +Since adding space in this way is almost sure to disrupt +mom's ability to guarantee perfectly flush bottom +margins, I highly recommend using the +SHIM +macro immediately after ADD_SPACE. +

    +


    +Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/momdoc/typesetting.html b/contrib/mom/momdoc/typesetting.html new file mode 100644 index 0000000..a7584b2 --- /dev/null +++ b/contrib/mom/momdoc/typesetting.html @@ -0,0 +1,4189 @@ + + + + +Mom -- Typesetting Macros + + + + + +Next   +Prev   +Back to Table of Contents +

    + + +

    THE TYPESETTING MACROS

    + + +Introduction to the typesetting macros +
    + +

    +


    + +

    Introduction to the typesetting macros

    + +Mom's typesetting macros provide access to +groff's typesetting capabilities. Aside from controlling basic +type parameters (family, font, line length, point size, leading), +mom's macros fine-tune wordspacing, letterspacing, +kerning, hyphenation, and so on. In addition, mom +has true typesetting tabs, string tabs, multiple indent styles, +line padding, and a batch of other goodies. +

    +In some cases, mom's typesetting macros merely imitate +groff primitives. In others, they approach typesetting concerns in +conceptually new ways (for groff, at least). This should present no +problem for newcomers to groff who are learning mom. +Old groff hands should be careful. Just because it looks like a +duck and walks like a duck does not, in this instance, mean that it +is a duck. When using mom, stay away from groff +primitives if mom provides a macro that accomplishes +the same thing. +

    +Mom's typesetting macros can be used as a standalone +package, independent of the +document processing macros. +With them, you can typeset on-the-fly. Book covers, your best +friend's résumé, a poster for a lost dog--none of these requires +structured document processing (page headers, paragraphs, heads, +footnotes, etc). What they do demand is precise control over every +element on the page. The typesetting macros give you that control. +

    +


    + + + + + + +

    Page setup: paper size and page margins

    +
    + +The page setup macros establish the physical dimensions of your +page and the margins you want it to have. Groff +has defaults for these, but I recommend setting them at the top +of your files anyway unless you're using mom's +document processing macros +and are content with her defaults. +

    +The +PAPER +macro provides a shortcut for setting the page to the correct dimensions +for a number of well-known, established paper sizes. The +PAGE +macro provides a convenient way of setting the page dimensions and +some or all of the page margins with a single macro. +

    + + +

    Page setup macros list

    + + + +

    + + + +


    +

    Page width

    +
    +Macro: PAGEWIDTH <width of printer sheet> +
    +*Requires a unit of measure + +

    +The argument to PAGEWIDTH is the width of your +printer sheet. PAGEWIDTH requires a unit of measure. +Decimal fractions are allowed. Hence, to tell mom +the width of your printer sheet is 8-1/2 inches, you enter +

    +

    +	.PAGEWIDTH 8.5i
    +
    + + + +
    +

    Page length

    +
    +Macro: PAGELENGTH <length of printer sheet> +
    +*Requires a unit of measure + +

    +PAGELENGTH tells mom how long your +printer sheet is. It works just like +PAGEWIDTH. Therefore, to tell +mom your printer sheet is 11 inches long, you +enter +

    +

    +	.PAGELENGTH 11i
    +
    + + + +
    +

    Paper

    +
    +Macro: PAPER <paper type> + +

    +PAPER provides a convenient way to set the page +dimensions for some common printer sheet sizes. <paper +type> can be one of: +

    +

    +	LETTER
    +	LEGAL
    +	STATEMENT
    +	TABLOID
    +	LEDGER
    +	FOLIO
    +	QUARTO
    +	10x14
    +	EXECUTIVE
    +	A3
    +	A4
    +	A5
    +	B4
    +	B5 
    +
    + +Say, for example, you have A4-sized sheets in your printer. +It's shorter (and easier) to enter +

    +

    +	.PAPER A4
    +
    + +than to remember the correct dimensions and enter +

    +

    +	.PAGEWIDTH  595p
    +	.PAGELENGTH 842p
    +
    + + + +
    +

    Left margin

    +
    +Macro: L_MARGIN <left margin> +
    +*Requires a unit of measure + +

    +L_MARGIN establishes the distance from the left edge +of the printer sheet at which you want your type to start. It may +be used any time, and remains in effect until you enter a new value. +

    +Left indents +and +tabs +are calculated from the value you pass to L_MARGIN, +hence it's always a good idea to invoke it before starting any serious +typesetting. A unit of measure is required. Decimal fractions are +allowed. Therefore, to set the left margin at 3 picas (1/2 inch), +you'd enter either +

    +

    +	.L_MARGIN 3P
    +	  or
    +	.L_MARGIN .5i
    +
    + +If you use the macros +PAGE, +PAGEWIDTH +or +PAPER +without invoking L_MARGIN (either before +or afterwards), mom automatically sets +L_MARGIN to 1 inch. +

    +NOTE: L_MARGIN behaves in a special way when you're +using the +document processing macros. +See +Typesetting Macros in Document Processing +for an explanation. +

    + + + +


    +

    Right margin

    +
    +Macro: R_MARGIN <right margin> +
    +*Requires a unit of measure + +

    +R_MARGIN establishes the amount of space you +want between the end of typeset lines and the right hand edge +of the printer sheet. In other words, it sets the line length. +R_MARGIN requires a unit of measure. Decimal +fractions are allowed. +

    +The line length macro (LL) can +be used in place of R_MARGIN. In either case, the +last one invoked sets the line length. The choice of which to use is +up to you. In some instances, you may find it easier to think of a +section of type as having a right margin. In others, giving a line +length may make more sense. +

    +For example, if you're setting a page of type you know should have +6-pica margins left and right, it makes sense to enter a left and +right margin, like this: +

    +

    +	.L_MARGIN 6P
    +	.R_MARGIN 6P
    +
    + +That way, you don't have to worry about calculating the line +length. On the other hand, if you know the line length for a +patch of type should be 17 picas and 3 points, entering the line +length with LL is much easier than calculating the +right margin. +

    +

    +	.LL 17P+3p
    +
    + +If you use the macros +PAGE, +PAGEWIDTH +or +PAPER +without invoking R_MARGIN afterwards, +mom automatically sets R_MARGIN +to 1 inch. If you set a line length after these macros (with +LL), +the line length calculated by R_MARGIN is, of course, +overridden. +

    +IMPORTANT: R_MARGIN, if used, MUST come after +PAPER, +PAGEWIDTH, +L_MARGIN +and/or +PAGE +(if a right margin isn't given to PAGE). +The reason is that R_MARGIN calculates line +length from the overall page dimensions and the left margin. +Obviously, it can't make the calculation if it doesn't know the page +width and the left margin. +

    +NOTE: R_MARGIN behaves in a special way +when you're using the +document processing macros. +See +Typesetting Macros in Document Processing +for an explanation. +

    + + + +


    +

    Top margin

    +
    +Macro: T_MARGIN <top margin> +
    +*Requires a unit of measure + +

    +T_MARGIN establishes the distance from the top of +the printer sheet at which you want your type to start. It requires +a unit of measure, and decimal fractions are allowed. To set a top +margin of 2-1/2 centimetres, you'd enter +

    +

    +	.T_MARGIN 2.5c
    +
    + +T_MARGIN calculates the vertical position of the +first line of type on a page by treating the top edge of the printer +sheet as a baseline. Therefore, +

    +

    +	.T_MARGIN 1.5i
    +
    + +puts the baseline of the first line of type 1-1/2 inches beneath +the top of the page. +

    +IMPORTANT: T_MARGIN does two +things: it establishes the top margin for pages that come after +it AND it moves to that position on the current page. Therefore, +T_MARGIN should only be used at the top of a file +(prior to entering text) or after +NEWPAGE, +like this: +

    +

    +	.NEWPAGE
    +	.T_MARGIN 6P
    +	<text>
    +
    + +NOTE: T_MARGIN means something +slightly different when you're using the +document processing macros. +See +Top and bottom margins in document processing +for an explanation. +

    + + + +


    +

    Bottom margin

    +
    +Macro: B_MARGIN <bottom margin> +
    +*Requires a unit of measure + +

    +B_MARGIN sets a nominal position at the bottom +of the page beyond which you don't want your type to go. When the +bottom margin is reached, mom starts a new page. +B_MARGIN requires a unit of measure. Decimal +fractions are allowed. To set a nominal bottom margin of 3/4 inch, +enter +

    +

    +	.B_MARGIN .75i
    +
    + +Obviously, if you haven't spaced the type on your pages so that +the last lines fall perfectly at the bottom margin, the margin will +vary from page to page. Usually, but not always, the last line of +type that fits on a page before the bottom margin causes +mom to start a new page. +

    +Occasionally, owing to a peculiarity in groff, +an extra line will fall below the nominal bottom margin. If you're +using the +document processing macros, +this is unlikely to happen; the document processing macros are very +hard-nosed about aligning bottom margins. +

    +NOTE: The meaning of B_MARGIN is +slightly different when you're using the document processing macros. +See +Top and bottom margins in document processing +for an explanation. +

    + + + +


    +

    Page

    +
    +Macro: PAGE +<width> [ <length> [ <lm> [ <rm> [ <tm> [ <bm> ] ] ] ] ] +
    +*All arguments require a unit of measure + +

    +PAGE lets you establish paper dimensions and page +margins with a single macro. The only required argument is page width. +The rest are optional, but they must appear in order and you can't +skip over any. <lm>, <rm>, <tm> +and <bm> refer to the left, right, top and bottom +margins respectively. +

    +Assuming your page dimensions are 11 inches by 17 inches, and that's +all you want to set, enter +

    +

    +	.PAGE 11i 17i
    +
    + +If you want to set the left margin as well, say, at 1 inch, +PAGE would look like this: +

    +

    +	.PAGE 11i 17i 1i
    +
    + +Now suppose you also want to set the top margin, say, at 1-1/2 +inches. <tm> comes after <rm> +in the optional arguments, but you can't skip over any arguments, +therefore to set the top margin, you must also give a right margin. +The PAGE macro would look like this: +

    +

    +        .PAGE 11i 17i 1i 1i 1.5i
    +                         |   |
    +        required right___|   |___top margin
    +                margin
    +
    + +Clearly, PAGE is best used when you want a convenient +way to tell mom just the dimensions of your printer +sheet (width and length), or when you want to tell her everything +about the page (dimensions and all the margins), for example +

    +

    +	.PAGE 8.5i 11i 45p 45p 45p 45p
    +
    + +This sets up an 8-1/2 by 11 inch page with margins of 45 points +(5/8-inch) all around. +

    +NOTE: Only use PAGE at the +start of a document, before entering any text. And remember, +when you're using the +document processing macros, +top margin and bottom margin mean something slightly different than +when you're using just the typesetting macros (see +Top and bottom margins in document processing). +

    +Additionally, if you invoke PAGE with a top margin +argument, any macros you invoke after PAGE will +almost certainly move the +baseline +of the first line of text down by one linespace. To compensate, do +

    +

    +	.RLD 1v
    +
    + +immediately before entering any text, or, if it's feasible, make +PAGE the last macro you invoke prior to entering text. +

    + + + +


    +

    Start a new page

    +
    +Macro: NEWPAGE + +

    +Whenever you want to start a new page, use NEWPAGE, by +itself with no argument. Mom will finish up +processing the current page and move you to the top of a new one +(subject to the top margin set with +T_MARGIN. +

    +Experts: Prior to version 1.1.9, +NEWPAGE was simply an alias of +.bp. As of 1.1.9, NEWPAGE, +is its own mom macro. While the new macro +should be backwardly compatible with documents created using +pre-1.1.9 moms, I suggest that from this version +onward, if you were in the habit of using .bp +whenever you wanted to break to a new page, you now begin to use +NEWPAGE instead. +

    +


    + + + + + + +

    Basic Typesetting Parameters

    +
    + +Basic parameter macros deal with the fundamental requirements +for setting type: family, font, point size, leading and line length. +

    +If you're using the typesetting macros only, the arguments passed +to the basic parameter macros remain in effect until you change them. +The document processing macros handle things differently. See +Typesetting Macros in Document Processing +for an explanation. +

    + +

    Basic parameter macros list

    + + + + +
    +

    Type family

    +
    +Macro: FAMILY <family> +
    +Alias: FAM + +

    +FAMILY takes one argument: the name of the +family +you want. Groff comes with a number of PostScript families, each +identified by a 1-, 2- or 3-letter mnemonic. The standard families +are: + + + +
    AAvant Garde +
    BM Bookman +
    HHelvetica +
    HNHelvetica Narrow +
    NNew Century Schoolbook +
    PPalatino +
    TTimes Roman
    ZCMZapf Chancery
    +

    +The argument you pass to FAMILY is the identifier at +left, above. For example, if you want Helvetica, enter +

    +

    +	.FAMILY H
    +
    + +NOTE: The +font macro +(FT) lets you specify both the type family +and the desired font with a single macro. While this saves a few +keystrokes, I recommend using FAMILY for family, +and FT for font, except where doing so is genuinely +inconvenient. ZCM, for example, only exists in one +style: Italic (I). Therefore, .FT ZCMI +makes more sense than setting the family to "ZCM", then +setting the font to "I". +

    + +ADDITIONAL NOTE: As of mom, version +1.1.9-a, if you are running a version of groff lower +than 1.19.2, you MUST follow all FAMILY +requests with a FT request, otherwise +mom will set all type up to the next +FT request in the +fallback font. +

    +If you are running a version of groff greater than or equal +to 1.19.2, when you invoke the FAMILY macro, +mom "remembers" the font style (Roman, +Italic, etc) currently in use (if the font style exists in the new +family) and will continue to use the same font style in the new +family. For example: +

    +

    +	.FAMILY BM   \" Bookman family
    +	.FT     I    \" Medium Italic
    +	<some text>  \" Bookman Medium Italic
    +	.FAMILY H    \" Helvetica family
    +	<more text>  \" Helvetica Medium Italic
    +
    + +However, if the font style does not exist in the new family, +mom will set all subsequent type in the +fallback font +(by default, Courier Medium Roman) until she encounters a +.FT +request that's valid for the family. For example, assuming +you don't have the font "Medium Condensed Roman" +(mom extension "CD") +in the Helvetica family: +

    +

    +	.FAMILY UN    \" Univers family
    +	.FT     CD    \" Medium Condensed
    +	<some text>   \" Univers Medium Condensed
    +	.FAMILY H     \" Helvetica family
    +	<more text>   \" Courier Medium Roman!
    +
    + +In the above example, you must follow .FAMILY H with a +FT request that's valid for Helvetica. +

    +Experts: +
    +If you add other PostScript families to groff's /font/devps directory, +I recommend following the groff standard for naming families and fonts. +For example, if you add the Garamond family, name the font files +

    +

    +	GARAMONDR
    +	GARAMONDI
    +	GARAMONDB
    +	GARAMONDBI
    +
    + +GARAMOND then becomes a legal family name you can pass to +FAMILY. (You could, of course, shorten GARAMOND to just +G, or GD.) R, I, B, and BI after GARAMOND are the roman, italic, +bold and bold-italic fonts respectively. +

    +Please see the Appendices, +Adding PostScript fonts to groff, +for information on adding fonts and families to groff, as well as +to see a list of the extensions mom provides to +groff's basic R, I, B, BI styles. +

    + + + +


    +

    Font

    +
    +Macro: FT R | I | B | BI | <any other valid font style> + +

    +By default, groff permits FT to take one of four +possible arguments specifying the desired font: + + +
    R = (Medium) Roman +
    I = (Medium) Italic +
    B = Bold (Roman) +
    BI = Bold Italic
    +

    +For example, if your +family +is Helvetica, entering +

    +

    +	.FT B
    +
    + +will give you the Helvetica bold +font. +If your family were Palatino, you'd get the Palatino bold font. +

    +(As of mom, version 1.1.9-a, the range of arguments +that can be passed to FT has been considerably +extended, allowing access to a greater variety of font +weights +and +shapes. +Please see the +NOTE, +below.) +

    +How mom reacts to an invalid argument to +FT depends on which version of groff you're using. +If your groff version is greater than or equal to 1.19.2, +mom will issue a warning and, depending on how +you've set up the +fallback font, +either continue processing using the fallback font, or abort +(allowing you to correct the problem). If your groff version is less +than 1.19.2, mom will silently continue processing, +using either the fallback font or the font that was in effect prior +to the invalid FT call. +

    +FT will also accept, as an argument, a full +family+font name. For example, +

    +

    +	.FT HB
    +
    + +will set subsequent type in Helvetica Bold. However, I strongly +recommend keeping family and font separate except where doing so is +genuinely inconvenient. +

    +For inline control of fonts, see +Inline Escapes, font control. +

    + +NOTE: mom, versions 1.1.9-a and higher, +considerably extends the range of arguments you can pass to +FT, making it more convenient to add and access +fonts of differing +weights +and +shapes +within the same family. Have a look +here +for a list of the weight/style arguments mom +allows. +

    +Be aware, though, that you must have the fonts, correctly +installed and named, in order to use the arguments. (See +How to create a PostScript font for use with groff +for how to add fonts to groff.) Please also read the +ADDITIONAL NOTE +found in the description of the FAMILY macro. +

    + + + +


    +

    Fallback font

    +
    +Macro: FALLBACK_FONT <fallback font> [ ABORT | WARN ] | ABORT | WARN + +

    +In the event that you pass an invalid argument to +.FAMILY +(i.e. a non-existent family), mom, by default, uses +the fallback font, Courier Medium Roman (CR), in order to continue +processing your file. +

    +If you'd prefer another fallback font, pass +FALLBACK_FONT the full family+font name +of the font you'd like. For example, if you'd rather the +fallback font were Times Roman Medium Roman, + +

    +	.FALLBACK_FONT TR
    +
    +

    +would do the trick. +

    +Additionally, if your version of groff accepts accepts "if +F" and "if S" (see +above), +mom issues a warning whenever a +font style set with +.FT +does not exist, either because you haven't registered the style +(see +here +for instructions on registering styles), or because the font style +does not exist in the current family set with +.FAMILY. +By default, mom then aborts, which allows you to +correct the problem. +

    +If you'd prefer that mom not abort on non-existent +fonts, but rather continue processing using a fallback font, +you can pass FALLBACK_FONT the argument +WARN, either by itself, or in conjunction with your +chosen fallback font. +

    +Some examples of invoking FALLBACK_FONT: +
    +

      +
    • .FALLBACK_FONT WARN +
      + mom will issue a warning whenever you try + to access a non-existent font but will continue processing + your file with the default fallback font, Courier Medium Roman. +
    • .FALLBACK_FONT TR WARN +
      + mom will issue a warning whenever you try + to access a non-existent font but will continue processing + your file with a fallback font of Times Roman Medium Roman; + additionally, "TR" will be the fallback font whenever + you try to access a family that does not exist. +
    • .FALLBACK_FONT TR ABORT +
      + mom will abort whenever you try to access a + non-existent font, and will use the fallback font + "TR" whenever you try to access a family + that does not exist. +
    +

    +If, for some reason, you want to revert to ABORT, just enter +.FALLBACK_FONT ABORT and mom will once +again abort on font errors. +

    + + + +


    +

    Point size of type

    +
    +Macro: PT_SIZE <size of type in points> +
    +*Does not require a unit of measure + +

    +PT_SIZE (Point Size) takes one argument: the size of type +in points. Unlike most other macros that establish the size or measure +of something, PT_SIZE does not require that you supply a +unit of measure since it's a near universal convention that type size +is measured in points. Therefore, to change the type size to, say, +11 points, enter +

    +

    +	.PT_SIZE 11
    +
    + +Point sizes may be fractional (e.g. 10.25 or 12.5). +

    +You can prepend a plus or a minus sign to the argument to +PT_SIZE, in which case the point size will be changed by + +or - the original value. For example, if the point size is 12, +and you want 14, you can do +

    +

    +	.PT_SIZE +2
    +
    + +then later reset it to 12 with +

    +

    +	.PT_SIZE -2
    +
    + +The size of type can also be changed inline. See +Inline Escapes, changing point size. +

    +NOTE: It is unfortunate that the pic +pre-processor uses PS, and thus +mom's macro for setting point sizes can't use it. +However, if you aren't using pic, you might want to +alias PT_SIZE as PS, since +there'd be no conflict. +

    +

    +	.ALIAS PS PT_SIZE
    +
    + +would allow you to set point sizes with .PS. +

    + + + +


    +

    Line spacing/leading

    +
    +Macro: LS <distance between lines> +
    +*Does not require a unit of measure + +

    +LS (Line Space) takes one argument: the distance you want, typically +in points, from baseline to baseline of type. The argument may +be fractional (e.g. 12.25 or 14.5). Like PT_SIZE, +LS does not require a unit of measure, since +leading +is most often given in points. Therefore, to set the linespace to +14 points, you would enter +

    +

    +	.LS 14
    +
    + +However, if you wish, you may specify a unit of measure by appending +it directly to the argument passed to LS. For example, +if you want a linespace of 1/4 of an inch, enter +

    +

    +	.LS .25i
    +
    + +You can prepend a plus or a minus sign to the argument to +LS, in which case the line spacing will be changed +by + or - the original value. For example, if the line spacing is +14 points, and you want 17 points, you can do +

    +

    +	.LS +3
    +
    + +then later reset it to 14 points with +

    +

    +	.LS -3
    +
    + +Experts: +
    +LS should not be confused with the groff primitive +ls. LS acts like vs. +mom does not provide a macro analogous to +ls. +

    + + + +


    +

    Automatic line spacing

    +
    +Macro: AUTOLEAD <amount of automatic leading> [FACTOR] +
    +*Does not require a unit of measure + +

    +Without the FACTOR argument, AUTOLEAD +calculates the linespace for you by adding its argument to the +current point size of type. All subsequent PT_SIZE +requests automatically update the linespacing by the autolead amount. +

    +Used in this way, AUTOLEAD does not require a unit +of measure; points is assumed. However, you may use an alternate +unit of measure by appending it to the argument. The argument may +be a decimal fraction (e.g. .5 or 2.75). +

    +As an example, if your current point size of type is 12, entering +

    +

    +	.AUTOLEAD 2
    +
    + +changes the linespace to 14 points, regardless any linespacing +already in effect. From here on, every change to the size of type +(with PT_SIZE, not +inline) +changes the linespace as well. If you decrease the type size to 9 +points, the leading decreases to 11 points. If you increase the type +size to 16 points, the leading increases to 18 points. +

    +Automatic updating of the linespacing continues until you enter a +"manual" line space value with LS. +

    +If you give AUTOLEAD the optional +FACTOR argument, AUTOLEAD +calculates the line space as a factor of the +numeric argument +you gave AUTOLEAD. For example, if your point +size is 12, +

    +

    +	.AUTOLEAD 1.125 FACTOR
    +
    +sets the leading at 13.5 points. If you change the point size +to 14, the leading automatically changes to 15.75 (14 x 1.125). +

    +NOTE: There's no need to prepend a plus sign (+) +to AUTOLEAD's argument, although you may do so if you +wish. +

    + + + +


    +

    Line length

    +
    +Macro: LL <line length> +
    +*Requires a unit of measure + +

    +LL (Line Length) takes one argument: the distance from the +left margin of the page to the maximum allowable point on the +right at which groff should place type. The line length, in +other words, as the macro suggests. +

    +LL requires a unit of measure. Therefore, to set the line +length to 39 picas, you would enter +

    +

    +	.LL 39P
    +
    + +As with other macros that require a unit of measure, the argument to +LL may be fractional. For example, +

    +

    +	.LL 4.5i
    +
    + +sets the line length to 4-1/2 inches. + +

    +Additionally, you may express a new line length relative to the +current line length by prepending a plus or minus sign to the +argument. Thus, if you wanted to increase the line length by 3 +points, you could +do +

    +

    +	.LL +3p
    +
    + +This is especially handy when you want to "hang" +punctuation outside the right margin since you can pass groff's +\w +escape as the argument to LL, like this: +

    +

    +	.LL +\w'.'u
    +
    + +The above example increases the current line length by the width of +a period. Notice that you must append the +unit of measure, +u, to the escape since .LL requires a unit of +measure. + +

    +NOTE: The right margin +macro (R_MARGIN) can also be used to set line +length. +

    +


    + + + + + + +

    Justifying, quadding, filling and breaking lines

    +
    + +The justification and quadding macros deal with how type aligns along +the left and right margins. In a nutshell, type either aligns at the +left margin, at the right margin, at both margins, or at neither margin +(centred). +

    +These macros also determine whether or not +input lines +are joined and +filled +during output. +

    +Additionally, macros that deal with how to break +output lines +are covered in this section, as is the +inline escape +for joining input lines. +

    +You may encounter some words here that are unfamiliar. Refer to +Typesetting terms +and +Groff terms +for an explanation. + +

    Justification, quad, fill, and break macro list

    +

    +

      +
    • Fill modes +
        +
      • JUSTIFY (set lines justified) +
      • QUAD (set filled lines flush left, right or centred) +
      +
    • Nofill modes +
        +
      • LEFT (set non-filled lines flush left) +
      • RIGHT (set non-filled lines flush right) +
      • CENTER (set non-filled lines centred) +
      +
    • Breaking lines +
        +
      • BR (manually break an output line) +
      • EL (break a line without advancing to the next output line) +
      • SPACE (break a line and add space before the next output line) +
      • SPREAD (break and force-justify an output line) +
      +
    • Joining input lines in + nofill mode +
        +
      • \c inline escape +
      +
    + + + +
    +

    Justify lines

    +
    +Macro: JUSTIFY +
    +Fill mode + +

    +JUSTIFY doesn't take an argument. +Input lines +after JUSTIFY are +filled and +justified +upon output. +

    +To break lines and prevent them from being filled and justified, +use the +BR macro. +

    + + + +


    +

    Quad lines left, right, or centre

    +
    +Macro: QUAD L | LEFT | R | RIGHT | C | CENTER | J | JUSTIFY +
    +Alias: FILL +
    +Fill mode + +

    +QUAD takes one argument: the direction in which lines +should be +quadded. +Input lines +after QUAD are +filled +upon output. +

    +If L or LEFT, type is set flush +along the left margin. +

    +If R or RIGHT, type is +set flush along the right margin. +

    +If C or CENTER type is set centred +on the current line length. +

    +J and JUSTIFY justify text, +and are included as a convenience only. Obviously, if text is +justified, it isn't quadded. QUAD J and +QUAD JUSTIFY have exactly the same effect as JUSTIFY. +

    +To break lines and prevent them from being filled, use the +BR macro. +

    + + + +


    +

    Set non-filled lines flush left, right, or centred

    +
    +Macro: LEFT +  Macro: RIGHT +  Macro: CENTER + (alias CENTRE) +
    +Nofill mode + +

    +LEFT, RIGHT and +CENTER let you enter text on a line for line basis +without having to use the +BR macro after each line. +Consider the following: +

    +

    +	.QUAD LEFT
    +	So runs my dream, but what am I?
    +	.BR
    +	An infant crying in the night
    +	.BR
    +	An infant crying for the light
    +	.BR
    +	And with no language but a cry.
    +	.BR
    +
    + +Because text after QUAD is +filled, you have to use the +BR +macro to prevent the lines from running together. Not only is this +annoying to type, it's awkward to read in a text editor. Much better +to do +

    +

    +	.LEFT
    +	So runs my dream, but what am I?
    +	An infant crying in the night
    +	An infant crying for the light
    +	And with no language but a cry.
    +
    + +IMPORTANT: Because LEFT, +RIGHT and CENTER are nofill +modes, groff does not always respect the current line length. +Input lines +that run long may exceed it, or get broken in undesirable ways. +Therefore, when using these three macros, you should preview your +work to ensure that all lines fit as expected. +

    + + + +


    +

    Manually break lines

    +
    +Macro: BR + +

    +When using JUSTIFY or QUAD, +BR tells mom about partial lines +that you want broken (as opposed to +filled). +Any partial +output line +that immediately precedes BR will be +quadded +in the direction of the current quad, or set flush left if text is +justified. + +

    +Most of the time, you won't need the BR macro. +In fill modes, mom tries to be sensible about +where breaks are needed. If the nature of a macro is such that under +most circumstances you'd expect a break, mom puts +it in herself. Equally, in macros where a break isn't normally +desirable, no break occurs. This means text files don't get cluttered +with annoying BR's. +

    +NOTE: Lines of text in +nofill mode +never require a BR. Furthermore, in nofill mode, +ALL macros cause a break. If a break is not desired, use the +\c +inline escape. + +

    +Experts: BR is an alias for br. +You can use either, or mix 'n' match with impunity. +

    + + + +


    +

    Manually break a line without advancing on the page

    +
    +Macro: EL +
    +*In nofill modes (LEFT, RIGHT, CENTER), you must terminate the +line input preceding EL with the \c inline +escape. See +NOTES, +below. +
    +*If you find remembering whether to put in the \c +bothersome, you may prefer to use the +inline escape +alternative to +.EL, +\*[B], +which works consistently regardless of the fill mode. +
    +*EL does not work after the PAD macro. +See +PAD +for the way around this
    . +

    +The mnemonic "EL" is borrowed from old Compugraphic typesetting +systems, where it stood for "End Line." Conceptually, +EL is equivalent to the notion of a carriage return +with no linefeed. + +

    +Note to groff jocks: EL is +unrelated to groff's .el. If you find the +similarity confusing, you may want to alias EL as +something else (but don't use EOL; it's already +taken.) + +

    +EL's function is simple: it breaks a line without +advancing on the page. +As +an example of where you might use it, +imagine that you're working from marked-up copy. The markup +indicates 24 points of space between two given lines, but the +prevailing line spacing is 12.5 points. You may find it more +convenient to break the first line with EL and +instruct mom to advance 24 points to the next line +instead of calculating the lead that needs to be added to 12.5 to +get 24. To demonstrate: +

    +

    +	.LEFT
    +	.LS 12.5
    +	A line of text.\c
    +	.EL
    +	.ALD 24p
    +	The next line of text.
    +
    + +may be more intuitive than +

    +

    +	.LEFT
    +	.LS 12.5
    +	A line of text.
    +	.ALD 11.5p
    +	The next line of text.
    +
    + +The first example has the further advantage that should you wish +to change the prevailing line space but keep the 24 points lead, +you don't have to recalculate the extra space. +

    +"ALD" in the above examples stands for "Advance +LeaD" (another mnemonic borrowed +from Compugraphic), which is covered in the section +Vertical movement. +

    +NOTES: +

    +In versions of mom prior to 1.1.9, EL did not +always work as advertised on the last +output line +of pages that contained a footer trap (e.g. one set with +B_MARGIN +or in documents formatted using the +document processing macros). +

    +EL has been re-written so that this should no longer be the +case. However, in order for it to work in the +nofill +modes +(LEFT, +RIGHT +or +CENTER), +you must always "join" .EL to the line +before it using the +\c +inline escape, +like this: +

    +

    +	.LEFT
    +	A line I don't want to advance\c
    +	.EL
    +
    + +Conversely, in +fill modes +(QUAD LEFT, +QUAD RIGHT, +QUAD CENTER +or +JUSTIFY), +the \c must not be used. +

    +If EL is used after most macros or groff +primitives +(see the exception, below), you don't have to worry about this, +regardless of the fill mode. Just type .EL +
    + + + +


    +

    Break lines and add space between

    +
    +Macro: SPACE <space to add between lines> +
    +Alias: SP + +

    +SPACE breaks a line, just like +BR, then adds space after the line. With no +argument, it adds an extra line space of a value equal to the +current +leading. +If you pass it a numeric argument without supplying a +unit of measure, +it advances that number of extra line spaces. For example: +

    +

    +	.SPACE
    +
    + +breaks the line then adds an extra linespace, whereas +

    +

    +	.SPACE 2
    +
    + +breaks the line and adds two extra linespaces. + +

    +If you supply a unit of measure, SPACE breaks the +line then advances one linespace (at the current +leading) +PLUS the specified amount of extra space given to +SPACE, +as in +

    +

    +	.SPACE 6p
    +
    + +which breaks the line and advances one full linespace plus six +points. + +

    +SUGGESTION: SPACE and +ALD +can be used interchangeably (.SPACE 6p and +.ALD 6p are equivalent). However, +ALD without an argument does nothing, whereas +SPACE without an argument adds an extra line +space. I recommend using SPACE when you +want an extra line space (or multiple thereof), and +ALD whenever you want some other value of space +after a line. + +

    +Experts: SPACE is an alias of sp. +You can use either, or mix 'n' match with impunity. +

    + + + +


    +

    Break and force justify (spread) lines

    +
    +Macro: SPREAD + +

    +Sometimes, you need to break a line of +justified +text and have it come out fully justified, not +quadded +left the way it would be with the BR macro. +An example of where you'd do this would be when you want to prevent a +word at the end of a line from being hyphenated (say, a proper name). +SPREAD is the macro that lets you break the line +and have it came out fully justified. + +

    +Experts: SPREAD is an alias for brp. +You can use either, or mix 'n' match with impunity. +

    + + + +


    +

    Join input lines

    +
    +Inline: \c + +

    +Sometimes, especially when in one of the +nofill modes, +a macro will cause a break where you don't want one. In order +to prevent this from happening (in other words, to join +input lines +together, forming one +output line), +use the groff +inline escape +\c at the end of each input line to +be joined to another, like this: +

    +

    +	.LEFT
    +	.FAMILY T
    +	.FT R
    +	Some lines of text to be \c
    +	.FAMILY H
    +	.FT B
    +	joined \c
    +	.FAMILY T
    +	.FT R
    +	together.
    +
    + +Upon output, the lines will be joined together to read +

    +

    +	Some lines of text to be joined together.
    +
    + +with the word "joined" in Helvetica bold. Note the +space before \c. Without it, the last three +words of the output line would read +

    +

    +	bejoinedtogether
    +
    + +Please also note that had the example been in one of the +fill modes, +there'd have been no need for the \c. +

    +Addendum: The example, above, is designed to +demonstrate the use of \c. However, an easier and +more intuitive way to accomplish the family/font change in the +example would be with the groff +inline escape, +\f. +

    +

    +	Some lines of text to be \f[HB]joined\*[PREV] together.
    +
    +

    +


    + + + + + + +

    Typographic refinements

    +
    + +The macros in this section help you tweak groff's behaviour, +ensuring that your documents look typographically professional. +
    + + +

    Typographic refinements macro list

    +
    +
      +
    • Word and sentence spacing +
        +
      • WS (word spacing) +
      • SS (sentence space) +
      +
    • Letter spacing (track kerning) + +
    • Hyphenation +
        +
      • HY (turn auto hyphenation on/off, or set specific hyphenation parameters) +
      • HY_SET (set all hyphenation parameters) +
      +
    • Automatic kerning and ligatures +
        +
      • KERN (turn automatic pairwise kerning on or off) +
      • LIGATURES (turn automatic generation of ligatures on or off) +
      +
    + + + +
    +

    Word spacing

    +
    +Macro: WS <+|-wordspace> | DEFAULT + +

    +WS (Word Space) increases or decreases the amount +of space between words. In +nofill modes, +or if +QUAD +is in effect, the space between words is fixed. Therefore, if you +change the word spacing with WS, the change applies +uniformly to the space between every word on every line. However, +when text is +justified, +the space between words varies from line to line (in order to justify +the text). Consequently, the change you make with WS +represents the minimum (and ideal) space groff will try to put between +words before deciding whether to hyphenate a final word or to stretch +the word spacing. + +

    +Word space is relative to type size. Knowing how it's calculated is +unimportant. What matters is having a sense of how the value passed +to WS affects the look of your type. Generally, +in/decreasing the word space by a value of 1 or 2 produces a difference +that in many cases is scarcely visible; in/decreasing by a value of 5 +or so produces a subtle but noticeable difference; and in/decreasing +by a value greater than 10 is always apparent. You should preview +your work to assess the effect of WS. + +

    +WS +takes as its argument a whole number preceded by a plus or minus sign. +Therefore, to decrease the word space slightly, you might enter +

    +

    +	.WS -4
    +
    + +To increase it by a noticeable amount, you might enter +

    +

    +	.WS +12
    +
    + +You can reset the word spacing to its previous value by switching +the plus or minus sign, like this: +

    +

    +	.WS +4
    +	A line of text
    +	.WS -4
    +
    + +The .WS -4 undoes the effect of .WS ++4. You can also reset WS to +its groff default by entering +

    +

    +	.WS DEFAULT
    +
    + +This can be particularly useful if you've been playing around +with plus and minus values, and can't remember by how much you +have to in/decrease the word space to get it back to normal. +

    + + + +


    +

    Sentence space

    +
    +Macro: SS <+sentence space> | 0 | DEFAULT + +

    +SS (Sentence Space) tells groff how to treat double +spaces it encounters between sentences in +input lines. +If you use SS, input sentences with two spaces +after them AND input sentences that fall at the end of input lines +all receive a normal word space plus an additional amount of space +whose size is determined by the + value passed as an argument to +SS. Thus, +

    +

    +	.SS +2
    +
    + +means that input sentences with two spaces after them receive a normal +word space PLUS the +2 value passed to SS. +

    +Like +WS, increasing the sentence space by a value of +1 or 2 produces a difference that in many cases is scarcely visible; +increasing by a value of 5 or so produces a subtle but noticeable +difference (i.e. the space between double-spaced input sentences will +be slightly but visibly greater than the space between words); and +increasing by a value greater than 10 is always apparent. You should +preview your work to assess the effect of SS. +

    +There's an additional argument you can pass SS: +the number zero (without the + sign). It's the argument you'll +use most often. Typeset copy should never have two spaces between +sentences, and the "zero" argument tells groff to give the extra +spaces no space at all (effectively removing them). Therefore, +if you double-space your sentences (as you should when writing in a +text editor), get in the habit of putting +

    +

    +	.SS 0
    +
    + +at the top of your files. + +

    +If you do use SS for something other than ensuring +that you don't get unwanted sentence spaces in output copy, you +can set or reset the sentence space to the groff default (the same +width as a word space, i.e. double-spaced input sentences will appear +double-spaced on output as well) with +

    +

    +	.SS DEFAULT
    +
    + +If you're using the +document processing macros +and your +PRINTSTYLE +is TYPEWRITE, .SS DEFAULT is the default, +because you do want double spaces between sentences in copy +that imitates the look of a typewritten document. +

    +IMPORTANT: SS with an argument other than +"0" should only be used if you're of the old (and wise) +school of typists that puts two spaces between sentences. If you +ignore this advice and use SS when you habitually +put only one space between sentences, you risk producing output where +the space between sentences is not equal. +

    + + + +


    +

    Automatic hyphenation control

    +
    +Macro: HY toggle +
    +Macro: HY LINES <max. number of consecutive hyphenated lines> +
    +Macro: HY MARGIN <size of hyphenation margin> +
    +Macro: HY SPACE <extra interword spacing to prevent hyphenation> +
    +Macro: HY DEFAULT +
    +Aliases: HYPHENATE, HYPHENATION + +

    +HY, as you can see, can be invoked with a number of +arguments. In all cases, the aliases HYPHENATE +or HYPHENATION can be used in place of +HY. To aid in understanding the various arguments +you can pass to HY, I've broken them down into +separate sections. + +

    1. HY

    +HY by itself (i.e. with no argument) simply turns +automatic hyphenation on. Any argument other than LINES, +MARGIN, SPACE or DEFAULT, turns automatic +hyphenation off. For example, as explained in +How to read macro arguments, +you could turn HY off by entering +

    +

    +	.HY OFF
    +	   or
    +	.HY X
    +	   or
    +	.HY END
    +
    + +HY observes the following default hyphenation rules: +
    +
      +
    1. Last lines (i.e. ones that will spring a trap--typically + the last line on a page) will not be hyphenated. +
    2. The first and last two characters of a word are never + split off. +
    + +

    2. HY LINES

    +HY LINES sets the maximum number of consecutive +hyphenated lines that will appear in output copy. 2 is a very +good choice, and you'd set it with +

    +

    +	.HY LINES 2
    +
    + +By default, when you turn automatic hyphenation on, there is no +limit to the number of consecutive hyphenated lines. + +

    +NOTE: +Discretionary hyphens +count when groff is figuring out how many lines to hyphenate; +explicit hyphens do not. + +

    3. HY MARGIN

    +HY MARGIN sets the amount of room allowed at +the end of a line before hyphenation is tripped (e.g. if there's +only 6 points left at the end of a line, groff won't try to hyphenate +the next word). HY MARGIN only applies if you're +using +QUAD, and is really only useful if you're +using QUAD LEFT. + +

    +As an example, if you don't want groff to hyphenate words when there's +only 18 points of space left at the end of a left-quadded line, +you'd enter +

    +

    +	.HY MARGIN 18p
    +
    + +NOTE: The numeric argument after HY +MARGIN requires a +unit of measure. + +

    4. HY SPACE

    +HY SPACE sets an amount of extra interword +space that groff will try to put between words on a +line in order to PREVENT hyphenation. HY SPACE +applies only to +justified lines. Generally speaking, +you'll want this value to be quite small, since too big a value +will result in lines with gaping holes between the words. A reasonable +value might be half a point, or one point, which you'd set with +

    +

    +	.HY SPACE .5p
    +	    or
    +	.HY SPACE 1p
    +
    + +NOTE: The numeric argument after HY +SPACE requires a +unit of measure. + +

    5. HY DEFAULT

    +HY DEFAULT resets automatic hyphenation to its +default behaviour, cancelling any changes made with LINES, +MARGIN, and/or SPACE. + +

    A note on hyphenation in general

    +Hyphenation is a necessary evil. If it can be avoided, it should be. +If it can't be, it should occur infrequently. That's the reason for +the number of parameters you can set with HY. + +

    +Furthermore, hyphenation in +rag +copy requires a great deal of attention. At best, it should be +avoided completely by individually adjusting the number of words +on consecutive lines to achieve a pleasing, natural-looking rag. +Since such adjustments are often too fussy for document +processing, I recommend playing around with HY MARGIN +a bit if your copy looks hyphen-heavy. +

    + + + +


    +

    Set hyphenation parameters all at once

    +
    +Macro: HY_SET <lines> [ <margin> [ <space> ] ] +
    +Alias: HYSET + +

    +HY_SET lets you set the parameters for hyphenation +with a single macro. <lines>, <margin> and <space> +correspond to the numeric values required by +LINES, MARGIN and +SPACE as described +above. + +

    +To set just the maximum number of consecutive hyphenated lines, +you'd enter +

    +

    +	.HY_SET 2
    +
    + +If you wanted the same number of maximum consecutive hyphenated lines +and a hyphenation margin for use with +rag +copy, +

    +

    +	.HY_SET 2 36p
    +
    + +would set the hyphenation margin to 36 points. + +

    +If you wanted the same number of maximum consecutive hyphenated +lines and a hyphenation space of 2 points for use with +justified +copy, +

    +

    +	.HYSET 2 0 2p
    +
    + +is how you'd do it. +

    + + + +


    +

    Reduce whitespace

    +
    +Macro: RW <amount of whitespace reduction between letters> +
    + +

    +RW (Reduce Whitespace) and its corresponding macro, +EW (Expand Whitespace), allow you to tighten +(or loosen) +output lines +by uniformly reducing or expanding the space between characters. +This is particularly useful when you want to squeeze or stretch +lines on a narrow measure. + +

    +The value passed to RW may be a whole number or a +decimal fraction. Since a value of 1 produces a noticeable reduction +in the space between letters at text sizes, you'll most likely use +small decimal values when tightening lines. For example, +

    +

    +	.RW .1
    +	  or
    +	.RW .2
    +
    + +may be just enough to squeeze an extra character or two on a +line without the change in letter spacing being obvious. I +highly recommend previewing your work to assess the effect of +RW. + +

    +

    +IMPORTANT: In versions prior to 1.1.9-a, +RW affected all +fonts +in the +family +current at the time it was invoked. As of 1.1.9-a, this behaviour +has been changed. RW affects only the font +current at the time it's invoked, and remains in effect for that +font every time the font is called, hence must be reset to zero to +cancel its effect (.RW 0) on that font. +

    +NOTE: By default, RW does not deposit a +break +(BR) when it's invoked if you're in one of the +fill +modes (i.e. +QUAD +L, R, C, J or +JUSTIFY). +If you want +RW to break at the ends of the previous +input lines +while you're in a fill mode, tell mom +that's what you want by invoking the +BR_AT_LINE_KERN +toggle macro. +

    + + + +


    +

    Expand whitespace

    +
    +Macro: EW <amount of whitespace expansion between letters> +
    + +

    +EW (Expand Whitespace) expands the amount of +whitespace between letters, effectively "loosening" lines +of type. + +

    +The value passed to EW may be a whole number or a +decimal fraction. Since a value of 1 produces a noticeable +expansion in the space between letters at text sizes, you'll most likely use +small decimal values when loosening lines. For example, +

    +

    +	.EW .1
    +	  or
    +	.EW .2
    +
    + +may be just enough to open up a line without the change in letter +spacing being obvious. I highly recommend previewing your work to +assess the effect of EW. +

    +IMPORTANT: In versions prior to 1.1.9-a, +EW affected all +fonts +in the +family +current at the time it was invoked. As of 1.1.9-a, this behaviour +has been changed. EW affects only the font +current at the time it's invoked, and remains in effect for that +font every time the font is called, hence must be reset to zero to +cancel its effect (.EW 0) on that font. +

    +NOTE: By default, EW does not deposit a +break +(BR) when it's invoked if you're in one of the +fill +modes (i.e. +QUAD +L, R, C, J or +JUSTIFY). +If you want +EW to break at the ends of the previous +input lines +while you're in a fill mode, tell mom +that's what you want by invoking the +BR_AT_LINE_KERN +toggle macro. +

    + + + +


    +

    Break before line kerning

    +
    +Macro: BR_AT_LINE_KERN toggle +
    + +

    +By default, in +fill +modes (i.e. +QUAD +L, R, C, J or +JUSTIFY) +mom does not break +input lines +when you invoke RW or EW. +If you'd like her to break input lines prior to RW +or EW, invoke BR_AT_INPUT_LINE +without any argument. To disable the breaks, invoke +BR_AT_INPUT_LINE with any argument (OFF, +QUIT, Q, X...), like this +

    +

    +	.BR_AT_LINE_KERN OFF
    +	    or
    +	.BR_AT_LINE_KERN X
    +
    + +In QUAD L, R or C, +mom simply breaks the line. In QUAD J +(or JUSTIFY, which is the same thing), she breaks +and +force justifies +the line prior to EW or RW. +
    + + + +
    +

    Automatic kerning

    +
    +Macro: KERN toggle +
    + +

    +By itself (i.e. with no argument), KERN turns +automatic pairwise +kerning +on. With any argument (e.g. OFF, Q, X), pairwise kerning is turned +off. +

    +Kerning of individual character pairs can be controlled with the +inline escapes +\*[BU <n>] and \*[FU <n>]. See +Inline Escapes, kerning. +

    + + + +


    +

    Automatic ligature generation

    +
    +Macro: LIGATURES toggle +
    +Alias: LIG + +

    +Provided your current font has +ligatures, +LIGATURES, by itself, turns on automatic +generation of ligatures. When automatic ligature generation is +on, simply typing the letters of a ligature combination will +produce the correct ligature upon output. For example, if you +type the word "finally", the fi combination will be +output as an fi ligature. Generally speaking, ligatures are A +Good Thing, hence mom has them on by default. +

    +LIGATURES with any argument turns automatic +ligature generation off. +

    +NOTE: Not all fonts support ligatures. +

    +


    + + + + + + +

    Type modifications: pseudo-italic, -bold, -condensed, -extended

    +
    + +It sometimes happens that a PostScript +family +doesn't contain all the fonts you need. You might, for example, +be missing an italic font, or a bold font. Or you might not be able +to get your hands on a condensed family. That's where these macros +and inline escapes come in. With them, you can fake the fonts +you're missing. A word of caution, though: "faked" +fonts are just that--faked. You should only use them as a +last resort, and then only sparingly. A word or two or a line +or two in a faked font will pass unnoticed; large patches of +type in a faked font look typographically cheap. +
    + + +

    Type modifications macro list

    +
    + +
      +
    • Pseudo italic +
        +
      • SETSLANT -- degree of pseudo-italicizing +
      • \*[SLANT] -- inline escape for pseudo-italicizing type +
      +
    • Pseudo bold + +
    • Pseudo condensed +
        +
      • CONDENSE -- percentage for pseudo-condensed type +
      • \*[COND] -- inline escape for pseudo-condensed type +
      +
    • Pseudo extended +
        +
      • EXTEND -- percentage for pseudo-extended type +
      • \*[EXT] -- inline escape for pseudo-extending +
      +
    + + + +
    +

    Set degree of slant for pseudo-italicizing

    +
    +Macro: SETSLANT <degrees to slant type> | RESET + +

    +Pseudo-italicizing of type is accomplished by slanting a roman font +a certain number of degrees to the right. SETSLANT +lets you fix the number of degrees. Mom's +default is 15, which produces an acceptable approximation of an +italic font. If you want another value -- say, 13 degrees -- +you'd set it by entering +

    +

    +	.SETSLANT 13
    +
    + +If you change the degree of slant and later want to set it back +to the mom default, do +

    +

    +	.SETSLANT RESET
    +
    + +NOTE: By itself, SETSLANT +will not start pseudo-italicizing type; it merely tells +mom what degree of slant you want. To start +pseudo-italicizing, use the +inline escape +\*[SLANT]. +

    + + + +


    +

    Pseudo italic on/off

    +
    +Inline: \*[SLANT] -- turn pseudo-italic on +
    +Inline: \*[SLANTX] -- turn pseudo-italic off + +

    +\*[SLANT] begins pseudo-italicizing type. +\*[SLANTX] turns the feature off. Both are +inline escapes, +therefore they should not appear as separate lines, but rather +be embedded in text lines, like this: +

    +

    +	Not \*[SLANT]everything\*[SLANTX] is as it seems.
    +
    + +Alternatively, if you wanted the whole line pseudo-italicized, +you'd do +

    +

    +	\*[SLANT]Not everything is as it seems.\*[SLANTX]
    +
    + +Once \*[SLANT] is invoked, it remains in effect +until turned off. + +

    +NOTE: If you're using the +document processing macros +with +PRINTSTYLE TYPEWRITE, +mom underlines pseudo-italics by default. To +change this behaviour, use the special macro +SLANT_MEANS_SLANT. +

    + + + +


    +

    Set amount of emboldening

    +
    +Macro: SETBOLDER <amount of emboldening, in machine units> | RESET + +

    +Emboldening of type is accomplished by printing characters +twice; the second printing is slightly offset from the first, +effectively "thickening" the character. +SETBOLDER lets you set the number of +machine units +for the offset. Mom's default is 700 units, which +produces an acceptable approximation of a bold font. If you want +another value -- say, 500 units -- you'd set it by entering +

    +

    +	.SETBOLDER 500
    +
    + +If you change the emboldening offset and later want to set it back +to the mom default, do +

    +

    +	.SETBOLDER RESET
    +
    + +NOTE: By itself, SETBOLDER +will not start emboldening type; it merely tells +mom what you want the emboldening offset to be. +To start emboldening, use the +inline escape +\*[BOLDER]. +

    + + + +


    +

    Emboldening on/off

    +
    +Inline: \*[BOLDER] -- turn emboldening on +
    +Inline: \*[BOLDERX] -- turn emboldening off + +

    +\*[BOLDER] begins emboldening type. +\*[BOLDERX] turns the feature off. Both are +inline escapes, +therefore they should not appear as separate lines, but rather +be embedded in text lines, like this: +

    +

    +	Not \*[BOLDER]everything\*[BOLDERX] is as it seems.
    +
    + +Alternatively, if you wanted the whole line emboldened, +you'd do +

    +

    +	\*[BOLDER]Not everything is as it seems.\*[BOLDERX]
    +
    + +Once \*[BOLDER] is invoked, it remains in effect +until turned off. + +

    +NOTE: If you're using the +document processing macros +with +PRINTSTYLE TYPEWRITE, +mom ignores \*[BOLDER] +requests. +

    + + + +


    +

    Set percentage for pseudo-condensed type

    +
    +Macro: CONDENSE <pseudo-condense percentage> + +

    +Pseudo-condensing of type is accomplished by reducing the width of +characters at a given point size without reducing their height, +effectively narrowing them so they look like condensed type. +CONDENSE tells mom what +percentage of the normal character width you want the characters +to be condensed. +

    +Mom has no default value for +CONDENSE, therefore you must set it before using the +inline escape +\*[COND]. +80 percent of the normal character width is a good value, and +you'd set it like this: +

    +

    +	.CONDENSE 80
    +
    + +NOTE: By itself, CONDENSE +will not start pseudo-condensing type; it merely tells +mom what percentage of the normal character +width you want characters to be condensed. +To start pseudo-condensing, use the +inline escape +\*[COND]. +

    +Additional note: Make sure that pseudo-condensing +is off (with +\*[CONDX]) +before before making any changes to the pseudo-condense percentage +with CONDENSE. +

    + + + +


    +

    Pseudo-condensing on/off

    +
    +Inline: \*[COND] -- turn pseudo-condensing on +
    +Inline: \*[CONDX] -- turn pseudo-condensing off + +

    +\*[COND] begins pseudo-condensing type. +\*[CONDX] turns the feature off. Both are +inline escapes, +therefore they should not appear as separate lines, but rather +be embedded in text lines, like this: +

    +

    +	\*[COND]Not everything is as it seems.\*[CONDX]
    +
    + +\*[COND] remains in effect until you turn it +off with \*[CONDX]. + +

    +IMPORTANT: You MUST turn \*[COND] +off before making any changes to the point size of your type, either +via the +PT_SIZE +macro or with the \s inline escape. If you wish +the new point size to be pseudo-condensed, simply reinvoke +\*[COND] afterwards. Equally, +\*[COND] must be turned off before changing the +condense percentage with CONDENSE. + +

    +NOTE: If you're using the +document processing macros +with +PRINTSTYLE TYPEWRITE, +mom ignores \*[COND] +requests. +

    + + + +


    +

    Set percentage for pseudo-extended type

    +
    +Macro: EXTEND <pseudo-extend percentage> + +

    +Pseudo-extending of type is accomplished by increasing the width of +characters at a given point size without increasing their height, +effectively widening them so they look like extended type. +EXTEND tells mom what +percentage of the normal character width you want the characters +to be extended. +

    +Mom has no default value for +EXTEND, therefore you must set it before using the +inline escape +\*[EXT]. +120% of the normal character width is a good value, and +you'd set it like this: +

    +

    +	.EXTEND 120
    +
    + +NOTE: By itself, EXTEND +will not start pseudo-extending type; it merely tells +mom what percentage of the normal character +width you want characters to be extended. +To start pseudo-extending, use the +inline escape +\*[EXT]. + +

    +Additional note: Make sure that +pseudo-extending is off (with +\*[EXTX]) +before before making any changes to the pseudo-extend percentage +with EXTEND. +

    + + + +


    +

    Pseudo-extending on/off

    +
    +Inline: \*[EXT] -- turn pseudo-extending on +
    +Inline: \*[EXTX] -- turn pseudo-extending off + +

    +\*[EXT] begins pseudo-extending type. +\*[EXTX] turns the feature off. Both are +inline escapes, +therefore they should not appear as separate lines, but rather +be embedded in text lines, like this: +

    +

    +	\*[EXT]Not everything is as it seems.\*[EXTX]
    +
    + +\*[EXT] remains in effect until you turn it +off with \*[EXTX]. + +

    +IMPORTANT: You MUST turn \*[EXT] +off before making any changes to the point size of your type, either +via the +PT_SIZE +macro or with the \s inline escape. If you wish +the new point size to be pseudo-extended, simply reinvoke +\*[EXT] afterwards. Equally, +\*[EXT] must be turned off before changing the +extend percentage with EXTEND. + +

    +NOTE: If you're using the +document processing macros +with +PRINTSTYLE TYPEWRITE, +mom ignores \*[EXT] +requests. +

    +


    + + + + + + +

    Vertical movement

    +
    + +The two macros in this section allow you to move down or up on the page +relative to the current +baseline. + + +

    Vertical movement macro list

    +
    +
      +
    • ALD -- Advance Lead +
    • RLD -- Reverse Lead +
    + + + +
    +

    Advance Lead (move downward)

    +
    +Macro: ALD <distance to move downward> +
    +*Requires a unit of measure + +

    +ALD takes one argument: the distance to move downward +on the page relative to the current vertical position. +

    +Used by itself, or preceded by +BR, +ALD will advance by one line space plus the +distance you specify. Preceded by +EL, +it will advance by exactly the distance you specify. +

    +ALD requires a unit of measure. Decimal fractions +are allowed, and values may be combined. Therefore, to move down +on the page by 1/4 of an inch, you could enter either +

    +

    +	.ALD .25i
    +	    or
    +	.ALD 1P+6p
    +
    + +As the mnemonic (Advance +LeaD) suggests, you'll most often +use ALD with +points +of lead. + +

    +NOTE: if you want to use ALD +at the top of a page (i.e. to advance to the starting position +of type on a page), combine the value you want with -1v (minus +one line space), like this: +

    +

    +	.ALD 1i-1v
    +
    + +At the top of a page, this will advance one inch from the +top edge of the paper. Without the -1v, the same command would +advance one inch from the top of the page plus the distance of +one line space. +

    +Important: Do NOT use ALD in this +way if you have set a top margin with +T_MARGIN +or +PAGE. +

    + + + +


    +

    Reverse Lead (move upward)

    +
    +Macro: RLD <distance to move upward> +
    +*Requires a unit of measure + +

    +RLD takes one argument: the distance to move +upward on the page relative to the current vertical position. +

    +Used by itself, or preceded by +BR, +RLD will advance by one line space, then +reverse by the distance you specify. Preceded by +EL, +it will reverse by exactly the distance you specify. +

    +RLD requires a unit of measure. Decimal fractions +are allowed, and values may be combined. Therefore, to move up +on the page by 1/4 of an inch, you could enter either +

    +

    +	.RLD .25i
    +	    or
    +	.RLD 1P+6p
    +
    + +As the mnemonic (Rdvance +LeaD) suggests, you'll most often +use RLD with +points +of lead. +

    +


    + + + + + + +

    Tabs

    +
    + +Mom provides two different kinds of tab setup: +typesetting tabs and string tabs. Neither one has anything to +do with the tab key on your keyboard, and both are utterly +divorced from groff's notion of tabs. I recommend reading this +section carefully in order to understand how +mom handles tabs. +

    +NOTE: see the section +Using typesetting macros during document processing +for re-assuring information on the use of tabs during +document processing. +

    + +

    Typesetting tabs

    +

    +Typesetting tabs are defined by both an indent from the left margin and +a line length. This is quite different from typewriter-style tab stops +(the groff norm) that only define the left indent. In conjunction +with the +multi-column macros, +typesetting tabs significantly facilitate +tabular and columnar work. +

    +Typesetting tabs are created with the +TAB_SET +macro. TAB_SET identifies the tab (by number), +establishes its left indent and line length, and optionally sets +a quad direction and fill mode. After tabs have been created with +TAB_SET, they can be called at any time with the +TAB +macro. +

    + +

    Quickie tutorial on typesetting tabs

    +

    +Say you want to set up three tabs to produce an employee evaluation +that looks something like this: +

    + +

    +	CRITERION       EVALUATION     COMMENTS
    +
    +	Service           Good         Many clients specifically request
    +	                               support from Joe by name.
    +
    +	Punctuality    Satisfactory    Tends to arrive after 8:00am, but
    +	                               often works through lunch hour.
    +
    +	Team spirit     Needs work     Persistently gives higher priority
    +	                               to helping clients than respecting
    +	                               organizational hierarchy.
    +
    + +You want the first tab ("CRITERION") +
    +
      +
    • to begin at the left margin of the page (i.e. no indent) +
    • to have a line length of 5 picas +
    • to be set flush left +
    +
    +Tabs must be numbered, and each has to be set up with a separate +TAB_SET +line. Therefore, to set up tab 1, you enter +

    +

    +   .TAB_SET  1  0  5P  L
    +             |  |  |   |
    +      tab #__|  |  |   |__direction
    +                |  |
    +        indent__|  |__length
    +
    + +You want the second tab ("EVALUATION") +
    +
      +
    • to begin 8 picas from the left margin +
    • to have a length of 9 picas +
    • to be set centred. +
    +
    +You set it up like this: +

    +

    +   .TAB_SET  2  8P  9P  C
    +             |  |   |   |
    +      tab #__|  |   |   |__direction
    +                |   |
    +        indent__|   |__length
    +
    + +You want the third tab ("COMMENTS") +
    +
      +
    • to begin 19 picas from the left margin +
    • to have a length of 17 picas +
    • to be set flush left, filled +
    +
    +The setup looks like this: +

    +

    +   .TAB_SET  3  19P  17P  L  QUAD
    +             |   |    |   |    |
    +             |   |    |   |    |__fill output lines
    +             |   |    |   |
    +      tab #__|   |    |   |__direction
    +                 |    |
    +         indent__|    |__length
    +
    + +Once the tabs are set up, you can call them in one of two ways: +
    +
      +
    • TAB (with the tab + number as an argument) breaks the current line, + advances one linespace, and calls the tab. +
    • TN (Tab Next) keeps + you on the current line and moves over to the next + tab in sequence (i.e. from 1 to 2, 2 to 3, etc.). +
    +
    +To exit from tabs and restore your original left margin, line length, +quad direction and fill mode, use +TQ +(Tab Quit). +

    +Here's how the input for our sample employee evaluation looks +(with some introductory parameters): +

    +

    +	.PAGE 8.5i 11i 1i 1i 1i
    +	.FAMILY  T
    +	.FT      R
    +	.PT_SIZE 14
    +	.LS      16
    +	.QUAD    LEFT
    +	.KERN
    +	.HY OFF
    +	.SS 0
    +	.TAB_SET 1 0   5P  L
    +	.TAB_SET 2 8P  9P  C
    +	.TAB_SET 3 19P 17P L QUAD
    +	.TAB 1
    +	CRITERION
    +	.TN
    +	EVALUATION
    +	.TN
    +	COMMENTS
    +	.SP
    +	.TAB 1
    +	Service
    +	.TN
    +	Good
    +	.TN
    +	Many clients specifically request support from Joe by name.
    +	.SP
    +	.TAB 1
    +	Punctuality
    +	.TN
    +	Satisfactory
    +	.TN
    +	Tends to arrive after 8:00am, but often works through lunch hour.
    +	.SP
    +	.TAB 1
    +	Team spirit
    +	.TN
    +	Needs work
    +	.TN
    +	Persistently gives higher priority to helping clients
    +	than respecting organizational hierarchy.
    +	.TQ
    +
    + +Try setting this up and previewing it with +

    +

    +	groff -mom -X <filename>
    +
    + +Notice how .TN simply moves over to the next tab, +while the combination .SP/.TAB 1 breaks the +line, advances by one extra linespace, and calls the first tab. +

    +Notice, too, how the QUAD argument passed to +tab 3 means you don't have to worry about the length of +input lines; +mom +fills +the tab and sets the type flush left. +

    +

    String tabs (autotabs)

    +

    +String tabs let you mark off tab positions with +inline escapes +embedded in +input lines. +Left indents and line lengths are calculated from the beginning and +end positions of the marks. This is especially useful when tab +indents and lengths need to be determined from the text that goes in +each tab. +

    +Setting up string tabs is a two-step procedure. First, you enter an +input line in which you mark off where you want tabs to begin and end. +(This is often best done in conjunction with the +SILENT +macro.) +

    +Next, you invoke the +ST +macro for every string tab you defined, and optionally pass quad and +fill information to it. That done, string tabs are called with +the +TAB +macro, just like typesetting tabs. +

    +In combination with the +PAD +macro and the groff inline escape +\h +(move horizontally across the page) or mom's +\*[FWD <distance>] +(move forward) inline, string tabs provide +tremendous flexibility in setting up complex tab structures. +

    +

    Quickie tutorial on string tabs

    +

    +Say you want to set up tabs for the +employee evaluation form +used as an example in the +typesetting tabs tutorial. +This time, though, you want to play around with the point size of +type, so you can't know exactly how long the tabs will be or where +they should start. All you know is +
    +

      +
    • CRITERION is the longest line in tab 1 +
    • EVALUATION is the longest line in tab 2 +
    • tab 3 should extend to the current right margin +
    • you want a 1 pica gutter between each tab +
    +
    +This is an ideal job for string tabs. +

    +The first thing you need for string tabs is an +input line +with tab positions marked on it. Tabs are marked with the +inline escapes +\*[ST<n>] +and +\*[ST<n>X], +where <n> +is the number you want the tab to have. (In this example, we +enclose the input line with the +SILENT +macro so the line doesn't print. We also use the +PAD +macro to permit defining tab 3 as simply "the amount of +space remaining on the input line.") +

    +The setup looks like this: +

    +

    +	.SILENT
    +	.PAD "\*[ST1]CRITERION\*[ST1X]\*[FWD 12p]\*[ST2]EVALUATION\*[ST2X]\*[FWD 12p]\*[ST3]#\*[ST3X]"
    +	.SILENT OFF
    +
    + +The long line after .PAD looks scary, but it isn't. +Here's what it means when broken down into its component parts: +
    +
      +
    • The longest line in tab 1 is "CRITERION", so we + enclose CRITERION with begin/end markers for string tab 1: +

      + \*[ST1]CRITERION\*[ST1X] +
      +

    • We want a 1 pica (12 points) gutter between tab 1 and 2, + so we insert 12 points of space with \*[FWD 12p] + (ForWarD 12 points): +

      + \*[FWD 12p] +
      +

    • The longest line in tab 2 is "EVALUATION", so + we enclose EVALUATION with begin/end markers for string + tab 2: +

      + \*[ST2]EVALUATION\*[ST2X] +
      +

    • We want 1 pica (12 points) between tab 2 and 3, so we + insert 12 points of space with another \*[FWD 12p]: +

      + \*[FWD 12p] +
      +

    • We want tab 3 to be as long as whatever space remains on + the current line length, so we enclose the + pad marker + (#) with begin/end markers for string tab 3: +

      + \*[ST3]#\*[ST3X] +
      +

    +
    +The tabs are now defined, but they require +quad direction +and +fill +information. For each string tab defined above, enter a +separate +ST +line, like this: +

    +

    +	.ST  1  L
    +	.ST  2  L
    +	.ST  3  L  QUAD
    +	     |  |   |
    +	     |  |   |__fill output lines
    +	     |  |
    +	tab__|  |__direction
    +	number
    +
    + +From here on in, you call the tabs with +TAB +and +TN +just like typesetting tabs (see +typesetting tabs tutorial). +

    +Here's the complete setup and entry for the sample employee +evaluation form utilizing string tabs. +

    +

    +	.PAGE 8.5i 11i 1i 1i 1i
    +	.FAMILY  T
    +	.FT      R
    +	.PT_SIZE 14
    +	.LS      16
    +	.QUAD    LEFT
    +	.KERN
    +	.HY OFF
    +	.SS 0
    +	.SILENT
    +	.PAD "\*[ST1]CRITERION\*[ST1X]\*[FWD 12p]\*[ST2]EVALUATION\*[ST2X]\*[FWD 12p]\*[ST3]#\*[ST3X]"
    +	.SILENT OFF
    +	.ST  1  L
    +	.ST  2  L
    +	.ST  3  L  QUAD
    +	.TAB 1
    +	CRITERION
    +	.TN
    +	EVALUATION
    +	.TN
    +	COMMENTS
    +	.SP
    +	.TAB 1
    +	Service
    +	.TN
    +	Good
    +	.TN
    +	Many clients specifically request support from Joe by name.
    +	.SP
    +	.TAB 1
    +	Punctuality
    +	.TN
    +	Satisfactory
    +	.TN
    +	Tends to arrive after 8:00am, but often works through lunch hour.
    +	.SP
    +	.TAB 1
    +	Team spirit
    +	.TN
    +	Needs work
    +	.TN
    +	Persistently gives higher priority to helping clients
    +	than respecting organizational hierarchy.
    +	.TQ
    +
    + +Try setting this up and previewing it with +

    +

    +	groff -mom -X <filename>
    +
    + +Now, change the point size of the above sample to 12 and preview +it again. You'll see that the tab structure remains identical (tab +1=CRITERION, tab 2=EVALUATION, tab 3=space remaining, and the gutter +between tabs is still 1 pica), while the position and length +of the tabs have altered because of the new point size. +

    +Now try increasing the gutters to 2 picas (\*[FWD 24p] or +\*[FWD 2P] instead of \*[FWD 12p]). Preview the +file again, and notice how the tab structure remains the same, but +the gutters are wider. +

    + + +

    Tabs macro list

    + + +
      +
    • TAB_SET (create typesetting tabs) +
    • \*[ST]...\*[STX] (inline escapes for marking String Tabs) +
    • ST (set String Tabs) +
    • TAB (call tabs) +
    • TN (Tab Next; call next tab in a sequence) +
    • TQ (Tab Quit) +
    + + + +
    +

    Set up typesetting tabs

    +
    +Macro: TAB_SET <tab number> <indent> <length> L | R | C | J [ QUAD ] +
    +*<indent> and <length> require a unit of measure + +

    +TAB_SET creates typesetting tabs that later can be +called with +TAB. +Typesetting tabs are numbered, and defined by an indent, a length, +and a "direction", hence TAB_SET has +four required arguments: +
    +

      +
    • a tab number +
    • an indent (measured from the left margin of the page, + or, if you're already in a tab, from the left margin of the tab) +
    • a length +
    • a direction +
    +
    +To set up a centred tab 6 picas long and 9 points from the left +margin, you'd enter +

    +

    +	.TAB_SET 1 9p 6P C
    +
    + +The tab number in the above ("1") is simply an +identifier. It could have been 4, or 17, or 296. There's no +need to set up tabs in numerical sequence. +

    +By default, tabs are in +nofill +mode, meaning you can enter text in tabs on a line-for-line basis +without having to use the +BR +macro. If you want a tab to be +filled, +pass the optional argument QUAD, which will +make the tab behave as if you'd entered .QUAD L | R | +C. +

    +For +justified +tabs, simply pass the argument J (without the +QUAD argument), like this: +

    +

    +	.TAB 1 9p 6P J
    +
    + +Once tabs are set, they can be called at any time with the +TAB # +macro, where "#" is the number of the desired tab. +

    +You can set up any number of typesetting tabs. However, be +aware that +string tabs +are also called with TAB #, so be careful that you +don't set up a typesetting tab numbered, say, 4, when you already +have a string tab numbered 4. Every tab, typesetting or string, +must have a unique numeric identifier. +

    +NOTE: If you use TAB_SET while +you're currently inside a tab, the indent argument is the distance from +the tab's left margin, not the left margin of the page. Therefore, +you should exit tabs (with +TQ) +before creating new tabs (unless, of course, you want to set +up a tab structure within the confines of an existing tab). +

    +IMPORTANT: Turn all indents off (see +Indents) +before setting up tabs with TAB_SET, or +mom may get confused. +

    + + + +


    +

    Mark positions of string tabs

    +
    +Inlines: \*[ST<number>]...\*[ST<number>X] +
    +*Quad +direction must be LEFT or JUSTIFY (see +QUAD +and +JUSTIFY) +or the +no-fill mode +set to +LEFT. +Please see +IMPORTANT, +below. +

    +String tabs need to be marked off with +inline escapes +before being set up with the +ST +macro. Any input line may contain string tab markers. +<number>, above, means the numeric identifier of +the tab. The following shows a sample input line with string +tab markers. +

    +

    +	\*[ST1]Now is the time\*[ST1X] for all \*[ST2]good men\*ST2X] to come to the aid of the party.
    +
    + +String tab 1 begins at the start of the line and ends after the word +"time". String tab 2 starts at "good" and ends +after "men". Inline escapes (e.g. font or point size +changes, or horizontal movements, including +padding) +are taken into account when mom determines the +position and length of string tabs. +

    +Up to nineteen string tabs may be marked (not necessarily all on +the same line, of course), and they must be numbered between 1 +and 19. +

    +Once string tabs have been marked in input lines, they have to +be "set" with +ST, +after which they may be called, by number, with +TAB. +

    +NOTE: Lines with string tabs marked off in them +are normal input lines, i.e. they get printed, just like any +input line. If you want to set up string tabs without the line +printing, use the +SILENT +macro. +

    +IMPORTANT: +Owing to the way groff processes +input lines +and turns them into +output lines, +it is not possible for mom to "guess" the +correct starting position of string tabs marked off in lines that +are centered or set flush right. +

    +Equally, she cannot guess the starting position if a line is fully +justified and broken with +SPREAD. +

    +In other words, in order to use string tabs, +LEFT +must be active, or, if +QUAD LEFT +or +JUSTIFY +are active, the line on which the string tabs are marked must be +broken "manually" with +BR +(but not +SPREAD). +

    +To circumvent this behaviour, I recommend using the +PAD +to set up string tabs in centered or flush right lines. Say, for +example, you want to use a string tab to underscore the text of a +centered line with a rule. Rather than this, +

    +

    +	.CENTER
    +	\*[ST1]A line of text\*[ST1X]\c
    +	.EL
    +	.ST 1
    +	.TAB 1
    +	.PT_SIZE 24
    +	.ALD 3p
    +	\*[RULE]
    +	.RLD 3p
    +	.TQ
    +
    + +you should do: +

    +

    +	.QUAD CENTER
    +	.PAD "#\*[ST1]A line of text\*[ST1X]#"
    +	.EL
    +	.ST 1
    +	.TAB 1
    +	.PT_SIZE 24
    +	.ALD 3p
    +	\*[RULE] \" Note that you can't use \*[UP ] or \*[DOWN] with \*[RULE]
    +	.RLD 3p
    +	.TQ
    +
    + +

    + + + +


    +

    Set string tabs

    +
    +Macro: ST <tab number> L | R | C | J [ QUAD ] + +

    +After string tabs have been marked off on an input line (see +\*[ST]...\*[STX]), +you need to "set" them by giving them a direction +and, optionally, the QUAD argument. In this +respect, ST is like +TAB_SET +except that you don't have to give ST an indent +or a line length (that's already taken care of, inline, by +\*[ST]...\*[STX]). If you want string tab 1 to be +left, enter +

    +

    +	.ST 1 L
    +
    + +If you want it to be left and +filled, enter +

    +

    +	.ST 1 L QUAD
    +
    + +If you want it to be justified, enter +

    +

    +	.ST 1 J
    +
    + +See the +Quickie tutorial on string tabs +for a full explanation of setting up string tabs. +

    + + + +


    +

    Call tabs

    +
    +Macro: TAB <tab number> +
    +Alias: TB +

    +After tabs have been defined (either with +TAB_SET +or +ST), +TAB moves to whatever tab number you pass it as +an argument. For example, +

    +

    +	.TAB 3
    +
    + +moves you to tab 3. +

    + +NOTE: TAB breaks the line preceding +it and advances 1 linespace. Hence, +

    +

    +	.TAB 1
    +	A line of text in tab 1.
    +	.TAB 2
    +	A line of text in tab 2.
    +
    + +produces, on output +

    +

    +	A line of text in tab 1.
    +	                           A line of text in tab 2.
    +
    + +If you want the tabs to line up, use +TN +(Tab Next), like this: +

    +

    +	.TAB 1
    +	A line of text in tab 1.
    +	.TN
    +	A line of text in tab 2.
    +
    + +which produces +

    +

    +	A line of text in tab 1.   A line of text in tab 2.
    +
    + +If the text in your tabs runs to several lines, and you want the +first lines of each tab to align, you must use the +multi-column macros. +

    +ADDITIONAL NOTE: Any indents in effect prior to +calling a tab are automatically turned off by TAB. +If you were happily zipping down the page with a left indent of 2 +picas turned on, and you call a tab whose indent from the left margin +is 6 picas, your new distance from the left margin will be 6 picas, +not 6 picas plus the 2 pica indent. +

    + + + +


    +

    Tab Next

    +
    +Macro: TN +
    +*In tabs that aren't given the QUAD argument when they're set up +with +TAB_SET +or +ST, you must terminate the line preceding +TN with the \c inline escape. See the +ADDITIONAL NOTE, +
    +*If you find remembering whether to put in the \c +bothersome, you may prefer to use the +inline escape +alternative to +.TN, +\*[TB+], +which works consistently regardless of the fill mode.
    + +

    +TN moves over to the next tab in numeric +sequence (tab n+1) without advancing on the page. See the +NOTE +in the description of the TAB macro for an +example of how TN works. +

    +NOTE: You must put text in the +input line +immediately after TN. "Stacking" of +TN's is not allowed. In other words, you cannot +do +

    +

    +	.TAB 1
    +	Some text
    +	.TN
    +	Some more text
    +	.TN
    +	.TN
    +	Yet more text
    +
    + +The above example, assuming tabs numbered from 1 to 4, should be entered +

    +

    +	.TAB 1
    +	Some text
    +	.TN
    +	Some more text
    +	.TAB 4
    +	Yet more text
    +
    +

    +ADDITIONAL NOTE: +In versions of mom prior to 1.1.9, TN did not +always work as advertised on the last +output line +of pages that contained a footer trap (e.g. one set with +B_MARGIN +or in documents formatted using the +document processing macros). +

    +TN has been re-written so that this should no longer be the +case. However, in order for it to work in tabs that have not been +given a QUAD argument (see +TAB_SET +and +ST) +you must always "join" .TN to the line +before it using the +\c +inline escape, +as in the following example: +

    +

    +	.TAB_SET 1 0  1P  L
    +	.TAB_SET 2 1P 20P L
    +	.TAB 1
    +	1.\c
    +	.TN
    +	The first rule of survival is "make and keep good friends."
    +
    + +When output, the example will look like this: +

    +

    +	1.  The first rule of survival is "make and keep good friends."
    +
    + +Conversely, if you did give a QUAD argument +to TAB_SET or ST, the +\c must not be used. +

    + + + +


    +

    Tab Quit

    +
    +Macro: TQ +
    + +

    +TQ takes you out of whatever tab you were in, +advances 1 linespace, and restores the left margin, line length, +quad direction and +fill mode +that were in effect prior to invoking any tabs. +

    +


    + + + + + + +

    Multi-Columns

    +
    + +Tabs are not by nature columnar, which is to say that if the text +inside a tab runs to several lines, calling another tab does not +automatically move to the +baseline +of the first line in the previous tab. To demonstrate: +

    +

    +	.TAB 1
    +	Carrots
    +	Potatoes
    +	Broccoli
    +	.TAB 2
    +	$1.99/5 lbs
    +	$0.25/lb
    +	$0.99/bunch
    +
    + +produces, on output +

    +

    +	Carrots
    +	Potatoes
    +	Broccoli
    +	           $1.99/5 lbs
    +	           $0.25/lb
    +	           $0.99/bunch
    +
    + +The multi-column macros allow you to set tabs in columnar +fashion, rather than line by line. When you invoke multi-column +mode (with +MCO), +mom saves the position of the current baseline. +MCR +(Multi-column return) at any point while multi-columns are on +returns you to the saved position. Exiting multi-columns +(MCX) +quits the current tab (if you're in one) and moves you to the +bottom of the longest column. (Note that you do not have to use +multi-columns in conjunction with tabs.) +

    +Using our example above, but setting it in multi-column mode, +

    +

    +	.MCO
    +	.TAB 1
    +	Carrots
    +	Potatoes
    +	Broccoli
    +	.MCR
    +	.TAB 2
    +	$1.99/5 lbs
    +	$0.25/lb
    +	$0.99/bunch
    +	.MCX
    +
    + +produces +

    +

    +	Carrots   $1.99/5 lbs
    +	Potatoes  $0.25/lb
    +	Broccoli  $0.99/bunch
    +
    + +NOTE: Do not confuse MCO with +the +COLUMNS +macro in the +document processing macros. +

    + +

    Columns macro list

    + + + + + +
    +

    Begin multi-column setting

    +
    +Macro: MCO +
    + +

    +MCO +(Multi-Column On) +is the macro you use to begin multi-column setting. It marks +the current +baseline +as the top of your columns, for use later with +MCR. See the +introduction to columns +for an explanation of multi-columns and some sample +input. +

    +NOTE: Do not confuse MCO with +the +COLUMNS +macro in the +document processing macros. +

    + + + +


    +

    Return to top of column

    +
    +Macro: MCR +
    + +

    +Once you've turned multi-columns on (with +MCO), +MCR, at any time, returns you to the top of +your columns. +

    + + + +


    +

    Exit multi-columns

    +
    +Macro: MCX [ <distance to advance below longest column> ] +
    +*Optional argument requires a unit of measure + +

    +MCX takes you out of any tab you were in (by silently +invoking +TQ) and advances to the bottom of the longest +column. +

    +Without an argument, MCX advances 1 linespace +below the longest column. Linespace, in this instance, is the +leading +in effect at the moment MCX is +invoked. +

    +If you pass the <distance> argument to +MCX, it advances 1 linespace below the longest +column (see above) PLUS the distance specified by the argument. +The argument requires a unit of measure; therefore, to advance +an extra 6 points below where MCX would +normally place you, you'd enter +

    +

    +	.MCX 6p
    +
    + +NOTE: If you wish to advance a precise distance +below the +baseline +of the longest column, use MCX with an +argument of 0 (zero; no unit of measure required) in conjunction +with the +ALD +macro, like this: +

    +

    +	.MCX 0
    +	.ALD 24p
    +
    + +The above advances to precisely 24 points below the baseline +of the longest column. +

    +


    + + + + + + +

    Indents

    +
    + +With mom's indents, you can indent from the left, +the right, or both margins. In addition, mom +provides temporary left indents (i.e. only one line is indented, +as at the start of a paragraph) and "hanging" left indents +(the reverse of a temporary indent; the first line isn't indented, +subsequent lines are). +

    +

    A brief explanation of how mom handles indents

    +

    +Mom provides five kinds of indents: left, right, +both, temporary, and hanging. Each is invoked by its own name: +
    +

      +
    • IL = Indent Left +
    • IR = Indent Right +
    • IB = Indent Both +
    • HI = Hanging Indent +
    • TI = Temporary Indent +
    +
    +In addition, there are four macros to control exiting from +indents: +
    +
      +
    • IQ  = quit all active indents +
    • ILX = exit indent style left +
    • IRX = exit indent style right +
    • IBX = exit indent style both +
    +
    +This section deals exclusively with IL, IR and +IB. For an explanation +of hanging and temporary indents -- how they work and how to use +them -- see +Hanging indents +and +Temporary indents. +

    +The first time you invoke any of mom's indents, +you must supply a measure. For example, +

    +

    +	.IL 2P
    +
    + +indents text 2 picas from the left margin (or current tab +indent). +

    +When you want to exit the above indent, use either +

    +

    +	.IQ
    +	 or
    +	.ILX
    +
    + +The next time you want the same indent, invoke it without the +argument, like this: +

    +

    +	.IL
    +
    + +As you can see, once you've supplied a measure to an indent macro +mom stores the value, obviating the need to repeat +it on subsequent invocations. And mom doesn't just +store the measure -- she hangs on to it tenaciously. Arguments passed +to IL, IR and IB are additive. +Consider the following: +

    +

    +	.LL 20P
    +	.IR 2P    \"Indent right by 2 picas
    +	A first block of text...
    +	...
    +	...
    +	.IQ       \"Turn indent off
    +	A second block of text...
    +	...
    +	...
    +	.IR 2P    \"Indent right by an additional 2 picas (i.e. 4 picas)
    +	A third block of text...
    +	...
    +	...
    +
    + +The first block of text is right indented by 2 picas (i.e. the line +length is shortened by 2 picas to 18 picas). The second block of +text, after IQ, is, as you'd expect, set to the full +measure. The third block of text -- the one to pay attention to -- +is not right indented by 2 picas, but rather by 4 picas. +Mom adds the value of arguments to IL, +IR and IB to whatever value is already +in effect. +

    +If you wanted the third block of text in the example above to +be right indented by just 2 picas (the original measure given to +IR), you would enter .IR without an +argument. +

    +Because indent arguments are additive, putting a minus sign in front +of the argument can be used to subtract from the current value. +In the following example, the first line is indented 18 points, the +second is indented 36 points (18+18), and the third is again indented +18 points (36-18). +

    +

    +	.IL 18p     \"Indent left by 18 points      = 18 points
    +	Now is the time
    +	.IL 18p     \"Indent left by 18 points more = 36 points
    +	for all good men to come
    +	.IL -18p    \"Indent left by 18 points less = 18 points
    +	to the aid of the party.
    +
    + +Sometimes, you may want to clear out the stored indent values -- let +mom start indenting with a clean slate, as it were. +Giving the optional argument CLEAR to any of the +"indent quit" macros resets them to zero. +
    +
      +
    • IQ CLEAR  = quit and clear all indents +
    • ILX CLEAR = quit and clear indent style left +
    • IRX CLEAR = quit and clear indent style right +
    • IBX CLEAR = quit and clear indent style both +
    +
    +Indent styles may be combined and manipulated separately. You could, +for example, have a left indent of 4 picas and a right indent of 6 +picas and control each separately, as in the following example. +

    +

    +	.IL 4P     \"Indent left 4 picas
    +	.IR 6P     \"Indent right 6 picas
    +	Some text
    +	.IRX       \"Turn off the right indent only
    +	More text  \"Text is still indented 4 picas left
    +
    + +If, at .IRX, you wanted the text afterwards to have no +indents (either left or right), you would enter .IQ, +which exits all indent styles at once. +

    +A word of advice: Indents are best used only when +you have a compelling reason not to change the current left margin or +line length. In many instances where indents might seem expedient, +it's better to use tabs, or actually change the left margin or the +line length. Mom's indenting macros are flexible +and powerful, but easy to get tangled up in. Personally, I don't +use them much, except for cutarounds and multi-level lists à la html, +at which they excel. +

    +NOTE: see the section +Typesetting Macros in Document Processing +for information and advice on using indents with the +document processing macros. +

    +

    Indents macro list

    +
      +
    • IL  (Indent left) +
    • IR  (Indent right) +
    • IB  (Indent both) +
    • TI  (Temporary indent, left) +
    • HI  (Hanging Indent) + +
    • IQ  (Quit indents, all) +
    • ILX (Exit indent style left) +
    • IRX (Exit indent style right) +
    • IBX (Exit indent style both) +
    + + + +
    +

    Indent left

    +
    +Macro: IL [ <measure> ] +
    +*The optional argument requires a unit of measure + +

    +IL indents text from the left margin of the page, +or if you're in a tab, from the left edge of the tab. Once +IL is on, the left indent is applied uniformly to +every subsequent line of text, even if you change the line length. +

    +The first time you invoke IL, you must give it a +measure. Subsequent invocations with a measure add to the previous +measure. A minus sign may be prepended to the argument to subtract +from the current measure. The +\w +inline escape +may be used to specify a text-dependent measure, in which case +no unit of measure is required. For example, +

    +

    +	.IL \w'margarine'
    +
    + +indents text by the width of the word "margarine". +

    +With no argument, IL indents by its last +active value. See the +brief explanation of how mom handles indents +for more details. +

    +NOTE: Calling a tab (with +TAB) +automatically cancels any active indents. +

    +ADDITIONAL NOTE: Invoking IL +automatically turns off IB. +

    + + + +


    +

    Indent right

    +
    +Macro: IR [ <measure> ] +
    +*The optional argument requires a unit of measure + +

    +IR indents text from the right margin of the +page, or if you're in a tab, from the end of the tab. +

    +The first time you invoke IR, you must give it a +measure. Subsequent invocations with a measure add to the previous +indent measure. A minus sign may be prepended to the argument to +subtract from the current indent measure. The +\w +inline escape +may be used to specify a text-dependent measure, in which case +no unit of measure is required. For example, +

    +

    +	.IR \w'jello'
    +
    + +indents text by the width of the word "jello". +

    +With no argument, IR indents by its last +active value. See the +brief explanation of how mom handles indents +for more details. +

    +NOTE: Calling a tab (with +TAB) +automatically cancels any active indents. +

    +ADDITIONAL NOTE: Invoking IR +automatically turns off IB. +

    + + + +


    +

    Indent both

    +
    +Macro: IB [ <left measure> <right measure> ] +
    +*The optional arguments require a unit of measure + +

    +IB allows you to set or invoke a left and a right +indent at the same time. +

    +At its first invocation, you must supply a measure for both indents; +at subsequent invocations when you wish to supply a measure, both must +be given again. As with IL and IR, +the measures are added to the values previously passed to the macro. +Hence, if you wish to change just one of the values, you must +give an argument of zero to the other. +

    +A word of advice: If you need to manipulate left and +right indents separately, use a combination of IL +and IR instead of IB. You'll +save yourself a lot of grief. +

    +A minus sign may be prepended to the arguments to subtract from their +current values. The +\w +inline escape +may be used to specify text-dependent measures, in which case +no unit of measure is required. For example, +

    +

    +	.IB \w'margarine' \w'jello'
    +
    + +left indents text by the width of the word "margarine" +and right indents by the width of "jello". +

    +Like IL and IR, IB +with no argument indents by its last active values. See the +brief explanation of how mom handles indents +for more details. +

    +NOTE: Calling a tab (with +TAB) +automatically cancels any active indents. +

    +ADDITIONAL NOTE: Invoking IB +automatically turns off IL and +IR. +

    + + + +


    +

    Temporary (left) indent

    +
    +Macro: TI [ <measure> ] +
    +*The optional argument requires a unit of measure + +

    +A temporary indent is one that applies only to the first line of +text that comes after it. Its chief use is indenting the first +line of paragraphs. (Mom's +PP +macro, for example, uses a temporary indent.) +

    +The first time you invoke TI, you must give it +a measure. If you want to indent the first line of a +paragraph by, say, 2 +ems, +do +

    +

    +	.TI 2m
    +
    + +Subsequent invocations of TI do not require you +to supply a measure; mom keeps track of the +last measure you gave it. +

    +Because temporary indents are temporary, there's no need to turn +them off. +

    +IMPORTANT: Unlike IL, IR and +IB, measures given to TI +are NOT additive. In the following example, the second .TI +2P is exactly 2 picas. +

    +

    +	.TI 1P
    +	The beginning of a paragraph...
    +	.TI 2P
    +	The beginning of another paragraph...
    +
    + + + +
    +

    Hanging indent

    +
    +Macro: HI [ <measure> ] +
    +*The optional argument requires a unit of measure + +

    +A hanging indent looks like this: +

    +

    +	The thousand injuries of Fortunato I had borne as best I
    +	    could, but when he ventured upon insult, I vowed
    +	    revenge.  You who so well know the nature of my soul
    +	    will not suppose, however, that I gave utterance to a
    +	    threat, at length I would be avenged...
    +
    + +The first line of text "hangs" outside the left +margin. +

    +In order to use hanging indents, you must first have a left indent +active (set with either +IL +or +IB). +Mom will not hang text outside the left margin set with +L_MARGIN +or outside the left margin of a tab. +

    +The first time you invoke HI, you must give it +a measure. If you want the first line of a paragraph to hang by, +say, 1 pica, do +

    +

    +	.IL 1P
    +	.HI 1P
    +
    + +Subsequent invocations of HI do not require you +to supply a measure; mom keeps track of the +last measure you gave it. +

    +Generally speaking, you should invoke HI immediately +prior to the line you want hung (i.e. without any intervening +control lines). +And because hanging indents affect only one line, there's no need to turn +them off. +

    +

    A recipe for numbered lists

    +

    +PLEASE NOTE: mom now has macros for setting lists (see +Nested lists), +making this recipe superfluous. It remains here in the hope that +it will clarify the use of hanging indents generally, if no longer +specifically. +

    +Consider the following example: +

    +

    +	.PAGE 8.5i 11i 1i 1i 1i 1i
    +	.FAMILY  T
    +	.FT      R
    +	.PT_SIZE 12
    +	.LS      14
    +	.JUSTIFY
    +	.KERN
    +	.SS 0
    +	.IL \w'\0\0.'    \"Indent left by 2 figure spaces and a period
    +	.HI \w'\0\0.'    \"Hang first line of text back by 2 figure spaces and a period
    +	1.\0The most important point to be considered is whether the
    +	answer to the meaning of life, the universe, and everything
    +	really is 42.  We have no-one's word on the subject except
    +	Mr. Adams'.
    +	.HI
    +	2.\0If the answer to the meaning of life, the universe,
    +	and everything is indeed 42, what impact does this have on
    +	the politics of representation?  42 is, after all not a
    +	prime number.  Are we to infer that prime numbers don't
    +	deserve equal rights and equal access in the universe?
    +	.HI
    +	3.\0If 42 is deemed non-exclusionary, how do we present it
    +	as the answer and, at the same time, forestall debate on its
    +	exclusionary implications?
    +
    + +First, we invoke a left indent with a measure equal to the width +of 2 +figures spaces +plus a period (using the +\w +inline escape). At this point, the left indent is active; text +afterwards would normally be indented. However, we invoke a hanging +indent of exactly the same width, which hangs the first line (and +first line only!) to the left of the indent by the same distance +(in this case, that means "out to the left margin"). +Because we begin the first line with a number, a period, and a +figure space, the actual text ("The most important point...") +starts at exactly the same spot as the indented lines that +follow. +

    +Notice that subsequent invocations of HI without a +measure produce exactly the same effect. +

    +Paste the example above into a file and preview it with groff -mom -X +<filename> to see hanging indents in action. +

    +IMPORTANT: Unlike IL, IR and +IB, measures given to HI +are NOT additive. Each time you pass a measure to +HI, the measure is treated literally. +

    + + + +


    +

    Quitting indents

    +
    +Macro: IQ  [ CLEAR ]  (quit any/all indents -- see *IMPORTANT NOTE) +
    +Macro: ILX [ CLEAR ]  (exit Indent Left) +
    +Macro: IRX [ CLEAR ]  (exit Indent Right) +
    +Macro: IBX [ CLEAR ]  (exit Indent Both) + +

    +*IMPORTANT NOTE: +
    +    Formerly, the macro for quitting all indents was +.IX. This usage is now deprecated, in favour +of .IQ. .IX will +continue to behave as before, but mom will +issue a warning to stderr indicating that you should update your +documents. +
    +    As a consequence of this change,
    +ILX, IRX and IBX may +now also be invoked as ILQ, IRQ and +IBQ. Both forms are acceptable. +

    +Without an argument, the macros to quit indents merely restore your +original margins and line length. The measures stored in the +indent macros themselves are saved so you can call them again without +having to supply a measure. +

    +If you pass these macros the optional argument CLEAR, +they not only restore your original left margin and line length, +but also clear any values associated with a particular indent style. +The next time you need an indent of the same style, you have to supply +a measure again. +

    +IQ CLEAR, as you'd suspect, quits and clears +the values for all indent styles at once. + +

    +


    +Next   +Prev   +Top   +Back to Table of Contents + + + diff --git a/contrib/mom/momdoc/using.html b/contrib/mom/momdoc/using.html new file mode 100644 index 0000000..f601dde --- /dev/null +++ b/contrib/mom/momdoc/using.html @@ -0,0 +1,230 @@ + + + + +Using mom + + + + + +Next   +Prev   +Back to Table of Contents +

    + + +

    USING MOM

    + + +Introduction +
    +Inputting macros +
    +Invoking groff +
    +Previewing documents +

    +


    +

    Introduction

    + +As explained in the section +What is mom?, +mom can be used in two ways: for straight typesetting +or for document processing. The difference between the two is +that in straight typesetting, every macro is a literal +typesetting instruction that determines precisely how text +following it will look. Document processing, on the other hand, +uses markup "tags" (e.g. .PP for +paragraphs, .HEAD for heads, .FOOTNOTE +for footnotes, etc.) that make a lot of typesetting decisions +automatically. +

    +You tell mom that you want to use the document +processing macros with the +START +macro, explained below. After START, +mom determines the appearance of text following +the markup tags automatically, although you, the user, can easily +change how mom interprets the tags. This gives you +nearly complete control over document design. In addition, the +typesetting macros, in combination with document processing, let you +meet all sorts of typesetting needs that just can't be covered by +"one macro fits all" markup tags. +

    + +

    How to input mom's macros

    + + +Regardless of which way you use mom, the +following apply. +
    +
      +
    1. You need a good text editor for inputting + mom files. +

      + I cannot recommend highly enough that you use an + editor that lets you write syntax highlighting + rules for mom's macros and + inline escapes. + I use the vi clone called elvis, and find it a pure + joy in this regard. Simply colourizing macros and + inlines to half-intensity can be enough to make text stand + out clearly from formatting commands. +

    2. All mom's macros begin with a period + (dot) and must be entered in upper case (capital) + letters. +
    3. Macro + arguments + are separated from the macro itself by spaces. Multiple + arguments to the same macro are separated from each + other by spaces. Any number of spaces may be used. All + arguments to a macro must appear on the same line as the + macro. +
    4. Any argument (except a + string argument) + that is not a digit must be entered in upper case + (capital) letters. +
    5. Any argument that requires a plus or minus sign must + have the plus or minus sign prepended to the argument + with no intervening space (e.g. +2, -4). +
    6. Any argument that requires a + unit of measure + must have the unit appended directly to the argument, + with no intervening space (e.g. 4P, .5i, 2v). +
    7. String arguments, + in the sense that the term is used in this manual, must + be surrounded by double-quotes ("text of + string"). Multiple string arguments are separated + from each other by spaces (each argument surrounded by + double-quotes, of course). +
    8. If a string argument, as entered in your text editor, + becomes uncomfortably long (i.e. runs longer than the + visible portion of your screen or window), you may break + it into two or more lines by placing the backslash + character (\) at the ends of lines to break + them up, like this: +

      +

      +	.SUBTITLE "An In-Depth Consideration of the \
      +	Implications of Forty-Two as the Meaning of Life, \
      +	The Universe, and Everything"
      +	
      +
    + +It's important that formatted documents be easy to read/interpret +when you're looking at them in a text editor. One way to achieve +this is to group macros that serve a similar purpose together, and +separate them from other groups of macros with a blank comment line. +In groff, that's done with \# on a line by itself. +Consider the following, which is a template for starting the +chapter of a book. +

    +

    +	.TITLE   "My Pulitzer Novel"
    +	.AUTHOR  "Joe Blow"
    +	.CHAPTER  1
    +	\#
    +	.DOCTYPE    CHAPTER
    +	.PRINTSTYLE TYPESET
    +	\#
    +	.FAM     P
    +	.PT_SIZE 10
    +	.LS      12
    +	\#
    +	.START
    +
    + + +

    Printing -- invoking groff with mom

    +
    + +After you've finished your document, naturally you will want to +print it. This involves invoking groff from the command line. +In all likelihood, you already know how to do this, but in case +you don't, here are two common ways to do it. +

    +

    +	groff -mom -l <filename>
    +	groff -mom <filename> | lpr
    +
    + +In the first, the -l option to groff tells +groff to send the output to your printer. In the second, you're +doing the same thing, except you're telling groff to pipe the +output to your printer. Basically, they're the same thing. The +only advantage to the second is that your system may be set up +to use something other than lpr as your print +command, in which case, you can replace lpr +with whatever is appropriate to your box. +

    +Sadly, it is well beyond the scope of this manual to tell you +how to set up a printing system. See the README file for +minimum requirements to run groff with mom. +

    +NOTE FOR ADVANCED USERS: I've sporadically had groff +choke on perfectly innocent sourced files within mom +documents. You'll know you have this problem when groff complains that +it can't find the sourced file even when you can plainly see that the +file exists, and that you've given .so the right path and +name. Should this happen, pass groff the -U (unsafe mode) +option along with the other options you require. Theoretically, you +only need -U with .open, .opena, .pso, .sy, +and .pi, however reality seems, at times, to dictate +otherwise. +

    + +

    How to preview documents

    + + +Other than printing out hard copy, there are two well-established +methods for previewing your work. Both assume you have a working +X server. +

    +Groff itself comes with a quick and dirty previewer called +gxditview. Invoke it with +

    +

    +	groff -X -mom filename
    +
    + +It's not particularly pretty, doesn't have many navigation +options, requires a lot of work if you want to use other than +the "standard" groff PostScript fonts, and occasionally +has difficulty accurately reproducing some of +mom's macro effects +(smartquotes +and +leaders +come to mind). What it does have going for it is that it's fast and +doesn't gobble up system resources. +

    +A surer way to preview documents is with gv +(ghostview). This involves processing documents with groff, +and directing the output to a PostScript file, like this, +

    +

    +	groff -mom filename > filename.ps
    +
    +then opening .ps file in gv. +

    +While that may sound like a lot of work, I've set up my editor +(elvis) to do it for me. Whenever I'm working on a document that +needs previewing/checking, I fire up gv with the +"Watch File" option turned on. To look at the file, I +tell elvis to process it (with groff) and send it to a temporary +file (groff -mom filename > filename.ps), then open +the file inside gv. Ever after, when I want to +look at any changes I make, I simply tell elvis to work his magic +again. The Watch File option in gv registers that +the file has changed, and automatically loads the new version. +Voilà! --instant previewing. + +

    +


    +Next   +Prev   +Top   +Back to Table of Contents + + diff --git a/contrib/mom/om.tmac b/contrib/mom/om.tmac new file mode 100644 index 0000000..45e9aa8 --- /dev/null +++ b/contrib/mom/om.tmac @@ -0,0 +1,15889 @@ +.\" om.tmac +.ig +Mom -- a typesetting/document-processing macro set for groff. + +Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Written by Peter Schaffter (peter@faustus.dyn.ca) + +This file is part of groff. + +groff is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +groff 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Version 1.3-a +------------- +Antoine de St-Exupéry asserted that elegance in engineering is +achieved not when there is nothing left to add, but when there is +nothing left to take away. + +By those standards, mom is a Rube Goldberg contraption. She was +created over the years while groff, and my understanding of it, +changed and evolved. However, I'm a firm believer in "if it +ain't broke, don't fix it," so I'm leaving any major clean-up +of redundancies and whatnot for a rainy day. + +Inasmuch as possible, macros that turn a feature on or off follow +a similar style. Invoking the macro without an argument turns +the feature on. Invoking it with any other argument turns it off. +Use of the argument OFF is recommended, but not required; users +may find other conventions preferable (e.g. NO, X, END, QUIT, etc.). + +"" in the description of arguments that can be passed +to a macro means that any argument turns the feature off. +.. +\# +\# ==================================================================== +\# +\# Check which version of groff is being run +.if (\n[.x]\n[.y] < 118) \ +. ab You need GNU troff version 1.18 or higher to run this version of mom. +\# Check that GNU troff is being run +.if !\n[.g]=1 \ +. ab The mom macros require that you be running GNU troff. +.if \n(.C \ +. ab The groff mom macros do not work in compatibility mode. +\# Add supplementary styles +.sty \n[.fp] L \" Light Roman +.sty \n[.fp] LI \" Light Italic +.sty \n[.fp] LCD \" Light Condensed Roman +.sty \n[.fp] LCDI \" Light Condensed Italic +.sty \n[.fp] LEX \" Light Extended Roman +.sty \n[.fp] LEXI \" Light Extended Italic +.sty \n[.fp] CD \" Medium/Book Condensed Roman +.sty \n[.fp] CDI \" Medium/Book Condensed Italic +.sty \n[.fp] EX \" Medium/Book Extended Roman +.sty \n[.fp] EXI \" Medium/Book Extended Italic +.sty \n[.fp] DB \" DemiBold Roman +.sty \n[.fp] DBI \" DemiBold Italic +.sty \n[.fp] BCD \" Bold Condensed Roman +.sty \n[.fp] BCDI \" Bold Condensed Italic +.sty \n[.fp] BEX \" Bold Extended Roman +.sty \n[.fp] BEXI \" Bold Extended Italic +.sty \n[.fp] HV \" Heavy Roman +.sty \n[.fp] HVI \" Heavy Italic +.sty \n[.fp] HVCD \" Heavy Condensed Roman +.sty \n[.fp] HVCDI \" Heavy Condensed Italic +.sty \n[.fp] HVEX \" Heavy Extended Roman +.sty \n[.fp] HVEXI \" Heavy Extended Italic +.sty \n[.fp] BL \" Black Roman +.sty \n[.fp] BLI \" Black Italic +.sty \n[.fp] BLCD \" Black Condensed Roman +.sty \n[.fp] BLCDI \" Black Condensed Italic +.sty \n[.fp] BLEX \" Black Extended Roman +.sty \n[.fp] BLEXI \" Black Extended Italic +.sty \n[.fp] UBL \" Ultra-Black Roman +.sty \n[.fp] UBLI \" Ultra-Black Italic +\# +\# ==================================================================== +\# +\# TYPESETTING MACROS, STRINGS, AND ALIASES +\# ======================================== +\# +\# +++ALIASES+++ +\# +\# Alias .als as ALIAS, and .aln (number registers) as ALIASN +\# +.als ALIAS als +.als ALIASN aln +\# +\# +\# ALIASES FOR GROFF REQUESTS +\# -------------------------- +\# +.ALIAS MAC de +.ALIAS BR br +.ALIAS SP sp +.ALIAS PAGELENGTH pl +.ALIAS SPREAD brp +.ALIAS ESC_CHAR ec +.ALIAS STRING ds +\# +\# ALIASES FOR NUMBER REGISTERS +\# ---------------------------- +\# +.ALIASN #PT_SIZE .ps \"fractional point size in units +.ALIASN #DIVER_DEPTH dn \"diversion depth +.ALIASN #DIVER_WIDTH dl \"diversion width +.ALIASN #TRAP_DISTANCE .t \"distance to next trap +.ALIASN #LEAD .v \"line space (.vs, not .ls) +.ALIASN #PAGE_LENGTH .p \"page length +.ALIASN #NUM_ARGS .$ \"number of arguments passed to a macro +.ALIASN #INDENT .i \"value of current indent +\# +\# ==================================================================== +\# +\# MISCELLANEOUS +\# ============= +.nr #L_MARGIN \n(.o \" Tabs, etc require #L_MARGIN +.cflags 4 /\(en \" So slash and en-dashes get broken +.warn 8192 +\# +.ig +About the warn level +-------------------- + +There's a lot of testing for the presence of number registers and +strings in this macro file. Many of the registers and strings +pop into and out of existence on the fly. For convenience, I +often use + + .if \\n[whatever] and .if !\\n[whatever] + +to test "if the register exists and is (not) empty." Groff, +encountering such tests when called with the -ww options, emits + + warning: number register whatever not defined. + +Groff also warns about strings similarly tested for. + +The warn level, above, is high in order to shut off those +warnings. If you're futzing in this file and need more verbose +warnings, either comment out ".warn 8192" or set the warnlevel +to the one you need (but be ready for lots of what I've just +described). +.. +\# +\# ==================================================================== +\# +\# +++PAGE LAYOUT+++ +\# +\# Macros that control the physical layout of the page: paper size +\# and margins. +\# +\# PAGE WIDTH +\# ---------- +\# *Argument: +\# +\# *Function: +\# Stores user supplied page width in register #PAGE_WIDTH. +\# *Notes: +\# #PAGE_WIDTH is used to establish the default LL (and right margin). +\# Requires unit of measure. +\# +.MAC PAGEWIDTH END +. br +. nr #PAGE_WIDTH \\$1 +. if !r#L_MARGIN \{ .L_MARGIN \\n(.o \} +. if !r#R_MARGIN \{ .R_MARGIN 1i \} +.END +\# +\# +\# L_MARGIN +\# -------- +\# *Argument: +\# +\# *Function: +\# Stores user supplied page offset in register #L_MARGIN. +\# Sets .po to user supplied offset. +\# *Notes: +\# Requires unit of measure. +\# +.MAC L_MARGIN END +. br +. nr #L_MARGIN (\\$1) +. po \\n[#L_MARGIN]u +.END +\# +\# +\# R_MARGIN +\# -------- +\# *Argument: +\# +\# *Function: +\# Stores user supplied right margin in register #R_MARGIN. +\# *Notes: +\# This is a pseudo-margin. Right margin is actually a function of +\# line length. The macro calculates line length from the page offset +\# and the value plugged into #R_MARGIN. +\# +\# N.B. -- PAGEWIDTH and L_MARGIN have to be defined before R_MARGIN. +\# +\# Requires unit of measure. +\# +.MAC R_MARGIN END +. br +. nr #R_MARGIN (\\$1) +. ll \\n[#PAGE_WIDTH]u-\\n[#L_MARGIN]u-\\n[#R_MARGIN]u +. ta \\n(.lu +. nr #L_LENGTH \\n(.l +.END +\# +\# +\# T_MARGIN +\# -------- +\# *Argument: +\# +\# *Function: +\# Stores the user supplied top margin in register #T_MARGIN. +\# Advances user supplied depth from the top of the page. +\# *Notes: +\# Requires unit of measure. +\# +.MAC T_MARGIN END +. nr #T_MARGIN (\\$1) +. nr #TOP 1 +. if !\\n[#DOCS] \{\ +. sp |\\n[#T_MARGIN]u-1v +. \} +. wh 0i DO_T_MARGIN +.END +\# +\# +\# B_MARGIN +\# -------- +\# *Argument: +\# +\# *Function: +\# Stores the user supplied bottom margin in register #B_MARGIN. +\# *Notes: +\# Requires unit of measure. +\# +.MAC B_MARGIN END +. br +. nr #B_MARGIN (\\$1) +. nr #ORIGINAL_B_MARGIN \\n[#B_MARGIN] +. nr #B_MARGIN_SET 1 +. wh -\\n[#B_MARGIN]u DO_B_MARGIN +.END +\# +\# +\# PAGE +\# ---- +\# *Arguments: +\# [pagelength [leftmargin [rightmargin [topmargin [bottommargin]]]]] +\# *Function: +\# Page set-up. Collects arguments and passes them to the appropriate +\# macros. +\# *Notes: +\# All arguments after pagewidth are optional, but must appear +\# in the order given above. (User can fill in as much or as +\# little as desired.) +\# +\# All arguments require a unit of measure. +\# +.MAC PAGE END +. br +. PAGEWIDTH \\$1 +. PAGELENGTH \\$2 +. ie '\\$3'' \{ .L_MARGIN \\n(.o \} +. el \{ .L_MARGIN \\$3 \} +. ie '\\$4'' \{ .R_MARGIN 1i \} +. el \{ .R_MARGIN \\$4 \} +. if !'\\$5'' \{ .T_MARGIN \\$5 \} +. if !'\\$6'' \{ .B_MARGIN \\$6 \} +.END +\# +\# ===================================================================== +\# +\# +++PAGE CONTROL+++ +\# +\# Generic macros for breaking pages. +\# +\# DO_T_MARGIN +\# ----------- +\# *Argument: +\# +\# *Function: +\# Plants the top margin at the top of each page. +\# *Notes: +\# The trap is set in .T_MARGIN or .PAGE +\# +.MAC DO_T_MARGIN END +. ev T_MARGIN +. nr #TOP 1 +. sp |\\n[#T_MARGIN]u-1v +. ev +. sp -\\n[#T_MARGIN_LEAD_ADJ]u +.END +\# +\# +\# DO_B_MARGIN +\# ----------- +\# *Argument: +\# +\# *Function: +\# Plants the bottom margin at the bottom of each page. +\# *Notes: +\# The trap is set in .B_MARGIN or .PAGE. +\# +.MAC DO_B_MARGIN END +. nr #T_MARGIN_LEAD_ADJ \\n[#LEAD]-12000 +. ev B_MARGIN +. bp +. ev +.END +\# +\# +\# NEWPAGE +\# ------- +\# *Argument: +\# +\# *Function: +\# Breaks to a new page. +\# *Notes: +\# If a B_MARGIN has been set, processes that, otherwise, just +\# breaks to a new page. +\# +.MAC NEWPAGE END +. br +. nr #NEWPAGE 1 +. ie \\n[#B_MARGIN_SET]=1 \{\ +. ie !\\n[#DOCS]=1 \{\ +. ev NP +. bp +. ev +. \} +. el \{\ +. if \\n[#COLUMNS]=1 \{ .nr #COL_NUM \\n[#NUM_COLS] \} +. ie !\\n[#FN_DEPTH] \{\ +. ch FN_OVERFLOW_TRAP +. DO_B_MARGIN +. wh -(\\n[#FN_OVERFLOW_TRAP_POS]u) FN_OVERFLOW_TRAP +. \} +. el \{\ +. DO_B_MARGIN +. \} +. \} +. \} +. el \{\ +. DO_B_MARGIN +. \} +.END +\# +\# ===================================================================== +\# +\# +++GENERAL STYLE MACROS+++ +\# +\# Macros that are likely to appear together to define general +\# type style: line length, family, font, point size, and line +\# spacing. +\# +\# LINE LENGTH +\# ----------- +\# *Argument: +\# +\# *Function: +\# Stores user supplied line length in register #L_LENGTH. +\# Sets .ll to #L_LENGTHu +\# *Notes: +\# Requires unit of measure. +\# +.MAC LL END +. nr #USER_SET_L_LENGTH 1 +. ll \\$1 +. nr #L_LENGTH \\n(.l +. ta \\n(.lu +.END +\# +\# +\# +++FAMILY AND FONT+++ +\# +\# FALLBACK FONT +\# ------------- +\# *Argument: +\# [ ABORT | WARN ] | ABORT | WARN +\# *Function: +\# Sets register #ABORT_FT_ERRORS to 1, or defines a fallback font +\# called "dummy" at font position 0. +\# *Notes: +\# Calls to non-existent families cause mom to continue processing +\# files using the fallback font until a valid family is entered. +\# +\# Calls to non-existent fonts generate warnings. If ABORT is passed +\# to FALLBACK_FONT, mom stops processing files after the warning. +\# Otherwise, she continues to process files using the fallback font +\# after the warning is issued. The default fallback font is CR; the +\# default for font warnings is to abort. +\# +.MAC FALLBACK_FONT END +. if \\n[#NUM_ARGS]=1 \{\ +. if '\\$1'ABORT' \{ .nr #ABORT_FT_ERRORS 1 \} +. if '\\$1'WARN' \{\ +. if r#ABORT_FT_ERRORS \{ .nr #ABORT_FT_ERRORS 0 \} +. \} +. if !'\\$1'ABORT' \{\ +. if !'\\$1'WARN' \{\ +. fp 0 dummy \\$1 +. \} +. \} +. \} +. if \\n[#NUM_ARGS]=2 \{\ +. fp 0 dummy \\$1 +. if '\\$2'ABORT' \{ .nr #ABORT_FT_ERRORS 1 \} +. if '\\$2'WARN' \{ .nr #ABORT_FT_ERRORS 0 \} +. \} +.END +\# +.FALLBACK_FONT CR ABORT +\# +\# FAMILY +\# ------ +\# *Argument: +\# +\# *Function: +\# Stores user supplied font family in string $FAMILY. Sets .fam +\# to $FAMILY. +\# +.MAC FAMILY END +. if \\n[#PRINT_STYLE]=1 \{\ +. fam C +. return +. \} +. if \\n[#IGNORE] \{\ +. fam C +. return +. \} +. if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ +. ds $SAVED_STYLE \\n[.sty] +. \} +. ds $FAMILY \\$1 +. ft 0 +. fam \\*[$FAMILY] +. if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ +. ft \\*[$SAVED_STYLE] +. if !F\\n[.fn] \{\ +. ft 0 +. \} +. \} +. if \\n[#COLLATE]=1 \{\ +. if !r#START \{ .DOC_FAM \\*[$FAMILY] \} +. \} +.END +\# +\# +\# FONT +\# ---- +\# *Argument: +\# R | I | B | BI | +\# *Function: +\# Stores user supplied font in $FONT and sets .ft to $FONT. +\# +.MAC FT END +. if \\n[#PRINT_STYLE]=1 \{\ +. ie '\\$1'I' \{\ +. if \\n[#UNDERLINE_ITALIC]=1 \{\ +. UNDERLINE +. return +. \} +. if \\n[#ITALIC_MEANS_ITALIC]=1 \{\ +. ds $FONT \\$1 +. ft \\*[$FONT] +. return +. \} +. \} +. el \{ .UNDERLINE OFF \} +. return +. \} +. ds $FONT \\$1 +. ft 0 +. ft \\*[$FONT] +. if if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ +. if '\\n[.sty]'' \{\ +. if !F\\n[.fn] \{\ +. if !S\\*[$FONT] \{\ +. tm1 "[mom]: Font style "\\*[$FONT]" at line \\n(.c has not been registered. +. ie \\n[#ABORT_FT_ERRORS]=0 \{\ +. tm1 " Continuing to process using fallback font. +. \} +. el .ab Aborting. +. \} +. if \\n[.f]=0 \{\ +. tm1 "[mom]: Either font style "\\*[$FONT]" at line \\n(.c does not exist in family "\\n[.fam]", +. tm1 " or family "\\n[.fam]" has not been installed in font/devps. +. ie \\n[#ABORT_FT_ERRORS]=0 \{\ +. tm1 " Continuing to process using fallback font. +. \} +. el .ab Aborting. +. \} +. \} +. \} +. \} +.END +\# +\# +\# POINT SIZE +\# ---------- +\# *Arguments: +\# +\# *Function: +\# Sets point size to user supplied value in scaled points. +\# If #AUTO_LEAD is on, sets .vs to #AUTOLEAD_VALUE+#PT_SIZE. +\# *Notes: +\# Must NOT use a unit of measure. +\# +.MAC PT_SIZE END +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. if \\n[#IGNORE] \{ .return \} +. nr #PT_SIZE_SET 1 +. ps \\$1 +. if \\n[#AUTO_LEAD] \{\ +. ie \\n[#AUTOLEAD_FACTOR] \{ .vs \\n[#PT_SIZE]u*\\n[#AUTOLEAD_VALUE]u/1000u \} +. el \{ .vs \\n[#PT_SIZE]u+\\n[#AUTOLEAD_VALUE]u \} +. \} +. nr #PT_SIZE_IN_UNITS \\n[.ps] +.END +\# +\# +\# SIZE (inline) +\# ------------- +\# *Arguments: +\# +\# *Function: +\# Sets point size to user supplied value in scaled points. +\# Intended to be called inline with \*[SIZE ] +\# *Notes: +\# Can be used with a unit of measure or not. +\# +.MAC SIZE END +\c +.ps \\$1 +.END +\# +\# +\# LEADING +\# ------- +\# *Argument: +\# +\# *Function: +\# Turns off #AUTOLEAD if it's on. +\# Sets .vs to user supplied value. +\# *Notes: +\# Does not require unit of measure. LS automatically turns off AUTOLEAD. +\# +.MAC LS END +. br +. nr #OLD_LEAD \\n(.v +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. if \\n[#IGNORE] \{ .return \} +. if \\n[#AUTO_LEAD] \{\ +. rr #AUTO_LEAD +. rr #AUTOLEAD_FACTOR +. \} +. vs \\$1 +. if \\n[#TOP] \{\ +. nr #TOP_BASELINE_ADJ \\n(.v-\\n[#OLD_LEAD] +. sp -\\n[#TOP_BASELINE_ADJ]u +. rr #TOP +. rr #TOP_BASELINE_ADJ +. \} +.END +\# +.MAC RESET_LEAD END +' vs +. ch RESET_LEAD +.END +\# +\# +\# AUTOLEAD +\# -------- +\# *Argument: +\# [FACTOR] +\# *Function: +\# Stores user supplied auto-lead value in register #AUTOLEAD_VALUE. +\# Adds #AUT0LEAD_VALUE to #PT_SIZE when invoked to set leading. +\# All subsequent PT_SIZE requests reset the leading in the same way until +\# AUTOLEAD is turned off. +\# *Notes: +\# With the optional FACTOR argument, the current point size is +\# multiplied by #AUTOLEAD_VALUE instead of the two being added +\# together. +\# +.MAC AUTOLEAD END +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. if \\n[#IGNORE] \{ .return \} +. nr #AUTO_LEAD 1 +. nr #OLD_LEAD \\n(.v +. nr #AUTOLEAD_VALUE (p;\\$1) +. ie \\n[#NUM_ARGS]=2 \{\ +. if '\\$2'FACTOR' \{\ +. nr #AUTOLEAD_FACTOR 1 +. vs \\n[#PT_SIZE]u*\\n[#AUTOLEAD_VALUE]u/1000u +. \} +. \} +. el \{\ +. vs \\n[#PT_SIZE]u+\\n[#AUTOLEAD_VALUE]u +. \} +. if \\n[#TOP] \{\ +. nr #TOP_BASELINE_ADJ \\n(.v-\\n[#OLD_LEAD] +. sp -\\n[#TOP_BASELINE_ADJ]u +. rr #TOP +. rr #TOP_BASELINE_ADJ +. \} +.END +\# +\# +\# STRINGS FOR INLINE CONTROL OF GENERAL TYPE STYLE +\# ------------------------------------------------ +.ds ROM \EfR +.ds IT \EfI +.ds BD \EfB +.ds BDI \Ef(BI +.ds PREV \EfP +.ds S \Es +\# +\# ===================================================================== +\# +\# +++KERNING+++ +\# +\# AUTOMATIC PAIRWISE KERNING +\# -------------------------- +\# *Arguments: +\# | +\# *Function: +\# Turns automatic pairwise kerning on or off. +\# +.MAC KERN END +. ie '\\$1'' \{\ +. kern +. nr #KERN 1 +. \} +. el \{\ +. kern 0 +. nr #KERN 0 +. \} +.END +\# +\# +.ig +INLINE KERNING AND HORIZONTAL MOVEMENT +-------------------------------------- +Kerning + +Inline kerning provides a simple method for users to adjust the +amount of space between any two letters. It's predicated on a +unit of measure "U", which is 1/36 of the current point size as +returned by \n[.ps]. E.g., if the current point size is 18, +\n[.ps] returns 18000u, therefore U=500u. Since U remains +proportional relative to the current point size, the amount +of kerning between two letters as expressed in Us remains +visually similar regardless of changes in point size. + +N.B.--the amount of inline kerning supplied by \*[BU] or +\*[FU] is added to or subtracted from any kerning that already +takes place between two characters when automatic kerning is +turned on. + +In groff v. 1.17.2, it was not possible to pass arguments to macros that +were called with inline escapes, nor thence to evaluate conditional +expressions. Consequently, each pseudo-escape \[BU] had to be defined +separately with ".char". + +As of v. 1.18, one can pass arguments to inline strings/macros, +hence it is now possible to do \*[BU n] where n, inline, is the desired +number of kern units. The original .char definitions have been left in +for backward compatibility with documents created prior to mom-1.1.3c. +.. +\# +.nr #KERN_UNIT 36 +.ds BU \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\\$1u)' +.ds FU \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\\$1u)' +\# +\# Initialize strings for pre-1.1.3c-style BU and FU +\# +.nr #LOOP 0 1 +.while \n+[#LOOP]<37 \{\ +. ds BU\n[#LOOP] \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\n[#LOOP]u)' +.\} +\# +.nr #LOOP 0 1 +.while \n+[#LOOP]<37 \{\ +. ds FU\n[#LOOP] \h'(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\n[#LOOP]u)' +.\} +.rr #LOOP +\# +.ig +Horizontal movements + +BP1...12.75 and FP1...12.75 move backwards or forwards inline by the +specified number of points. +Left in for backward compatibility with mom-1.1.3c, the +preferred methods for inline horizontal movements are now +\*[BCK ] and \*[FWD ]. +.. +\# +.ds BCK \h'-\\$1' +.ds FWD \h'\\$1' +\# +.ds BP.25 \h'-.25' +.ds BP.5 \h'-.5' +.ds BP.75 \h'-.75' +.ds BP1 \h'-1p' +.ds BP1.25 \h'-1.25p' +.ds BP1.5 \h'-1.5p' +.ds BP1.75 \h'-1.75p' +.ds BP2 \h'-2p' +.ds BP2.25 \h'-2.25p' +.ds BP2.5 \h'-2.5p' +.ds BP2.75 \h'-2.75p' +.ds BP3 \h'-3p' +.ds BP3.25 \h'-3.25p' +.ds BP3.5 \h'-3.5p' +.ds BP3.75 \h'-3.75p' +.ds BP4 \h'-4p' +.ds BP4.25 \h'-4.25p' +.ds BP4.5 \h'-4.5p' +.ds BP4.75 \h'-4.75p' +.ds BP5 \h'-5p' +.ds BP5.25 \h'-5.25p' +.ds BP5.5 \h'-5.5p' +.ds BP5.75 \h'-5.75p' +.ds BP6 \h'-6p' +.ds BP6.25 \h'-6.25p' +.ds BP6.5 \h'-6.5p' +.ds BP6.75 \h'-6.75p' +.ds BP7 \h'-7p' +.ds BP7.25 \h'-7.25p' +.ds BP7.5 \h'-7.5p' +.ds BP7.75 \h'-7.75p' +.ds BP8 \h'-8p' +.ds BP8.25 \h'-8.25p' +.ds BP8.5 \h'-8.5p' +.ds BP8.75 \h'-8.75p' +.ds BP9 \h'-9p' +.ds BP9.25 \h'-9.25p' +.ds BP9.5 \h'-9.5p' +.ds BP9.75 \h'-9.75p' +.ds BP10 \h'-10p' +.ds BP10.25 \h'-10.25p' +.ds BP10.5 \h'-10.5p' +.ds BP10.75 \h'-10.75p' +.ds BP11 \h'-11p' +.ds BP11.25 \h'-11.25p' +.ds BP11.5 \h'-11.5p' +.ds BP11.75 \h'-11.75p' +.ds BP12 \h'-12p' +.ds BP12.25 \h'-12.25p' +.ds BP12.5 \h'-12.5p' +.ds BP12.75 \h'-12.75p' +\# +.ds FP.25 \h'.25' +.ds FP.5 \h'.5' +.ds FP.75 \h'.75' +.ds FP1 \h'1p' +.ds FP1.25 \h'1.25p' +.ds FP1.5 \h'1.5p' +.ds FP1.75 \h'1.75p' +.ds FP2 \h'2p' +.ds FP2.25 \h'2.25p' +.ds FP2.5 \h'2.5p' +.ds FP2.75 \h'2.75p' +.ds FP3 \h'3p' +.ds FP3.25 \h'3.25p' +.ds FP3.5 \h'3.5p' +.ds FP3.75 \h'3.75p' +.ds FP4 \h'4p' +.ds FP4.25 \h'4.25p' +.ds FP4.5 \h'4.5p' +.ds FP4.75 \h'4.75p' +.ds FP5 \h'5p' +.ds FP5.25 \h'5.25p' +.ds FP5.5 \h'5.5p' +.ds FP5.75 \h'5.75p' +.ds FP6 \h'6p' +.ds FP6.25 \h'6.25p' +.ds FP6.5 \h'6.5p' +.ds FP6.75 \h'6.75p' +.ds FP7 \h'7p' +.ds FP7.25 \h'7.25p' +.ds FP7.5 \h'7.5p' +.ds FP7.75 \h'7.75p' +.ds FP8 \h'8p' +.ds FP8.25 \h'8.25p' +.ds FP8.5 \h'8.5p' +.ds FP8.75 \h'8.75p' +.ds FP9 \h'9p' +.ds FP9.25 \h'9.25p' +.ds FP9.5 \h'9.5p' +.ds FP9.75 \h'9.75p' +.ds FP10 \h'10p' +.ds FP10.25 \h'10.25p' +.ds FP10.5 \h'10.5p' +.ds FP10.75 \h'10.75p' +.ds FP11 \h'11p' +.ds FP11.25 \h'11.25p' +.ds FP11.5 \h'11.5p' +.ds FP11.75 \h'11.75p' +.ds FP12 \h'12p' +.ds FP12.25 \h'12.25p' +.ds FP12.5 \h'12.5p' +.ds FP12.75 \h'12.75p' +\# +\# +\# WHOLE LINE KERNING (RW and EW) +\# ----------------------------- +\# +.ig +The line kerning macros are special instances of track kerning, +used where a complete line needs to be tightened (or relaxed) in +order to accomodate or remove one or two more characters +than the default justification permits. +.. +\# +\# *Argument: +\# +\# *Function: +\# Invokes .tkf (track kerning) for the current font with +\# 1 as both the upper and lower point size limits, so that +\# the value entered by the user applies regardless of point +\# size. RW ("Reduce Whitespace") reduces the amount of space +\# between all characters by an equal amount. EW ("Extra +\# Whitespace") increases the amount of space. +\# *Notes: +\# Decimal values are acceptable. +\# +.ig +The groff documentation is a tad confusing about what unit of +measure is used in track kerning, only that the width of each +character is increased or decreased by the amount(s) passed as +arguments to .tkf, and something about linear function of point +size. In fact, with the way I've put this macro together, it +doesn't matter. All the user needs to know is that a value of +one will produce an unacceptably tight or loose line at most text +point sizes; therefore, effective use of RW and EW is in the +fractional range below 1 (e.g. .25, .5). Given that RW and EW +are for massaging type, a certain amount of experimentation and +previewing is expected and necessary. + +\n(.f holds the current font number, which is acceptable to .tkf. + +RW and EW must be reset to 0 to cancel their effect on subsequent +output lines. +.. +\# +.MAC RW END +. if \\n[#BR_AT_LINE_KERN] \{\ +. ie \\n[#JUSTIFY]=1 \{ .brp \} +. el \{ .br \} +. \} +. tkf \\n(.f 1 -\\$1 1 -\\$1 +.END +\# +\# +.MAC EW END +. if \\n[#BR_AT_LINE_KERN] \{\ +. ie \\n[#JUSTIFY]=1 \{ .brp \} +. el \{ .br \} +. \} +. tkf \\n(.f 1 \\$1 1 \\$1 +.END +\# +\# +\# BREAK AT LINE KERN +\# ------------------ +\# *Arguments: +\# toggle +\# *Function: +\# Enables/disables .br's before .RW and .EW +\# *Notes: +\# Mostly, users will want .br's before any kind of line kerning, but +\# there may be cases where they don't. BR_BEFORE_LINE_KERN is off by +\# default and must be invoked explicitly. +\# +.MAC BR_AT_LINE_KERN END +. ie '\\$1'' \{ .nr #BR_AT_LINE_KERN 1 \} +. el \{ .rr #BR_AT_LINE_KERN \} +.END +\# +\# ===================================================================== +\# +\# +++HYPHENATION+++ +\# +\# AUTO HYPHENATION +\# ---------------- +\# *Arguments: +\# | | DEFAULT +\# or +\# LINES | MARGIN | SPACE +\# *Function: +\# Turns auto hyphenation on or off, resets the hyphenation style +\# to default, or permits the setting of various hyphenation +\# parameters. +\# *Notes: +\# HY, by itself, defaults to .hy 14, i.e. no hyphens after the +\# first two or before the last two characters of a word, and no +\# hyphenation of the last line prior to a trap (e.g., at the +\# bottom of a page). +\# +\# HY DEFAULT resets the hyphenation style to .hy 14 (see +\# above) if that behaviour is desired after changes have been +\# made to LINES, MARGIN, or SPACE. +\# +\# HY LINES sets the number of allowable consecutive hyphenated lines. +\# +\# HY MARGIN sets the amount of space (ipPcm) allowed at the end +\# of a line in QUAD mode before hyphenation is tripped (e.g. if there's +\# only 6 points left, groff won't try to hyphenate the next word). +\# +\# HY SPACE sets the amount of extra interword space (ipPcm) that can +\# be added in JUSTIFY mode to prevent a line from being hyphenated. +\# +.MAC HY END +. ie '\\$1'' \{\ +. hy 14 +. nr #HYPHENATE 1 +. \} +. el \{\ +. if !'\\$1'LINES' \{\ +. nh +. nr #HYPHENATE 0 +. \} +. if !'\\$1'MARGIN' \{\ +. nh +. nr #HYPHENATE 0 +. \} +. if !'\\$1'SPACE' \{\ +. nh +. nr #HYPHENATE 0 +. \} +. if !'\\$1'DEFAULT' \{\ +. nh +. nr #HYPHENATE 0 +. \} +. if '\\$1'LINES' \{ .hlm \\$2 \} +. if '\\$1'MARGIN' \{ .hym \\$2 \} +. if '\\$1'SPACE' \{ .hys \\$2 \} +. if '\\$1'DEFAULT' \{\ +. hlm -1 +. hym 0 +. hys 0 +. \} +. \} +.END +\# +\# +\# HYPHENATION PARAMETERS +\# ---------------------- +\# *Arguments: +\# <# of lines> | | +\# *Function: +\# Allows user to specify .HY LINES, MARGIN, and SPACE with a single command. +\# +.MAC HY_SET END +. nr #HY_SET 1 +. hlm \\$1 +. hym \\$2 +. hys \\$3 +.END +\# +\# ===================================================================== +\# +\# +++VERTICAL SPACING+++ +\# +\# ADVANCE LEAD +\# ------------ +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #ALD. Adds user supplied lead +\# below current baseline. +\# *Notes: +\# Requires a unit of measure. +\# +.MAC ALD END +. if \\n(nl=0 \{ .nr #TOP 1 \} +. if '\\$0'ALD' \{\ +. nr #ALD (\\$1) +. sp \\n[#ALD]u +. \} +. if '\\$0'ADD_SPACE' \{\ +. nr #ALD (\\$1) +. rs +. sp \\n[#ALD]u +. \} +. if '\\$0'SPACE' \{\ +. sp \\$1u +. \} +. if '\\$0'SP' \{\ +. sp \\$1u +. \} +.END +\# +\# +\# REVERSE LEAD +\# ------------ +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #RLD. Reverses user supplied +\# lead above current baseline. +\# *Notes: +\# Requires a unit of measure. +\# +.MAC RLD END +. nr #RLD (\\$1) +. sp -\\n[#RLD]u +.END +\# +\# ALD/RLD STRINGS +\# --------------- +.ig +The strings \*[ALD.25]...\*[ALD12.75] and their corresponding +\*[RLD] forms have been left in for backward compatibility with +documents created using mom-1.1.3c or earlier. The prefered methods +of advancing and reversing on the page inline are \*[UP ] +and \*[DOWN ]. +.. +\# +.ds DOWN \v'\\$1' +.ds UP \v'-\\$1' +\# +.ds ALD.25 \v'.25p' +.ds ALD.5 \v'.5p' +.ds ALD.75 \v'.75p' +.ds ALD1 \v'1p' +.ds ALD1.25 \v'1.25p' +.ds ALD1.5 \v'1.5p' +.ds ALD1.75 \v'1.75p' +.ds ALD2 \v'2p' +.ds ALD2.25 \v'2.25p' +.ds ALD2.5 \v'2.5p' +.ds ALD2.75 \v'2.75p' +.ds ALD3 \v'3p' +.ds ALD3.25 \v'3.25p' +.ds ALD3.5 \v'3.5p' +.ds ALD3.75 \v'3.75p' +.ds ALD4 \v'4p' +.ds ALD4.25 \v'4.25p' +.ds ALD4.5 \v'4.5p' +.ds ALD4.75 \v'4.75p' +.ds ALD5 \v'5p' +.ds ALD5.25 \v'5.25p' +.ds ALD5.5 \v'5.5p' +.ds ALD5.75 \v'5.75p' +.ds ALD6 \v'6p' +.ds ALD6.25 \v'6.25p' +.ds ALD6.5 \v'6.5p' +.ds ALD6.75 \v'6.75p' +.ds ALD7 \v'7p' +.ds ALD7.25 \v'7.25p' +.ds ALD7.5 \v'7.5p' +.ds ALD7.75 \v'7.75p' +.ds ALD8 \v'8p' +.ds ALD8.25 \v'8.25p' +.ds ALD8.5 \v'8.5p' +.ds ALD8.75 \v'8.75p' +.ds ALD9 \v'9p' +.ds ALD9.25 \v'9.25p' +.ds ALD9.5 \v'9.5p' +.ds ALD9.75 \v'9.75p' +.ds ALD10 \v'10p' +.ds ALD10.25 \v'10.25p' +.ds ALD10.5 \v'10.5p' +.ds ALD10.75 \v'10.75p' +.ds ALD11 \v'11p' +.ds ALD11.25 \v'11.25p' +.ds ALD11.5 \v'11.5p' +.ds ALD11.75 \v'11.75p' +.ds ALD12 \v'12p' +.ds ALD12.25 \v'12.5p' +.ds ALD12.5 \v'12.5p' +.ds ALD12.75 \v'12.75p' +\# +.ds RLD.25 \v'-.25p' +.ds RLD.5 \v'-.5p' +.ds RLD.75 \v'-.75p' +.ds RLD1 \v'-1p' +.ds RLD1.25 \v'-1.25p' +.ds RLD1.5 \v'-1.5p' +.ds RLD1.75 \v'-1.75p' +.ds RLD2 \v'-2p' +.ds RLD2.25 \v'-2.25p' +.ds RLD2.5 \v'-2.5p' +.ds RLD2.75 \v'-2.75p' +.ds RLD3 \v'-3p' +.ds RLD3.25 \v'-3.25p' +.ds RLD3.5 \v'-3.5p' +.ds RLD3.75 \v'-3.75p' +.ds RLD4 \v'-4p' +.ds RLD4.25 \v'-4.25p' +.ds RLD4.5 \v'-4.5p' +.ds RLD4.75 \v'-4.75p' +.ds RLD5 \v'-5p' +.ds RLD5.25 \v'-5.25p' +.ds RLD5.5 \v'-5.5p' +.ds RLD5.75 \v'-5.75p' +.ds RLD6 \v'-6p' +.ds RLD6.25 \v'-6.25p' +.ds RLD6.5 \v'-6.5p' +.ds RLD6.75 \v'-6.75p' +.ds RLD7 \v'-7p' +.ds RLD7.25 \v'-7.25p' +.ds RLD7.5 \v'-7.5p' +.ds RLD7.75 \v'-7.75p' +.ds RLD8 \v'-8p' +.ds RLD8.25 \v'-8.25p' +.ds RLD8.5 \v'-8.5p' +.ds RLD8.75 \v'-8.75p' +.ds RLD9 \v'-9p' +.ds RLD9.25 \v'-9.25p' +.ds RLD9.5 \v'-9.5p' +.ds RLD9.75 \v'-9.75p' +.ds RLD10 \v'-10p' +.ds RLD10.25 \v'-10.25p' +.ds RLD10.5 \v'-10.5p' +.ds RLD10.75 \v'-10.75p' +.ds RLD11 \v'-11p' +.ds RLD11.25 \v'-11.25p' +.ds RLD11.5 \v'-11.5p' +.ds RLD11.75 \v'-11.75p' +.ds RLD12 \v'-12p' +.ds RLD12.25 \v'-12.5p' +.ds RLD12.5 \v'-12.5p' +.ds RLD12.75 \v'-12.75p' +\# +\# ===================================================================== +\# +\# +++REFINEMENTS+++ +\# +\# AUTOMATIC LIGATURES +\# ------------------- +\# *Arguments: +\# | +\# *Function: +\# Turns automatic ligature generation on or off. +\# *Notes: +\# Ligatures may be supplied manually with \(fi, \(fl, etc. +\# +.MAC LIGATURES END +. ie '\\$1'' \{\ +. lg +. nr #LIGATURES 1 +. \} +. el \{\ +. lg 0 +. nr #LIGATURES 0 +. \} +.END +\# +\# +\# SMARTQUOTES +\# ----------- +\# *Arguments: +\# [ ,, ] | [ << ] | [ >> ] | +\# or +\# [ DA | DE | ES | FR | IT | NL | NO | PT | SV ] | +\# *Function: +\# Turns smartquotes on (optionally with a quoting style from the +\# argument list, or off). +\# *Notes: +\# The " character is read outside the macro when mom is +\# processed. The strings for open/close ($QUOTE) are then +\# defined in the macro. +\# +\# (Note to myself: code for " is \N'34'.) +\# +.char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])' +\# +.MAC SMARTQUOTES END +. rr #ARGS_TO_SQ +. ie '\\$1'' \{\ +. nr #OPEN_CLOSE 0 +. ds $QUOTE0 \\[lq] +. ds $QUOTE1 \\[rq] +. \} +. el \{\ +. if '\\$1',,' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Bq] +. ds $QUOTE1 \\[lq] +. \} +. if '\\$1'<<' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fo] +. ds $QUOTE1 \\[Fc] +. \} +. if '\\$1'>>' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fc] +. ds $QUOTE1 \\[Fo] +. \} +. if '\\$1'DA' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fc] +. ds $QUOTE1 \\[Fo] +. \} +. if '\\$1'DE' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Bq] +. ds $QUOTE1 \\[lq] +. \} +. if '\\$1'ES' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[lq] +. ds $QUOTE1 \\[rq] +. \} +. if '\\$1'FR' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fo]\\| +. ds $QUOTE1 \\|\\[Fc] +. \} +. if '\\$1'IT' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fo]\\| +. ds $QUOTE1 \\|\\[Fc] +. \} +. if '\\$1'NL' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[rq] +. ds $QUOTE1 \\[rq] +. \} +. if '\\$1'NO' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fo] +. ds $QUOTE1 \\[Fc] +. \} +. if '\\$1'PT' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fo] +. ds $QUOTE1 \\[Fc] +. \} +. if '\\$1'SV' \{\ +. nr #ARGS_TO_SQ 1 +. ds $QUOTE0 \\[Fc] +. ds $QUOTE1 \\[Fc] +. \} +. if !r#ARGS_TO_SQ \{\ +. ds $QUOTE0 \\[dq] +. ds $QUOTE1 \\[dq] +. \} +. \} +.END +\# +.ds $QUOTE0 \[dq] +.ds $QUOTE1 \[dq] +\# +\# Strings for foot and inch marks +\# +.ds FOOT \(fm +.ds INCH \(fm\(fm +\# +\# ===================================================================== +\# +\# +++LINE BREAKS+++ +\# +\# NO-SPACE BREAK +\# -------------- +\# *Argument: +\# +\# *Function: +\# Breaks a line without advancing. +\# *Notes: +\# EL is the mnemonic used on older, dedicated typesetting machines +\# to indicate "process the line, without advancing the galley +\# medium." It stands for End Line. +\# +\# The \c inline must be appended to the end of input lines when in +\# nofill mode; in fill modes, the \c inline must not be used. +\# +.MAC EL END +. TRAP OFF +. if \\n[#PSEUDO_FILL]=1 \& +. br +. sp -1v +. TRAP +.END +\# +\# An inline escape to accomplish the same thing. Actually +\# preferable, since it works with filled and non-filled copy and +\# doesn't require the user to remember to use (or not use) the \c. +\# +.ds B \h'|0'\c +\# +\# ===================================================================== +\# +\# +++FILLING/QUADDING/JUSTIFYING+++ +\# +\# JUSTIFY +\# ------- +\# *Argument: +\# +\# *Function: +\# Turns fill on and sets .ad to b. +\# *Notes: +\# Justifies text left and right. +\# +.MAC JUSTIFY END +. if \\n[#TAB_ACTIVE]=0 \{\ +. nr #QUAD 1 +. ds $RESTORE_QUAD_VALUE \\*[$QUAD_VALUE] +. \} +' ce 0 +. QUAD J +. if \\n[#PRINT_STYLE]=1 \{ .QUAD L \} +. nr #PSEUDO_FILL 0 +.END +\# +\# +\# QUAD +\# ---- +\# *Arguments: +\# L | LEFT | R | RIGHT | C | CENTER/CENTRE +\# *Function: +\# Turns fill on and sets .ad to l, r, or c. +\# *Notes: +\# Terminology is a problem here. Some people call quad left +\# left justified, flush left, or flush left/rag right (and the +\# reverse for quad right). Quad center is sometimes called rag +\# both. For our purposes, all "quad" modes mean that groff fill +\# mode is enabled. +\# +.MAC QUAD END +. ds $QUAD_VALUE \\$1 +. if \\n[#TAB_ACTIVE]=0 \{\ +. nr #QUAD 1 +. ds $RESTORE_QUAD_VALUE \\*[$QUAD_VALUE] +. \} +' ce 0 +' fi +. if '\\*[$QUAD_VALUE]'L' \{\ +. nr #JUSTIFY 0 +. ad l +. \} +. if '\\*[$QUAD_VALUE]'LEFT' \{\ +. nr #JUSTIFY 0 +. ad l +. \} +. if '\\*[$QUAD_VALUE]'R' \{\ +. nr #JUSTIFY 0 +. ad r +. \} +. if '\\*[$QUAD_VALUE]'RIGHT' \{\ +. nr #JUSTIFY 0 +. ad r +. \} +. if '\\*[$QUAD_VALUE]'C' \{\ +. nr #JUSTIFY 0 +. ad c +. \} +. if '\\*[$QUAD_VALUE]'CENTER' \{\ +. nr #JUSTIFY 0 +. ad c +. \} +. if '\\*[$QUAD_VALUE]'CENTRE' \{\ +. nr #JUSTIFY 0 +. ad c +. \} +. if '\\*[$QUAD_VALUE]'J' \{\ +. nr #JUSTIFY 1 +. ad b +. \} +. if '\\*[$QUAD_VALUE]'JUSTIFY' \{\ +. nr #JUSTIFY 1 +. ad b +. \} +. nr #PSEUDO_FILL 0 +.END +\# +\# +\# LEFT, RIGHT, AND CENTER +\# ----------------------- +\# +.ig +The purpose of these macros is to allow the user to enter lines of +text that will be quadded LRC *without* the user having to enter .BR +or .br between lines. For the sake of consistency, all three appear +to behave similarly (from the point of view of the user), although +the underlying primitives don't. For this reason, LEFT, RIGHT, and +CENTER must be followed by .QUAD [L R C J] or .JUSTIFY to restore +text to groff fill mode. +.. +\# +\# LEFT +\# ---- +\# *Argument: +\# +\# *Function: +\# Turns fill mode off. Allows user to quad lines left without +\# requiring the .BR or .br macro. +\# *Notes: +\# LEFT simply turns fill off. Lines that exceed the current LL will +\# not be broken, just continued (indefinitely) until a return is +\# encountered. Note that this behaviour differs from the RIGHT and +\# CENTER macros. +\# +.MAC LEFT END +. if \\n[#TAB_ACTIVE]=0 \{\ +. rr #QUAD +. ds $RESTORE_QUAD_VALUE LEFT +. \} +. ce 0 +. nf +. nr #PSEUDO_FILL 1 +.\" Fix for a little conflict with DOCTYPE LETTER +. if '\\n(.z'LETTERHEAD1' \{ .rr #DATE_FIRST \} +.END +\# +\# +\# RIGHT +\# ----- +\# *Argument: +\# +\# *Function: +\# Turns fill on. Allows user to quad lines right without +\# requiring the .BR or .br macro. +\# *Notes: +\# Lines that exceed the current LL will be broken, with the excess +\# text quadded right. +\# +.MAC RIGHT END +. if \\n[#TAB_ACTIVE]=0 \{\ +. rr #QUAD +. ds $RESTORE_QUAD_VALUE RIGHT +. \} +. fi +. rj 100000 +. nr #PSEUDO_FILL 1 +.END +\# +\# +\# CENTER +\# ------ +\# *Argument: +\# +\# *Function: +\# Turns fill on. Allows user to center lines without +\# requiring the .BR or .br macro. +\# *Notes: +\# Lines that exceed the current LL will be broken, with the excess +\# text centered. +\# +.MAC CENTER END +. if \\n[#TAB_ACTIVE]=0 \{\ +. rr #QUAD +. ds $RESTORE_QUAD_VALUE CENTER +. \} +. fi +. ce 100000 +. nr #PSEUDO_FILL 1 +.END +\# +\# ===================================================================== +\# +\# +++TABS+++ +\# +.ig +There are two different kinds of tabs available: typesetting tabs +and string tabs. + +Typesetting tabs are set with TAB_SET, which requires a tab number, +an indent (offset) from the left margin and a length (optionally +with a quad direction and an instruction to fill lines). After tabs +are set with TAB_SET, they are called with .TAB n, where "n" +corresponds to the number passed to TAB_SET as a valid tab number. + +String tabs allow the user to mark off tab positions inline. Tab +indents and lengths are calculated from the beginning and end +positions of the marks. Up to 19 string tabs may be created, +numbered 1-19. Once created, they are called with .TAB n, +just like typesetting tabs. + +Setting up string tabs is a two-step procedure. First, the user +enters an input line in which s/he wants to mark off string tabs. +The beginning of a tab is marked with \*[STn], where "n" is +the desired number of the tab. The end of the the tab is marked +with \*[STnX]. All ST's must have a matching STX. String tabs +may be nested. + +Next, the user invokes .ST n for every string tab defined, and +optionally passes quad information to it. That done, string tabs +can be called just like typesetting tabs. + +String tabs don't preview properly with gxditview. Use gv instead. +.. +\# +\# Strings for string tab inlines +\# ------------------------------ +\# +\# Initialize string tab markers numbered 1 to 19. +\# +.nr #LOOP 0 1 +.while \n+[#LOOP]<20 \{\ +. ds ST\n[#LOOP] \Ek[#ST\n[#LOOP]_OFFSET] +.\} +\# +.nr #LOOP 0 1 +.while \n+[#LOOP]<20 \{\ +. ds ST\n[#LOOP]X \Ek[#ST\n[#LOOP]_MARK] +.\} +.rr #LOOP +\# +\# +\# These are reserved ST numbers for internal use +.ds ST100 \Ek[#ST100_OFFSET] +.ds ST100X \Ek[#ST100_MARK] +.ds ST101 \Ek[#ST101_OFFSET] +.ds ST101X \Ek[#ST101_MARK] +\# +\# +\# QUAD AND SET STRING TABS +\# ------------------------ +\# *Arguments: +\# L | R | C | J [QUAD] +\# *Function: +\# Creates strings $ST<#>_QUAD_DIR and $ST<#>_FILL, then sets up a +\# tab based on the collected information. +\# *Notes: +\# Like TAB_SET, ST invoked without a quad direction will default to LEFT. +\# If lines should be filled and quadded, use the optional argument QUAD. +\# N.B. -- indents *must* be turned off before setting string tabs +\# inside .PAD +\# +.MAC ST END +. ds $ST\\$1_QUAD_DIR \\$2 +. if \\n[#NUM_ARGS]=3 \{\ +. ds $ST\\$1_FILL QUAD +. \} +. nr #ST\\$1_LENGTH \\n[#ST\\$1_MARK]-\\n[#ST\\$1_OFFSET] +. ie \\n[#IN_TAB] \{\ +. TAB_SET \\$1 \\n[#ST\\$1_OFFSET]u+\\n[#ST_OFFSET]u \\n[#ST\\$1_LENGTH]u \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL] +. \} +. el \{\ +. TAB_SET \\$1 \\n[#ST\\$1_OFFSET]u \\n[#ST\\$1_LENGTH]u \\*[$ST\\$1_QUAD_DIR] \\*[$ST\\$1_FILL] +. \} +.END +\# +\# +\# TAB SET +\# ------- +\# *Arguments: +\# ident(ipPcm) length(ipPcm) [L | R | C | J [QUAD]] +\# *Function: +\# Creates macros TABn and TAB n, where "n" is any arbitrary number. +\# TABn is a typesetting tab (i.e. a tab defined as an indent +\# from the page left offset plus a line length.) +\# *Notes: +\# n = arbitrary digit to identify the tab +\# indent = indent from left margin; unit of measure required +\# length = length of tab (unit of measure required; can be +\# \w''u--if more than one word in string, surround +\# with double quotes "\w''" +\# LRCJ = quad for tab (left, right, center, justified) +\# If option QUAD afterwards is not given, quad is line for line +\# (no fill mode), meaning that there's no need for .BR or .br +\# between lines. +\# QUAD = fill tab (so it behaves as if .QUAD LRC or .JUSTIFY +\# had been given). +\# +\# N.B. -- indents *must* be turned off before setting tabs +\# +.ig +Examples: +-------- + +.TAB_SET 1 2P+6p 12P C + +means "create a tab numbered 1 that starts 2 picas and 6 points from +the left margin, is 12 picas long, and centre each input line." + +.TAB_SET 1 2P+6P 12P C QUAD + +means exactly the same thing, except that input lines are joined and +the area delimted by the tab filled with centered text. + +TAB n can be called at any time after being set. + +Tabs are NOT columnar in behaviour. If the text inside a +tab runs to several lines, when you call the next tab a break +occurs, meaning that the new tab starts one line below the last +line in the previous tab. For columnar behaviour, you must +use the multi-column macros in addition to tabs. + +If you want tabs to line up bottom-line to bottom-line (most likely +single line tabs), use .TN (provided the tabs are numbered sequentially). +Otherwise, you must use .EL then .TAB if you want them to align. + +If you want to reset tabs, you must use .TQ before .TAB_SET. + +Note that indents are turned off automatically whenever a new +tab is called with TAB . + +Tabs themselves are user-invoked using the TAB macro with a numeric +argument, e.g. TAB 1. + +Generally, in order not to get confused, it's a good idea +to make sure all indents are off before setting tabs. +.. +\# +.MAC TAB_SET END +. br +. nr #TAB_NUMBER \\$1 +. ds $CURRENT_TAB \\n[#TAB_NUMBER] +. nr #TAB_OFFSET (\\$2) +. nr #TAB_LENGTH (\\$3) +. MAC TAB\\n[#TAB_NUMBER] DONE \"Define TAB macro +. if !\\\\n[#TB+]=1 \{ .br \} +. if \\\\n[#TB+]=1 \{\ +. EL +. vpt 0 +. rr #TB+ +. \} +. in 0 +. nr #TAB_ACTIVE 1 +. nr #CURRENT_TAB \\n[#TAB_NUMBER] +. ds $CURRENT_TAB \\*[$CURRENT_TAB] +. nr #TAB_OFFSET\\*[$CURRENT_TAB] \\n[#TAB_OFFSET] +. nr #ST_OFFSET \\n[#TAB_OFFSET] +. po \\\\n[#L_MARGIN]u+\\\\n[#TAB_OFFSET\\\\*[$CURRENT_TAB]]u +. ll \\n[#TAB_LENGTH]u +. ta \En(.lu +. ie '\\$5'QUAD' \{\ +. if '\\$4'L' \{ .QUAD L \} +. if '\\$4'R' \{ .QUAD R \} +. if '\\$4'C' \{ .QUAD C \} +. if '\\$4'J' \{ .JUSTIFY \} +. \} +. el \{\ +. if '\\$4'' \{ .LEFT \} +. if '\\$4'L' \{ .LEFT \} +. if '\\$4'R' \{ .RIGHT \} +. if '\\$4'C' \{ .CENTER \} +. if '\\$4'J' \{ .JUSTIFY \} +. \} +. if \\\\n[#TN]=1 \{\ +. TRAP +. rr #TN +. \} +.DONE +. rr #TAB_ACTIVE +.END +\# +\# +\# TAB +\# --- +\# *Arguments: +\# +\# *Function: +\# Moves to tab number passed as an argument. +\# +.MAC TAB END +. ds $TAB_NUMBER \\$1 +. TAB\\*[$TAB_NUMBER] +. nr #IN_TAB 1 +.END +\# +\# +\# TAB NEXT +\# -------- +\# *Argument: +\# +\# *Function: +\# Automagically moves to TAB on the same line as the last +\# line of the previous tab. +\# *Notes: +\# The \c inline must be appended to the end of input lines when in +\# nofill mode; in fill modes, the \c inline must not be used. +\# +.MAC TN END +. nr #TN 1 +. TRAP OFF +. sp -1v +. nr #NEXT_TAB \\n[#CURRENT_TAB]+1 +. TAB\\n[#NEXT_TAB] +. TRAP +.END +\# +\# An inline escape to accomplish the same thing. Actually +\# preferable, since it works with filled and non-filled copy and +\# doesn't require the user to remember to use (or not use) the \c. +\# +.ds TB+ "\c\\R'#TB+ 1'\\R'#TN 1'\\R'#NEXT_TAB \\n[#CURRENT_TAB]+1'\\*[TAB\\n[#NEXT_TAB]]\c +\# +\# TAB QUIT +\# -------- +\# *Argument: +\# +\# *Function: +\# Sets #TAB_ACTIVE to "0" (off). +\# Resets left margin to value in effect prior to tabs. +\# Resets line length to value in effect prior to tabs. +\# Checks #QUAD to see if we were in flush or quad mode +\# prior to tabs (0=off, 1=on). +\# Resets QUAD [ L|R|C ], LEFT, RIGHT, CENTER, or JUSTIFY +\# in effect prior to tabs. +\# *Notes: +\# TQ *must* come before setting any new tabs if you want the +\# tabs' indents measured from page left. Otherwise, the tabs' +\# indents are measured from the left margin of the tab you're +\# currently in. +\# +.MAC TQ END +. br +. rr #TAB_ACTIVE +. rr #IN_TAB +. po \\n[#L_MARGIN]u +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. ie \\n[#QUAD] \{\ +. ie '\\*[$RESTORE_QUAD_VALUE]'J' \{ .JUSTIFY \} +. el \{ .QUAD \\*[$RESTORE_QUAD_VALUE] \} +. \} +. el \{\ +. if '\\*[$RESTORE_QUAD_VALUE]'LEFT' \{ .LEFT \} +. if '\\*[$RESTORE_QUAD_VALUE]'RIGHT' \{ .RIGHT \} +. if '\\*[$RESTORE_QUAD_VALUE]'CENTER' \{ .CENTER \} +. \} +.END +\# +\# ==================================================================== +\# +\# COLOR HANDLING +\# ============== +\# +\# COLOR +\# ----- +\# *Arguments: +\# +\# *Function: +\# Allows the inline escape for setting color to be called +\# as a macro. +\# +.MAC COLOR END +.ie \\n(.u=1 \{\ +\c +\\*[\\$1]\c +.\} +.el \{ \\*[\\$1] \} +.END +\# +\# +\# NEWCOLOR +\# -------- +\# *Arguments: +\# [] +\# *Function: +\# Based on .defcolor, allows users to name and define colors using +\# one of the four color schemes rgb, cmy, cmyk and grey. The new +\# color is then defined as a string so that it can be called inline +\# with \*[COLORNAME] or with .COLOR. +\# *Notes: +\# With only two args, the default color scheme is rgb. +\# +\# It is highly recommended that users define new colors as +\# all-cap strings, to differentiate them from x colors, which must +\# be in lower case. +\# +.MAC NEWCOLOR END +. if \\n[#NUM_ARGS]=2 \{\ +. defcolor \\$1 rgb \\$2 +. \} +. if \\n[#NUM_ARGS]=3 \{\ +. if '\\$2'RGB' .ds $COLOR_SCHEME rgb +. if '\\$2'CYM' .ds $COLOR_SCHEME cym +. if '\\$2'CMYK' .ds $COLOR_SCHEME cmyk +. if '\\$2'GRAY' .ds $COLOR_SCHEME gray +. if '\\$2'GREY' .ds $COLOR_SCHEME gray +. defcolor \\$1 \\*[$COLOR_SCHEME] \\$3 +. \} +. ds \\$1 \\m[\\$1] +.END +\# +\# +\# XCOLOR +\# ------ +\# *Arguments: +\# [] +\# *Function: +\# Defines a string of x color name (i.e. a predefined x +\# color). If is given, creates a string of +\# that references the x color name of the first argument. +\# *Notes: +\# The color name must be a legal color name from rgb.txt, and +\# must be given entirely in lower case, all one word. +\# +.MAC XCOLOR END +. ds \\$1 \m[\\$1] +. if \\n[#NUM_ARGS]=2 .ds \\$2 \m[\\$1] +.END +\# +\# Pre-define xcolors black and white +\# +.ds black \m[black] +.ds BLACK \m[black] +.ds white \m[white] +.ds WHITE \m[WHITE] +\# +\# ===================================================================== +\# +\# +++MISCELLANEOUS USEFUL MACROS AND STRINGS+++ +\# +\# UNDERLINE +\# --------- +\# *Arguments: +\# | +\# *Function: +\# When on, underlines all letters, words, and digits in a passage, +\# ignoring punctuation and spaces. +\# *Notes: +\# Only for use when the font family is COURIER, to simulate +\# typewriter-style underlining of italic passages. +\# +.MAC UNDERLINE END +. ie '\\$1'' \{\ +. nr #UNDERLINE_ON 1 +. char A _A +. char B _B +. char C _C +. char D _D +. char E _E +. char F _F +. char G _G +. char H _H +. char I _I +. char J _J +. char K _K +. char L _L +. char M _M +. char N _N +. char O _O +. char P _P +. char Q _Q +. char R _R +. char S _S +. char T _T +. char U _U +. char V _V +. char W _W +. char X _X +. char Y _Y +. char Z _Z +. char \[`A] _\[`A] +. char \[^A] _\[^A] +. char \['A] _\['A] +. char \[:A] _\[:A] +. char \[oA] _\[oA] +. char \[~A] _\[~A] +. char \[AE] _\[AE] +. char \[`E] _\[`E] +. char \[^E] _\[^E] +. char \['E] _\['E] +. char \[:E] _\[:E] +. char \[`I] _\[`I] +. char \[^I] _\[^I] +. char \['I] _\['I] +. char \[:I] _\[:I] +. char \[`O] _\[`O] +. char \[^O] _\[^O] +. char \['O] _\['O] +. char \[:O] _\[:O] +. char \[~O] _\[~O] +. char \[/O] _\[/O] +. char \[`U] _\[`U] +. char \[^U] _\[^U] +. char \['U] _\['U] +. char \[:U] _\[:U] +. char \[,C] _\[,C] +. char \[-D] _\[-D] +. char \[~N] _\[~N] +. char \[TP] _\[TP] +. char \['Y] _\['Y] +. char \[:Y] _\[:Y] +. char a _a +. char b _b +. char c _c +. char d _d +. char e _e +. char f _f +. char g _g +. char h _h +. char i _i +. char j _j +. char k _k +. char l _l +. char m _m +. char n _n +. char o _o +. char p _p +. char q _q +. char r _r +. char s _s +. char t _t +. char u _u +. char v _v +. char w _w +. char x _x +. char y _y +. char z _z +. char \[`a] _\[`a] +. char \[^a] _\[^a] +. char \['a] _\['a] +. char \[:a] _\[:a] +. char \[oa] _\[oa] +. char \[~a] _\[~a] +. char \[ae] _\[ae] +. char \[`e] _\[`e] +. char \[^e] _\[^e] +. char \['e] _\['e] +. char \[:e] _\[:e] +. char \[`i] _\[`i] +. char \[^i] _\[^i] +. char \['i] _\['i] +. char \[:i] _\[:i] +. char \[`o] _\[`o] +. char \[^o] _\[^o] +. char \['o] _\['o] +. char \[:o] _\[:o] +. char \[~o] _\[~o] +. char \[/o] _\[/o] +. char \[`u] _\[`u] +. char \[^u] _\[^u] +. char \['u] _\['u] +. char \[:u] _\[:u] +. char \[,c] _\[,c] +. char \[Sd] _\[Sd] +. char \[~n] _\[~n] +. char \[Tp] _\[Tp] +. char \['y] _\['y] +. char \[:y] _\[:y] +. char \[ss] _\[ss] +. char ' _' +. char 1 _1 +. char 2 _2 +. char 3 _3 +. char 4 _4 +. char 5 _5 +. char 6 _6 +. char 7 _7 +. char 8 _8 +. char 9 _9 +. char 0 _0 +. \} +. el \{\ +. nr #UNDERLINE_ON 0 +. rchar A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ + a b c d e f g h i j k l m n o p q r s t u v w x y z \ + \[`A] \[^A] \['A] \[:A] \[oA] \[~A] \[AE] \[`E] \[^E] \['E] \[:E] \ + \[`I] \[^I] \['I] \[:I] \[`O] \[^O] \['O] \[:O] \[~O] \[/O] \[`U] \ + \[^U] \['U] \[:U] \[,C] \[-D] \[~N] \[TP] \['Y] \[:Y] \ + \[`a] \[^a] \['a] \[:a] \[oa] \[~a] \[ae] \[`e] \[^e] \['e] \[:e] \[`i] \ + \[^i] \['i] \[:i] \[`o] \[^o] \['o] \[:o] \[~o] \[/o] \[`u] \[^u] \['u] \ + \[:u] \[,c] \[Sd] \[~n] \[Tp] \['y] \[:y] \[ss] \ + ' 1 2 3 4 5 6 7 8 9 0 +. \} +.END +\# +\# +\# UL/ULX +\# ------ +\# *Arguments: +\# +\# *Function: +\# Underscores all letters, words, and digits in a passage, +\# ignoring punctuation and spaces. +\# *Notes: +\# Intended to be called with inline escapes \*[UL] (underline +\# on) and \*[ULX] (underline off). Only works when the font family +\# is COURIER, to simulate typewriter-style underlining of italic +\# passages. +\# +.MAC UL END +\c\R'#UNDERLINE_ON 1' +. char A _A +. char B _B +. char C _C +. char D _D +. char E _E +. char F _F +. char G _G +. char H _H +. char I _I +. char J _J +. char K _K +. char L _L +. char M _M +. char N _N +. char O _O +. char P _P +. char Q _Q +. char R _R +. char S _S +. char T _T +. char U _U +. char V _V +. char W _W +. char X _X +. char Y _Y +. char Z _Z +. char \[`A] _\[`A] +. char \[^A] _\[^A] +. char \['A] _\['A] +. char \[:A] _\[:A] +. char \[oA] _\[oA] +. char \[~A] _\[~A] +. char \[AE] _\[AE] +. char \[`E] _\[`E] +. char \[^E] _\[^E] +. char \['E] _\['E] +. char \[:E] _\[:E] +. char \[`I] _\[`I] +. char \[^I] _\[^I] +. char \['I] _\['I] +. char \[:I] _\[:I] +. char \[`O] _\[`O] +. char \[^O] _\[^O] +. char \['O] _\['O] +. char \[:O] _\[:O] +. char \[~O] _\[~O] +. char \[/O] _\[/O] +. char \[`U] _\[`U] +. char \[^U] _\[^U] +. char \['U] _\['U] +. char \[:U] _\[:U] +. char \[,C] _\[,C] +. char \[-D] _\[-D] +. char \[~N] _\[~N] +. char \[TP] _\[TP] +. char \['Y] _\['Y] +. char \[:Y] _\[:Y] +. char a _a +. char b _b +. char c _c +. char d _d +. char e _e +. char f _f +. char g _g +. char h _h +. char i _i +. char j _j +. char k _k +. char l _l +. char m _m +. char n _n +. char o _o +. char p _p +. char q _q +. char r _r +. char s _s +. char t _t +. char u _u +. char v _v +. char w _w +. char x _x +. char y _y +. char z _z +. char \[`a] _\[`a] +. char \[^a] _\[^a] +. char \['a] _\['a] +. char \[:a] _\[:a] +. char \[oa] _\[oa] +. char \[~a] _\[~a] +. char \[ae] _\[ae] +. char \[`e] _\[`e] +. char \[^e] _\[^e] +. char \['e] _\['e] +. char \[:e] _\[:e] +. char \[`i] _\[`i] +. char \[^i] _\[^i] +. char \['i] _\['i] +. char \[:i] _\[:i] +. char \[`o] _\[`o] +. char \[^o] _\[^o] +. char \['o] _\['o] +. char \[:o] _\[:o] +. char \[~o] _\[~o] +. char \[/o] _\[/o] +. char \[`u] _\[`u] +. char \[^u] _\[^u] +. char \['u] _\['u] +. char \[:u] _\[:u] +. char \[,c] _\[,c] +. char \[Sd] _\[Sd] +. char \[~n] _\[~n] +. char \[Tp] _\[Tp] +. char \['y] _\['y] +. char \[:y] _\[:y] +. char \[ss] _\[ss] +. char ' _' +. char 1 _1 +. char 2 _2 +. char 3 _3 +. char 4 _4 +. char 5 _5 +. char 6 _6 +. char 7 _7 +. char 8 _8 +. char 9 _9 +. char 0 _0 +.END +\# +\# +.MAC ULX END +\c\R'#UNDERLINE_ON 0' +. rchar A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ + a b c d e f g h i j k l m n o p q r s t u v w x y z \ + \[`A] \[^A] \['A] \[:A] \[oA] \[~A] \[AE] \[`E] \[^E] \['E] \[:E] \ + \[`I] \[^I] \['I] \[:I] \[`O] \[^O] \['O] \[:O] \[~O] \[/O] \[`U] \ + \[^U] \['U] \[:U] \[,C] \[-D] \[~N] \[TP] \['Y] \[:Y] \ + \[`a] \[^a] \['a] \[:a] \[oa] \[~a] \[ae] \[`e] \[^e] \['e] \[:e] \[`i] \ + \[^i] \['i] \[:i] \[`o] \[^o] \['o] \[:o] \[~o] \[/o] \[`u] \[^u] \['u] \ + \[:u] \[,c] \[Sd] \[~n] \[Tp] \['y] \[:y] \[ss] \ + ' 1 2 3 4 5 6 7 8 9 0 +.END +\# +\# +\# UNDERSCORE +\# ---------- +\# *Arguments: +\# [points below baseline] "text" +\# *Function: +\# Places an underscore 2 points under the string if no lead given, +\# otherwise places underscore under string by user specified amount. +\# *Notes: +\# When using this macro, the string to be underscored must begin +\# with double-quotes ("), regardless of whether it's the sole +\# argument or the second. +\# E.g.: +\# .UNDERSCORE "Text to be underscored +\# or +\# .UNDERSCORE 2p "Text to be underscored +\# +\# All text is underscored (including punctuation and spaces). +\# This is the primary difference between UNDERLINE and UNDERSCORE, +\# aside from the fact the UNDERLINE only works with Courier. +\# +\# UNDERSCORE does not work across line breaks. Each line of +\# text must be entered separately with UNDERSCORE. If the +\# UNDERSCORE begins in the middle of a line and crosses over a +\# break, the portion before the break must be entered in its own +\# UNDERSCORE, as must the portion that comes after the break. +\# +.MAC UNDERSCORE END +. nr #RESTORE_PT_SIZE \\n[#PT_SIZE] +. ie \\n[#NUM_ARGS]=1 \{ \\$1\\s(12\\v'+2p'\\l'|0'\\v'-2p'\\s[\\n[#RESTORE_PT_SIZE]u] \} +. el \{ \\$2\\s(12\\v'+(\\$1)'\\l'|0'\\v'-(\\$1)'\\s[\\n[#RESTORE_PT_SIZE]u] \} +. rr #RESTORE_PT_SIZE +.END +\# +\# +\# DOUBLE UNDERSCORE +\# ----------------- +\# *Arguments: +\# [points below baseline] [points distance between rules] "text" +\# *Function: +\# Same as UNDERSCORE, except it produces a double underscore. The default +\# distance between the rules is 2 points. +\# *Notes: +\# The same double-quote requirement as UNDERSCORE. +\# +.MAC UNDERSCORE2 END +. nr #RESTORE_PT_SIZE \\n[#PT_SIZE] +. if \\n[#NUM_ARGS]=1 \{\ +. PRINT \\$1\\s(12\\v'+2p'\\l'|0'\\v'+2p'\\l'|0'\\v'-4p'\\s[\\n[#RESTORE_PT_SIZE]u] +. \} +. if \\n[#NUM_ARGS]=2 \{\ +. PRINT \\$2\\s(12\\v'+\\$1'\\l'|0'\\v'+2p'\\l'|0'\\v'-(2p+\\$1)'\\s[\\n[#RESTORE_PT_SIZE]u] +. \} +. if \\n[#NUM_ARGS]=3 \{\ +. PRINT \\$3\\s(12\\v'+\\$1'\\l'|0'\\v'+\\$2'\\l'|0'\\v'-(\\$2+\\$1)'\\s[\\n[#RESTORE_PT_SIZE]u] +. \} +. rr #RESTORE_PT_SIZE +.END +\# +\# +\# SUPERSCRIPT INLINES +\# ------------------- +\# *Function: +\# Prints everything after invocation as superscript. +\# *Notes: +\# \*[SUP] and \*[SUPX] turn superscript on and off respectively. +\# If running type is pseudo-condensed/expanded, invoke the superscript +\# strings as \*[CONDSUP] or \*[EXTSUP] and turn off with \*[CONDSUPX] +\# and \*[EXTSUPX] respectively. +\# +.ds SUP \ +\R'#PT_SIZE_IN_UNITS \En[.ps]'\ +\R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ +\s[\En[#PT_SIZE_IN_UNITS]u]\v'-.26m'\s[\En[#SUP_PT_SIZE]u] +\# +.ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.26m' +\# +.ds CONDSUP \ +\R'#PT_SIZE_IN_UNITS \En[.ps]'\ +\R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ +\s[\En[#PT_SIZE_IN_UNITS]u]\v'-.3m'\s[\En[#SUP_PT_SIZE]u]\E*[COND_FOR_SUP] +\# +.ds CONDSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.3m'\E*[COND] +\# +.ds EXTSUP \ +\R'#PT_SIZE_IN_UNITS \En[.ps]'\ +\R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ +\s[\En[#PT_SIZE_IN_UNITS]u]\v'-.3m'\s[\En[#SUP_PT_SIZE]u]\E*[EXT_FOR_SUP] +\# +.ds EXTSUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.3m'\E*[EXT] +\# +\# +\# SLANT +\# ----- +\# +\# SETSLANT +\# -------- +\# *Arguments: +\# | RESET +\# *Function: +\# Modifies register #DEGREES for use with \*[SLANT], or resets +\# it to the default. Defines string \*[SLANTX] +\# *Notes: +\# \*[SLANT] permits pseudo-italicizing of a font in cases where +\# no italic font exists in a particular family. +\# +\# Default # of degrees is 15. +\# +\# Do not use unit of measure with arg to SETSLANT. +\# +\# It may be necessary to adjust the spacing on either side of +\# [SLANT] and [SLANTX]. +\# +\# In docs, SLANT carries over from para to para. +\# +.nr #DEGREES 15 +.ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' +.ds SLANTX \ER'#SLANT_ON 0'\ES'0' +\# +.MAC SETSLANT END +. ie '\\$1'RESET' \{\ +. nr #DEGREES 15 +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#UNDERLINE_SLANT] \{ .return \} +. \} +. ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' +. \} +. el \{\ +. nr #DEGREES \\$1 +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#UNDERLINE_SLANT] \{ .return \} +. \} +. ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' +. \} +. ds SLANTX \ER'#SLANT_ON 0'\ES'0' +.END +\# +\# +\# BOLDER +\# ------ +\# +\# SETBOLDER +\# --------- +\# *Arguments: +\# | RESET +\# *Function: +\# Modifies register #BOLDER_UNITS for use with \*[BOLDER], or resets +\# it to the default 700 units. +\# *Notes: +\# \*[BOLDER] allows pseudo-emboldening of a font where no bold +\# font exists in a particular family. +\# +\# Default for SETBOLDER is 700 units. Do not use unit of measure +\# with arg to SETBOLDER. +\# +.nr #BOLDER_UNITS 700 +\# +.MAC SETBOLDER END +. if \\n[#IGNORE]=1 \{ .return \} +. ie '\\$1'RESET' \{ .nr #BOLDER_UNITS 700 \} +. el \{ .nr #BOLDER_UNITS \\$1 \} +.END +\# +\# +.MAC BOLDER END +\c +.bd \\n(.f \\n[#BOLDER_UNITS] +.END +\# +\# +.MAC BOLDERX END +\c +.bd \\n(.f +.END +\# +\# +++CONDENSE/EXTEND+++ +\# +\# CONDENSE/EXTEND +\# --------------- +\# *Arguments: +\# +\# *Function: +\# Stores current point size in z's in #PT_SIZE_IN_UNITS, figures out +\# new point size (for character width) from arg, and defines string +\# COND or EXT, which set the type size to the new character width, +\# and sets the height of type to the value stored in CURRENT_PT_SIZE +\# *Notes: +\# CONDENSE_OR_EXTEND is invoked from the aliases +\# CONDENSE and EXTEND. CONDENSE implies <100, EXTEND +\# implies >100. Do not use a percent sign in the argument. +\# +\# There is no default setting for CONDENSE or EXTEND. +\# 80 is a good approximation of condensed type, 120 is okay +\# for extended. +\# +\# The value set by CONDENSE or EXTEND applies to all +\# subsequent \*[COND] or \*[EXT] escapes until a new value is set. +\# +\# \*[COND] or \*[EXT] must be turned off before all changes of point +\# size and reinvoked afterwards (if so desired). This refers to +\# changes of point size via control lines AND with via inlines. +\# +.MAC CONDENSE_OR_EXTEND END +. if '\\$0'CONDENSE' \{\ +. ds $COND_PERCENT \\$1 +. if \\n[#PRINT_STYLE]=1 \{\ +. rm $COND_PERCENT +. ds $COND_PERCENT 100 +. \} +. ds COND \ +\R'#PT_SIZE_IN_UNITS \En[.ps]'\ +\R'#CONDENSE 1'\ +\R'#COND_WIDTH (\En[#PT_SIZE_IN_UNITS]u*\E*[$COND_PERCENT]u)/100'\ +\Es[\En[#COND_WIDTH]u]\EH'\En[#PT_SIZE_IN_UNITS]u' +. ds COND_FOR_SUP \ +\R'#COND_WIDTH (\En[#SUP_PT_SIZE]u*\E*[$COND_PERCENT]u)/100'\ +\Es[\En[#COND_WIDTH]u]\H'\En[#SUP_PT_SIZE]u' +. \} +. if '\\$0'EXTEND' \{\ +. ds $EXT_PERCENT \\$1 +. if \\n[#PRINT_STYLE]=1 \{\ +. rm $EXT_PERCENT +. ds $EXT_PERCENT 100 +. \} +. ds EXT \ +\R'#PT_SIZE_IN_UNITS \En[.ps]'\ +\R'#EXTEND 1'\ +\R'#EXT_WIDTH (\En[#PT_SIZE_IN_UNITS]u*\E*[$EXT_PERCENT]u)/100'\ +\Es[\En[#EXT_WIDTH]u]\EH'\En[#PT_SIZE_IN_UNITS]u' +. ds EXT_FOR_SUP \ +\R'#EXT_WIDTH (\En[#SUP_PT_SIZE]u*\E*[$EXT_PERCENT]u)/100'\ +\Es[\En[#EXT_WIDTH]u]\H'\En[#EXT_PT_SIZE]u' +. \} +.END +\# +.ds CONDX \ER'#CONDENSE 0'\Es0\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' +.ds EXTX \ER'#EXTEND 0'\Es0\R'#PT_SIZE_IN_UNITS \En[.ps]'\H'\En[#PT_SIZE_IN_UNITS]u' +\# +\# +\# +++PAD LINES+++ (insert space) +\# +\# PAD MARKER +\# ---------- +\# *Arguments: +\# +\# *Function: +\# Defines string $PAD_MARKER, used in PAD +\# *Notes: +\# $PAD_MARKER is normally # (the pound sign). +\# +.MAC PAD_MARKER END +. ds $PAD_MARKER \\$1 +.END +\# +\# +\# PAD +\# --- +\# *Argments: +\# "" +\# *Function: +\# Defines and redefines padding character (default=pound sign +\# unless padding character has been set with PAD_MARKER) +\# several times so that when the string is output at the end +\# of the macro, every # has been converted to an equal-sized +\# amount of padding (blank space) on a line. # is equivalent to +\# CompuGraphic's old . +\# *Notes: +\# String tabs may be marked off during PAD. +\# +.MAC PAD END +. if \\n(.u=1 \{ .nr #FILL_MODE 1 \} +. nf +. if !d$PAD_MARKER .ds $PAD_MARKER # +. char \\*[$PAD_MARKER] \R'#PAD_COUNT \En[#PAD_COUNT]+1' +. ds $FAMILY_FOR_PAD \\n[.fam] +\#. fp \\n[.fp] \\*[$FONT] +. fp \\n[.fp] \\n[.sty] +. ds $FONT_FOR_PAD \\*[$FONT] +. nr #SIZE_FOR_PAD \\n[.ps] +. ds $PAD_STRING \\$1 +. as $PAD_STRING \Ekp +. di PAD_STRING +. fam \\*[$FAMILY_FOR_PAD] +\\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +. br +. di +. char \\*[$PAD_MARKER] \R'#SPACE_TO_END \En(.l-\Enp'\R'#PAD_SPACE \En[#SPACE_TO_END]/\En[#PAD_COUNT]' +. di PAD_STRING +. fam \\*[$FAMILY_FOR_PAD] +\\f]\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +. br +. di +. char \\*[$PAD_MARKER] \h'\En[#PAD_SPACE]u' +. ie \\n[#SILENT] \{\ +. SILENT +. fam \\*[$FAMILY_FOR_PAD] +\\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +. br +. SILENT OFF +. \} +. el \{\ +. fam \\*[$FAMILY_FOR_PAD] +\\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +. br +. \} +. if \\n[#FILL_MODE]=1 \{\ +. fi +. rr #FILL_MODE +. \} +. rr #PAD_COUNT +. rr #SPACE_TO_END +. rr #PAD_SPACE +. rm $PAD_STRING +. rm PAD_STRING +. rchar # +. if '\\$2'NOBREAK' \{\ +. TRAP OFF +. EOL +. TRAP +. \} +.END +\# +\# +\# +++LEADERS+++ +\# +.ig +The leader mechanism is primitive, but it works. Basically, every +macro in this set that includes a line length also sets a single +groff tab stop at the right hand end of the line. That way, +whenever Ctrl-A is invoked (always at the end of an input line), +leader of the correct length gets deposited. Ctrl-A is accessed by +the string LEADER (i.e. inline, as \*[LEADER]). Leaders within tabs +get their length from the tab line length. +.. +\# +\# SET LEADER CHARACTER +\# -------------------- +\# *Arguments: +\# +\# *Function: +\# Set leader character. +\# +.MAC LEADER_CHARACTER END +. lc \\$1 +.END +\# +.ds LEADER  +\# +\# +++DROP CAPS+++ +\# +\# DROP CAP FAMILY +\# --------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $DC_FAM. +\# +.MAC DROPCAP_FAMILY END +. ds $DC_FAM \\$1 +.END +\# +\# +\# DROP CAP FONT +\# ------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $DC_FT. +\# +.MAC DROPCAP_FONT END +. ds $DC_FT \\$1 +.END +\# +\# +\# DROPCAP COLOR +\# ------------- +\# *Arguments: +\# +\# *Function: +\# Defines string $DC_COLOR to argument. +\# *Notes: +\# User must define an XCOLOR or NEWCOLOR before using +\# DC_COLOR. +\# +.MAC DROPCAP_COLOR END +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. nr #DC_COLOR 1 +. ds $DC_COLOR \\$1 +.END +\# +\# +\# DROP CAP GUTTER +\# --------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #DC_GUT. +\# *Notes: +\# Requires unit of measure. Default is 3p. +\# +.MAC DROPCAP_GUTTER END +. nr #DC_GUT (\\$1) +.END +\# +\# +\# DROP CAP ADJUST +\# --------------- +\# *Argument: +\# <+|- # of points to in/decrease point size of drop cap letter> +\# *Function: +\# Creates or modifies string $DC_ADJUST. +\# *Notes: +\# Despite its best efforts, DROPCAP doesn't always get the point +\# size of the drop cap critically perfect. DROPCAP_ADJUST lets +\# the user add or subtract points (or fractions of points) to +\# get the size right. +\# +\# Requires the + or - sign. +\# +.MAC DROPCAP_ADJUST END +. ds $DC_ADJUST \\$1 +.END +\# +\# +\# DROP CAP +\# -------- +\# *Arguments: +\# <# of lines> [COND <% to condense> | EXT <% to extend>] +\# *Function: +\# Calculates point size of dropcap based on # of lines passed as +\# arg 2. Sets indent for text based on dropcap width+gutter. +\# Advances and prints dropcap; reverses and prints indented text +\# to bottom of dropcap, then resets indent to left margin (plus +\# any indent that was in effect prior to invoking DROPCAP). +\# *Notes: +\# Drop caps put a strain on on resource-challenged systems. +\# +\# Drop caps when using the doc processing macro PP only work with +\# initial paragraphs (i.e. at doc start, or after heads), only when +\# DROPCAPS comes immediately after PP, and only when the PRINTSTYLE +\# is TYPESET. If these conditions aren't met, DROPCAPS is silently +\# ignored. +\# +\# The COND or EXT argument are processed separately from all +\# other COND or EXT inlines or macros, hence passing COND or +\# EXT has no effect on running type. +\# +.MAC DROPCAP END +. if #IGNORE \{ .return \} +. br +. if \\n[#DOCS] \{\ +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. if \\n[#PRINT_STYLE]=2 \{\ +. if \\n[#PP_STYLE]=2 \{ .return \} +. if \\n[#PP]>1 \{ .return \} +. ti 0 +. \} +. \} +. ds $DROPCAP \\$1 +. nr #DC_LINES \\$2-1 +. if \\n[#CONDENSE]=1 \{\ +. ds $RESTORE_COND \\*[$COND_PERCENT] +\\*[CONDX] +. nr #CONDENSE_WAS_ON 1 +. \} +. if \\n[#EXTEND]=1 \{\ +. ds $RESTORE_EXT \\*[$EXT_PERCENT] +\\*[EXTX] +. nr #EXTEND_WAS_ON 1 +. \} +. if '\\$3'COND' \{ .CONDENSE \\$4 \} +. if '\\$3'EXT' \{ .EXTEND \\$4 \} +. if !r#DC_GUT \{ .nr #DC_GUT (3p) \} +. ds $RESTORE_FAM \\n[.fam] +. ds $RESTORE_FT \\*[$FONT] +. nr #RESTORE_PT_SIZE \\n[#PT_SIZE] +. nr #RESTORE_INDENT \\n(.i +. SIZESPECS +. nr #DC_HEIGHT \\n[#DC_LINES]*\\n[#LEAD]+\\n[#CAP_HEIGHT] +. ie !d$DC_FAM \{ .FAM \\n[.fam] \} +. el \{ .FAM \\*[$DC_FAM] \} +. ie !d$DC_FT \{ .FT \\*[$FONT] \} +. el \{ .FT \\*[$DC_FT] \} +. while \\n[#GET_DC_HEIGHT]<\\n[#DC_HEIGHT] \{\ +. ps \\n[#PT_SIZE]u+100u +. SIZESPECS +. nr #GET_DC_HEIGHT \\n[#CAP_HEIGHT] +.\} +. if d$DC_ADJUST \{ .ps \\*[$DC_ADJUST]p \} +. mk x +. sp \\n[#DC_LINES]v +. ie \\n[#DC_COLOR]=1 \{\ +. ie !'\\$3'' \{\ +. ie '\\$3'COND' \{ .PRINT \m[\\*[$DC_COLOR]]\\*[COND]\\*[$DROPCAP]\\*[CONDX]\m[] \} +. el \{ .PRINT \m[\\*[$DC_COLOR]]\\*[EXT]\\*[$DROPCAP]\\*[EXTX]\m[] \} +. \} +. el \{ .PRINT \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[] \} +. \} +. el \{\ +. ie !'\\$3'' \{\ +. ie '\\$3'COND' \{ .PRINT \\*[COND]\\*[$DROPCAP]\\*[CONDX] \} +. el \{ .PRINT \\*[EXT]\\*[$DROPCAP]\\*[EXTX] \} +. \} +. el \{ .PRINT \m[\\*[$DC_COLOR]]\\*[$DROPCAP]\m[] \} +. \} +. if '\\$3'COND' \{ \E*[COND] \} +. if '\\$3'EXT' \{ \E*[EXT] \} +. ie \\n(.i \{ .in +\w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} +. el \{ .in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} +. if '\\$3'COND' \{ \E*[CONDX]\c \} +. if '\\$3'EXT' \{ \E*[EXTX]\c \} +. rt \\nxu +. FAM \\*[$RESTORE_FAM] +. FT \\*[$RESTORE_FT] +. ps \\n[#RESTORE_PT_SIZE]u +. if \\n[#CONDENSE_WAS_ON] \{\ +. CONDENSE \\*[$RESTORE_COND] +\\*[COND]\c +. \} +. if \\n[#EXTEND_WAS_ON] \{\ +. EXTEND \\*[$RESTORE_EXT] +\\*[EXT]\c +. \} +. ie \\n(.u \{ .wh \\n(.du+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF \} +. el \{ .wh \\n(.du+\\n[#DC_HEIGHT]u DROPCAP_OFF \} +. rr #CONDENSE_WAS_ON +. rr #EXTEND_WAS_ON +. rm $DROPCAP +. rr #DC_LINES +. rm $RESTORE_COND +. rm $RESTORE_EXT +. rm $RESTORE_FAM +. rm $RESTORE_FT +. rr #RESTORE_PT_SIZE +. rr #RESTORE_INDENT +. rr #DC_HEIGHT +. rr #GET_DC_HEIGHT +. rr x +.END +\# +.MAC DROPCAP_OFF END +' in \\n[#RESTORE_INDENT]u +.END +\# +\# +\# RULE +\# ---- +\# *Argument: +\# +\# *Function: +\# Draws a rule the length of the current measure. +\# *Notes: +\# +.MAC RULE END +\c +. EL +. if \\n(.u=1 \{\ +. nr #FILL_WAS_ON 1 +. ds $CURRENT_QUAD \\*[$QUAD_VALUE] +. nf +. \} +. ie \\n[#INDENT_ACTIVE] \{\ +. nr #RESTORE_L_LENGTH \\n(.l +. if \\n[#INDENT_BOTH_ACTIVE] \{ .ll \\n(.lu-\\n[#BL_INDENT]u \} +. if \\n[#INDENT_LEFT_ACTIVE] \{ .ll \\n(.lu-\\n[#L_INDENT]u \} +. PRINT \El'\En(.lu'\c +. ll \\n[#RESTORE_L_LENGTH]u +. rr #RESTORE_L_LENGTH +. \} +. el \{\ +. PRINT \El'\En(.lu'\c +. \} +. if r#FILL_WAS_ON \{\ +. fi +. rr #FILL_WAS_ON +. QUAD \\*[$CURRENT_QUAD] +. rm $CURRENT_QUAD +. \} +. EL +.END +\# +\# ===================================================================== +\# +\# +++WORD AND SENTENCE SPACING+++ +\# +\# WORD SPACE CONTROL +\# ------------------ +\# *Argument: +\# <+|->wordspace | DEFAULT +\# *Function: +\# Increases or decreases interword space by user supplied amount. +\# If DEFAULT, value is set to 12 (groff default). +\# *Notes: +\# $WS_CONSTANT is the groff default word space. +\# $WS_VAR is the user supplied amount by which to in/decrease word space. +\# $WS is a concatenation of WS_CONSTANT and WS_VAR. +\# +\# Because the user supplied value requires a literal + or - sign, +\# the macro argument is stored in a string. +\# +\# \n[.sss] holds the current sentence space value. +\# +.MAC WS END +. ds $WS_CONSTANT 12 +. ds $WS_VAR \\$1 +. ie '\\$1'DEFAULT' .ds $WS_VAR +0 +. el .ds $WS (\\*[$WS_CONSTANT]\\*[$WS_VAR]) +. ie \\n[.sss]=12 \{ .ss \\*[$WS] 12 \} +. el \{\ +. ss \\*[$WS] (\\*[$WS]\\*[$SS_VAR]) +. SS \\*[$SS_VAR] +. \} +.END +\# +\# +\# SENTENCE SPACE CONTROL +\# ---------------------- +\# *Argument: +\# <+-sentencespace> | 0 | DEFAULT +\# *Function: +\# Increases or decreases sentence space by user supplied amount. +\# If 0, sentence spaces are ignored. If DEFAULT, value is +\# set to 12 (groff default). +\# *Notes: +\# Because the user supplied value requires a literal + or - sign, +\# the macro argument is stored in a string. +\# +\# Sentence space applies only to input where sentences are separated +\# by two spaces (and/or, in fill mode [FLUSH L|R|C or JUSTIFY], an EOL). +\# Changing .SS when sentences are separated by only one space has +\# no effect on the space between sentences. +\# +\# \n[.ss] holds the current wordspace value. +\# \n[.sss] holds the current sentence space value. +\# +.MAC SS END +. ie '\\$1'0' \{ .ss \\n[.ss] (\\n[.ss]-\\n[.ss]) \} +. el \{\ +. ie '\\$1'DEFAULT' \{ .ss \\n[.ss] \} +. el \{\ +. ds $SS_VAR \\$1 +. ss \\n[.ss] (0\\*[$SS_VAR]) +. \} +. \} +.END +\# +\# +\# ===================================================================== +\# +\# +++INDENTS+++ +\# +.ig +There are five styles of indents: left, right, both, temporary, +and hanging. Each is set/invoked with a different macro. +Indent macros begin with the letter "I", hence .IL means "indent left," +.IR means "indent right," and so on. + +The first time any of the indent macros is used, it requires an +argument--the size of the indent (with a unit of measure). The +size may also be entered using the \w escape--very useful +for numbered lists using HI. The unit of measure is required. +Subsequent invocations don't require the argument; the indent +measure remains the same until it's changed by invoking the macro +with an argument again. + +If no indents are in effect, the arguments passed to indent macros are +measured from the left and right margins of the page. If a left indent +or a right indent is already in effect, the arguments passed to +the indent macros are calculated from the current values; in other words, +the arguments are additive. If you quit an indent and later return +to it, its value will be the value last in effect, unless you pass +it an argument. If you do pass an argument, it is added to the last +value in effect, unless you cleared the indent with one of +.IX/Q macros. + +Example +------- + +.IL 2P +...some text... +.IL 2P +...some text... +.IQ +...some text... +.IL +...some text... + +The first .IL 2P indents text 2P from the left margin. The second +.IL 2P indents text by an additional 2P, i.e. 4P from the left margin. +.IQ turns the indent off. The last .IL (which has no argument) +takes its value from the total of all arguments passed to .IL (in +this case, 2P and 2P), therefore it indents 2P+2P from the left +margin, i.e. 4P. If you wanted the last .IL to indent just 2P, +you'd either have to reset the .IL prior to .IQ (.IL -2P), or pass +the last .IL the argument 2P. + +To reverse the sense of an indent added to an indent, you may use +negative values. + +Indents can be turned off individually with ILX, IRX, and IBX. +LEFT and RIGHT indents may be combined and manipulated +separately, (e.g. you can have an IL of 2P and an IR of 4P +operative at the same time, and then change, say, the IL to +4P--thereby left indenting 6P--while the IR remains at 4P. + +IB automatically turns off IL and IR. They have to be reinvoked +again when needed. IL and IR automatically turn IB off; it, too, +has to be reinvoked with needed. + +All indents can be turned off at once with IQ. The ILX, IRX, IBX, +and IQ macros simply turn the indents off; the values stored in +the respective indent macros (IL, IR, IB) remain in effect. If +the user wishes to clear the values, the IX macros should be +invoked with the single argument CLEAR. IQ CLEAR clears out +the values stored for all indent styles. + +Indents *must* be turned off before settting string tabs +inside PAD. Generally, in order not to get confused, it's a +good idea to turn all indents off before setting any tabs. + +TI and HI are special cases. There's no need to turn them off, +since they affect only one line--the first after their +invocation. Like the other indent styles, the first time +they're invoked, they require a value in iPpcm; each subsequent +invocation without an argument will use the same value. To +change the value, simply pass a new value. Values for TI and HI +are *not* additive. + +HI presupposes that you already have a left or both indent on. +HI will never hang a line outside the left margin of a document +or column. In other words, you must have IL or IB on before you +can use HI. +.. +\# +\# INDENT LEFT +\# ----------- +\# +.MAC IL END +. if \\n[#INDENT_STYLE_BOTH] \{ .IBX \} +. nr #INDENT_STYLE_LEFT 1 +. nr #INDENT_ACTIVE 1 +. nr #INDENT_LEFT_ACTIVE 1 +. ie '\\$1'' \{\ +. br +. in \\n[#L_INDENT]u +. ta \\n(.lu-\\n[#L_INDENT]u +. \} +. el \{\ +. br +. nr #L_INDENT +(\\$1) +. in \\n[#L_INDENT]u +. ta \\n(.lu-\\n[#L_INDENT]u +. \} +.END +\# +\# +\# +++INDENT RIGHT+++ +\# +.MAC IR END +. if \\n[#INDENT_STYLE_BOTH] \{ .IBX \} +. nr #INDENT_STYLE_RIGHT 1 +. nr #INDENT_ACTIVE 1 +. nr #INDENT_RIGHT_ACTIVE 1 +. ie '\\$1'' \{\ +. br +. ie \\n[#TAB_ACTIVE] \{\ +. ll \\n(.lu-\\n[#R_INDENT]u +. ta \\n(.lu-\\n[#L_INDENT]u +. \} +. el \{\ +. ll \\n[#L_LENGTH]u-\\n[#R_INDENT]u +. ta \\n(.lu-\\n[#L_INDENT]u +. \} +. \} +. el \{\ +. br +. nr #R_INDENT +(\\$1) +. ie \\n[#TAB_ACTIVE] \{\ +. ll \\n(.lu-\\n[#R_INDENT]u +. ta \\n(.lu-\\n[#L_INDENT]u +. \} +. el \{\ +. ll \\n[#L_LENGTH]u-\\n[#R_INDENT]u +. ta \\n(.lu-\\n[#L_INDENT]u +. \} +. \} +.END +\# +\# +\# +++INDENT BOTH+++ +\# +.MAC IB END +. if \\n[#INDENT_STYLE_LEFT] \{ .ILX \} +. if \\n[#INDENT_STYLE_RIGHT] \{ .IRX \} +. nr #INDENT_STYLE_BOTH 1 +. nr #INDENT_ACTIVE 1 +. nr #INDENT_BOTH_ACTIVE 1 +. ie '\\$1'' \{\ +. br +. in \\n[#BL_INDENT]u +. ie \\n[#TAB_ACTIVE] \{\ +. ll \\n(.lu-\\n[#BR_INDENT]u +. ta \\n(.lu-\\n[#BR_INDENT]u +. \} +. el \{\ +. ll \\n[#L_LENGTH]u-\\n[#BR_INDENT]u +. ta \\n(.lu-\\n[#BR_INDENT]u +. \} +. \} +. el \{\ +. br +. nr #BL_INDENT (\\n[#INDENT]+\\$1) +. ie \\n[#NUM_ARGS]=2 \{ .nr #BR_INDENT +(\\$2) \} +. el \{ .nr #BR_INDENT \\n[#BL_INDENT] \} +. ie \\n[#TAB_ACTIVE] \{\ +. in \\n[#BL_INDENT]u +. ll \\n(.lu-\\n[#BR_INDENT]u +. ta \\n(.lu-\\n[#BL_INDENT]u +. \} +. el \{\ +. in \\n[#BL_INDENT]u +. ll \\n[#L_LENGTH]u-\\n[#BR_INDENT]u +. ta \\n(.lu-\\n[#BR_INDENT]u +. \} +. \} +.END +\# +\# +\# +++TEMPORARY INDENT+++ +\# +.MAC TI END +. br +. ie '\\$1'' \{\ +. ti \\n[#T_INDENT]u +. if \\n[#INDENT_LEFT_ACTIVE] \{\ +. ti \\n[#T_INDENT]u+\\n[#L_INDENT]u +. \} +. if \\n[#INDENT_BOTH_ACTIVE] \{\ +. ti \\n[#T_INDENT]u+\\n[#BL_INDENT]u +. \} +. \} +. el \{\ +. nr #T_INDENT (\\$1) +. ti \\n[#T_INDENT]u +. \} +.END +\# +\# +\# +++HANGING INDENT+++ +\# +.MAC HI END +. ie '\\$1'' \{ .ti -\\n[#HL_INDENT]u \} +. el \{\ +. nr #HL_INDENT (\\$1) +. ti -\\n[#HL_INDENT]u +. \} +.END +\# +\# +\# +++INDENTS OFF+++ +\# +.MAC ILX END +. br +. in 0 +. rr #INDENT_LEFT_ACTIVE +. if '\\$1'CLEAR' \{\ +. rr #L_INDENT +. rr #INDENT_STYLE_LEFT +. \} +.END +\# +\# +.MAC IRX END +. br +. rr #INDENT_RIGHT_ACTIVE +. ie \\n[#TAB_ACTIVE] \{ .TAB\\n[#CURRENT_TAB] \} +. el \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. if '\\$1'CLEAR' \{\ +. rr #R_INDENT +. rr #INDENT_STYLE_RIGHT +. \} +.END +\# +\# +.MAC IBX END +. br +. in 0 +. rr #INDENT_BOTH_ACTIVE +. ie \\n[#TAB_ACTIVE] \{ .TAB\\n[#CURRENT_TAB] \} +. el \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. if '\\$1'CLEAR' \{\ +. rr #BL_INDENT +. rr #BR_INDENT +. rr #INDENT_STYLE_BOTH +. \} +.END +\# +\# +.MAC IX END +. if '\\$0'IX' \{\ +. if !\\n[#IX_WARN] \{\ +. tm1 "[mom]: Use of .IX is now deprecated. Use .IQ instead. +. tm1 " .IX will continue to behave as before, but to +. tm1 " avoid this message, please update your document. +. nr #IX_WARN 1 +. \} +. \} +. br +. in 0 +. rr #INDENT_LEFT_ACTIVE +. rr #INDENT_RIGHT_ACTIVE +. rr #INDENT_BOTH_ACTIVE +. if \\n[#INDENT_STYLE_RIGHT] \{\ +. ie \\n[#TAB_ACTIVE] \{ .TAB\\n[#CURRENT_TAB] \} +. el \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. \} +. if \\n[#INDENT_STYLE_BOTH] \{\ +. ie \\n[#TAB_ACTIVE] \{ .TAB\\n[#CURRENT_TAB] \} +. el \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. \} +. if '\\$1'CLEAR' \{\ +. if \\n[#INDENT_STYLE_RIGHT] \{\ +. ie \\n[#TAB_ACTIVE] \{ .TAB\\n[#CURRENT_TAB] \} +. el \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. \} +. if \\n[#INDENT_STYLE_BOTH] \{\ +. ie \\n[#TAB_ACTIVE] \{ .TAB\\n[#CURRENT_TAB] \} +. el \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. \} +. rr #L_INDENT +. rr #R_INDENT +. rr #BL_INDENT +. rr #BR_INDENT +. rr #T_INDENT +. rr #H_INDENT +. rr #INDENT_STYLE_LEFT +. rr #INDENT_STYLE_RIGHT +. rr #INDENT_STYLE_BOTH +. \} +. rr #INDENT_ACTIVE +.END +\# +\# ===================================================================== +\# +\# +++MULTIPLE COLUMNS+++ +\# +\# MULTIPLE COLUMNS ON +\# ------------------- +\# *Arguments: +\# +\# *Function: +\# Marks the top of a column set +\# +.MAC MCO END +.mk c +.END +\# +\# MULTIPLE COLUMN RETURN +\# ---------------------- +\# *Arguments: +\# +\# *Function: +\# Returns to the top of a column set +\# +.MAC MCR END +. TRAP OFF +. sp |\\ncu +. TRAP +.END +\# +\# MULTIPLE COLUMNS OFF +\# -------------------- +\# *Arguments: +\# | +\# *Function: +\# Advances to the end of a column set +\# *Notes: +\# With no argument, advances to the next baseline (at the current +\# leading value) beneath the longest column. With an argument +\# (which requires a unit of measure), advances arg distance +\# beneath the baseline of the deepest column. If the argument +\# is zero, advances to the baseline of the deepest column. +\# +.MAC MCX END +. ie '\\$1'' \{\ +. TQ +. sp |\\n(.hu +. \} +. el \{\ +. nr #MCX_ALD (\\$1) +. TQ +. ie \\n[#MCX_ALD]=0 \{ .sp |\\n(.hu-1v \} +. el \{ .sp |\\n(.hu+\\n[#MCX_ALD]u \} +. rr #MCX_ALD +. \} +.END +\# +\# ===================================================================== +\# +\# +++TYPESETTING SUPPORT MACROS+++ +\# +\# TRAP +\# ---- +\# *Arguments: +\# toggle +\# *Function: +\# Enables/disables traps. +\# *Notes: +\# EL and TN don't function as advertised on the last line before +\# a trap (when they break the preceding line, they spring the +\# trap, and groff won't back up to the line preceding the trap). +\# TRAP is a kludge to get EL and TN work properly on last lines. +\# The user simply enloses the offending lines in TRAP OFF/TRAP. +\# +.MAC TRAP END +. ie '\\$1'' \{ .vpt 1 \} +. el \{ .vpt 0 \} +.END +\# +\# +\# SILENT +\# ------ +\# *Arguments: +\# | +\# *Function: +\# Diverts text so that it doesn't print, or turns the function off. +\# *Notes: +\# Useful for setting up autotabs where you don't want the line with +\# the tab marks to print. +\# +\# Also aliased as COMMENT, in case user wants to input a batch of +\# text that doesn't print. +\# +.MAC SILENT END +. nr #SILENT 1 +. if \\n[#QUAD] \{ .br \} +. ie '\\$1'' \{ .di NO_FLASH \} +. el \{\ +. br +. di +. rm NO_FLASH +. rr #SILENT +. \} +.END +\# +\# +\# PRINT +\# ----- +\# *Function: +\# Prints anything. A macro that helps keep my code nicely indented. +\# +.MAC PRINT END +. nop \\$* +.END +\# +\# +\# CAPS +\# ---- +\# *Arguments: +\# | +\# *Function: +\# Converts text to caps, or, if OFF, reverts to normal caps/lc. +\# +.MAC CAPS END +. ie '\\$1'' \{\ +. tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ +. tr à\[`A] +. tr â\[^A] +. tr á\['A] +. tr ä\[:A] +. tr å\[oA] +. tr ã\[~A] +. tr æ\[AE] +. tr è\[`E] +. tr ê\[^E] +. tr é\['E] +. tr ë\[:E] +. tr ì\[`I] +. tr î\[^I] +. tr í\['I] +. tr ï\[:I] +. tr ò\[`O] +. tr ô\[^O] +. tr ó\['O] +. tr ö\[:O] +. tr õ\[~O] +. tr ø\[/O] +. tr ù\[`U] +. tr û\[^U] +. tr ú\['U] +. tr ü\[:U] +. tr ç\[,C] +. tr ð\[-D] +. tr ñ\[~N] +. tr þ\[TP] +. tr ý\['Y] +. tr ÿ\[:Y] +. nr #CAPS_ON 1 +. \} +. el \{\ +. tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz +. tr à\[`a] +. tr â\[^a] +. tr á\['a] +. tr ä\[:a] +. tr å\[oa] +. tr ã\[~a] +. tr æ\[ae] +. tr è\[`e] +. tr ê\[^e] +. tr é\['e] +. tr ë\[:e] +. tr ì\[`i] +. tr î\[^i] +. tr í\['i] +. tr ï\[:i] +. tr ò\[`o] +. tr ô\[^o] +. tr ó\['o] +. tr ö\[:o] +. tr õ\[~o] +. tr ø\[/o] +. tr ù\[`u] +. tr û\[^u] +. tr ú\['u] +. tr ü\[:u] +. tr ç\[,c] +. tr ð\[Sd] +. tr ñ\[~n] +. tr þ\[Tp] +. tr ý\['y] +. tr ÿ\[:y] +. rr #CAPS_ON +. \} +.END +\# +\# SIZESPECS +\# --------- +\# Argument: +\# +\# Function: +\# Gets cap-height, x-height, and descender depth of the +\# current font at the current point size. +\# *Notes: +\# The routine is diverted so it remains invisible to output. +\# +.MAC SIZESPECS END +. di TYPESIZE +E\\R'#CAP_HEIGHT \\n[.cht]' +e\\R'#X_HEIGHT \\n[.cht]' +y\\R'#DESCENDER \\n[.cdp]' +. br +. di +.END +\# +\# ===================================================================== +\# +\# +++TYPESETTING ALIASES+++ +\# +.ALIAS ADD_SPACE ALD +.ALIAS CENTRE CENTER +.ALIAS COLOUR COLOR +.ALIAS COMMENT SILENT +.ALIAS CONDENSE CONDENSE_OR_EXTEND +.ALIAS EXTEND CONDENSE_OR_EXTEND +.ALIAS FAM FAMILY +.ALIAS HYPHENATE HY +.ALIAS HYPHENATION HY +.ALIAS HYSET HY_SET +.ALIAS IBQ IBX +.ALIAS ILQ ILX +.ALIAS IQ IX +.ALIAS IRQ IRX +.ALIAS LIG LIGATURES +.ALIAS NEWCOLOUR NEWCOLOR +.ALIAS PADMARKER PAD_MARKER +.ALIAS SP ALD +.ALIAS SPACE ALD +.ALIAS TABSET TAB_SET +.ALIAS TB TAB +.ALIAS UNDERSCORE_2 UNDERSCORE2 +.ALIAS XCOLOUR XCOLOR +\# +\# +\# ==================================================================== +\# +\# DOCUMENT PROCESSING MACROS, STRINGS AND ALIASES +\# =============================================== +\# +\# +++PAGE DIMENSIONS+++ +\# +\# PAPER SIZE +\# ---------- +\# *Arguments: +\# LETTER | LEGAL | STATEMENT | TABLOID | LEDGER | FOLIO | QUARTO | 10x14 | EXECUTIVE | A3 | A4 | A5 | B4 | B5 +\# *Function: +\# Sets up dimensions for different paper sizes. +\# +.MAC PAPER END +. ds $PAPER \\$1 +. if '\\*[$PAPER]'LETTER' \{\ +. PAGEWIDTH 8.5i +. PAGELENGTH 11i +. \} +. if '\\*[$PAPER]'LEGAL' \{\ +. PAGEWIDTH 8.5i +. PAGELENGTH 14i +. \} +. if '\\*[$PAPER]'STATEMENT' \{\ +. PAGEWIDTH 5.5i +. PAGELENGTH 8.5i +. \} +. if '\\*[$PAPER]'TABLOID' \{\ +. PAGEWIDTH 11i +. PAGELENGTH 17i +. \} +. if '\\*[$PAPER]'LEDGER' \{\ +. PAGEWIDTH 17i +. PAGELENGTH 11i +. \} +. if '\\*[$PAPER]'FOLIO' \{\ +. PAGEWIDTH 8.5i +. PAGELENGTH 13i +. \} +. if '\\*[$PAPER]'QUARTO' \{\ +. PAGEWIDTH 610p +. PAGELENGTH 780p +. \} +. if '\\*[$PAPER]'10x14' \{\ +. PAGEWIDTH 10i +. PAGELENGTH 14i +. \} +. if '\\*[$PAPER]'EXECUTIVE' \{\ +. PAGEWIDTH 7.25i +. PAGELENGTH 10.5i +. \} +. if '\\*[$PAPER]'A3' \{\ +. PAGEWIDTH 842p +. PAGELENGTH 1190p +. \} +. if '\\*[$PAPER]'A4' \{\ +. PAGEWIDTH 595p +. PAGELENGTH 842p +. \} +. if '\\*[$PAPER]'A5' \{\ +. PAGEWIDTH 421p +. PAGELENGTH 595p +. \} +. if '\\*[$PAPER]'B4' \{\ +. PAGEWIDTH 709p +. PAGELENGTH 1002p +. \} +. if '\\*[$PAPER]'B5' \{\ +. PAGEWIDTH 501p +. PAGELENGTH 709p +. \} +. if !r#L_MARGIN \{ .L_MARGIN \\n(.o \} +. if !r#R_MARGIN \{ .R_MARGIN 1i \} +.END +\# +\# +\# ==================================================================== +\# +\# +++PRINTSTYLE -- TYPEWRITE OR TYPESET+++ +\# +\# PRINTSTYLE +\# ---------- +\# *Arguments: +\# TYPESET | TYPEWRITE [SINGLESPACE] +\# *Function: +\# Sets type specs for typewriter-style or typeset output. +\# *Notes: +\# Number registers: TYPEWRITE=1, TYPESET=2. +\# +.MAC PRINTSTYLE END +. if !\\n[#COLLATE]=1 \{\ +. if !d$PAPER \{ .PAPER LETTER \} +. if '\\$1'TYPEWRITE' \{\ +. nr #PRINT_STYLE 1 +. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \} +. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \} +. TYPEWRITER +. color 0 +. ie '\\$2'SINGLESPACE' \{\ +. nr #SINGLE_SPACE 1 +. vs 12 +. nr #ORIGINAL_DOC_LEAD \\n(.v +. \} +. el \{\ +. vs 24 +. nr #ORIGINAL_DOC_LEAD \\n(.v +. \} +. QUAD L +. HY OFF +. SMARTQUOTES OFF +. if !\\n[#PP_INDENT] \{\ +. in 3P \"Set indent +. nr #PP_INDENT \\n(.i \"Read into #PP_INDENT +. in 0 \"Remove indent +. \} +. HDRFTR_RIGHT_CAPS +. nr #BOLDER_UNITS 0 +. nr #CONDENSE 0 +. nr #EXTEND 0 +. rm IT +. rm BD +. rm BDI +. rm PREV +. UNDERLINE_SLANT +. UNDERLINE_ITALIC +. UNDERLINE_QUOTES +. nr #IGNORE_COLUMNS 1 +. char \(em -- +. tr `' +. \} +. if '\\$1'TYPESET' \{\ +. nr #PRINT_STYLE 2 +. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \} +. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \} +. FAMILY T +. FT R +. if !\\n[#DOC_TYPE]=4 \{ .PT_SIZE 12.5 \} +. if !\\n[#DOC_TYPE]=4 \{ .LS 16 \} +. JUSTIFY +. HY +. HY_SET 2 36p 1p +. KERN +. LIG +. SS 0 +. SMARTQUOTES +. if !\\n[#PP_INDENT] \{\ +. in 2m \"Set indent +. nr #PP_INDENT \\n(.i \"Read into #PP_INDENT +. in 0 \"Remove indent +. \} +. HDRFTR_RIGHT_CAPS +. rr #IGNORE_COLUMNS +. \} +. \} +.END +\# +\# +\# Macros to control behaviour of PRINTSTYLE TYPEWRITE +\# +\# First, a little utility macro. +\# +.MAC TYPEWRITER END +. fam C +. ft R +. ps 12 +.END +\# +\# +\# ITALIC MEANS ITALIC +\# ------------------- +\# *Argument: +\# +\# *Function: +\# Instructs TYPEWRITE to treat italics as italics, whether +\# invoked via control lines or inline. +\# *Notes: +\# ITALIC_MEANS_ITALIC and UNDERLINE_ITALIC are mututally exclusive, +\# hence invoking the one automatically turns off the other. +\# +.MAC ITALIC_MEANS_ITALIC END +. if \\n[#PRINT_STYLE]=1 \{\ +. nr #ITALIC_MEANS_ITALIC 1 +. rr #UNDERLINE_ITALIC +. rm ROM +. rm IT +. rm PREV +. ds ROM \EfR +. ds IT \EfI +. ds PREV \EfR +. \} +.END +\# +\# +\# UNDERLINE ITALIC +\# ---------------- +\# *Argument: +\# +\# *Function: +\# Instructs TYPEWRITE to underline italics, whether invoked +\# via control lines or inline. +\# *Notes: +\# UNDERLINE_ITALIC and ITALIC_MEANS_ITALIC are mututally exclusive, +\# hence invoking the one automatically turns off the other. +\# +\# UNDERLINE_ITALIC is the default for TYPEWRITE. +\# +.MAC UNDERLINE_ITALIC END +. if \\n[#PRINT_STYLE]=1 \{\ +. nr #UNDERLINE_ITALIC 1 +. rr #ITALIC_MEANS_ITALIC +. rm ROM +. rm IT +. rm PREV +. ds ROM \E*[ULX] +. ds IT \E*[UL] +. ds PREV \E*[ULX] +. \} +.END +\# +\# +\# UNDERLINE SLANT +\# --------------- +\# *Arguments: +\# | +\# *Function: +\# Instructs TYPEWRITE to underline occurences of \*[SLANT], or +\# turns feature off. +\# *Notes: +\# Users may want \*[SLANT] to mean slant in TYPEWRITE, although +\# most of the time, \*[SLANT] most likely means the user wanted +\# italic but didn't have it, ergo the need to tell TYPEWRITE to +\# treat \*[SLANT] as italic (i.e. underlined). +\# +\# UNDERLINE_SLANT and SLANT_MEANS_SLANT are mututally exclusive, +\# hence invoking the one automatically turns off the other. +\# +\# UNDERLINE_SLANT is the default for TYPEWRITE. +\# +.MAC UNDERLINE_SLANT END +. if \\n[#PRINT_STYLE]=1 \{\ +. rr #SLANT_MEANS_SLANT +. nr #UNDERLINE_SLANT 1 +. rm SLANT +. rm SLANTX +. ds SLANT \ER'#SLANT_ON 1'\E*[UL] +. ds SLANTX \ER'#SLANT_ON 0'\E*[ULX] +. \} +.END +\# +\# +.MAC SLANT_MEANS_SLANT END +. if \\n[#PRINT_STYLE]=1 \{\ +. rr #UNDERLINE_SLANT +. nr #SLANT_MEANS_SLANT 1 +. rm SLANT +. rm SLANTX +. ds SLANT \ER'#SLANT_ON 1'\ES'\En[#DEGREES]' +. ds SLANTX \ER'#SLANT_ON 0'\ES'0' +. \} +.END +\# +\# +.MAC IGNORE_COLUMNS END +. if \\n[#PRINT_STYLE]=1 \{ .nr #NO_COLUMNS 1 \} +.END +\# +\# +\# ==================================================================== +\# +\# +++COPY STYLE -- DRAFT OR FINAL+++ +\# +\# COPY STYLE +\# ---------- +\# *Arguments: +\# DRAFT | FINAL +\# *Function: +\# Sets registers that are used to determine what to put +\# in the default header, and how to number pages. +\# *Notes: +\# DOCTYPE must come before COPYSTYLE. +\# +.MAC COPYSTYLE END +. ds $COPY_STYLE \\$1 +. if '\\*[$COPY_STYLE]'DRAFT' \{\ +. nr #COPY_STYLE 1 +. if !d$DRAFT \{ .DRAFT 1 \} +. \} +. if '\\*[$COPY_STYLE]'FINAL' \{ .nr #COPY_STYLE 2 \} +. if !d$CHAPTER_STRING \{ .CHAPTER_STRING "Chapter" \} +. if !d$DRAFT_STRING \{ .DRAFT_STRING "Draft" \} +. if !d$REVISION_STRING \{ .REVISION_STRING "Rev." \} +.\" Default +. if \\n[#DOC_TYPE]=1 \{\ +. ie \\n[#COPY_STYLE]=1 \{\ +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{ .PAGENUM_STYLE roman \} +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ +. ie \\n[#DRAFT_WITH_PAGENUM] \{\ +. ds $HDRFTR_CENTER +. \} +. el \{\ +. ie '\\*[$REVISION]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$DRAFT_STRING]\\*[$DRAFT] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$DRAFT_STRING]\\*[$DRAFT], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. \} +. \} +. \} +. el \{\ +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{ .PAGENUM_STYLE DIGIT \} +. if r#DRAFT_WITH_PAGENUM \{ .rr #DRAFT_WITH_PAGENUM \} +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ +. ds $HDRFTR_CENTER +. rr #USER_DEF_HDRFTR_CENTER +. \} +. \} +. \} +.\" Chapter +. if \\n[#DOC_TYPE]=2 \{\ +.\" Copystyle DRAFT +. ie \\n[#COPY_STYLE]=1 \{\ +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{ .PAGENUM_STYLE roman \} +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ +. ie \\n[#DRAFT_WITH_PAGENUM] \{\ +. ie '\\*[$CHAPTER]'' \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] +. \} +. el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] +. \} +. el \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] +. \} +. el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. \} +. \} +. el \{\ +. ie '\\*[$REVISION]'' \{\ +. ie '\\*[$CHAPTER]'' \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_TITLE], \ + \\*[$DRAFT_STRING]\\*[$DRAFT] +. \} +. \} +. el \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING], \ + \\*[$DRAFT_STRING]\\*[$DRAFT] +. \} +. \} +. \} +. el \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_TITLE], \ + \\*[$DRAFT_STRING]\\*[$DRAFT] +. \} +. \} +. el \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ + \\*[$DRAFT_STRING]\\*[$DRAFT] +. \} +. \} +. \} +. \} +. el \{\ +. ie '\\*[$CHAPTER]'' \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_TITLE], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_TITLE], \ + \\*[$DRAFT_STRING]\\*[$DRAFT], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. \} +. el \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING], \ + \\*[$DRAFT_STRING]\\*[$DRAFT], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. \} +. \} +. el \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_TITLE], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_TITLE], \ + \\*[$DRAFT_STRING]\\*[$DRAFT], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. \} +. el \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$CHAPTER_STRING] \\*[$CHAPTER], \ + \\*[$DRAFT_STRING]\\*[$DRAFT], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. \} +. \} +. \} +. \} +. \} +. \} +.\" Copystyle FINAL +. el \{\ +. if r#DRAFT_WITH_PAGENUM \{ .rr #DRAFT_WITH_PAGENUM \} +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{ .PAGENUM_STYLE DIGIT \} +. ie '\\*[$CHAPTER]'' \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] +. \} +. el \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] +. \} +. \} +. el \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] +. \} +. el \{\ +. ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. \} +. \} +. \} +. \} +. \} +.\" Named +. if \\n[#DOC_TYPE]=3 \{\ +. ie \\n[#COPY_STYLE]=1 \{\ +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{ .PAGENUM_STYLE roman \} +. ie \\n[#DRAFT_WITH_PAGENUM] \{\ +. ds $HDRFTR_CENTER \\*[$DOC_TYPE] +. \} +. el \{\ +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ +. ie '\\*[$REVISION]'' \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \\*[$DOC_TYPE] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$DOC_TYPE], \ + \\*[$DRAFT_STRING]\\*[$DRAFT] +. \} +. \} +. el \{\ +. ie '\\*[$DRAFT]'' \{\ +. ds $HDRFTR_CENTER \ + \\*[$DOC_TYPE], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. el \{\ +. ds $HDRFTR_CENTER \ + \\*[$DOC_TYPE], \ + \\*[$DRAFT_STRING]\\*[$DRAFT], \ + \\*[$REVISION_STRING] \\*[$REVISION] +. \} +. \} +. \} +. \} +. \} +. el \{\ +. if r#DRAFT_WITH_PAGENUM \{ .rr #DRAFT_WITH_PAGENUM \} +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{ .PAGENUM_STYLE DIGIT \} +. ds $HDRFTR_CENTER \\*[$DOC_TYPE] +. \} +. \} +. \} +.END +\# +\# ==================================================================== +\# +\# +++COLLECT DOC INFO -- STRINGS AND REGISTERS FOR REFERENCE MACROS+++ +\# +\# *Arguments: +\# various string/register arguments +\# *Function: +\# Collect information about documents. +\# +\# +.MAC DOCTITLE END +. ds $DOC_TITLE \\$1 +.END +\# +.MAC TITLE END \"Document title +. ds $TITLE \\$1 +.END +\# +\# +.MAC SUBTITLE END \"Document sub-title +. ds $SUBTITLE \\$1 +.END +\# +\# +.MAC CHAPTER END \"If document is a chapter, the chapter number +. ds $CHAPTER \\$1 +.END +\# +\# +.MAC CHAPTER_TITLE END \" This defines what comes after Chapter # +. ds $CHAPTER_TITLE \\$1 +.END +\# +\# +.MAC DRAFT END \"Draft number +. ie '\\$1'' .ds $DRAFT +. el .ds $DRAFT " \\$1 +.END +\# +\# +.MAC REVISION END \"Revision number +. ds $REVISION \\$1 +.END +\# +\# +.MAC DRAFT_WITH_PAGENUMBER END \"Attach draft/revision strings to page number +. nr #DRAFT_WITH_PAGENUM 1 +.END +\# +\# +.MAC AUTHOR END \"Author. Enclose all args fully in double quotes. +. nr #AUTHOR_NUM -1 1 +. while \\n[#NUM_ARGS]>\\n[#AUTHOR_NUM] \{\ +. ds $AUTHOR_\\n+[#AUTHOR_NUM] \\$\\n[#AUTHOR_NUM] +.\} +. nr #NUM_AUTHORS \\n[#NUM_ARGS]%2 \"Use mod 2 to test if odd or even # of authors +. ie \\n[#NUM_AUTHORS]=1 \{ .nr #AUTHOR_LINES 0 \} +. el \{ .nr #AUTHOR_LINES 1 \} +.END +\# +\# +.MAC COPYRIGHT END \"For use on cover page only +. ds $COPYRIGHT \[co]\\$1 +.END +\# +\# +.MAC MISC END \"For use on cover page only; enclose all args in double quotes +. nr #MISC_NUM -1 1 +. while \\n[#NUM_ARGS]>\\n[#MISC_NUM] \{\ +. ds $MISC_\\n+[#MISC_NUM] \\$\\n[#MISC_NUM] +.\} +. nr #NUM_MISCS \\n[#NUM_ARGS] +.END +\# +\# +.MAC PAGENUMBER END \"Page # that appears on page one. +. nr #n%_AT_PAGENUM_SET \\n% +. nr #PAGE_NUM_ADJ \\$1-\\n[#n%_AT_PAGENUM_SET] +. rr #n%_AT_PAGENUM_SET +. nr #PAGE_NUM_SET 1 +.END +\# +\# ==================================================================== +\# +\# +++TYPE OF DOCUMENT+++ +\# +\# DOCUMENT TYPE +\# ------------- +\# *Argument: +\# DEFAULT | CHAPTER | NAMED " | LETTER +\# *Function: +\# Creates strings and sets registers for document types. +\# *Notes: +\# Number registers: DEFAULT=1, CHAPTER=2, NAMED=3, LETTER=4 +\# +.MAC DOCTYPE END +. if '\\$1'DEFAULT' \{\ +. nr #DOC_TYPE 1 +. \} +. if '\\$1'CHAPTER' \{\ +. nr #DOC_TYPE 2 +. \} +. if '\\$1'NAMED' \{\ +. ds $DOC_TYPE \\$2 +. nr #DOC_TYPE 3 +. \} +. if '\\$1'LETTER' \{\ +. nr #DOC_TYPE 4 +. L_MARGIN 1.125i +. R_MARGIN 1.125i +. PT_SIZE 12 +. LS 13.5 +. DOCHEADER OFF +. PARA_INDENT 3m +. INDENT_FIRST_PARAS +. PARA_SPACE +. ds $SUITE \En[#SUITE] +. HEADER_MARGIN 3P+6p +. HEADER_GAP 3P +. FOOTERS +. FOOTER_RULE OFF +. FOOTER_LEFT "" +. FOOTER_CENTER "" +. FOOTER_RIGHT_SIZE +0 +. FOOTER_RIGHT "\&.../\E*[$SUITE] +. FOOTER_ON_FIRST_PAGE +. em ALL_DONE +. \} +.END +\# +\# +++LETTER MACROS+++ +\# +\# First, create a register to hold incrementing numbers to be +\# appended to LETTERHEAD. +\# +.nr #FIELD 0 1 +\# +\# DATE +\# ---- +\# *Arguments: +\# +\# *Function: +\# Stores date (entered on the line after .DATE) in diversion +\# LETTERHEAD +\# +.MAC DATE END +. if !'\\n(.z'' \{ .di \} +. di LETTERHEAD\\n+[#FIELD] +. ie \\n[#FIELD]=1 \{\ +. nr #DATE_FIRST 1 +. RIGHT +. \} +. el \{\ +. LEFT +. \} +.END +\# +\# +\# TO +\# -- +\# *Arguments: +\# +\# *Function: +\# Stores addressee address (entered on the line after .TO) in +\# diversion LETTERHEAD +\# +.MAC TO END +. if !'\\n(.z'' \{ .di \} +. di LETTERHEAD\\n+[#FIELD] +. LEFT +.END +\# +\# +\# FROM +\# ---- +\# *Arguments: +\# +\# *Function: +\# Stores addresser address (entered on the line after .FROM) in +\# diversion LETTERHEAD +\# +.MAC FROM END +. if !'\\n(.z'' \{ .di \} +. di LETTERHEAD\\n+[#FIELD] +. LEFT +.END +\# +\# +\# GREETING +\# -------- +\# *Arguments: +\# +\# *Function: +\# Stores greeting (entered on the line after .GREETING) in +\# diversion LETTERHEAD +\# +.MAC GREETING END +. if !'\\n(.z'' \{ .di \} +. di LETTERHEAD\\n+[#FIELD] +. LEFT +.END +\# +\# +\# CLOSING +\# ------- +\# *Arguments: +\# +\# *Function: +\# Stores greeting in diversion CLOSING. +\# +.MAC CLOSING END +. br +. nr #CLOSING 1 +. di CLOSING +. LEFT +.END +\# +\# +\# NO SUITE +\# -------- +\# *Arguments: +\# +\# *Function: +\# Redefines $FOOTER_RIGHT to blank so that a suite number doesn't +\# appear at the bottom of letter pages. +\# +.MAC NO_SUITE END +. FOOTER_RIGHT "" +.END +\# +\# ==================================================================== +\# +\# +++DEFAULTS+++ +\# +\# TYPE-STYLE CONTROL MACROS +\# ------------------------- +\# +.ig +The control macros for family, font, size, quad and color are here +grouped together. Each (e.g. _FAMILY or _FONT) tests for a calling +alias before performing the action(s) appropriate to the calling +macro. Defaults for all these guys are set in DEFAULTS, and listed +in the "Control Macros" section of the documentation pertinent to +the macro whose style is to be changed. +.. +\# +.MAC _FAMILY END +. if '\\$0'AUTHOR_FAMILY' .ds $AUTHOR_FAM \\$1 +. if '\\$0'BIBLIOGRAPHY_FAMILY' .ds $BIB_FAM \\$1 +. if '\\$0'BIBLIOGRAPHY_STRING_FAMILY' .ds $BIB_STRING_FAM \\$1 +. if '\\$0'BLOCKQUOTE_FAMILY' .ds $BQUOTE_FAM \\$1 +. if '\\$0'CITATION_FAMILY' .ds $BQUOTE_FAM \\$1 +. if '\\$0'CITE_FAMILY' .ds $BQUOTE_FAM \\$1 +. if '\\$0'CHAPTER_TITLE_FAMILY' .ds $CHAPTER_TITLE_FAM \\$1 +. if '\\$0'COVER_AUTHOR_FAMILY' .ds $COVER_AUTHOR_FAM \\$1 +. if '\\$0'COVER_CHAPTER_TITLE_FAMILY' .ds $COVER_CHAPTER_TITLE_FAM \\$1 +. if '\\$0'COVER_COPYRIGHT_FAMILY' .ds $COVER_COPYRIGHT_FAM \\$1 +. if '\\$0'COVER_DOCTYPE_FAMILY' .ds $COVER_DOCTYPE_FAM \\$1 +. if '\\$0'COVER_FAMILY' .ds $COVER_FAM \\$1 +. if '\\$0'COVER_SUBTITLE_FAMILY' .ds $COVER_SUBTITLE_FAM \\$1 +. if '\\$0'COVER_TITLE_FAMILY' .ds $COVER_TITLE_FAM \\$1 +. if '\\$0'DOC_COVER_AUTHOR_FAMILY' .ds $DOC_COVER_AUTHOR_FAM \\$1 +. if '\\$0'DOC_COVER_CHAPTER_TITLE_FAMILY' .ds $DOC_COVER_CHAPTER_TITLE_FAM \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_FAMILY' .ds $DOC_COVER_COPYRIGHT_FAM \\$1 +. if '\\$0'DOC_COVER_DOCTYPE_FAMILY' .ds $DOC_COVER_DOCTYPE_FAM \\$1 +. if '\\$0'DOC_COVER_FAMILY' .ds $DOC_COVER_FAM \\$1 +. if '\\$0'DOC_COVER_SUBTITLE_FAMILY' .ds $DOC_COVER_SUBTITLE_FAM \\$1 +. if '\\$0'DOC_COVER_TITLE_FAMILY' .ds $DOC_COVER_TITLE_FAM \\$1 +. if '\\$0'DOCHEADER_FAMILY' .ds $DOCHEADER_FAM \\$1 +. if '\\$0'DOCTYPE_FAMILY' .ds $DOCTYPE_FAM \\$1 +. if '\\$0'ENDNOTE_FAMILY' .ds $EN_FAM \\$1 +. if '\\$0'ENDNOTE_NUMBER_FAMILY' .ds $EN_NUMBER_FAM \\$1 +. if '\\$0'ENDNOTE_LINENUMBER_FAMILY' .ds $EN_LN_FAM \\$1 +. if '\\$0'ENDNOTE_STRING_FAMILY' .ds $EN_STRING_FAM \\$1 +. if '\\$0'ENDNOTE_TITLE_FAMILY' .ds $EN_TITLE_FAM \\$1 +. if '\\$0'EPIGRAPH_FAMILY' .ds $EPI_FAM \\$1 +. if '\\$0'FOOTNOTE_FAMILY' .ds $FN_FAM \\$1 +. if '\\$0'HDRFTR_CENTER_FAMILY' .ds $HDRFTR_CENTER_FAM \\$1 +. if '\\$0'HDRFTR_FAMILY' \{\ +. ds $HDRFTR_FAM \\$1 +. ds $HDRFTR_LEFT_FAM \\$1 +. ds $HDRFTR_CENTER_FAM \\$1 +. ds $HDRFTR_RIGHT_FAM \\$1 +. \} +. if '\\$0'HDRFTR_LEFT_FAMILY' .ds $HDRFTR_LEFT_FAM \\$1 +. if '\\$0'HDRFTR_RIGHT_FAMILY' .ds $HDRFTR_RIGHT_FAM \\$1 +. if '\\$0'HEAD_FAMILY' .ds $HEAD_FAM \\$1 +. if '\\$0'PAGENUM_FAMILY' .ds $PAGE_NUM_FAM \\$1 +. if '\\$0'PARAHEAD_FAMILY' .ds $PH_FAM \\$1 +. if '\\$0'QUOTE_FAMILY' .ds $QUOTE_FAM \\$1 +. if '\\$0'SUBHEAD_FAMILY' .ds $SH_FAM \\$1 +. if '\\$0'SUBTITLE_FAMILY' .ds $SUBTITLE_FAM \\$1 +. if '\\$0'TITLE_FAMILY' .ds $TITLE_FAM \\$1 +. if '\\$0'TOC_FAMILY' .ds $TOC_FAM \\$1 +. if '\\$0'TOC_FAM' .ds $TOC_FAM \\$1 +. if '\\$0'TOC_HEADER_FAMILY' .ds $TOC_HEADER_FAM \\$1 +. if '\\$0'TOC_HEAD_FAMILY' .ds $TOC_HEAD_FAM \\$1 +. if '\\$0'TOC_PARAHEAD_FAMILY' .ds $TOC_PH_FAM \\$1 +. if '\\$0'TOC_PN_FAMILY' .ds $TOC_PN_FAM \\$1 +. if '\\$0'TOC_SUBHEAD_FAMILY' .ds $TOC_SH_FAM \\$1 +. if '\\$0'TOC_TITLE_FAMILY' .ds $TOC_TITLE_FAM \\$1 +.END +\# +\# +.MAC _FONT END +. if '\\$0'AUTHOR_FONT' .ds $AUTHOR_FT \\$1 +. if '\\$0'BIBLIOGRAPHY_FONT' .ds $BIB_FT \\$1 +. if '\\$0'BIBLIOGRAPHY_STRING_FONT' .ds $BIB_STRING_FT \\$1 +. if '\\$0'BLOCKQUOTE_FONT' .ds $BQUOTE_FT \\$1 +. if '\\$0'CITATION_FONT' .ds $BQUOTE_FT \\$1 +. if '\\$0'CITE_FONT' .ds $BQUOTE_FT \\$1 +. if '\\$0'CHAPTER_TITLE_FONT' .ds $CHAPTER_TITLE_FT \\$1 +. if '\\$0'COVER_AUTHOR_FONT' .ds $COVER_AUTHOR_FT \\$1 +. if '\\$0'COVER_CHAPTER_TITLE_FONT' .ds $COVER_CHAPTER_TITLE_FT \\$1 +. if '\\$0'COVER_COPYRIGHT_FONT' .ds $COVER_COPYRIGHT_FT \\$1 +. if '\\$0'COVER_DOCTYPE_FONT' .ds $COVER_DOCTYPE_FT \\$1 +. if '\\$0'COVER_SUBTITLE_FONT' .ds $COVER_SUBTITLE_FT \\$1 +. if '\\$0'COVER_TITLE_FONT' .ds $COVER_TITLE_FT \\$1 +. if '\\$0'DOC_COVER_AUTHOR_FONT' .ds $DOC_COVER_AUTHOR_FT \\$1 +. if '\\$0'DOC_COVER_CHAPTER_TITLE_FONT' .ds $DOC_COVER_CHAPTER_TITLE_FT \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_FONT' .ds $DOC_COVER_COPYRIGHT_FT \\$1 +. if '\\$0'DOC_COVER_DOCTYPE_FONT' .ds $DOC_COVER_DOCTYPE_FT \\$1 +. if '\\$0'DOC_COVER_SUBTITLE_FONT' .ds $DOC_COVER_SUBTITLE_FT \\$1 +. if '\\$0'DOC_COVER_TITLE_FONT' .ds $DOC_COVER_TITLE_FT \\$1 +. if '\\$0'DOCTYPE_FONT' .ds $DOCTYPE_FT \\$1 +. if '\\$0'ENDNOTE_FONT' .ds $EN_FT \\$1 +. if '\\$0'ENDNOTE_NUMBER_FONT' .ds $EN_NUMBER_FT \\$1 +. if '\\$0'ENDNOTE_LINENUMBER_FONT' .ds $EN_LN_FT \\$1 +. if '\\$0'ENDNOTE_STRING_FONT' .ds $EN_STRING_FT \\$1 +. if '\\$0'ENDNOTE_TITLE_FONT' .ds $EN_TITLE_FT \\$1 +. if '\\$0'EPIGRAPH_FONT' .ds $EPI_FT \\$1 +. if '\\$0'FOOTNOTE_FONT' .ds $FN_FT \\$1 +. if '\\$0'HDRFTR_CENTER_FONT' .ds $HDRFTR_CENTER_FT \\$1 +. if '\\$0'HDRFTR_LEFT_FONT' .ds $HDRFTR_LEFT_FT \\$1 +. if '\\$0'HDRFTR_RIGHT_FONT' .ds $HDRFTR_RIGHT_FT \\$1 +. if '\\$0'HEAD_FONT' .ds $HEAD_FT \\$1 +. if '\\$0'PAGENUM_FONT' .ds $PAGE_NUM_FT \\$1 +. if '\\$0'PARAHEAD_FONT' .ds $PH_FT \\$1 +. if '\\$0'QUOTE_FONT' .ds $QUOTE_FT \\$1 +. if '\\$0'SUBHEAD_FONT' .ds $SH_FT \\$1 +. if '\\$0'SUBTITLE_FONT' .ds $SUBTITLE_FT \\$1 +. if '\\$0'TITLE_FONT' .ds $TITLE_FT \\$1 +. if '\\$0'TOC_HEADER_FONT' .ds $TOC_HEADER_FT \\$1 +. if '\\$0'TOC_HEAD_FONT' .ds $TOC_HEAD_FT \\$1 +. if '\\$0'TOC_PARAHEAD_FONT' .ds $TOC_PH_FT \\$1 +. if '\\$0'TOC_PN_FONT' .ds $TOC_PN_FT \\$1 +. if '\\$0'TOC_SUBHEAD_FONT' .ds $TOC_SH_FT \\$1 +. if '\\$0'TOC_TITLE_FONT' .ds $TOC_TITLE_FT \\$1 +.END +\# +\# +.MAC _SIZE END +. if '\\$0'AUTHOR_SIZE' .ds $AUTHOR_SIZE_CHANGE \\$1 +. if '\\$0'BIBLIOGRAPHY_STRING_SIZE' .ds $BIB_STRING_SIZE_CHANGE \\$1 +. if '\\$0'BLOCKQUOTE_SIZE' .ds $BQUOTE_SIZE_CHANGE \\$1 +. if '\\$0'CITATION_SIZE' .ds $BQUOTE_SIZE_CHANGE \\$1 +. if '\\$0'CITE_SIZE' .ds $BQUOTE_SIZE_CHANGE \\$1 +. if '\\$0'CHAPTER_TITLE_SIZE' .ds $CHAPTER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_AUTHOR_SIZE' .ds $COVER_AUTHOR_SIZE_CHANGE \\$1 +. if '\\$0'COVER_CHAPTER_TITLE_SIZE' .ds $COVER_CHAPTER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_COPYRIGHT_SIZE' .ds $COVER_COPYRIGHT_SIZE_CHANGE \\$1 +. if '\\$0'COVER_DOCTYPE_SIZE' .ds $COVER_DOCTYPE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_SUBTITLE_SIZE' .ds $COVER_SUBTITLE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_TITLE_SIZE' .ds $COVER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_AUTHOR_SIZE' .ds $DOC_COVER_AUTHOR_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_CHAPTER_TITLE_SIZE' .ds $DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_SIZE' .ds $DOC_COVER_COPYRIGHT_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_DOCTYPE_SIZE' .ds $DOC_COVER_DOCTYPE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_SUBTITLE_SIZE' .ds $DOC_COVER_SUBTITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_TITLE_SIZE' .ds $DOC_COVER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOCTYPE_SIZE' .ds $DOCTYPE_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_NUMBER_SIZE' .ds $EN_NUMBER_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_LINENUMBER_SIZE' .ds $EN_LN_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_STRING_SIZE' .ds $EN_STRING_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_TITLE_SIZE' .ds $EN_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'EPIGRAPH_SIZE' .ds $EPI_SIZE_CHANGE \\$1 +. if '\\$0'FOOTNOTE_SIZE' .ds $FN_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_CENTER_SIZE' .ds $HDRFTR_CENTER_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_LEFT_SIZE' .ds $HDRFTR_LEFT_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_RIGHT_SIZE' .ds $HDRFTR_RIGHT_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_SIZE' .ds $HDRFTR_SIZE_CHANGE \\$1 +. if '\\$0'HEAD_SIZE' .ds $HEAD_SIZE_CHANGE \\$1 +. if '\\$0'PAGENUM_SIZE' .ds $PAGE_NUM_SIZE_CHANGE \\$1 +. if '\\$0'PARAHEAD_SIZE' .ds $PH_SIZE_CHANGE \\$1 +. if '\\$0'QUOTE_SIZE' .ds $QUOTE_SIZE_CHANGE \\$1 +. if '\\$0'SUBHEAD_SIZE' .ds $SH_SIZE_CHANGE \\$1 +. if '\\$0'SUBTITLE_SIZE' .ds $SUBTITLE_SIZE_CHANGE \\$1 +. if '\\$0'TITLE_SIZE' .ds $TITLE_SIZE_CHANGE \\$1 +. if '\\$0'TOC_HEADER_SIZE' .ds $TOC_HEADER_SIZE_CHANGE \\$1 +. if '\\$0'TOC_HEAD_SIZE' .ds $TOC_HEAD_SIZE_CHANGE \\$1 +. if '\\$0'TOC_PARAHEAD_SIZE' .ds $TOC_PH_SIZE_CHANGE \\$1 +. if '\\$0'TOC_PN_SIZE' .ds $TOC_PN_SIZE_CHANGE \\$1 +. if '\\$0'TOC_SUBHEAD_SIZE' .ds $TOC_SH_SIZE_CHANGE \\$1 +. if '\\$0'TOC_TITLE_SIZE' .ds $TOC_TITLE_SIZE_CHANGE \\$1 +.END +\# +\# +.MAC _COLOR END +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. if '\\$0'ATTRIBUTE_COLOR' \{\ +. nr #ATTRIBUTE_COLOR 1 +. ds $ATTRIBUTE_COLOR \\$1 +. \} +. if '\\$0'AUTHOR_COLOR' \{\ +. nr #AUTHOR_COLOR 1 +. ds $AUTHOR_COLOR \\$1 +. \} +. if '\\$0'BLOCKQUOTE_COLOR' \{\ +. nr #BQUOTE_COLOR 1 +. ds $BQUOTE_COLOR \\$1 +. \} +. if '\\$0'CITATION_COLOR' \{\ +. nr #BQUOTE_COLOR 1 +. ds $BQUOTE_COLOR \\$1 +. \} +. if '\\$0'CITE_COLOR' \{\ +. nr #BQUOTE_COLOR 1 +. ds $BQUOTE_COLOR \\$1 +. \} +. if '\\$0'CHAPTER_TITLE_COLOR' \{\ +. nr #CHAPTER_TITLE_COLOR 1 +. ds $CHAPTER_TITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_ATTRIBUTE_COLOR' \{\ +. nr #COVER_ATTRIBUTE_COLOR 1 +. ds $COVER_ATTRIBUTE_COLOR \\$1 +. \} +. if '\\$0'COVER_AUTHOR_COLOR' \{\ +. nr #COVER_AUTHOR_COLOR 1 +. ds $COVER_AUTHOR_COLOR \\$1 +. \} +. if '\\$0'COVER_CHAPTER_TITLE_COLOR' \{\ +. nr #COVER_CHAPTER_TITLE_COLOR 1 +. ds $COVER_CHAPTER_TITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_COLOR' \{\ +. nr #COVER_COLOR 1 +. ds $COVER_COLOR \\$1 +. \} +. if '\\$0'COVER_COPYRIGHT_COLOR' \{\ +. nr #COVER_COPYRIGHT_COLOR 1 +. ds $COVER_COPYRIGHT_COLOR \\$1 +. \} +. if '\\$0'COVER_MISC_COLOR' \{\ +. nr #COVER_MISC_COLOR 1 +. ds $COVER_MISC_COLOR \\$1 +. \} +. if '\\$0'COVER_TITLE_COLOR' \{\ +. nr #COVER_TITLE_COLOR 1 +. ds $COVER_TITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_SUBTITLE_COLOR' \{\ +. nr #COVER_SUBTITLE_COLOR 1 +. ds $COVER_SUBTITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_DOCTYPE_COLOR' \{\ +. nr #COVER_DOCTYPE_COLOR 1 +. ds $COVER_DOCTYPE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_ATTRIBUTE_COLOR' \{\ +. nr #DOC_COVER_ATTRIBUTE_COLOR 1 +. ds $DOC_COVER_ATTRIBUTE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_AUTHOR_COLOR' \{\ +. nr #DOC_COVER_AUTHOR_COLOR 1 +. ds $DOC_COVER_AUTHOR_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_CHAPTER_TITLE_COLOR' \{\ +. nr #DOC_COVER_CHAPTER_TITLE_COLOR 1 +. ds $DOC_COVER_CHAPTER_TITLE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_COLOR' \{\ +. nr #DOC_COVER_COLOR 1 +. ds $DOC_COVER_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_COPYRIGHT_COLOR' \{\ +. nr #DOC_COVER_COPYRIGHT_COLOR 1 +. ds $DOC_COVER_COPYRIGHT_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_MISC_COLOR' \{\ +. nr #DOC_COVER_MISC_COLOR 1 +. ds $DOC_COVER_MISC_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_TITLE_COLOR' \{\ +. nr #DOC_COVER_TITLE_COLOR 1 +. ds $DOC_COVER_TITLE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_SUBTITLE_COLOR' \{\ +. nr #DOC_COVER_SUBTITLE_COLOR 1 +. ds $DOC_COVER_SUBTITLE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_DOCTYPE_COLOR' \{\ +. nr #DOC_COVER_DOCTYPE_COLOR 1 +. ds $DOC_COVER_DOCTYPE_COLOR \\$1 +. \} +. if '\\$0'DOCHEADER_COLOR' \{\ +. nr #DOCHEADER_COLOR 1 +. ds $DOCHEADER_COLOR \\$1 +. \} +. if '\\$0'DOCTYPE_COLOR' \{\ +. nr #DOCTYPE_COLOR 1 +. ds $DOCTYPE_COLOR \\$1 +. \} +. if '\\$0'EPIGRAPH_COLOR' \{\ +. nr #EPI_COLOR 1 +. ds $EPI_COLOR \\$1 +. \} +. if '\\$0'FINIS_COLOR' \{\ +. nr #FINIS_COLOR 1 +. ds $FINIS_COLOR \\$1 +. \} +. if '\\$0'FOOTNOTE_COLOR' \{\ +. nr #FOOTNOTE_COLOR 1 +. ds $FOOTNOTE_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_CENTER_COLOR' \{\ +. nr #HDRFTR_CENTER_COLOR 1 +. ds $HDRFTR_CENTER_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_COLOR' \{\ +. nr #HDRFTR_COLOR 1 +. ds $HDRFTR_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_LEFT_COLOR' \{\ +. nr #HDRFTR_LEFT_COLOR 1 +. ds $HDRFTR_LEFT_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_RIGHT_COLOR' \{\ +. nr #HDRFTR_RIGHT_COLOR 1 +. ds $HDRFTR_RIGHT_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_RULE_COLOR' \{\ +. nr #HDRFTR_RULE_COLOR 1 +. ds $HDRFTR_RULE_COLOR \\$1 +. \} +. if '\\$0'HEAD_COLOR' \{\ +. nr #HEAD_COLOR 1 +. ds $HEAD_COLOR \\$1 +. \} +. if '\\$0'LINEBREAK_COLOR' \{\ +. nr #LINEBREAK_COLOR 1 +. ds $LINEBREAK_COLOR \\$1 +. \} +. if '\\$0'PAGENUM_COLOR' \{\ +. nr #PAGE_NUM_COLOR 1 +. ds $PAGENUM_COLOR \\$1 +. \} +. if '\\$0'PARAHEAD_COLOR' \{\ +. nr #PH_COLOR 1 +. ds $PH_COLOR \\$1 +. \} +. if '\\$0'QUOTE_COLOR' \{\ +. nr #QUOTE_COLOR 1 +. ds $QUOTE_COLOR \\$1 +. \} +. if '\\$0'SUBHEAD_COLOR' \{\ +. nr #SH_COLOR 1 +. ds $SH_COLOR \\$1 +. \} +. if '\\$0'SUBTITLE_COLOR' \{\ +. nr #SUBTITLE_COLOR 1 +. ds $SUBTITLE_COLOR \\$1 +. \} +. if '\\$0'TITLE_COLOR' \{\ +. nr #TITLE_COLOR 1 +. ds $TITLE_COLOR \\$1 +. \} +.END +\# +\# +.MAC _QUAD END +. if '\\$0'BIBLIOGRAPHY_QUAD' \{\ +. ds $BIB_QUAD \\$1 +. if '\\*[$BIB_QUAD]'R' .ab Fatal error: \\$0 must be set to either L or J +. if '\\*[$BIB_QUAD]'C' .ab Fatal error: \\$0 must be set to either L or J +. \} +. if '\\$0'BIBLIOGRAPHY_STRING_QUAD' .ds $BIB_STRING_QUAD \\$1 +. if '\\$0'BLOCKQUOTE_QUAD' .ds $BQUOTE_QUAD \\$1 +. if '\\$0'CITATION_QUAD' .ds $BQUOTE_QUAD \\$1 +. if '\\$0'CITE_QUAD' .ds $BQUOTE_QUAD \\$1 +. if '\\$0'COVER_COPYRIGHT_QUAD' .ds $COVER_COPYRIGHT_QUAD \\$1 +. if '\\$0'COVER_MISC_QUAD' .ds $COVER_MISC_QUAD \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_QUAD' .ds $DOC_COVER_COPYRIGHT_QUAD \\$1 +. if '\\$0'DOC_COVER_MISC_QUAD' .ds $DOC_COVER_MISC_QUAD \\$1 +. if '\\$0'DOC_QUAD' \{\ +. ds $DOC_QUAD \\$1 +. QUAD \\*[$DOC_QUAD] +. \} +. if '\\$0'ENDNOTE_QUAD' \{\ +. ds $EN_QUAD \\$1 +. if '\\*[$EN_QUAD]'R' .ab Fatal error: \\$0 must be set to either L or J +. if '\\*[$EN_QUAD]'C' .ab Fatal error: \\$0 must be set to either L or J +. \} +. if '\\$0'ENDNOTE_STRING_QUAD' .ds $EN_STRING_QUAD \\$1 +. if '\\$0'ENDNOTE_TITLE_QUAD' .ds $EN_TITLE_QUAD \\$1 +. if '\\$0'EPIGRAPH_QUAD' .ds $EPI_QUAD \\$1 +. if '\\$0'FOOTNOTE_QUAD' .ds $FN_QUAD \\$1 +. if '\\$0'HEAD_QUAD' .ds $HEAD_QUAD \\$1 +. if '\\$0'SUBHEAD_QUAD' .ds $SH_QUAD \\$1 +. if '\\$0'TOC_HEADER_QUAD' .ds $TOC_HEADER_QUAD \\$1 +.END +\# +\# +\# DEFAULTS +\# -------- +\# *Arguments: +\# +\# *Function: +\# Sets up defaults if no values are entered prior to START. +\# *Notes: +\# The defaults for $CHAPTER_STRING, $DRAFT_STRING, and +\# $REVISION_STRING are in the COPYSTYLE macro. +\# +.MAC DEFAULTS END +. if !d$PAPER \{ .PAPER LETTER \} +. if !\\n[#DOC_TYPE] \{ .DOCTYPE DEFAULT \} +. ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} +. el \{\ +. if !\\n[#COPY_STYLE]=1 \{ .PAGENUM_STYLE DIGIT \} +. \} +. if !\\n[#COPY_STYLE] \{ .COPYSTYLE FINAL \} +. if \\n[#DRAFT_WITH_PAGENUM] \{ .COPYSTYLE \\*[$COPY_STYLE] \} +. if \\n[#DOC_TYPE]=4 \{\ +. if !\\n[#USER_SET_L_LENGTH] \{\ +. R_MARGIN \\n[#R_MARGIN]u +. rr #USER_SET_L_LENGTH +. \} +. if \\n[#PRINT_STYLE]=1 \{ .PRINTSTYLE TYPEWRITE SINGLESPACE \} +. \} +. if \\n[#COPY_STYLE]=1 \{\ +. COPYSTYLE DRAFT +. PAGENUMBER 1 +. \} +. if !r#DOC_HEADER \{ .DOCHEADER \} +. if !r#HEADERS_ON \{ .HEADERS \} +. if !r#PAGINATE \{ .PAGINATE \} +. if \\n[#FOOTERS_ON] \{\ +. HEADERS OFF +. if \\n[#PAGE_NUM_POS_SET]=0 \{ .PAGENUM_POS TOP CENTER \} +. \} +. if !r#HEADER_MARGIN \{ .HEADER_MARGIN 4P+6p \} +. if !r#HEADER_GAP \{ .HEADER_GAP 3P \} +. if \\n[#FOOTERS_ON] \{\ +. if \\n[#PAGINATE]=0 \{\ +. if !r#T_MARGIN \{ .T_MARGIN 6P \} +. \} +. \} +. if \\n[#HEADERS_ON]=0 \{\ +. if \\n[#FOOTERS_ON]=0 \{\ +. if !r#T_MARGIN \{ .T_MARGIN 6P \} +. \} +. \} +. if !r#T_MARGIN \{ .T_MARGIN \\n[#HEADER_MARGIN]+\\n[#HEADER_GAP] \} +. if !r#DOCHEADER_ADVANCE \{ .nr #DOCHEADER_ADVANCE \\n[#T_MARGIN] \} +. if !r#FOOTER_MARGIN \{ .FOOTER_MARGIN 3P \} +. if !r#FOOTER_GAP \{ .FOOTER_GAP 3P \} +. if !r#B_MARGIN \{ .B_MARGIN \\n[#FOOTER_MARGIN]u+\\n[#FOOTER_GAP]u \} +. if (\\n[#FOOTER_MARGIN]+\\n(.v)>\\n[#B_MARGIN] \{\ +. tm1 "[mom]: Your chosen bottom margin for running text is too close to the footer margin. +. tm1 " No footers or bottom-of-page page numbers will be printed. +. tm1 " Please reset B_MARGIN or FOOTER_MARGIN to allow enough space. +. tm1 " If no footers or bottom-of-page page numbers are required, +. tm1 " type in .FOOTER_MARGIN 0 before .START +. \} +. if !r#HDRFTR_RULE_GAP \{\ +. if \\n[#HEADERS_ON] \{ .HDRFTR_RULE_GAP 4p \} +. if \\n[#FOOTERS_ON] \{ .HDRFTR_RULE_GAP 4p \} +. \} +. if !r#HDRFTR_RULE \{ .HDRFTR_RULE \} +. if !r#PAGE_NUM_SET \{ .PAGENUMBER 1 \} +.\" Read in number registers and strings for type parameters +. nr #DOC_L_MARGIN \\n[#L_MARGIN] +. nr #DOC_L_LENGTH \\n[#L_LENGTH] +. nr #DOC_R_MARGIN \\n[#PAGE_WIDTH]-(\\n[#DOC_L_MARGIN]+\\n[#L_LENGTH]) +. ds $DOC_FAM \\*[$FAMILY] +. nr #DOC_PT_SIZE \\n[#PT_SIZE] +. nr #DOC_LEAD \\n[#LEAD] +.\" #SAVED_DOC_LEAD is set in COLLATE +. if r#SAVED_DOC_LEAD \{\ +. if !\\n[#DOC_LEAD]=\\n[#SAVED_DOC_LEAD] \{ .nr #RERUN_TRAPS 1 \} +. \} +. ie \\n[#ADJ_DOC_LEAD]=1 \{ . \} +. el \{\ +. if !\\n[#DOC_LEAD_ADJUST_OFF] \{\ +. DOC_LEAD_ADJUST +. \} +. \} +. ds $DOC_QUAD \\*[$QUAD_VALUE] +. ds $PP_FT \\*[$FONT] +.\" Counters +. nr #PP 0 +. nr #FN_NUMBER 0 1 +. nr #EN_NUMBER 0 1 +. nr #FN_COUNT_FOR_COLS 0 1 +. nr #DONE_ONCE 0 1 +. RESET_HEAD_NUMBER +. RESET_SUBHEAD_NUMBER +. RESET_PARAHEAD_NUMBER +.\" General style defaults for both PRINTSTYLEs +. nr #PP_STYLE 1 +. PARA_INDENT \\n[#PP_INDENT]u +. if !d$HDRFTR_FAM \{ .HDRFTR_FAMILY \\*[$DOC_FAM] \} +. if !d$HDRFTR_SIZE_CHANGE \{ .HDRFTR_SIZE +0 \} +. if !d$PAGE_NUM_FAM \{ .PAGENUM_FAMILY \\*[$DOC_FAM] \} +. if !d$PAGE_NUM_FT \{ .PAGENUM_FONT R \} +. if !d$PAGE_NUM_SIZE_CHANGE \{ .PAGENUM_SIZE +0 \} +. if !r#PAGE_NUM_POS_SET \{ .PAGENUM_POS BOTTOM CENTER \} +. ie \\n[#PAGE_NUM_HYPHENS_SET] \{\ +. if \\n[#PAGE_NUM_HYPHENS]=0 \{ .PAGENUM_HYPHENS OFF \} +. if \\n[#PAGE_NUM_HYPHENS]=1 \{ .PAGENUM_HYPHENS \} +. \} +. el \{ .PAGENUM_HYPHENS \} +. if !d$HEAD_QUAD \{ .HEAD_QUAD CENTER \} +. if !r#HEAD_CAPS \{ .HEAD_CAPS \} +. if !r#HEAD_UNDERLINE \{ .HEAD_UNDERLINE \} +. if !d$SH_QUAD \{ .SUBHEAD_QUAD LEFT \} +. if !r#HDRFTR_RIGHT_CAPS \{ .HDRFTR_RIGHT_CAPS \} +. if \\n[#HDRFTR_RIGHT_CAPS]=0 \{\ +. if !d$HDRFTR_RIGHT_SIZE_CHANGE \{ .HDRFTR_RIGHT_SIZE +0 \} +. \} +. if !d$FN_FAM \{ .FOOTNOTE_FAMILY \\*[$DOC_FAM] \} +. if !d$FN_FT \{ .FOOTNOTE_FONT R \} +. if !d$FN_QUAD \{ .FOOTNOTE_QUAD \\*[$DOC_QUAD] \} +. if !r#FN_RULE \{ .FOOTNOTE_RULE \} +. if !r#FN_MARKERS \{ .FOOTNOTE_MARKERS \} +. if !\\n[#FN_MARKER_STYLE] \{ .FOOTNOTE_MARKER_STYLE STAR \} +. if !\\n[#EN_MARKER_STYLE] \{ .ENDNOTE_MARKER_STYLE NUMBER \} +. if !d$EN_PN_STYLE \{ .ENDNOTES_PAGENUM_STYLE digit \} +. if !d$EN_FAM \{ .ENDNOTE_FAMILY \\*[$DOC_FAM] \} +. if !d$EN_FT \{ .ENDNOTE_FONT R \} +. if !d$EN_QUAD \{ .ENDNOTE_QUAD \\*[$DOC_QUAD] \} +. if !d$EN_STRING \{ .ENDNOTE_STRING "Endnotes" \} +. if !d$EN_STRING_FAM \{ .ENDNOTE_STRING_FAMILY \\*[$EN_FAM] \} +. if !d$EN_STRING_QUAD \{ .ENDNOTE_STRING_QUAD CENTER \} +. if !r#EN_STRING_UNDERSCORE \{ .ENDNOTE_STRING_UNDERSCORE 2 \} +. if !r#EN_STRING_CAPS \{ .ENDNOTE_STRING_CAPS \} +. if !d$EN_TITLE \{\ +. ie \\n[#DOC_TYPE]=2 \{\ +. ie '\\*[$CHAPTER]'' \{ .ENDNOTE_TITLE "\\*[$CHAPTER_STRING]" \} +. el \{ .ENDNOTE_TITLE "\\*[$CHAPTER_STRING] \\*[$CHAPTER]" \} +. \} +. el \{ .ENDNOTE_TITLE "\\*[$TITLE]" \} +. \} +. if !d$EN_TITLE_FAM \{ .ENDNOTE_TITLE_FAMILY \\*[$EN_FAM] \} +. if !d$EN_TITLE_QUAD \{ .ENDNOTE_TITLE_QUAD LEFT \} +. if !r#EN_TITLE_UNDERSCORE \{ .ENDNOTE_TITLE_UNDERSCORE \} +. if !d$EN_NUMBER_FAM \{ .ENDNOTE_NUMBER_FAMILY \\*[$EN_FAM] \} +. if !r#EN_NUMBERS_ALIGN_LEFT \{\ +. if !r#EN_NUMBERS_ALIGN_RIGHT \{ .ENDNOTE_NUMBERS_ALIGN_RIGHT 2 \} +. \} +. if !d$EN_LN_GAP \{ .ENDNOTE_LINENUMBER_GAP 1.5n \} +. if !d$BIB_PN_STYLE \{ .BIBLIOGRAPHY_PAGENUM_STYLE digit \} +. if !d$BIB_FAM \{ .BIBLIOGRAPHY_FAMILY \\*[$DOC_FAM] \} +. if !d$BIB_FT \{ .BIBLIOGRAPHY_FONT R \} +. if !d$BIB_QUAD \{ .BIBLIOGRAPHY_QUAD \\*[$DOC_QUAD] \} +. if !d$BIB_STRING \{ .BIBLIOGRAPHY_STRING "Bibliography" \} +. if !d$BIB_STRING_FAM \{ .BIBLIOGRAPHY_STRING_FAMILY \\*[$BIB_FAM] \} +. if !d$BIB_STRING_QUAD \{ .BIBLIOGRAPHY_STRING_QUAD CENTER \} +. if !r#BIB_STRING_UNDERSCORE \{ .BIBLIOGRAPHY_STRING_UNDERSCORE 2 \} +. if !r#BIB_STRING_CAPS \{ .BIBLIOGRAPHY_STRING_CAPS \} +. if !d$TOC_HEADER_STRING \{ .TOC_HEADER_STRING "Contents" \} +. if !d$TOC_HEADER_QUAD \{ .TOC_HEADER_QUAD LEFT \} +. if !d$TOC_PN_STYLE \{ .TOC_PAGENUM_STYLE roman \} +. if !r#TOC_PN_PADDING \{ .TOC_PADDING 3 \} +. if !r#TOC_TITLE_INDENT \{ .TOC_TITLE_INDENT 0 \} +. if !r#TOC_HEAD_INDENT \{ .TOC_HEAD_INDENT 18p \} +. if !r#TOC_SH_INDENT \{ .TOC_SUBHEAD_INDENT 30p \} +. if !r#TOC_PH_INDENT \{ .TOC_PARAHEAD_INDENT 42p \} +.\" String defaults for both PRINTSTYLEs +. ie \\n[#DOC_TYPE]=1 \{\ +. ie '\\*[$DOC_TITLE]'' \{\ +. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] +. rr #USER_DEF_HDRFTR_LEFT +. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] +. rr #USER_DEF_HDRFTR_RIGHT +. \} +. el \{\ +. if \\n[#COPY_STYLE]=1 \{ .DRAFT_WITH_PAGENUMBER \} +. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] +. rr #USER_DEF_HDRFTR_LEFT +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 .ds $HDRFTR_CENTER \\*[$TITLE] +. rr #USER_DEF_HDRFTR_CENTER +. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$DOC_TITLE] +. rr #USER_DEF_HDRFTR_RIGHT +. \} +. \} +. el \{\ +. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] +. rr #USER_DEF_HDRFTR_LEFT +. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] +. rr #USER_DEF_HDRFTR_RIGHT +. \} +. if !d$ATTRIBUTE_STRING \{ .ATTRIBUTE_STRING "by" \} +. if !d$FINIS_STRING \{ .FINIS_STRING "END" \} +.\" Covers +. if !r#DOC_COVERS_OFF \{ .nr #DOC_COVERS 1 \} +. if !r#COVERS_OFF \{ .nr #COVERS 1 \} +. if !d$COVER_COPYRIGHT_QUAD \{ .COVER_COPYRIGHT_QUAD R \} +. if !d$COVER_MISC_QUAD \{ .COVER_MISC_QUAD L \} +. if !d$DOC_COVER_COPYRIGHT_QUAD \{ .DOC_COVER_COPYRIGHT_QUAD R \} +. if !d$DOC_COVER_MISC_QUAD \{ .DOC_COVER_MISC_QUAD L \} +.\" Defaults for printstyle TYPEWRITE +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#UNDERLINE_QUOTES]=1 \{ .UNDERLINE_QUOTES \} +. if \\n[#UNDERLINE_QUOTES]=0 \{ .UNDERLINE_QUOTES OFF \} +.\" +Quotes and blockquotes +. if !r#Q_OFFSET_VALUE \{ .QUOTE_INDENT 2 \} +.\" +Epigraphs +. if !r#EPI_OFFSET_VALUE \{ .EPIGRAPH_INDENT 2 \} +.\" +Linebreaks +. if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 2p \} +.\" +Footnotes +. if !d$FN_SIZE_CHANGE \{ .FOOTNOTE_SIZE +0 \} +. if !r#FN_RULE_LENGTH \{ .FOOTNOTE_RULE_LENGTH 2i \} +.\" +Paragraph heads +. if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} +.\" +Endnotes +. if !r#EN_PP_INDENT \{ .ENDNOTE_PARA_INDENT \\n[#PP_INDENT] \} +.\" +Footnotes +. if !r#FN_RULE_ADJ \{ .FOOTNOTE_RULE_ADJ 6p \} +.\" +Slant stuff +. if !r#SLANT_MEANS_SLANT \{\ +. ie \\n[#UNDERLINE_SLANT]=1 \{ .UNDERLINE_SLANT \} +. el \{ .UNDERLINE_SLANT OFF \} +. \} +. \} +.\" Defaults for printstyle TYPESET +. if \\n[#PRINT_STYLE]=2 \{\ +. if !d$DOCHEADER_LEAD_ADJ \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. ie !'\\*[$CHAPTER_STRING]'' \{\ +. DOCHEADER_LEAD +4 +. \} +. el \{ .DOCHEADER_LEAD +0 \} +. \} +. el \{ .DOCHEADER_LEAD +0 \} +. \} +.\" +Cover +. if !d$COVER_LEAD_ADJ \{ .COVER_LEAD +0 \} +. if !d$COVER_FAM \{ .COVER_FAMILY \\*[$DOC_FAM] \} +.\" (title) +. if !d$COVER_TITLE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_TITLE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_TITLE_FT \{ .COVER_TITLE_FONT B \} +. if !d$COVER_TITLE_SIZE_CHANGE \{ .COVER_TITLE_SIZE +3.5 \} +.\" (chapter title) +. if !d$COVER_CHAPTER_TITLE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_CHAPTER_TITLE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_CHAPTER_TITLE_FT \{ .COVER_CHAPTER_TITLE_FONT BI \} +. if !d$COVER_CHAPTER_TITLE_SIZE_CHANGE \{ .COVER_CHAPTER_TITLE_SIZE +4 \} +.\" (subtitle) +. if !d$COVER_SUBTITLE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_SUBTITLE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_SUBTITLE_FT \{ .COVER_SUBTITLE_FONT R \} +. if !d$COVER_SUBTITLE_SIZE_CHANGE \{ .COVER_SUBTITLE_SIZE +0 \} +.\" (attribution and author[s]) +. if !d$COVER_AUTHOR_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_AUTHOR_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_AUTHOR_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_AUTHOR_FT \{ .COVER_AUTHOR_FONT I \} +. if !d$COVER_AUTHOR_SIZE_CHANGE \{ .COVER_AUTHOR_SIZE +0 \} +.\" (doctype if "named") +. if !d$COVER_DOCTYPE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_DOCTYPE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_DOCTYPE_FT \{ .COVER_DOCTYPE_FONT BI \} +. if !d$COVER_DOCTYPE_SIZE_CHANGE \{ .COVER_DOCTYPE_SIZE +3 \} +.\" (copyright) +. if !d$COVER_COPYRIGHT_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_COPYRIGHT_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_COPYRIGHT_FT \{ .COVER_COPYRIGHT_FONT R \} +. if !d$COVER_COPYRIGHT_SIZE_CHANGE \{ .COVER_COPYRIGHT_SIZE -2 \} +.\" +Doc cover +. if !d$DOC_COVER_LEAD_ADJ \{ .DOC_COVER_LEAD +0 \} +. if !d$DOC_COVER_FAM \{ .DOC_COVER_FAMILY \\*[$DOC_FAM] \} +.\" (title) +. if !d$DOC_COVER_TITLE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_TITLE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_TITLE_FT \{ .DOC_COVER_TITLE_FONT B \} +. if !d$DOC_COVER_TITLE_SIZE_CHANGE \{ .DOC_COVER_TITLE_SIZE +3.5 \} +.\" (chapter title) +. if !d$DOC_COVER_CHAPTER_TITLE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_CHAPTER_TITLE_FT \{ .DOC_COVER_CHAPTER_TITLE_FONT BI \} +. if !d$DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE \{ .DOC_COVER_CHAPTER_TITLE_SIZE +4 \} +.\" (subtitle) +. if !d$DOC_COVER_SUBTITLE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_SUBTITLE_FT \{ .DOC_COVER_SUBTITLE_FONT R \} +. if !d$DOC_COVER_SUBTITLE_SIZE_CHANGE \{ .DOC_COVER_SUBTITLE_SIZE +0 \} +.\" (attribution and author[s]) +. if !d$DOC_COVER_AUTHOR_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_AUTHOR_FT \{ .DOC_COVER_AUTHOR_FONT I \} +. if !d$DOC_COVER_AUTHOR_SIZE_CHANGE \{ .DOC_COVER_AUTHOR_SIZE +0 \} +.\" (doctype if "named") +. if !d$DOC_COVER_DOCTYPE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_DOCTYPE_FT \{ .DOC_COVER_DOCTYPE_FONT BI \} +. if !d$DOC_COVER_DOCTYPE_SIZE_CHANGE \{ .DOC_COVER_DOCTYPE_SIZE +3 \} +.\" (copyright) +. if !d$DOC_COVER_COPYRIGHT_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_COPYRIGHT_FT \{ .DOC_COVER_COPYRIGHT_FONT R \} +. if !d$DOC_COVER_COPYRIGHT_SIZE_CHANGE \{ .DOC_COVER_COPYRIGHT_SIZE -2 \} +.\" +Docheader +. if !d$DOCHEADER_FAM \{ .DOCHEADER_FAMILY \\*[$DOC_FAM] \} +. if !d$TITLE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .TITLE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$TITLE_FT \{ .TITLE_FONT B \} +. if !d$TITLE_SIZE_CHANGE \{\ +. ie \\n[#DOC_TYPE]=2 \{ .TITLE_SIZE +4 \} +. el \{ .TITLE_SIZE +3.5 \} +. \} +. if !d$CHAPTER_TITLE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .CHAPTER_TITLE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$CHAPTER_TITLE_FT \{ .CHAPTER_TITLE_FONT BI \} +. if !d$CHAPTER_TITLE_SIZE_CHANGE \{ .CHAPTER_TITLE_SIZE +4 \} +. if !d$SUBTITLE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .SUBTITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .SUBTITLE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$SUBTITLE_FT \{ .SUBTITLE_FONT R \} +. if !d$SUBTITLE_SIZE_CHANGE \{ .SUBTITLE_SIZE +0 \} +. if !d$AUTHOR_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .AUTHOR_FAMILY \\*[$DOC_FAM] \} +. el \{ .AUTHOR_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$AUTHOR_FT \{ .AUTHOR_FONT I \} +. if !d$AUTHOR_SIZE_CHANGE \{ .AUTHOR_SIZE +0 \} +. if !d$DOCTYPE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .DOCTYPE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOCTYPE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$DOCTYPE_FT \{ .DOCTYPE_FONT BI \} +. if !d$DOCTYPE_SIZE_CHANGE \{ .DOCTYPE_SIZE +3 \} +.\" +Headers and footers +. if !d$HDRFTR_LEFT_FAM \{ .HDRFTR_LEFT_FAMILY \\*[$DOC_FAM] \} +. if !d$HDRFTR_LEFT_FT \{ .HDRFTR_LEFT_FONT R \} +. if \\n[#HDRFTR_LEFT_CAPS] \{\ +. if !d$HDRFTR_LEFT_SIZE_CHANGE \{ .HDRFTR_LEFT_SIZE -2 \} +. \} +. if !d$HDRFTR_LEFT_SIZE_CHANGE \{ .HDRFTR_LEFT_SIZE -.5 \} +. if !d$HDRFTR_CENTER_FAM \{ .HDRFTR_CENTER_FAMILY \\*[$DOC_FAM] \} +. if !d$HDRFTR_CENTER_FT \{ .HDRFTR_CENTER_FONT I \} +. if \\n[#HDRFTR_CENTER_CAPS] \{\ +. if !d$HDRFTR_CENTER_SIZE_CHANGE \{ .HDRFTR_CENTER_SIZE -2 \} +. \} +. if !d$HDRFTR_CENTER_SIZE_CHANGE \{ .HDRFTR_CENTER_SIZE -.5 \} +. if !d$HDRFTR_RIGHT_FAM \{ .HDRFTR_RIGHT_FAMILY \\*[$DOC_FAM] \} +. if !d$HDRFTR_RIGHT_FT \{ .HDRFTR_RIGHT_FONT R \} +. if \\n[#HDRFTR_RIGHT_CAPS] \{\ +. if !d$HDRFTR_RIGHT_SIZE_CHANGE \{ .HDRFTR_RIGHT_SIZE -2 \} +. \} +. if !d$HDRFTR_RIGHT_SIZE_CHANGE \{ .HDRFTR_RIGHT_SIZE -.5 \} +.\" +Heads +. if !d$HEAD_FAM \{ .HEAD_FAMILY \\*[$DOC_FAM] \} +. if !d$HEAD_FT \{ .HEAD_FONT B \} +. if !d$HEAD_SIZE_CHANGE \{ .HEAD_SIZE +1 \} +. if !r#HEAD_SPACE \{ .HEAD_SPACE \} +.\" +Subheads +. if !d$SH_FAM \{ .SUBHEAD_FAMILY \\*[$DOC_FAM] \} +. if !d$SH_FT \{ .SUBHEAD_FONT B \} +. if !d$SH_SIZE_CHANGE \{ .SUBHEAD_SIZE +.5 \} +.\" +Paragraph heads +. if !d$PH_FAM \{ .PARAHEAD_FAMILY \\*[$DOC_FAM] \} +. if !d$PH_FT \{ .PARAHEAD_FONT BI \} +. if !d$PH_SIZE_CHANGE \{ .PARAHEAD_SIZE -.25 \} +. if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} +.\" +Quotes +. if !d$QUOTE_FAM \{ .QUOTE_FAMILY \\*[$DOC_FAM] \} +. if !d$QUOTE_FT \{ .QUOTE_FONT I \} +. if !d$QUOTE_SIZE_CHANGE \{ .QUOTE_SIZE +0 \} +. if !r#Q_OFFSET_VALUE \{ .QUOTE_INDENT 3 \} +.\" +Blockquotes +.\" Note: the leading for quotes and blockquotes is set after .DEFAULTS in START +. if !d$BQUOTE_FAM \{ .BLOCKQUOTE_FAMILY \\*[$DOC_FAM] \} +. if !d$BQUOTE_FT \{ .BLOCKQUOTE_FONT R \} +. if !d$BQUOTE_SIZE_CHANGE \{ .BLOCKQUOTE_SIZE -1 \} +. if !d$BQUOTE_QUAD \{ .BLOCKQUOTE_QUAD LEFT \} +.\" +Epigraphs +. if !d$EPI_FAM \{ .EPIGRAPH_FAMILY \\*[$DOC_FAM] \} +. if !d$EPI_FT \{ .EPIGRAPH_FONT R \} +. if !d$EPI_SIZE_CHANGE \{ .EPIGRAPH_SIZE -1.5 \} +. if !r#EPI_AUTOLEAD \{ .EPIGRAPH_AUTOLEAD 2 \} +. if !d$EPI_QUAD \{ .EPIGRAPH_QUAD \\*[$DOC_QUAD] \} +. if !r#EPI_OFFSET_VALUE \{ .EPIGRAPH_INDENT 3 \} +.\" +Linebreaks +. if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 3p \} +.\" +Footnotes +. if !r#FN_RULE_LENGTH \{ .FOOTNOTE_RULE_LENGTH 4P \} +. if !r#FN_RULE_ADJ \{ .FOOTNOTE_RULE_ADJ 3p \} +. if !d$FN_SIZE_CHANGE \{ .FOOTNOTE_SIZE -2 \} +. if !r#FN_AUTOLEAD \{ .FOOTNOTE_AUTOLEAD 2 \} +.\" +Endnotes +. if !r#EN_PS \{ .ENDNOTE_PT_SIZE \\n[#DOC_PT_SIZE]u \} +. if !d$EN_STRING_FT \{ .ENDNOTE_STRING_FONT B \} +. if !d$EN_STRING_SIZE_CHANGE \{ .ENDNOTE_STRING_SIZE +1 \} +. if !d$EN_TITLE_FT \{ .ENDNOTE_TITLE_FONT B \} +. if !d$EN_TITLE_SIZE_CHANGE \{ .ENDNOTE_TITLE_SIZE +0 \} +. if !d$EN_NUMBER_FT \{ .ENDNOTE_NUMBER_FONT B \} +. if !d$EN_NUMBER_SIZE_CHANGE \{ .ENDNOTE_NUMBER_SIZE +0 \} +. if !r#EN_PP_INDENT \{ .ENDNOTE_PARA_INDENT 1.5m \} +.\" +Bibliography +. if !r#BIB_LIST \{ .BIBLIOGRAPHY_TYPE LIST . \} +. if !r#BIB_PS \{ .BIBLIOGRAPHY_PT_SIZE \\n[#DOC_PT_SIZE]u \} +. if !d$BIB_STRING_FT \{ .BIBLIOGRAPHY_STRING_FONT B \} +. if !d$BIB_STRING_SIZE_CHANGE \{ .BIBLIOGRAPHY_STRING_SIZE +1 \} +.\" +Table of contents +. if !d$TOC_FAM \{ .TOC_FAMILY \\*[$DOC_FAM] \} +. if !r#TOC_PS \{ .TOC_PT_SIZE \\n[#DOC_PT_SIZE]u \} +. if !r#TOC_LEAD \{ .TOC_LEAD \\n[#DOC_LEAD]u ADJUST \} +. if !d$TOC_HEADER_FAM \{ .TOC_HEADER_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_HEADER_SIZE_CHANGE \{ .TOC_HEADER_SIZE +4 \} +. if !d$TOC_HEADER_FT \{ .TOC_HEADER_FONT B \} +. if !d$TOC_TITLE_FAM \{ .TOC_TITLE_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_PN_FAM \{ .TOC_PN_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_HEAD_FAM \{ .TOC_HEAD_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_SH_FAM \{ .TOC_SUBHEAD_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_PH_FAM \{ .TOC_PARAHEAD_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_TITLE_FT \{ .TOC_TITLE_FONT BI \} +. if !d$TOC_PN_FT \{ .TOC_PN_FONT R \} +. if !d$TOC_HEAD_FT \{ .TOC_HEAD_FONT B \} +. if !d$TOC_SH_FT \{ .TOC_SUBHEAD_FONT R \} +. if !d$TOC_PH_FT \{ .TOC_PARAHEAD_FONT I \} +. if !d$TOC_TITLE_SIZE_CHANGE \{ .TOC_TITLE_SIZE +.5 \} +. if !d$TOC_PN_SIZE_CHANGE \{ .TOC_PN_SIZE +0 \} +. if !d$TOC_HEAD_SIZE_CHANGE \{ .TOC_HEAD_SIZE +.5 \} +. if !d$TOC_SH_SIZE_CHANGE \{ .TOC_SUBHEAD_SIZE +0 \} +. if !d$TOC_PH_SIZE_CHANGE \{ .TOC_PARAHEAD_SIZE +0 \} +. \} +.\" +Refer support +. if !r#ENDNOTE_REFS \{ .nr #FN_REFS 1 \} +. if '\\*[$REF_FN_INDENT]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS FOOTNOTE 2m \} +. if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS FOOTNOTE 1.5m \} +. \} +. if '\\*[$REF_EN_INDENT]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS ENDNOTE 2m \} +. if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS ENDNOTE 1.5m \} +. \} +. if '\\*[$REF_BIB_INDENT]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS BIBLIO 2m \} +. if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS BIBLIO 1.5m :\} +. \} +.\" Adjust doc leading for PRINTSTYLE TYPESET +. if \\n[#PRINT_STYLE]=2 \{\ +. ie \\n[#ADJ_DOC_LEAD]=1 \{ .DOC_LEAD_ADJUST \} +. el \{ . \} +. \} +.\" This diversion is to get a value for #FN_AUTOLEAD +. di NULL +. ev NULL +. if \\n[#PRINT_STYLE]=1 \{\ +. ps 12 +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#ORIGINAL_DOC_LEAD]u \} +. el \{ .vs \\n[#ORIGINAL_DOC_LEAD]u/2u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE] +. AUTOLEAD \\n[#FN_AUTOLEAD] +. \} +. nr #FN_LEAD \\n[#LEAD] +. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u \} +. ev +. di +. ie !\\n[#COLLATE] \{\ +.\" DOC_LEAD adjusted (or not) here +. TRAPS +. rr #DOC_LEAD_ADJUST_OFF +.\" Endnote, bibliography and toc leading +. nr #OK_PROCESS_LEAD 1 +. nr #RESTORE_DOC_LEAD \\n(.v +. nr #RESTORE_B_MARGIN \\n[#B_MARGIN] +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE] \{\ +. ENDNOTE_LEAD 12 ADJUST +. BIBLIOGRAPHY_LEAD 12 ADJUST +. \} +. el \{\ +. ie \\n[#EN_SINGLESPACE] \{ .ENDNOTE_LEAD 12 ADJUST \} +. el \{ .ENDNOTE_LEAD 24 ADJUST \} +. ie \\n[#BIB_SINGLESPACE] \{ .BIBLIOGRAPHY_LEAD 12 ADJUST \} +. el \{ .BIBLIOGRAPHY_LEAD 24 ADJUST \} +. \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. ie !d$EN_LEAD \{ .ENDNOTE_LEAD 14 ADJUST \} +. el \{ .ENDNOTE_LEAD \\*[$EN_LEAD] \\*[$ADJUST_EN_LEAD] \} +. ie !d$BIB_LEAD \{ .BIBLIOGRAPHY_LEAD 14 ADJUST \} +. el \{ .BIBLIOGRAPHY_LEAD \\*[$BIB_LEAD] \\*[$ADJUST_BIB_LEAD] \} +. ie !d$TOC_LEAD \{ .TOC_LEAD \\n[#RESTORE_DOC_LEAD]u \} +. el \{ .TOC_LEAD \\*[$TOC_LEAD] \\*[$ADJUST_TOC_LEAD] \} +. rm $ADJUST_EN_LEAD +. rm $ADJUST_BIB_LEAD +. rm $ADJUST_TOC_LEAD +. \} +. ie !d$BIB_SPACE \{ .BIBLIOGRAPHY_SPACING 1v \} +. el \{\ +. if \\n[#DEFER_BIB_SPACING]=1 \{\ +. BIBLIOGRAPHY_SPACING \\*[$BIB_SPACE] +. rr #DEFER_BIB_SPACING +. \} +. \} +. DOC_LEAD \\n[#RESTORE_DOC_LEAD]u +. nr #B_MARGIN \\n[#RESTORE_B_MARGIN] +. \} +. el \{\ +. if \\n[#COLLATE] \{\ +. if !\\n[#PRINT_STYLE]=1 \{\ +. if \\n[#RERUN_TRAPS] \{ .TRAPS \} +. \} +. \} +. \} +. if \\n[#PRINT_STYLE]=1 \{ .nr #IGNORE 1 \} +.END +\# +\# ==================================================================== +\# +\# +++START THE DOCUMENT+++ +\# +\# THE START MACRO +\# --------------- +\# *Arguments: +\# +\# *Function: +\# Reads in default document style parameters and any parameter +\# the user has changed before issuing START. +\# Using the information gathered in the opening macros, +\# prints appropriate title (or chapter #), subtitle, author +\# and document type (if appropriate). +\# *Notes: +\# The .PRINT \& (zero-width character) is required to get the +\# subsequent .sp request to work as advertised. +\# +\# The overall document line length, family, and point-size +\# are stored in #DOC_L_LENGTH, $DOC_FAM, and #DOC_PT_SIZE for +\# use in the HEADER and FOOTER macros. +\# +\# First, define some strings for point sizes +\# +\# Doc cover +.ds $DOC_COVER_AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_AUTHOR_SIZE_CHANGE] +.ds $DOC_COVER_CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE] +.ds $DOC_COVER_COPYRIGHT_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_COPYRIGHT_SIZE_CHANGE] +.ds $DOC_COVER_DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_DOCTYPE_SIZE_CHANGE] +.ds $DOC_COVER_SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_SUBTITLE_SIZE_CHANGE] +.ds $DOC_COVER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_TITLE_SIZE_CHANGE] +\# Cover +.ds $COVER_AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_AUTHOR_SIZE_CHANGE] +.ds $COVER_CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_CHAPTER_TITLE_SIZE_CHANGE] +.ds $COVER_COPYRIGHT_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_COPYRIGHT_SIZE_CHANGE] +.ds $COVER_DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_DOCTYPE_SIZE_CHANGE] +.ds $COVER_SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_SUBTITLE_SIZE_CHANGE] +.ds $COVER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_TITLE_SIZE_CHANGE] +\# Docheader +.ds $AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$AUTHOR_SIZE_CHANGE] +.ds $CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$CHAPTER_TITLE_SIZE_CHANGE] +.ds $COPYRIGHT_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COPYRIGHT_SIZE_CHANGE] +.ds $DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE] +.ds $SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$SUBTITLE_SIZE_CHANGE] +.ds $TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE] +\# +\# Next, some utility macros for various routines to prevent repetition +\# +.MAC PRINT_AUTHORS END +. nr #AUTHORS \\n[#AUTHOR_NUM] +. nr #NEXT_AUTHOR 0 1 +. ie r#DOING_COVER \{\ +. if \\n[#COVER]=1 \{\ +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. ie \\n[#COVER_AUTHOR_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. \} +. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +.\} +. \} +. if \\n[#DOC_COVER]=1 \{\ +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. ie \\n[#DOC_COVER_AUTHOR_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. \} +. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +.\} +. \} +. \} +. el \{\ +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. ie \\n[#AUTHOR_COLOR]=1 \{\ +. PRINT \m[\\*[$AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. \} +. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +.\} +. \} +.END +\# +.MAC DEFAULT_DOCHEADER END +. CENTER +. FAMILY \\*[$TITLE_FAM] +. FT \\*[$TITLE_FT] +. PT_SIZE \\*[$TITLE_PT_SIZE] +. LS \\n[#DOCHEADER_LEAD]u +. ie \\n[#TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$TITLE_COLOR]]\\*[$TITLE]\m[] +. \} +. el \{ .PRINT \\*[$TITLE] \} +. if !'\\*[$SUBTITLE]'' \{\ +. FAMILY \\*[$SUBTITLE_FAM] +. FT \\*[$SUBTITLE_FT] +. PT_SIZE \\*[$SUBTITLE_PT_SIZE] +. ie \\n[#SUBTITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$SUBTITLE_COLOR]]\\*[$TITLE]\m[] +. \} +. el \{ .PRINT \\*[$SUBTITLE] \} +. \} +. if !'\\*[$AUTHOR_1]'' \{\ +. FAMILY \\*[$AUTHOR_FAM] +. FT \\*[$AUTHOR_FT] +. PT_SIZE \\*[$AUTHOR_PT_SIZE] +. if !'\\*[$ATTRIBUTE_STRING]'' \{\ +. ie \\n[#ATTRIBUTE_COLOR]=1 \{\ +. PRINT \m[\\*[$ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] +. \} +. el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} +. \} +. PRINT_AUTHORS +. \} +.END +\# +\# +.MAC CHAPTER_DOCHEADER END +. CENTER +. FAMILY \\*[$TITLE_FAM] +. FT \\*[$TITLE_FT] +. PT_SIZE \\*[$TITLE_PT_SIZE] +. LS \\n[#DOCHEADER_LEAD]u +.\" Chapter title only +. ie '\\*[$CHAPTER]'' \{\ +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. if \\n[#PRINT_STYLE]=2 \{\ +. FAMILY \\*[$CHAPTER_TITLE_FAM] +. FT \\*[$CHAPTER_TITLE_FT] +. PT_SIZE \\*[$CHAPTER_TITLE_PT_SIZE] +. LS \\n[#DOCHEADER_LEAD]u +. \} +. ie \\n[#TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. el \{\ +. ie \\n[#TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_STRING]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \} +. \} +. \} +.\" Chapter string, possibly with a chapter title +. el \{\ +. ie \\n[#TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. if !'\\*[$CHAPTER_TITLE]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .PRINT \\*[$CHAPTER_TITLE] \} +. if \\n[#PRINT_STYLE]=2 \{\ +. FAMILY \\*[$CHAPTER_TITLE_FAM] +. FT \\*[$CHAPTER_TITLE_FT] +. PT_SIZE \\*[$CHAPTER_TITLE_PT_SIZE] +. LS \\n[#DOCHEADER_LEAD]u +. ie \\n[#CHAPTER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. RLD \\n[#DOC_LEAD]u \" Just looks better this way +. \} +. \} +. \} +.END +\# +\# +.MAC NAMED_DOCHEADER END +. CENTER +. FAMILY \\*[$TITLE_FAM] +. FT \\*[$TITLE_FT] +. PT_SIZE \\*[$TITLE_PT_SIZE] +. LS \\n[#DOCHEADER_LEAD]u +. ie \\n[#TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$TITLE_COLOR]]\\*[$TITLE]\m[] +. \} +. el \{ .PRINT \\*[$TITLE] \} +. if !'\\*[$SUBTITLE]'' \{\ +. FAMILY \\*[$SUBTITLE_FAM] +. FT \\*[$SUBTITLE_FT] +. PT_SIZE \\*[$SUBTITLE_PT_SIZE] +. ie \\n[#SUBTITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$SUBTITLE_COLOR]]\\*[$TITLE]\m[] +. \} +. el \{ .PRINT \\*[$SUBTITLE] \} +. \} +. if !'\\*[$AUTHOR_1]'' \{\ +. FAMILY \\*[$AUTHOR_FAM] +. FT \\*[$AUTHOR_FT] +. PT_SIZE \\*[$AUTHOR_PT_SIZE] +. if !'\\*[$ATTRIBUTE_STRING]'' \{\ +. ie \\n[#ATTRIBUTE_COLOR]=1 \{\ +. PRINT \m[\\*[$ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] +. \} +. el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} +. \} +. PRINT_AUTHORS +. \} +. FAMILY \\*[$DOCTYPE_FAM] +. FT \\*[$DOCTYPE_FT] +. PT_SIZE \\*[$DOCTYPE_PT_SIZE] +. LS \\n[#DOCHEADER_LEAD]u +. ALD \\n[#DOCHEADER_LEAD]u +. ie \\n[#DOCTYPE_COLOR]=1 \{\ +. COLOR \\*[$DOCTYPE_COLOR] +. UNDERSCORE "\\*[$DOC_TYPE] +. \} +. el .UNDERSCORE "\\*[$DOC_TYPE] +.END +\# +\# +\# COVER PAGE +\# ---------- +\# *Arguments: +\# TITLE | DOCTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE | COVERTITLE ... +\# ... [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC ] +\# *Function: +\# Toggles the number register for each cover page element +\# passed as an argument. +\# *Notes: +\# TITLE, DOCTITLE, CHAPTER, CHAPTER_TITLE or CHAPTER+TITLE must +\# be supplied. After that, users may enter as many or as few of +\# the arguments as they like; however, the arguments must appear +\# in the order given above. +\# +\# If called as DOC_COVER, performs the same operations, but +\# applies everything to a doc cover. +\# +.MAC COVER END +. ie '\\$0'DOC_COVER' \{\ +. nr #DOC_COVER 1 +. if '\\$1'TITLE' \{ .nr #DOC_COVER_TITLE 1 \} +. if '\\$1'DOCTITLE' \{ .nr #DOC_COVER_TITLE 2 \} +. if '\\$1'CHAPTER' \{ .nr #DOC_COVER_TITLE 3 \} +. if '\\$1'CHAPTER_TITLE' \{ .nr #DOC_COVER_TITLE 4 \} +. if '\\$1'CHAPTER+TITLE' \{ .nr #DOC_COVER_TITLE 5 \} +. if '\\$1'COVERTITLE' \{ .nr #DOC_COVER_TITLE 6 \} +. if '\\$2'SUBTITLE' \{ .nr #DOC_COVER_SUBTITLE 1 \} +. if '\\$2'AUTHOR' \{ .nr #DOC_COVER_AUTHOR 1 \} +. if '\\$2'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} +. if '\\$2'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$2'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$3'AUTHOR' \{ .nr #DOC_COVER_AUTHOR 1 \} +. if '\\$3'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} +. if '\\$3'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$3'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$4'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} +. if '\\$4'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$4'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$5'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$5'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$6'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. \} +. el \{\ +. nr #COVER 1 +. if '\\$1'TITLE' \{ .nr #COVER_TITLE 1 \} +. if '\\$1'DOCTITLE' \{ .nr #COVER_TITLE 2 \} +. if '\\$1'CHAPTER' \{ .nr #COVER_TITLE 3 \} +. if '\\$1'CHAPTER_TITLE' \{ .nr #COVER_TITLE 4 \} +. if '\\$1'CHAPTER+TITLE' \{ .nr #COVER_TITLE 5 \} +. if '\\$1'COVERTITLE' \{ .nr #COVER_TITLE 6 \} +. if '\\$2'SUBTITLE' \{ .nr #COVER_SUBTITLE 1 \} +. if '\\$2'AUTHOR' \{ .nr #COVER_AUTHOR 1 \} +. if '\\$2'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} +. if '\\$2'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$2'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$3'AUTHOR' \{ .nr #COVER_AUTHOR 1 \} +. if '\\$3'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} +. if '\\$3'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$3'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$4'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} +. if '\\$4'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$4'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$5'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$5'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$6'MISC' \{ .nr #COVER_MISC 1 \} +. \} +.END +\# +\# +.MAC COVERTITLE END +. ie '\\$0'DOC_COVERTITLE' .ds $DOC_COVER_TITLE \\$1 +. el .ds $COVER_TITLE \\$1 +.END +\# +\# +\# COVER PAGE LEADING +\# ------------------ +\# *Arguments: +\# <+|- amount by which to in/decrease leading of cover/doc cover> +\# *Function: +\# Stores user supplied lead in/decrease in string $COVER_LEAD_ADJ +\# or $DOC_COVER_LEAD_ADJ, depending on whether the macro was called +\# with an alias (DOC_COVER_LEAD). +\# *Notes: +\# A unit of measure must be supplied. Decimal fractions OK. +\# Default is +0, i.e. same as DOC_LEAD. +\# +.MAC COVER_LEAD END +. ie '\\$0'DOC_COVER_LEAD' \{\ +. ds $DOC_COVER_LEAD_ADJ \\$1 +. \} +. el \{\ +. ds $COVER_LEAD_ADJ \\$1 +. \} +.END +\# +\# +\# COVER PAGE START POSITION +\# ------------------------- +\# *Arguments: +\# +\# *Function: +\# Stores user supplied lead in/decrease in #COVER_START_POS +\# or #DOC_COVER_START_POS, depending on whether the macro was +\# called by an alias (DOC_COVER_ADVANCE). +\# *Notes: +\# A unit of measure must be supplied. Decimal fractions OK. +\# If user doesn't invoke this macro, the default starting +\# position for both covers and doc covers is 1/3 of the way +\# down the page (setup in DO_COVER). +\# +.MAC COVER_ADVANCE END +. ie '\\$0'DOC_COVER_ADVANCE' \{\ +. nr #DOC_COVER_START_POS (\\$1) +. \} +. el \{\ +. nr #COVER_START_POS (\\$1) +. \} +.END +\# +\# +\# COVERS - WHETHER TO PRINT +\# ------------------------- +\# *Arguments: +\# | +\# *Function: +\# Creates or removes registers #COVERS and #COVERS_OFF, checked for +\# in DEFAULTS (in START) prior to printing +\# +.MAC COVERS END +. ie '\\$0'DOC_COVERS' \{\ +. ie '\\$1'' \{\ +. rr #DOC_COVERS_OFF +. nr #DOC_COVERS 1 +. \} +. el \{\ +. rr #DOC_COVERS +. nr #DOC_COVERS_OFF 1 +. \} +. \} +. el \{\ +. ie '\\$1'' \{\ +. rr #COVERS_OFF +. nr #COVERS 1 +. \} +. el \{\ +. rr #COVERS +. nr #COVERS_OFF 1 +. \} +. \} +.END +\# +\# +.MAC DO_COVER END +. nr #DOING_COVER 1 +. ev COVER +. evc 0 +. TRAP OFF +. if \\n[#PAGINATE]=1 \{\ +. nr #PAGINATION_WAS_ON 1 +. rr #PAGINATE +. \} +. if \\n[#HEADERS_ON]=1 \{\ +. nr #HEADERS_WERE_ON 1 +. HEADERS OFF +. \} +. if \\n[#FOOTERS_ON]=1 \{\ +. nr #FOOTERS_WERE_ON 1 +. FOOTERS OFF +. \} +. if \\n[#COLUMNS]=1 \{\ +. nr #COLUMNS_WERE_ON 1 +. rr #COLUMNS +. \} +.\" Doc cover +. ie '\\$0'DO_DOC_COVER' \{\ +. if !r#DOC_COVER_START_POS \{\ +. nr #DOC_COVER_START_POS \\n[#PAGE_LENGTH]/3 +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. LS \\n[#DOC_LEAD]u\\*[$DOC_COVER_LEAD_ADJ] +. nr #DOC_COVER_LEAD \\n[#LEAD] +. \} +. PRINT \& +. sp |\\n[#DOC_COVER_START_POS]u-1v +. if \\n[#DOC_COVER_COLOR]=1 \{\ +. nf +\m[\\*[$DOC_COVER_COLOR]] +. EOL +. \} +. CENTER +. FAMILY \\*[$DOC_COVER_TITLE_FAM] +. FT \\*[$DOC_COVER_TITLE_FT] +. PT_SIZE \\*[$DOC_COVER_TITLE_PT_SIZE] +. LS \\n[#DOC_COVER_LEAD]u +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. if \\n[#DOC_COVER_TITLE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$TITLE]\m[] +. \} +. el \{ .PRINT \\*[$TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=2 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$DOC_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$DOC_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$DOC_TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=3 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=4 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=5 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. if !'\\*[$CHAPTER_TITLE]'' \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. \} +. el \{\ +. FAMILY \\*[$DOC_COVER_CHAPTER_TITLE_FAM] +. FT \\*[$DOC_COVER_CHAPTER_TITLE_FT] +. PT_SIZE \\*[$DOC_COVER_CHAPTER_TITLE_PT_SIZE] +. ie \\n[#DOC_COVER_CHAPTER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=6 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$DOC_COVER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$DOC_COVER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$DOC_COVER_TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_SUBTITLE]=1 \{\ +. FAMILY \\*[$DOC_COVER_SUBTITLE_FAM] +. FT \\*[$DOC_COVER_SUBTITLE_FT] +. PT_SIZE \\*[$DOC_COVER_SUBTITLE_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. ie \\n[#DOC_COVER_SUBTITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE]\m[] +. \} +. el \{ .PRINT \\*[$SUBTITLE] \} +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if !r#DOC_COVER_SUBTITLE \{ .SP \} +. \} +. if \\n[#DOC_COVER_AUTHOR]=1 \{\ +. FAMILY \\*[$DOC_COVER_AUTHOR_FAM] +. FT \\*[$DOC_COVER_AUTHOR_FT] +. PT_SIZE \\*[$DOC_COVER_AUTHOR_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u/2u +. \} +. if !'\\*[$ATTRIBUTE_STRING]'' \{\ +. ie \\n[#DOC_COVER_ATTRIBUTE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] +. \} +. el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} +. \} +. PRINT_AUTHORS +. \} +. FAMILY \\*[$DOC_COVER_DOCTYPE_FAM] +. FT \\*[$DOC_COVER_DOCTYPE_FT] +. PT_SIZE \\*[$DOC_COVER_DOCTYPE_PT_SIZE] +. SP +. if \\n[#DOC_COVER_DOCTYPE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u +. UNDERSCORE2 "\\*[$DOC_TYPE] +. \} +. el \{\ +. ie \\n[#DOC_COVER_DOCTYPE_COLOR]=1 \{\ +. COLOR \\*[$DOC_COVER_DOCTYPE_COLOR] +. UNDERSCORE "\\*[$DOC_TYPE] +. \} +. el .UNDERSCORE "\\*[$DOC_TYPE] +. \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. \} +. el \{\ +. FAMILY \\*[$DOC_COVER_COPYRIGHT_FAM] +. FT \\*[$DOC_COVER_COPYRIGHT_FT] +. AUTOLEAD 2 +. PT_SIZE \\*[$DOC_COVER_COPYRIGHT_PT_SIZE] +. \} +. if \\n[#DOC_COVER_COPYRIGHT]=1 \{\ +. QUAD \\*[$DOC_COVER_COPYRIGHT_QUAD] +. ie \\n[#DOC_COVER_COPYRIGHT_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] +. \} +. el \{ .PRINT \\*[$COPYRIGHT] \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. if \\n[#DOC_COVER_MISC]=1 \{\ +. QUAD \\*[$DOC_COVER_MISC_QUAD] +. nr #MISCS \\n[#MISC_NUM] +. sp -\\n[#MISCS]+1 +. nr #NEXT_MISC 0 1 +. while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ +. ie \\n[#DOC_COVER_MISC_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] +. br +. \} +. el \{\ +. PRINT \\*[$MISC_\\n+[#NEXT_MISC]] +. br +. \} +.\} +. \} +. \} +.\" Cover +. el \{\ +. if !r#COVER_START_POS \{\ +. nr #COVER_START_POS \\n[#PAGE_LENGTH]/3 +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. LS \\n[#DOC_LEAD]u\\*[$COVER_LEAD_ADJ] +. nr #COVER_LEAD \\n[#LEAD] +. \} +. PRINT \& +. sp |\\n[#COVER_START_POS]u-1v +. if \\n[#COVER_COLOR]=1 \{\ +. nf +\m[\\*[$COVER_COLOR]] +. EOL +. \} +. CENTER +. FAMILY \\*[$COVER_TITLE_FAM] +. FT \\*[$COVER_TITLE_FT] +. PT_SIZE \\*[$COVER_TITLE_PT_SIZE] +. LS \\n[#COVER_LEAD]u +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. if \\n[#COVER_TITLE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$TITLE]\m[] +. \} +. el \{ .PRINT \\*[$TITLE] \} +. \} +. \} +. if \\n[#COVER_TITLE]=2 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$DOC_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$DOC_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$DOC_TITLE] \} +. \} +. \} +. if \\n[#COVER_TITLE]=3 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. \} +. if \\n[#COVER_TITLE]=4 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. if \\n[#COVER_TITLE]=5 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. if !'\\*[$CHAPTER_TITLE]'' \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. \} +. el \{\ +. FAMILY \\*[$COVER_CHAPTER_TITLE_FAM] +. FT \\*[$COVER_CHAPTER_TITLE_FT] +. PT_SIZE \\*[$COVER_CHAPTER_TITLE_PT_SIZE] +. ie \\n[#COVER_CHAPTER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. \} +. if \\n[#COVER_TITLE]=6 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$COVER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$COVER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$COVER_TITLE] \} +. \} +. \} +. if \\n[#COVER_SUBTITLE]=1 \{\ +. FAMILY \\*[$COVER_SUBTITLE_FAM] +. FT \\*[$COVER_SUBTITLE_FT] +. PT_SIZE \\*[$COVER_SUBTITLE_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. ie \\n[#COVER_SUBTITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE]\m[] +. \} +. el \{ .PRINT \\*[$SUBTITLE] \} +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if !r#COVER_SUBTITLE \{ .SP \} +. \} +. if \\n[#COVER_AUTHOR]=1 \{\ +. FAMILY \\*[$COVER_AUTHOR_FAM] +. FT \\*[$COVER_AUTHOR_FT] +. PT_SIZE \\*[$COVER_AUTHOR_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u/2u +. \} +. if !'\\*[$ATTRIBUTE_STRING]'' \{\ +. ie \\n[#COVER_ATTRIBUTE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] +. \} +. el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} +. \} +. PRINT_AUTHORS +. \} +. FAMILY \\*[$COVER_DOCTYPE_FAM] +. FT \\*[$COVER_DOCTYPE_FT] +. PT_SIZE \\*[$COVER_DOCTYPE_PT_SIZE] +. SP +. if \\n[#COVER_DOCTYPE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u +. UNDERSCORE2 "\\*[$DOC_TYPE] +. \} +. el \{\ +. ie \\n[#COVER_DOCTYPE_COLOR]=1 \{\ +. COLOR \\*[$COVER_DOCTYPE_COLOR] +. UNDERSCORE "\\*[$DOC_TYPE] +. \} +. el .UNDERSCORE "\\*[$DOC_TYPE] +. \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. \} +. el \{\ +. FAMILY \\*[$COVER_COPYRIGHT_FAM] +. FT \\*[$COVER_COPYRIGHT_FT] +. AUTOLEAD 2 +. PT_SIZE \\*[$COVER_COPYRIGHT_PT_SIZE] +. \} +. if \\n[#COVER_COPYRIGHT]=1 \{\ +. QUAD \\*[$COVER_COPYRIGHT_QUAD] +. ie \\n[#COVER_COPYRIGHT_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] +. \} +. el \{ .PRINT \\*[$COPYRIGHT] \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. if \\n[#COVER_MISC]=1 \{\ +. QUAD \\*[$COVER_MISC_QUAD] +. nr #MISCS \\n[#MISC_NUM] +. sp -\\n[#MISCS]+1 +. nr #NEXT_MISC 0 1 +. while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ +. ie \\n[#COVER_MISC_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] +. br +. \} +. el \{\ +. PRINT \\*[$MISC_\\n+[#NEXT_MISC]] +. br +. \} +.\} +. \} +. \} +. EOL +. TRAP +. NEWPAGE +. ev +. if \\n[#PAGINATION_WAS_ON] \{\ +. rr #PAGINATION_WAS_ON +. PAGINATE +. PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]-1 +. \} +. if \\n[#HEADERS_WERE_ON] \{\ +. rr #HEADERS_WERE_ON +. HEADERS +. \} +. if \\n[#FOOTERS_WERE_ON] \{\ +. rr #FOOTERS_WERE_ON +. FOOTERS +. \} +. if \\n[#COLUMNS_WERE_ON]=1 \{\ +. rr #COLUMNS_WERE_ON 1 +. nr #COLUMNS 1 +. \} +. rr #DOING_COVER +.END +\# +\# +.MAC START END +. if !\\n[#PRINT_STYLE] \{\ +. PRINTSTYLE TYPEWRITE +. PRINT \& +. po 6P +. ll 39P +. ta \\n(.lu +. sp |1i-1v +. CENTER +. PRINT "You neglected to enter a PRINTSTYLE" +. fl +. ab PRINTSTYLE missing +. \} +. nr #DOCS 1 +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} +. if \\n[#COLLATE] \{\ +. COPYSTYLE \\*[$COPY_STYLE] +. nr #HEADERS_ON \\n[#HEADER_STATE] +. if \\n[#PAGE_NUM_V_POS]=1 \{ .nr #PAGINATE \\n[#PAGINATION_STATE] \} +. sp |\\n[#HEADER_MARGIN]u +. PRINT \& +. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ +. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] +. rm $RESTORE_PAGENUM_STYLE +. \} +. \} +. DEFAULTS +.\" Quote and blockquote default leads are the same as #DOC_LEAD, so +.\" they have to be set after DEFAULTS (where DOC_LEAD is finalized) +. if !r#Q_AUTOLEAD \{ .nr #Q_LEAD \\n[#DOC_LEAD] \} +. if !r#BQ_AUTOLEAD \{ .nr #BQ_LEAD \\n[#DOC_LEAD] \} +. if !r#EN_Q_AUTOLEAD \{ .nr #EN_Q_LEAD \\n[#EN_LEAD] \} +. if !r#EN_BQ_AUTOLEAD \{ .nr #EN_BQ_LEAD \\n[#EN_LEAD] \} +.\" Covers and doc covers +. if \\n[#DOC_COVERS]=1 \{\ +. if \\n[#DOC_COVER]=1 \{\ +. DO_DOC_COVER +. rr #DOC_COVER +. rr #DOC_COVER_TITLE +. rr #DOC_COVER_SUBTITLE +. rr #DOC_COVER_AUTHOR +. rr #DOC_COVER_DOCTYPE +. rr #DOC_COVER_COPYRIGHT +. rr #DOC_COVER_MISC +. \} +. \} +. if \\n[#COVERS]=1 \{\ +. if \\n[#COVER]=1 \{\ +. DO_COVER +. rr #COVER +. rr #COVER_TITLE +. rr #COVER_SUBTITLE +. rr #COVER_AUTHOR +. rr #COVER_DOCTYPE +. rr #COVER_COPYRIGHT +. rr #COVER_MISC +. \} +. \} +.\" Collate related stuff +. ie \\n[#COLLATED_DOC]=1 \{\ +.\" Collect TITLE for TOC. +. nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] +. af #TOC_ENTRY_PN \\g[#PAGENUMBER] +. ie \\n[#USER_SET_TITLE_ITEM] \{\ +. ds $TOC_TITLE_ITEM \\*[$USER_SET_TITLE_ITEM]\\| +. rr #USER_SET_TITLE_ITEM +. rm $USER_SET_TITLE_ITEM +. \} +. el \{\ +. ie \\n[#DOC_TYPE]=2 \{\ +. ie '\\*[$CHAPTER_TITLE]'' \{\ +. ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER]\\| +. \} +. el \{\ +. ie '\\*[$CHAPTER]'' \{\ +. ds $TOC_TITLE_ITEM \\*[$CHAPTER_TITLE]\\| +. \} +. el \{\ +. ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]\\| +. \} +. \} +. \} +. el \{\ +. ds $TOC_TITLE_ITEM \\*[$TITLE]\\| +. \} +. \} +. if \\n[#TOC_AUTHORS]=1 \{\ +. ie '\\*[$TOC_AUTHORS]'' \{\ +. as $TOC_TITLE_ITEM /\\|\\*[$AUTHOR_1]\\| +. \} +. el \{\ +. as $TOC_TITLE_ITEM /\\|\\*[$TOC_AUTHORS]\\| +. rm $TOC_AUTHORS +. \} +. \} +.\" Note the use of \!, which transparently embeds the macros used +.\" in the TOC_ENTRIES diversion. The elements they control must be +.\" processed literally when the diversion is output. +. ev TOC_EV +. da TOC_ENTRIES +. if \\n[#PRINT_STYLE]=1 \{\ +\!. fam C +\!. ft R +\!. ps 12 +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +\!. FAMILY \\*[$TOC_TITLE_FAM] +\!. FT \\*[$TOC_TITLE_FT] +\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_TITLE_SIZE_CHANGE] +. \} +\!. TRAP OFF +. ie \\n[#PRINT_STYLE]=1 \{\ +\!. PAD "\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN_TYPEWRITE]" +. \} +. el \{\ +\!. PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN]" +. \} +\!. EOL +\!. ST 100 L +\!. ST 101 R +. if \\n[#PRINT_STYLE]=2 \{\ +\!. FAMILY \\*[$TOC_PN_FAM] +\!. FT \\*[$TOC_PN_FT] +\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_PN_SIZE_CHANGE] +. \} +\!. TAB 100 +\!. PRINT \\*[LEADER] +\!. TN +\!. TRAP +\!. PRINT \\n[#TOC_ENTRY_PN] +\!. TQ +. di +. ev +. \} +. el \{\ +. nr #FIRST_DOC_TITLE_PN \\n%+\\n[#PAGE_NUM_ADJ] +. af #FIRST_DOC_TITLE_PN \\g[#PAGENUMBER] +. nr #FIRST_DOC_TOC_PN_PADDING \\n[#TOC_PN_PADDING] +. \} +.\" End TITLE collection +. if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\ +. sp |\\n[#HEADER_MARGIN]u +. PRINT_PAGE_NUMBER +. \} +. rr #COLLATE +. rr #PAGINATION_STATE +.\" End collate stuff +. ie \\n[#DOC_HEADER]=0 \{\ +. PRINT \& +. if \\n[#DOC_TYPE]=4 \{\ +. if !'\\n(.z'' \{ .di \} +. \} +. nr #STORED_PP_INDENT \\n[#PP_INDENT] +. PARA_INDENT 0 +. PP +. PARA_INDENT \\n[#STORED_PP_INDENT]u +. rr #STORED_PP_INDENT +. ie r#ADVANCE_FROM_TOP \{\ +. sp |\\n[#ADVANCE_FROM_TOP]u-1v +. if \\n[#ADJ_DOC_LEAD]=1 \{ .SHIM \} +. \} +. el \{ .sp |\\n[#T_MARGIN]u-1v \} +. if \\n[#COLUMNS] \{\ +. mk dc +. nr #COL_NUM 0 1 +. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. ll \\n[#COL_L_LENGTH]u +. \} +. nr #PP 0 +. rr #DOC_HEADER +. if r#ADVANCE_FROM_TOP \{ .rr #ADVANCE_FROM_TOP \} +. \} +. el \{\ +. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] \} +. nr #DOCHEADER_LEAD \\n[#LEAD] +.\" Default +. if \\n[#DOC_TYPE]=1 \{\ +. PRINT \& +. sp |\\n[#DOCHEADER_ADVANCE]u-1v +. ev DOCHEADER +. if \\n[#DOCHEADER_COLOR]=1 \{\ +. nf +\m[\\*[$DOCHEADER_COLOR]] +. EOL +. \} +. L_MARGIN \\n[#DOC_L_MARGIN]u +. LL \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. if \\n[#PRINT_STYLE]=1 \{\ +. CENTER +. TYPEWRITER +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. CAPS +. if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\} +. CAPS OFF +. if !'\\*[$SUBTITLE]'' \{\ +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. PRINT \\*[$SUBTITLE] +. \} +. if '\\*[$SUBTITLE]'' \{\ +. ALD \\n[#DOC_LEAD]u +. \} +. ie !'\\*[$AUTHOR_1]'' \{\ +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. if !d$SUBTITLE \{\ +. ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} +. el \{ .ALD \\n[#DOC_LEAD]u*2u \} +. \} +. PRINT \\*[$ATTRIBUTE_STRING] +. nr #AUTHORS \\n[#AUTHOR_NUM] +. nr #NEXT_AUTHOR 0 1 +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] +.\} +. if \\n[#AUTHOR_LINES]=1 \{\ +. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \} +. el \{ .ALD \\n[#DOC_LEAD]u/2u \} +. \} +. \} +. el \{\ +. ie !d$SUBTITLE \{\ +. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u*2u \} +. el \{ .RLD \\n[#DOC_LEAD]u \} +. \} +. el \{\ +. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u*2u \} +. el \{ .ALD \\n[#DOC_LEAD]u \} +. \} +. \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. DEFAULT_DOCHEADER +. di DOCHEADER_DIVERSION \" This diversion is only +. br \" necessary to find the depth of the +. DEFAULT_DOCHEADER \" docheader +. br +. di +. nr #DOCHEADER_DEPTH \\n(dn-\\n[#DOCHEADER_LEAD] \"Storing the depth (height) of the diversion +. \"in #DOCHEADER_DEPTH +. rm DOCHEADER_DIVERSION \" Removing the diversion macro +. \} +. ev +. \} +.\" Chapter +. if \\n[#DOC_TYPE]=2 \{\ +. PRINT \& +. sp |\\n[#DOCHEADER_ADVANCE]u-1v +. ev DOCHEADER +. if \\n[#DOCHEADER_COLOR]=1 \{\ +. nf +\m[\\*[$DOCHEADER_COLOR]] +. EOL +. \} +. L_MARGIN \\n[#DOC_L_MARGIN]u +. LL \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. if \\n[#PRINT_STYLE]=1 \{\ +. CENTER +. TYPEWRITER +. vs \\n[#DOC_LEAD]u +. ie '\\*[$CHAPTER]'' \{\ +. CAPS +. ie !'\\*[$CHAPTER_TITLE]'' \{\ +. PRINT \\*[$CHAPTER_TITLE] +. \} +. el \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] +. \} +. CAPS OFF +. \} +. el \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. if !'\\*[$CHAPTER_TITLE]'' \{\ +. if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} +. UNDERSCORE "\\*[$CHAPTER_TITLE] +. \} +. \} +. if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. CHAPTER_DOCHEADER +. di DOCHEADER_DIVERSION \" This diversion is only +. br \" necessary to find the depth of the +. CHAPTER_DOCHEADER \" docheader +. br +. di +. nr #DOCHEADER_DEPTH \\n(dn-\\n[#DOCHEADER_LEAD] \" Storing the depth (height) of the diversion +. \" in #DOCHEADER_DEPTH +. rm DOCHEADER_DIVERSION \" Removing the diversion macro +. \} +. ev +. \} +.\" Named +. if \\n[#DOC_TYPE]=3 \{\ +. PRINT \& +. sp |\\n[#DOCHEADER_ADVANCE]u-1v +. ev DOCHEADER +. if \\n[#DOCHEADER_COLOR]=1 \{\ +. nf +\m[\\*[$DOCHEADER_COLOR]] +. EOL +. \} +. L_MARGIN \\n[#DOC_L_MARGIN]u +. LL \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. if \\n[#PRINT_STYLE]=1 \{\ +. CENTER +. TYPEWRITER +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. CAPS +. if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\} +. CAPS OFF +. if !'\\*[$SUBTITLE]'' \{\ +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. PRINT \\*[$SUBTITLE] +. \} +. if '\\*[$SUBTITLE]'' \{\ +. ALD \\n[#DOC_LEAD]u +. \} +. ie !'\\*[$AUTHOR_1]'' \{\ +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. if !d$SUBTITLE \{\ +. ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} +. el \{ .ALD \\n[#DOC_LEAD]u*2u \} +. \} +. PRINT \\*[$ATTRIBUTE_STRING] +. nr #AUTHORS \\n[#AUTHOR_NUM] +. nr #NEXT_AUTHOR 0 1 +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] +.\} +. if \\n[#AUTHOR_LINES]=1 \{\ +. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \} +. el \{ .ALD \\n[#DOC_LEAD]u/2u \} +. \} +. vs \\n[#DOC_LEAD]u +. \} +. el \{\ +. ie !d$SUBTITLE \{\ +. ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u*2u \} +. el \{ .RLD \\n[#DOC_LEAD]u \} +. \} +. el \{\ +. ie \\n[#SINGLE_SPACE] \{ . \} +. el \{ .RLD \\n[#DOC_LEAD]u \} +. \} +. \} +. ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u*2u \} +. el \{ .ALD \\n[#DOC_LEAD]u \} +. UNDERSCORE2 "\\*[$DOC_TYPE] +. if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. NAMED_DOCHEADER +. di DOCHEADER_DIVERSION \" This diversion is only +. br \" necessary to find the depth of the +. NAMED_DOCHEADER \" docheader +. br +. di +. nr #DOCHEADER_DEPTH \\n(dn-\\n[#DOCHEADER_LEAD] \"Storing the depth (height) of the diversion +. \"in #DOCHEADER_DEPTH +. rm DOCHEADER_DIVERSION \" Removing the diversion macro +. \} +. ev +. \} +. if !\\n[#DOC_TYPE]=4 \{\ +. if \\n[#PRINT_STYLE]=1 \{ .ALD \\n[#DOC_LEAD]u \} +. nr #DOCHEADER_SPACE_ADJ \\n[#DOCHEADER_DEPTH]%\\n[#DOC_LEAD] +. ie !\\n[#DOCHEADER_SPACE_ADJ]=0 \{ .nr #DOCHEADER_EXTRA_SPACE \\n[#DOC_LEAD]-\\n[#DOCHEADER_SPACE_ADJ] \} +. el \{ .nr #DOCHEADER_EXTRA_SPACE 0 \} +. if \\n[#PRINT_STYLE]=2 \{ .ALD (\\n[#DOC_LEAD]u*2u)+\\n[#DOCHEADER_EXTRA_SPACE]u \} +. if \\n[#COLUMNS] \{\ +. nr #COL_NUM 0 1 +. nr #L_LENGTH_FOR_EPI \\n[#L_LENGTH] +. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. LL \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. mk dc +. \} +. \} +. \} +. LS \\n[#DOC_LEAD]u +. if \\n[#ADJ_DOC_LEAD]=1 \{ .SHIM \} +. QUAD \\*[$DOC_QUAD] +. CLEANUP_DEFAULTS +. nr #START_FOR_FOOTERS 1 +. if \\n[#COLLATED_DOC]=1 \{\ +. if !\\n[MNinit_DEFERRED]=1 \{\ +. MN_INIT rerun +. \} +. \} +. if \\n[#MNinit_DEFERRED]=1 \{\ +. rr #MNinit_DEFERRED +. nr #START_FOR_MNinit 1 +. MN_INIT \\*[$MN-arg1] \\*[$MN-arg2] \\*[$MN-arg3] \\*[$MN-arg4] \\*[$MN-arg5] \\*[$MN-arg6] \\*[$MN-arg7] \\*[$MN-arg8] \\*[$MN-arg9] +. \} +. nr #START_FOR_MNinit 2 +. if !\\n[#DOC_TYPE]=4 \{ .em TERMINATE \} +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} +. if \\n[#RUN_ON]=1 \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{ .RUNON_WARNING \} +. if \\n[#FN_MARKER_STYLE]=2 \{ .RUNON_WARNING \} +. \} +.END +\# +.MAC CLEANUP_DEFAULTS END +. nr #START 1 +.\" Family strings for docheader +. rm $AUTHOR_FAM +. rm $CHAPTER_TITLE_FAM +. rm $DOCTYPE_FAM +. rm $SUBTITLE_FAM +. rm $TITLE_FAM +.\" Family strings for cover +. rm $COVER_AUTHOR_FAM +. rm $COVER_CHAPTER_TITLE_FAM +. rm $COVER_COPYRIGHT_FAM +. rm $COVER_DOCTYPE_FAM +. rm $COVER_LEAD_ADJ +. rm $COVER_SUBTITLE_FAM +. rm $COVER_TITLE_FAM +.\" Family strings for doc cover +. rm $DOC_COVER_AUTHOR_FAM +. rm $DOC_COVER_CHAPTER_TITLE_FAM +. rm $DOC_COVER_COPYRIGHT_FAM +. rm $DOC_COVER_DOCTYPE_FAM +. rm $DOC_COVER_LEAD_ADJ +. rm $DOC_COVER_SUBTITLE_FAM +. rm $DOC_COVER_TITLE_FAM +.\" Quad args to copyright and misc +. rm $COVER_COPYRIGHT_QUAD +. rm $COVER_MISC_QUAD +. rm $DOC_COVER_COPYRIGHT_QUAD +. rm $DOC_COVER_MISC_QUAD +.\" Miscellaneous strings +. rm $TOC_TITLE_ITEM +. rm $DOCHEADER_LEAD_ADJ +.\" Various registers +. rr #ADJ_DOC_LEAD +. rr #ADVANCE_FROM_TOP +. rr #AUTHOR_NUM +. rr #AUTHORS +. rr #COVER_LEAD +. rr #DEPTH_1 +. rr #DEPTH_2 +. rr #DOC_COVER_LEAD +. rr #DOCHEADER_ADVANCE +. rr #DOCHEADER_EXTRA_SPACE +. rr #DOCHEADER_LEAD +. rr #DOCHEADER_SPACE_ADJ +. rr #MISC_NUM +. rr #MISCS +. rr #NEXT_AUTHOR +. rr #NEXT_MISC +. rr #NUM_AUTHORS +.END +\# +\# ==================================================================== +\# +\# +++MACROS TO CHANGE SOME DEFAULTS+++ +\# +\# DOCUMENT HEADER +\# --------------- +\# *Argument: +\# | [distance to advance from top of page] +\# *Function: +\# Turns printing of document header on or off. If a second argument +\# in units of measure is given, advances that distance from the +\# top of the page without printing the document header. +\# *Notes: +\# Default is on. If the 1st argument is (which turns +\# document headers off), the optional 2nd argument may be given +\# (with a unit of measure). +\# +.MAC DOCHEADER END +. ie '\\$1'' \{ .nr #DOC_HEADER 1 \} +. el \{\ +. if !'\\$2'' \{ .nr #ADVANCE_FROM_TOP (\\$2) \} +. nr #DOC_HEADER 0 +. \} +.END +\# +\# +\# DOCUMENT HEADER LEADING +\# ----------------------- +\# *Arguments: +\# <+|- amount by which to in/decrease leading of doc header> +\# *Function: +\# Stores user supplied lead in/decrease in string $DOCHEADER_LEAD_ADJ. +\# *Notes: +\# A unit of measure must be supplied. Decimal fractions OK. +\# Default is +0, i.e. same as DOC_LEAD. +\# +.MAC DOCHEADER_LEAD END +. ds $DOCHEADER_LEAD_ADJ \\$1 +.END +\# +\# +\# DOCHEADER ADVANCE +\# ----------------- +\# *Arguments: +\# +\# *Function: +\# Creates register #DOCHEADER_ADVANCE, used in START. +\# *Notes: +\# Unit of measure required. +\# Default is same as T_MARGIN. +\# +.MAC DOCHEADER_ADVANCE END +. nr #DOCHEADER_ADVANCE (\\$1) +.END +\# +\# +\# DOCUMENT LEFT MARGIN +\# -------------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #DOC_L_MARGIN. +\# *Notes: +\# Affects EVERYTHING on the page. +\# +.MAC DOC_LEFT_MARGIN END +. br +. nr #DOC_L_MARGIN (\\$1) +. L_MARGIN \\n[#DOC_L_MARGIN]u +.END +\# +\# +\# DOCUMENT RIGHT MARGIN +\# --------------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #DOC_R_MARGIN. +\# *Notes: +\# Affects EVERYTHING on the page. +\# +.MAC DOC_RIGHT_MARGIN END +. br +. nr #DOC_R_MARGIN (\\$1) +. R_MARGIN \\n[#DOC_R_MARGIN] +. nr #DOC_L_LENGTH \\n[#L_LENGTH] +.END +\# +\# +\# DOCUMENT LINE LENGTH +\# -------------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $DOC_L_LENGTH. +\# *Notes: +\# Affects EVERYTHING on the page. +\# +.MAC DOC_LINE_LENGTH END +. br +. nr #DOC_L_LENGTH (\\$1) +. LL \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +.END +\# +\# +\# DOCUMENT FAMILY +\# --------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $DOC_FAM. +\# *Notes: +\# Affects everything EXCEPT headers and footers. +\# +.MAC DOC_FAMILY END +. br +. ds $DOC_FAM \\$1 +. ds $FAMILY \\*[$DOC_FAM] +. TITLE_FAMILY \\*[$DOC_FAM] +. SUBTITLE_FAMILY \\*[$DOC_FAM] +. AUTHOR_FAMILY \\*[$DOC_FAM] +. DOCTYPE_FAMILY \\*[$DOC_FAM] +. HEAD_FAMILY \\*[$DOC_FAM] +. SUBHEAD_FAMILY \\*[$DOC_FAM] +. QUOTE_FAMILY \\*[$DOC_FAM] +. BLOCKQUOTE_FAMILY \\*[$DOC_FAM] +. EPIGRAPH_FAMILY \\*[$DOC_FAM] +. HDRFTR_FAMILY \\*[$DOC_FAM] +. FOOTNOTE_FAMILY \\*[$DOC_FAM] +.END +\# +\# +\# DOCUMENT POINT SIZE +\# ------------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #DOC_PT_SIZE. +\# *Notes: +\# DOC_PT_SIZE is the basis for calculating all type sizes in +\# a document. +\# +.MAC DOC_PT_SIZE END +. if \\n[#IGNORE] \{ .return \} +. br +. PT_SIZE \\$1 +. nr #DOC_PT_SIZE \\n[#PT_SIZE] +.END +\# +\# +\# DOCUMENT LEAD +\# ------------- +\# *Argument: +\# [ADJUST] +\# *Function: +\# Creates or modifies register #DOC_LEAD. If the optional +\# ADJUST argument is given, adjusts leading so that the last +\# line of text falls exactly on #B_MARGIN. +\# *Notes: +\# DOC_LEAD is the basis for calculating all leading changes in +\# a document. Default for TYPESET is 16; 24 for TYPEWRITE. +\# +\# Because the visible bottom or footer margin of a page depends +\# on the overall document lead supplied by the register #DOC_LEAD, +\# DOC_LEAD, in the body of a document, should always be associated +\# with the start of a new page (in other words, just before or +\# just after a manual NEWPAGE). +\# +.MAC DOC_LEAD END +. if \\n[#IGNORE] \{ .return \} +. br +. vs \\$1 +. nr #DOC_LEAD \\n[#LEAD] +. if '\\$2'ADJUST' \{ .TRAPS \} +.END +\# +\# +\# ADJUST DOCUMENT LEAD +\# -------------------- +\# *Arguments: +\# | +\# *Function: +\# Adjusts document lead so that the last line of text falls exactly +\# on #B_MARGIN. +\# +.MAC DOC_LEAD_ADJUST END +. ie '\\$1'' \{\ +. nr #ADJ_DOC_LEAD 1 +. \} +. el \{\ +. nr #ADJ_DOC_LEAD 0 +. nr #DOC_LEAD_ADJUST_OFF 1 +. \} +.END +\# +\# +\# SHIM +\# ---- +\# *Argument: +\# None +\# *Function: +\# Advances to the next "legal" baseline. +\# *Notes: +\# If a user plays around with spacing in a doc (say, with ALD), +\# it isn't easy to get mom back on track so she can achieve +\# perfectly flush bottom margins. Any time SHIM is used, it +\# ensures that the next output line falls on a legal baseline. +\# +\# First, a little convenience macro +\# +.MAC PROCESS_SHIM END +. while \\n+[#LEGAL_BASELINE]<\\n[#CURRENT_V_POS] \{\ +. +.\} +. nr #SHIM \\n[#LEGAL_BASELINE]-\\n[#CURRENT_V_POS] +.END +\# +\# +.MAC SHIM END +. nr #LEGAL_BASELINE \\n[#T_MARGIN]-1v \\n[#DOC_LEAD] +. if !r#CURRENT_V_POS \{ .nr #CURRENT_V_POS \\n(.d \} +. ie r#ADVANCE_FROM_TOP \{\ +. ie \\n[#CURRENT_V_POS]<(\\n[#T_MARGIN]-1v) \{\ +. while \\n-[#LEGAL_BASELINE]>\\n[#CURRENT_V_POS] \{\ +. +.\} +. nr #LEGAL_BASELINE +\\n[#DOC_LEAD] +. nr #SHIM \\n[#LEGAL_BASELINE]-\\n[#CURRENT_V_POS] +. \} +. el \{\ +. PROCESS_SHIM +. \} +. \} +. el \{\ +. PROCESS_SHIM +. \} +. ALD \\n[#SHIM]u +. rr #CURRENT_V_POS +.END +\# +\# +\# +\# ==================================================================== +\# +\# +++INTERNATIONALIZATION+++ +\# +\# ATTRIBUTE STRING +\# ---------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $ATTRIBUTE_STRING. +\# *Notes: +\# Default is "by". A blank string ("") may be used if no +\# attribution is desired. +\# +.MAC ATTRIBUTE_STRING END +. ds $ATTRIBUTE_STRING \\$1 +.END +\# +\# +\# CHAPTER STRING +\# -------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $CHAPTER_STRING. +\# *Notes: +\# Default is "chapter". +\# +.MAC CHAPTER_STRING END +. ds $CHAPTER_STRING \\$1 +.END +\# +\# +\# DRAFT STRING +\# ------------ +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $DRAFT_STRING. +\# *Notes: +\# Default is "draft". +\# +.MAC DRAFT_STRING END +. ds $DRAFT_STRING \\$1 +.END +\# +\# +\# REVISION STRING +\# --------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $REVISION_STRING. +\# *Notes: +\# Default is "revision". +\# +.MAC REVISION_STRING END +. ds $REVISION_STRING \\$1 +.END +\# +\# +\# FINIS STRING +\# ------------ +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $FINIS_STRING. +\# *Notes: +\# Default is "END". +\# +.MAC FINIS_STRING END +. nr #FINIS 1 +. CAPS +. ds $FINIS_STRING \\$1 +. CAPS OFF +.END +\# +\# +\# ==================================================================== +\# +\# +++RECTO/VERSO+++ +\# +\# RECTO_VERSO +\# ----------- +\# *Arguments: +\# | +\# *Function: +\# Switches HDRFTR_LEFT and HDRFTR_RIGHT on alternate pages. Also +\# switches page numbers left and right if either is chosen rather +\# than the default centered page numbers. Switches left and right +\# margins if differing values have been entered. +\# *Notes: +\# Default is OFF. +\# +.MAC RECTO_VERSO END +. ie '\\$1'' \{ .nr #RECTO_VERSO 1 \} +. el \{ .nr #RECTO_VERSO 0 \} +.END +\# +\# ==================================================================== +\# +\# +++EPIGRAPHS+++ +\# +\# EPIGRAPH INDENT +\# --------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #EPI_OFFSET_VALUE. +\# *Notes: +\# Default is 2 for TYPEWRITE, 3 for TYPESET. +\# +.MAC EPIGRAPH_INDENT END +. nr #EPI_OFFSET_VALUE \\$1 +.END +\# +\# +\# EPIGRAPH AUTOLEAD +\# ----------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #EPI_AUTOLEAD. +\# *Notes: +\# Default is 2 (for TYPESET; TYPEWRITE doesn't require this). +\# +.MAC EPIGRAPH_AUTOLEAD END +. nr #EPI_AUTOLEAD \\$1 +.END +\# +\# +\# EPIGRAPH +\# -------- +\# *Arguments: +\# BLOCK | +\# *Function: +\# Places an epigraph before the document's text, after the +\# document header, or after a HEAD. +\# *Notes: +\# #EPIGRAPH 1 = centered; 2 = block +\# +\# By default, epigraphs are centered, allowing the user +\# to input them on a line per line basis. To change this +\# behaviour, the user can supply the argument BLOCK, which +\# will produce indented, filled text similar to BLOCKQUOTE. +\# +\# If a block epigraph contains more than one para, ALL paras of +\# the epigraph must be preceded by PP. Otherwise, PP is optional. +\# +.MAC EPIGRAPH END +. nr #PP_STYLE 2 +. nr #Q_PP 0 +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} +. if \\n[#START] \{\ +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#AUTHOR_LINES]=1 \{ .ALD \\n[#DOC_LEAD]u \} +. \} +. \} +. ie '\\$1'' \{\ +. nr #EPIGRAPH 1 +. ev EPIGRAPH +. nr #IN_DIVER 1 +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +. CHECK_INDENT +. if \\n[#COLUMNS] \{\ +. ie \\n[#START] \{\ +. ll \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. \} +. \} +. CENTER +. if \\n[#PRINT_STYLE]=1 \{\ +. fam C +. ft R +. if '\\*[$EPI_FT]'I' \{\ +. FT I +. \} +. ps 12 +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. nr #EPI_LEAD \\n[#LEAD] +. nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. FAMILY \\*[$EPI_FAM] +. FT \\*[$EPI_FT] +. PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] +. if \\n[#EPI_COLOR]=1 \{\ +. nf +\m[\\*[$EPI_COLOR]] +. EOL +. \} +. AUTOLEAD \\n[#EPI_AUTOLEAD] +. nr #EPI_LEAD \\n[#LEAD] +. nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] +. \} +. di EPI_TEXT +. nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 +. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p +. hy 14 +. nr #EPI_ACTIVE 1 +. \} +. el \{\ +. ie '\\$1'BLOCK' \{\ +. nr #EPIGRAPH 2 +. ev EPIGRAPH +. ie \\n[#START] \{\ +. ie \\n[#COLUMNS] \{\ +. ll \\n[#L_LENGTH_FOR_EPI]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) +. ta \\n(.lu +. \} +. el \{\ +. ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) +. ta \\n(.lu +. \} +. \} +. el \{\ +. ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) +. ta \\n(.lu +. if \\n[#COLUMNS] \{\ +. ll \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*(\\n[#EPI_OFFSET_VALUE]u*2u)) +. ta \\n(.lu +. \} +. CHECK_INDENT +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. fam C +. ft R +. if '\\*[$EPI_FT]'I' \{\ +. FT I +. \} +. ps 12 +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. QUAD LEFT +. HY OFF +. nr #EPI_LEAD \\n[#LEAD] +. nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] +. di EPI_TEXT +. nr #EPI_ACTIVE 1 +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. FAMILY \\*[$EPI_FAM] +. FT \\*[$EPI_FT] +. PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$EPI_SIZE_CHANGE] +. if \\n[#EPI_COLOR]=1 \{\ +. nf +\m[\\*[$EPI_COLOR]] +. EOL +. \} +. AUTOLEAD \\n[#EPI_AUTOLEAD] +. QUAD \\*[$EPI_QUAD] +. nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 +. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p +. hy 14 +. nr #EPI_LEAD \\n[#LEAD] +. nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] +. di EPI_TEXT +. nr #EPI_ACTIVE 1 +. \} +. \} +. el \{\ +. DO_EPIGRAPH +. \} +. \} +.END +\# +\# +\# DO EPIGRAPH +\# ----------- +\# *Arguments: +\# +\# *Function: +\# Ends diversion started in EPIGRAPH. Makes spacing +\# adjustments to compensate for the difference between epigraph +\# leading and overall document leading, so that the bottom of +\# the pages remain flush. +\# *Notes: +\# In addition to its usual place at the beginning of a +\# document, EPIGRAPH may also be used after HEAD. +\# +.MAC DO_EPIGRAPH END +. br +. di +. rr #IN_DIVER +. if \\n[#RESET_FN_COUNTERS]=2 \{\ +. if !\\n[#FN_COUNT]=1 \{\ +. if ((\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS])+\\n[#DIVER_DEPTH])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ +. DIVER_FN_2_POST +. rr #RESET_FN_COUNTERS +. \} +. \} +. \} +. nr #SAVED_FN_NUMBER \\n[#FN_NUMBER] +. nr #DONE_ONCE 0 1 +. REMOVE_INDENT +. ev +. nr #EPI_DEPTH \\n[#DIVER_DEPTH]-\\n[#EPI_LEAD] +. nr #EPI_LINES \\n[#EPI_DEPTH]/\\n[#EPI_LEAD] +. ie \\n[#START] \{\ +. RLD \\n[#SHIM]u +. nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] +. while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. nr #EPI_WHITESPACE -\\n[#DOC_LEAD] +.\} +. if \\n[#PRINT_STYLE]=2 \{\ +. RLD \\n[#DOC_LEAD]u +. if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{\ +. ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u) +. \} +. if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u +. \} +. \} +. \} +. el \{\ +. ie \\n[#EPI_DEPTH]<\\n[#TRAP_DISTANCE] \{\ +. nr #EPI_FITS 1 +. nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] +. while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. nr #EPI_WHITESPACE -\\n[#DOC_LEAD] +.\} +. ie \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#EPI_WHITESPACE]=\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u/2u \} +. \} +. el \{\ +. if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{\ +. ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u) +. \} +. if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u +. \} +. \} +. if \\n[#DIVER_FN]=2 \{ .rr #DIVER_FN \} +. \} +. el \{\ +. nr #EPI_LINES_TO_TRAP 0 1 +. while \\n[#EPI_LEAD]*\\n+[#EPI_LINES_TO_TRAP]<\\n[#TRAP_DISTANCE] \{\ +. nr #LOOP 1 +.\} +. nr #EPI_LINES_TO_TRAP -1 +. nr #EPI_WHITESPACE (\\n[#EPI_LINES_TO_TRAP]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_TRAP]*\\n[#EPI_LEAD]) +. while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. nr #EPI_WHITESPACE -\\n[#DOC_LEAD] +.\} +. if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u \} +. if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u-\\n[#DOC_LEAD]u \} +. \} +. \} +. if \\n[#EPIGRAPH]=1 \{\ +. po \\n[#L_MARGIN]u +. if \\n[#COLUMNS] \{\ +. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. \} +. \} +. if \\n[#EPIGRAPH]=2 \{\ +. nr #EPI_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) +. if \\n[#COLUMNS] \{\ +. nr #EPI_OFFSET \\n[#COL_\\n[#COL_NUM]_L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) +. \} +. po \\n[#EPI_OFFSET]u +. \} +. nf +. EPI_TEXT +. br +. ie \\n[#START] \{\ +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} +. el \{\ +. ie \\n[#EPI_LINES]%2=1 \{ .ALD \\n[#DOC_LEAD]u \} +. el \{ .ALD \\n[#DOC_LEAD]u/2u \} +. \} +. SHIM +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{\ +. ALD \\n[#EPI_WHITESPACE]u/2u +. \} +. if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. ALD (\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u +. \} +. SHIM +. \} +. \} +. el \{\ +. rr #EPI_ACTIVE +. ie \\n[#EPI_FITS] \{\ +. ie \\n[#FN_FOR_EPI] \{\ +. nr #EPI_LINES_TO_END 1 +. nr #EPI_WHITESPACE (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) +. while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. nr #EPI_WHITESPACE -\\n[#DOC_LEAD] +.\} +. ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) +. \} +. el \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#EPI_WHITESPACE]=\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u \} +. \} +. el \{\ +. if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{\ +. ALD \\n[#EPI_WHITESPACE]u/2u +. \} +. if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. ALD (\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u +. \} +. \} +. \} +. \} +. el \{\ +. nr #EPI_LINES_TO_END \\n[#EPI_LINES]-\\n[#EPI_LINES_TO_TRAP] +. if \\n[#LOOP] \{ .nr #EPI_LINES_TO_END +1 \} +. rr #LOOP +. nr #EPI_WHITESPACE (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) +. while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ +. nr #EPI_WHITESPACE -\\n[#DOC_LEAD] +.\} +. ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) +. if \\n[#PRINT_STYLE]=1 \{\ +. if !\\n[#SINGLE_SPACE] \{\ +. nr #EPI_LINES_EVEN \\n[#EPI_LINES_TO_END]%2 +. ie \\n[#EPI_LINES_EVEN] \{ .ALD .5v \} +. el \{ .RLD .5v \} +. rr #EPI_LINES_EVEN +. \} +. \} +. \} +. \} +. nr #PP_STYLE 1 +. rr #EPI_FITS +. ALD \\n[#DOC_LEAD]u +. QUAD \\*[$DOC_QUAD] +. po \\n[#L_MARGIN]u +. if \\n[#COLUMNS] \{\ +. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. \} +. if \\n[#START] \{\ +. if \\n[#COLUMNS] \{\ +. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. mk dc +. \} +. \} +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} +.END +\# +\# ==================================================================== +\# +\# +++FINIS MACRO+++ +\# +\# FINIS +\# ----- +\# *Arguments: +\# +\# *Function: +\# Deposits --END-- at the end of a document. +\# +.MAC FINIS END +. br +. ev FINIS +. evc 0 +. if \\n[#TAB_ACTIVE] \{ .TQ \} +. if \\n[#INDENT_ACTIVE] \{ .IQ CLEAR \} +. nr #EM_ADJUST (1m/8) +. if \\n[#COLUMNS] \{\ +. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. \} +. ALD \\n[#DOC_LEAD]u +. CENTER +. if \\n[#PRINT_STYLE]=1 \{ .PRINT "--\\*[$FINIS_STRING]--\} +. if \\n[#PRINT_STYLE]=2 \{\ +. ie \\n[#FINIS_COLOR] \{\ +. PRINT "\m[\\*[$FINIS_COLOR]]\v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em\m[] +. \} +. el \{ .PRINT \v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em\m[] \} +. \} +. ev +.END +\# +\# ==================================================================== +\# +\# +++HEADERS/FOOTERS+++ +\# +\# Define a string so that the current page number can be incorporated +\# into the strings for hdrftr left, right, and center. NOTE: This is +\# not the same thing as using the shortform # in hdrftr strings. +\# +.ds PAGE# \En[#PAGENUMBER] +\# +\# +\# HDRFTR RULE GAP +\# --------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #HDRFTR_RULE_GAP to hold amount +\# of space between header/footer and header/footer rule. +\# *Notes: +\# Default is 4p. +\# +.MAC HDRFTR_RULE_GAP END +. nr #HDRFTR_RULE_GAP (\\$1) +.END +\# +\# +\# HDRFTR LEFT +\# ----------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $HDRFTR_LEFT. +\# Creates register #USER_DEF_HDRFTR_LEFT, which, if 1, +\# overrides the $HDRFTR_LEFT string created by default +\# in DEFAULTS. +\# *Notes: +\# Especially useful if doc has more than one author, and a list +\# of authors by last name is desired in header/footers. +\# Default is author. +\# +\# If the argument is the # character, simply prints the current +\# page number. +\# +\# If the user wants to *incorporate* the page number into the string, +\# \*[PAGE#] must be used. For example, if the user wants to put +\# an elipsis before the page number in the string, s/he should use +\# ...\*[PAGE#], not ...# +\# +.MAC HDRFTR_LEFT END +. nr #USER_DEF_HDRFTR_LEFT 1 +. ds $HDRFTR_LEFT \\$1 +.END +\# +\# +\# HDRFTR LEFT CAPS +\# ---------------- +\# *Argument: +\# | +\# *Function: +\# Turns capitalisation of $HDRFTR_LEFT (typically, the author of +\# the document) on or off. +\# *Notes: +\# Default is on. +\# +.MAC HDRFTR_LEFT_CAPS END +. ie '\\$1'' \{\ +. nr #HDRFTR_LEFT_CAPS 1 +. \} +. el \{\ +. nr #HDRFTR_LEFT_CAPS 0 +. ds $HDRFTR_LEFT_SIZE_CHANGE +0 +. \} +.END +\# +\# +\# HDRFTR CENTER +\# ------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $HDRFTR_CENTER. +\# Creates register #USER_DEF_HDRFTR_CENTER, which, if 1, +\# overrides the $HDRFTR_CENTER string created by default +\# in COPYSTYLE. +\# *Notes: +\# Default is document type if DOCTYPE NAMED, Chapter # if DOCTYPE +\# CHAPTER, draft and revision number if COPYSTYLE DRAFT. +\# +\# If the argument is the # character, simply prints the current +\# page number. +\# +\# If the user wants to *incorporate* the page number into the string, +\# \*[PAGE#] must be used. For example, if the user wants to put +\# an elipsis before the page number in the string, s/he should use +\# ...\*[PAGE#], not ...# +\# +.MAC HDRFTR_CENTER END +. nr #USER_DEF_HDRFTR_CENTER 1 +. if '\\$0'FOOTER_CENTER' \{\ +. ds $HDRFTR_CENTER_OLD \\*[$HDRFTR_CENTER] +. ds $HDRFTR_CENTER_NEW \\$1 +. \} +. if '\\$0'FOOTER_CENTRE' \{\ +. ds $HDRFTR_CENTER_OLD \\*[$HDRFTR_CENTER] +. ds $HDRFTR_CENTER_NEW \\$1 +. \} +. ds $HDRFTR_CENTER \\$1 +.END +\# +\# +\# HDRFTR CENTER CAPS +\# ------------------ +\# *Argument: +\# | +\# *Function: +\# Turns capitalisation of $HDRFTR_CENTER (typically, doctype of +\# the document) on or off. +\# *Notes: +\# Default is on. +\# +.MAC HDRFTR_CENTER_CAPS END +. ie '\\$1'' \{\ +. nr #HDRFTR_CENTER_CAPS 1 +. \} +. el \{\ +. nr #HDRFTR_CENTER_CAPS 0 +. ds $HDRFTR_CENTER_SIZE_CHANGE +0 +. \} +.END +\# +\# +\# HDRFTR CENTER PADDING +\# --------------------- +\# *Argument: +\# LEFT | RIGHT +\# *Function: +\# Creates or modifies registers #HDRFTR_CTR_PAD_LEFT or +\# #HDRFTR_CTR_PAD_RIGHT. +\# *Notes: +\# By default, the HDRFTR_CENTER string is centered on the doc +\# line length. Long titles or long author names can screw up +\# visual centering, or create overprints. This macro allows the +\# user to pad the center string by the specified amount of space +\# to fix these problems. Use only one of LEFT or RIGHT. +\# +\# A unit of measure is required. +\# +.MAC HDRFTR_CENTER_PAD END +. if '\\$1'LEFT' \{\ +. nr #HDRFTR_CTR_PAD_LEFT (\\$2) +. \} +. if '\\$1'RIGHT' \{\ +. nr #HDRFTR_CTR_PAD_RIGHT (\\$2) +. \} +.END +\# +\# +\# SWITCH HDRFTR CENTER PADDING SIDE - support macro +\# -------------------------------- +\# *Argument: +\# +\# *Function: +\# Switches the padding side of hdrftr center padding. +\# *Notes: +\# Required to keep spacing around hdrftr string constant +\# in recto/verso documents. +\# +.MAC SWITCH_HDRFTR_CENTER_PAD END +. nr #HDRFTR_CTR_PAD_TMP \\n[#HDRFTR_CTR_PAD_LEFT] +. HDRFTR_CENTER_PAD LEFT \\n[#HDRFTR_CTR_PAD_RIGHT]u +. HDRFTR_CENTER_PAD RIGHT \\n[#HDRFTR_CTR_PAD_TMP]u +.END +\# +\# +\# HDRFTR RIGHT +\# ------------ +\# *Argument: +\# +\# *Function: +\# Creates or modifies string $HDRFTR_RIGHT. +\# Creates register #USER_DEF_HDRFTR_RIGHT, which, if 1, +\# overrides the $HDRFTR_RIGHT string created by default +\# in DEFAULTS. +\# *Notes: +\# Default is document title. +\# +\# If the argument is the # character, simply prints the current +\# page number. +\# +\# If the user wants to *incorporate* the page number into the string, +\# \*[PAGE#] must be used. For example, if the user wants to put +\# an elipsis before the page number in the string, s/he should use +\# ...\*[PAGE#], not ...# +\# +.MAC HDRFTR_RIGHT END +. nr #USER_DEF_HDRFTR_RIGHT 1 +. ds $HDRFTR_RIGHT \\$1 +.END +\# +\# +\# HDRFTR RIGHT CAPS +\# ----------------- +\# *Argument: +\# | +\# *Function: +\# Turns capitalisation of $HDRFTR_RIGHT (typically, the title of +\# the document) on or off. +\# *Notes: +\# Default is on. +\# +.MAC HDRFTR_RIGHT_CAPS END +. ie '\\$1'' \{\ +. nr #HDRFTR_RIGHT_CAPS 1 +. \} +. el \{\ +. nr #HDRFTR_RIGHT_CAPS 0 +. ds $HDRFTR_RIGHT_SIZE_CHANGE +0 +. \} +.END +\# +\# +\# HDRFTR RULE +\# ----------- +\# *Arguments: +\# | +\# *Function: +\# If invoked via the alias HDRFTR_RULE_INTERNAL in HDRFTR, prints a rule +\# under the header/over the footer. Otherwise, turns HDRFTR_RULE +\# on or off. +\# +.MAC HDRFTR_RULE END \"To print rule under header/over footer. +. ie '\\$0'HDRFTR_RULE_INTERNAL' \{\ +. ie \\n[#USERDEF_HDRFTR] \{\ +. nr #CAP_HEIGHT_ADJUST \\n[#HDRFTR_HEIGHT] +. ps 12 +. if \\n[#HEADERS_ON] \{\ +. rt \\nyu +. ALD \\n[#HDRFTR_RULE_GAP]u +. \} +. if \\n[#FOOTERS_ON] \{\ +. rt \\nyu +. RLD \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+1p +. \} +. ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ +. PRINT \m[\\*[$HDRFTR_RULE_COLOR]]\\l'\\n[#DOC_L_LENGTH]u'\m[] +. \} +. el \{\ +. PRINT \\l'\\n[#DOC_L_LENGTH]u' +. \} +. br +. \} +. el \{\ +. if \\n[#PRINT_STYLE]=1 \{\ +. nr #CAP_HEIGHT_ADJUST \\n[#CAP_HEIGHT] +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. ie \\n[#LEFT_CAP_HEIGHT]>\\n[#CENTER_CAP_HEIGHT] \{\ +. nr #CAP_HEIGHT_ADJUST \\n[#LEFT_CAP_HEIGHT] +. \} +. el \{ .nr #CAP_HEIGHT_ADJUST \\n[#CENTER_CAP_HEIGHT] \} +. ie \\n[#CAP_HEIGHT_ADJUST]>\\n[#RIGHT_CAP_HEIGHT] \{\ +. nr #CAP_HEIGHT_ADJUST \\n[#CAP_HEIGHT_ADJUST] +. \} +. el \{ .nr #CAP_HEIGHT_ADJUST \\n[#RIGHT_CAP_HEIGHT] \} +. \} +. ps 12 +. if \\n[#HEADERS_ON] \{\ +. rt \\nyu +. ALD \\n[#HDRFTR_RULE_GAP]u +. \} +. if \\n[#FOOTERS_ON] \{\ +. rt \\nyu +. RLD \\n[#HDRFTR_RULE_GAP]u+\\n[#CAP_HEIGHT_ADJUST]u+1p +. \} +. ie \\n[#HDRFTR_RULE_COLOR]=1 \{\ +. PRINT \m[\\*[$HDRFTR_RULE_COLOR]]\\l'\\n[#DOC_L_LENGTH]u'\m[] +. \} +. el \{\ +. PRINT \\l'\\n[#DOC_L_LENGTH]u' +. \} +. br +. \} +. \} +. el \{\ +. ie '\\$1'' \{ .nr #HDRFTR_RULE 1 \} +. el \{ .nr #HDRFTR_RULE 0 \} +. \} +.END +\# +\# +.ALIAS HDRFTR_RULE_INTERNAL HDRFTR_RULE +\# +\# +\# HDRFTR PLAIN +\# ------------ +\# *Arguments: +\# +\# *Function: +\# Sets the family, font, and point size of all strings in +\# header/footers to the same family and point size as running +\# text. Font for the header/footer becomes roman throughout. +\# +.MAC HDRFTR_PLAIN END +. HDRFTR_FAMILY \\*[$DOC_FAM] +. HDRFTR_PT_SIZE \\n[#DOC_PT_SIZE] +. HDRFTR_LEFT_FAMILY \\*[$DOC_FAM] +. HDRFTR_LEFT_FONT R +. HDRFTR_LEFT_SIZE +0 +. HDRFTR_LEFT_CAPS OFF +. HDRFTR_CENTER_FAMILY \\*[$DOC_FAM] +. HDRFTR_CENTER_FONT R +. HDRFTR_CENTER_SIZE +0 +. HDRFTR_CENTER_CAPS OFF +. HDRFTR_RIGHT_FAMILY \\*[$DOC_FAM] +. HDRFTR_RIGHT_FONT R +. HDRFTR_RIGHT_SIZE +0 +. HDRFTR_RIGHT_CAPS OFF +.END +\# +\# +\# SWITCH HDRFTR +\# ------------- +\# *Arguments: +\# | +\# *Function: +\# Creates or modifies register #SWITCH_HDRFTR, used to switch +\# default location of HDRFTR_LEFT and HDRFTR_RIGHT. +\# *Notes: +\# +.ig +Typically, the author string appears at the left of header/footers, +and the title string appears at the right. This switches the +location of the two. Useful in conjuction with RECTO_VERSO to tweak +switches on alternate pages to come out as the user wishes. The +assumption of RECTO_VERSO is that the first page of the document +(recto) is odd, and even though it has no header/footer, if it did +have one, it would print as AUTHOR...CENTER...TITLE (or whatever +strings the user has supplied for HDRFTR_LEFT/RIGHT), meaning that +the next page, which does have a header/footer, will come out as +TITLE...CENTER...AUTHOR (or whatever strings the user has supplied +for HDRFTR_LEFT/RIGHT). SWITCH_HDRFTRS allows the user to get the +desired string in the desired place on the desired recto/verso page. + +Default is OFF. +.. +\# +.MAC SWITCH_HDRFTR END +. ie '\\$1'' \{ .nr #SWITCH_HDRFTR 1 \} +. el \{ .nr #SWITCH_HDRFTR 0 \} +.END +\# +\# +\# USER DEFINED HDRFTR RECTO +\# ------------------------- +\# *Arguments: +\# L | LEFT | C | CENTER | CENTER | R | RIGHT +\# *Function: +\# Toggles #USERDEF_HDRFTR on, stores quad as #USERDEF_HDRFTR_RECTO_QUAD, +\# stores string in $USERDEF_HDRFTR_RECTO. +\# *Notes: +\# For use when users don't want 3-part headers/footers, but rather +\# want to design their own headers/footers and need different +\# headers/footers on recto and verso pages. Using just +\# HEADER_RECTO, even when recto/verso is not on, allows users to +\# design their own headers/footers for doc pages. +\# +.MAC HDRFTR_RECTO END +. nr #USERDEF_HDRFTR 1 +. if '\\$1'L' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 1 \} +. if '\\$1'LEFT' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 1 \} +. if '\\$1'C' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 2 \} +. if '\\$1'CENTER' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 2 \} +. if '\\$1'CENTRE' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 2 \} +. if '\\$1'R' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 3 \} +. if '\\$1'RIGHT' \{ .nr #USERDEF_HDRFTR_RECTO_QUAD 3 \} +. ds $USERDEF_HDRFTR_RECTO \\$2 +.END +\# +\# +\# USER DEFINED HDRFTR VERSO +\# ------------------------- +\# *Arguments: +\# L | LEFT | C | CENTER | CENTER | R | RIGHT +\# *Function: +\# Toggles #USERDEF_HDRFTR on, stores quad as #USERDEF_HDRFTR_VERSO_QUAD, +\# stores string in $USERDEF_HDRFTR_VERSO. +\# *Notes: +\# For use when users don't want 3-part headers/footers, but rather +\# want to design their own headers/footers and need different +\# headers/footers on recto and verso pages. +\# +.MAC HDRFTR_VERSO END +. nr #USERDEF_HDRFTR 1 +. if '\\$1'L' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 1 \} +. if '\\$1'LEFT' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 1 \} +. if '\\$1'C' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 2 \} +. if '\\$1'CENTER' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 2 \} +. if '\\$1'CENTRE' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 2 \} +. if '\\$1'R' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 3 \} +. if '\\$1'RIGHT' \{ .nr #USERDEF_HDRFTR_VERSO_QUAD 3 \} +. ds $USERDEF_HDRFTR_VERSO \\$2 +.END +\# +\# +\# PRINT FOOTER ON FIRST PAGE +\# -------------------------- +\# *Arguments: +\# | +\# *Function: +\# Toggles register #PRINT_FOOTER_ON_PAGE_1 +\# *Notes: +\# Lets user choose whether to print footer on first +\# page of doc. +\# +.MAC FOOTER_ON_FIRST_PAGE END +. ie '\\$1'' \{ .nr #PRINT_FOOTER_ON_PAGE_1 1 \} +. el \{ .rr #PRINT_FOOTER_ON_PAGE_1 \} +.END +\# +\# +\# PRINT PAGE NUMBER ON FIRST PAGE +\# ------------------------------- +\# *Arguments: +\# | +\# *Function: +\# Toggles register #PRINT_PAGENUM_ON_PAGE_1 +\# *Notes: +\# Lets user choose whether to print page number on first +\# page of doc and after collate when footers are on or page numbering +\# has been user set at top of page. +\# +.MAC PAGENUM_ON_FIRST_PAGE END +. ie '\\$1'' \{ .nr #PRINT_PAGENUM_ON_PAGE_1 1 \} +. el \{ .rr #PRINT_PAGENUM_ON_PAGE_1 \} +.END +\# +\# +\# PRINT HEADER/FOOTER +\# ------------------- +\# *Arguments: +\# +\# *Function: +\# Based on defaults or values entered by user, prints a +\# three-part title at either the top or the bottom of the page. +\# *Notes: +\# Called from within either HEADER or FOOTER. +\# +.MAC PRINT_HDRFTR END +. if \\n[#DOC_TYPE]=4 \{\ +. nr #SUITE \En[.pn] +. \} +. if \\n[#FOOTERS_ON] \{\ +. if \\n[#START_FOR_FOOTERS] \{\ +. rr #START_FOR_FOOTERS +. if !\\n[#PRINT_FOOTER_ON_PAGE_1] \{ .return \} +. \} +. \} +. if \\n[#USERDEF_HDRFTR] \{\ +. PRINT_USERDEF_HDRFTR +. return +. \} +. if \\n[#SWITCH_HDRFTR] \{\ +. ds $HDRFTR_TMP_SWITCH \\*[$HDRFTR_LEFT] +. ds $HDRFTR_LEFT \\*[$HDRFTR_RIGHT] +. ds $HDRFTR_RIGHT \\*[$HDRFTR_TMP_SWITCH] +. ds $HDRFTR_TMP_SIZE_CHANGE_SWITCH \\*[$HDRFTR_LEFT_SIZE_CHANGE] +. ds $HDRFTR_LEFT_SIZE_CHANGE \\*[$HDRFTR_RIGHT_SIZE_CHANGE] +. ds $HDRFTR_RIGHT_SIZE_CHANGE \\*[$HDRFTR_TMP_SIZE_CHANGE_SWITCH] +. nr #HDRFTR_TMP_CAPS_SWITCH \\n[#HDRFTR_LEFT_CAPS] +. nr #HDRFTR_LEFT_CAPS \\n[#HDRFTR_RIGHT_CAPS] +. nr #HDRFTR_RIGHT_CAPS \\n[#HDRFTR_TMP_CAPS_SWITCH] +. ds $HDRFTR_TMP_COLOR_SWITCH \\*[$HDRFTR_LEFT_COLOR] +. ds $HDRFTR_LEFT_COLOR \\*[$HDRFTR_RIGHT_COLOR] +. ds $HDRFTR_RIGHT_COLOR \\*[$HDRFTR_TMP_COLOR_SWITCH] +. rr #HDRFTR_TMP_CAPS_SWITCH +. rm $HDRFTR_TMP_SWITCH +. rm $HDRFTR_TMP_SIZE_CHANGE_SWITCH +. rm $HDRFTR_TMP_COLOR_SWITCH +. nr #SWITCH_HDRFTR 0 +. \} +. nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ] +. if \\n[#ENDNOTES] \{ .PAGENUM_STYLE \\*[$EN_PN_STYLE] \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. if o \{ .RIGHT \} +. if e \{ .LEFT \} +. if \\n[#RECTO_VERSO]=0 \{ .LEFT \} +. if \\n[#HDRFTR_LEFT_CAPS] \{ .CAPS \} +. ie '\\*[$HDRFTR_LEFT]'#' \{\ +. PRINT \\n[#PAGENUMBER] +. \} +. el \{\ +. ie !'\\*[$HDRFTR_LEFT]'' \{ . PRINT \\*[$HDRFTR_LEFT] \} +. el \{ .PRINT \& \} +. \} +. if \\n[#HDRFTR_LEFT_CAPS] \{ .CAPS OFF \} +. CENTER +. if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS \} +. rt \\nyu +. ie '\\*[$HDRFTR_CENTER]'#' \{\ +. PRINT \\h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\n[#PAGENUMBER]\\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' +. \} +. el \{\ +. ie !'\\*[$HDRFTR_CENTER]'' \{ .PRINT \\h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\*[$HDRFTR_CENTER]\\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' \} +. el \{ .PRINT \& \} +. \} +. if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS OFF \} +. if o \{ .LEFT \} +. if e \{ .RIGHT \} +. if \\n[#RECTO_VERSO]=0 \{ .RIGHT \} +. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS \} +. rt \\nyu +. ie '\\*[$HDRFTR_RIGHT]'#' \{\ +. PRINT \\n[#PAGENUMBER] +. \} +. el \{\ +. ie !'\\*[$HDRFTR_RIGHT]'' \{ .PRINT \\*[$HDRFTR_RIGHT] \} +. el \{ .PRINT \& \} +. \} +. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS OFF \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. if \\n[#HDRFTR_COLOR]=1 \{\ +. nf +\m[\\*[$HDRFTR_COLOR]] +. EOL +. \} +. fam \\*[$HDRFTR_LEFT_FAM] +. ft \\*[$HDRFTR_LEFT_FT] +. ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_LEFT_SIZE_CHANGE] +. vs 12 +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #LEFT_CAP_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. if o \{ .LEFT \} +. if e \{ .RIGHT \} +. if \\n[#RECTO_VERSO]=0 \{ .LEFT \} +. if \\n[#HDRFTR_LEFT_CAPS] \{ .CAPS \} +. ie '\\*[$HDRFTR_LEFT]'#' \{\ +. ie \\n[#HDRFTR_LEFT_COLOR]=1 \{\ +. PRINT \m[\\*[$HDRFTR_LEFT_COLOR]]\\n[#PAGENUMBER]\m[] +. \} +. el \{\ +. PRINT \\n[#PAGENUMBER] +. \} +. \} +. el \{\ +. ie !'\\*[$HDRFTR_LEFT]'' \{\ +. ie \\n[#HDRFTR_LEFT_COLOR]=1 \{\ +. PRINT \m[\\*[$HDRFTR_LEFT_COLOR]]\\*[$HDRFTR_LEFT]\m[] +. \} +. el \{\ +. PRINT \\*[$HDRFTR_LEFT] +. \} +. \} +. el \{ .PRINT \& \} +. \} +. if \\n[#HDRFTR_LEFT_CAPS] \{ .CAPS OFF \} +. fam \\*[$HDRFTR_CENTER_FAM] +. ft \\*[$HDRFTR_CENTER_FT] +. ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_CENTER_SIZE_CHANGE] +. vs 12 +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #CENTER_CAP_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. CENTER +. if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS \} +. rt \\nyu +. ie '\\*[$HDRFTR_CENTER]'#' \{\ +. ie \\n[#HDRFTR_CENTER_COLOR]=1 \{\ +. PRINT \\h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\m[\\*[$HDRFTR_CENTER_COLOR]]\\n[#PAGENUMBER]\\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u'\m[] +. \} +. el \{\ +. PRINT \\h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\n[#PAGENUMBER]\\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' +. \} +. \} +. el \{\ +. ie !'\\*[$HDRFTR_CENTER]'' \{\ +. ie \\n[#HDRFTR_CENTER_COLOR]=1 \{\ +. PRINT \\h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\m[\\*[$HDRFTR_CENTER_COLOR]]\\*[$HDRFTR_CENTER]\\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u'\m[] +. \} +. el \{\ +. PRINT \\h'\\n[#HDRFTR_CTR_PAD_LEFT]u'\\*[$HDRFTR_CENTER]\\h'\\n[#HDRFTR_CTR_PAD_RIGHT]u' +. \} +. \} +. el \{ .PRINT \& \} +. \} +. if \\n[#HDRFTR_CENTER_CAPS] \{ .CAPS OFF \} +. fam \\*[$HDRFTR_RIGHT_FAM] +. ft \\*[$HDRFTR_RIGHT_FT] +. ps \\n[#HDRFTR_PT_SIZE]u\\*[$HDRFTR_RIGHT_SIZE_CHANGE] +. vs 12 +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #RIGHT_CAP_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. if o \{ .RIGHT \} +. if e \{ .LEFT \} +. if \\n[#RECTO_VERSO]=0 \{ .RIGHT \} +. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS \} +. rt \\nyu +. ie '\\*[$HDRFTR_RIGHT]'#' \{\ +. ie \\n[#HDRFTR_RIGHT_COLOR]=1 \{\ +. PRINT \m[\\*[$HDRFTR_RIGHT_COLOR]]\\n[#PAGENUMBER]\m[] +. \} +. el \{\ +. PRINT \\n[#PAGENUMBER] +. \} +. \} +. el \{\ +. ie !'\\*[$HDRFTR_RIGHT]'' \{\ +. ie \\n[#HDRFTR_RIGHT_COLOR]=1 \{\ +. PRINT \m[\\*[$HDRFTR_RIGHT_COLOR]]\\*[$HDRFTR_RIGHT]\m[] +. \} +. el \{\ +. PRINT \\*[$HDRFTR_RIGHT] +. \} +. \} +. el \{ .PRINT \& \} +. \} +. if \\n[#HDRFTR_RIGHT_CAPS] \{ .CAPS OFF \} +. \} +. if \\n[#HDRFTR_RULE] \{\ +. HDRFTR_RULE_INTERNAL +. \} +. br +.END +\# +\# +\# PRINT USER DEFINED HEADER/FOOTER +\# -------------------------------- +\# *Arguments: +\# +\# *Function: +\# Based on defaults or values entered by user, prints a single part +\# (i.e. not 3-part) title at either the top or the bottom of the page. +\# *Notes: +\# Called from within PRINT_HDRFTR. +\# +.MAC PRINT_USERDEF_HDRFTR END +. nr #PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ] +. fc ^ # +. if \\n[#PRINT_STYLE]=2 \{\ +. FAMILY \\*[$HDRFTR_FAM] +. FT R +. PT_SIZE \\n[#HDRFTR_PT_SIZE]u +. if \\n[#HDRFTR_COLOR]=1 \{\ +. nf +. COLOR \\*[$HDRFTR_COLOR] +. \} +. \} +. ie \\n[#RECTO_VERSO] \{\ +. if o \{\ +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 \{ .LEFT \} +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 \{ .CENTER \} +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 \{ .RIGHT \} +. PRINT \\*[$USERDEF_HDRFTR_RECTO] +. EOL +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. \} +. if e \{\ +. ie !'\\*[$USERDEF_HDRFTR_VERSO]'' \{\ +. if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=1 \{ .LEFT \} +. if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=2 \{ .CENTER \} +. if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=3 \{ .RIGHT \} +. PRINT \\*[$USERDEF_HDRFTR_VERSO] +. EOL +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. \} +. el \{\ +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 \{ .LEFT \} +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 \{ .CENTER \} +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 \{ .RIGHT \} +. PRINT \\*[$USERDEF_HDRFTR_RECTO] +. EOL +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. \} +. \} +. \} +. el \{\ +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=1 \{ .LEFT \} +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 \{ .CENTER \} +. if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 \{ .RIGHT \} +. PRINT \\*[$USERDEF_HDRFTR_RECTO] +. EOL +. if \\n[#FOOTERS_ON] \{\ +. di NULL +. SIZESPECS +. nr #HDRFTR_HEIGHT \\n[#CAP_HEIGHT] +. di +. \} +. \} +. fc +. if \\n[#PRINT_STYLE]=2 \{\ +. ie \\n[#HDRFTR_COLOR]=1 \m[\\*[$HDRFTR_COLOR]] +. el \m[black] +. \} +. if \\n[#HDRFTR_RULE] \{\ +. HDRFTR_RULE_INTERNAL +. \} +.END +\# +\# +\# +++HEADERS+++ +\# +\# HEADERS (off or on) +\# ------------------- +\# *Arguments: +\# | +\# *Function: +\# Turns headers at the top of the page off or on. +\# *Notes: +\# Default is on. +\# +.MAC HEADERS END +. ie '\\$1'' \{ .nr #HEADERS_ON 1 \} +. el \{ .nr #HEADERS_ON 0 \} +.END +\# +\# +\# HEADER MARGIN +\# ------------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #HEADER_MARGIN to hold amount +\# of space between top of page and header. +\# *Notes: +\# Requires unit of measure. Default is 4P+6p, measured top-of-page +\# to baseline. +\# +.MAC HEADER_MARGIN END +. nr #HEADER_MARGIN (\\$1) +.END +\# +\# +\# HEADER GAP +\# ---------- +\# *Argument: +\# +\# *Function: +\# Creates or modifies register #HEADER_GAP to hold amount +\# of space between header and running text. +\# *Notes: +\# Default is 1P+6p. +\# +.MAC HEADER_GAP END +. nr #HEADER_GAP (\\$1) +.END +\# +\# +\# HEADER +\# ------ +\# *Arguments: +\# +\# *Function: +\# Prints header appropriate to DOC_TYPE, PRINTSTYLE, and COPYSTYLE. +\# *Notes: +\# In order to convert the title string to caps in the header (in the +\# event that the user enters .TITLE in caps/lc), I've used +\# quad left, quad centre, and quad right to arrange the three bits +\# of the header, rather than .tl. This allows the use of the CAPS macro. +\# The downside is that I have to add \\v'-(\\n[#LEAD]u*) in order +\# for -Tlatin1 output to align the header/footer strings on the baseline. +\# The console output still isn't brilliant, but at least it's +\# comprehensible. +\# +.MAC HEADER END +. MNtop +. rr #FROM_FOOTER +. nr #FROM_HEADER 1 +. nr #LAST_FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS] +. if \\n[#FN_DEPTH] \{ .PROCESS_FN_LEFTOVER \} +. rr #RULED +. if \\n[#RESET_FN_NUMBER] \{ .nr #FN_NUMBER 0 1 \} +. po \\n[#DOC_L_MARGIN]u +. if \\n[#RECTO_VERSO] \{\ +. if !\\n[#TOC_RV_SWITCH] \{\ +. nr #DOC_LR_MARGIN_TMP \\n[#DOC_L_MARGIN] +. DOC_LEFT_MARGIN \\n[#DOC_R_MARGIN]u +. DOC_RIGHT_MARGIN \\n[#DOC_LR_MARGIN_TMP]u +. SWITCH_HDRFTR_CENTER_PAD +. \} +. rr #TOC_RV_SWITCH +. \} +. ev HEADER +. if \\n[#PAGE_NUM_V_POS]=1 \{ .vs 0 \} +. sp |\\n[#HEADER_MARGIN]u-1v +. mk y +. ll \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. if \\n[#PRINT_STYLE]=1 \{\ +. fam C +. ft R +. ps 12\\*[$HDRFTR_SIZE_CHANGE] +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. fam \\*[$HDRFTR_FAM] +. ft R +. ps \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE] +. vs 12 +. \} +. nr #HDRFTR_PT_SIZE \\n[#PT_SIZE] +. if \\n[#CAPS_ON] \{\ +. nr #CAPS_WAS_ON 1 +. CAPS OFF +. \} +. if \\n[#UNDERLINE_ON] \{\ +. nr #UNDERLINE_WAS_ON 1 +. UNDERLINE OFF +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#ENDNOTES]=1 \{\ +.\" Single-spaced endotes have a different lead +. if \\n[#EN_SINGLESPACE] \{\ +. nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD] +. nr #DOC_LEAD \\n[#EN_LEAD]u +. \} +. \} +. \} +. ie \\n[#HEADERS_ON] \{\ +. PRINT_HDRFTR +. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u +. \} +. el \{\ +. ie \\n[#PAGE_NUM_V_POS]=1 \{\ +. ie \\n[#PAGINATE] \{\ +. PRINT_PAGE_NUMBER +. sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u +. \} +. el \{ .sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u \} +. \} +. el \{ .sp |\\n[#T_MARGIN]u-\\n[#DOC_LEAD]u \} +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#ENDNOTES]=1 \{\ +. if \\n[#EN_SINGLESPACE] \{\ +. nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD]u +. rr #RESTORE_DOC_LEAD +. \} +. \} +. \} +. nr #PAGE_TOP \\n(nl +. ev +. po \\n[#L_MARGIN]u +. if \\n[#RECTO_VERSO] \{\ +. nr #L_MARGIN +\\n[#L_MARGIN_DIFF] +. \} +. if \\n[#CAPS_WAS_ON] \{\ +. CAPS +. rr #CAPS_WAS_ON +. \} +. if \\n[#UNDERLINE_WAS_ON] \{\ +. UNDERLINE +. rr #UNDERLINE_WAS_ON +. \} +. if \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} +. if \\n[#QUOTE] \{\ +. ie \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} +. el \{\ +. nr #Q_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) +. po \\n[#Q_OFFSET]u +. \} +. ALD \\n[#Q_LEAD_DIFF]u +. \} +. if \\n[#EPIGRAPH] \{\ +. ie \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} +. el \{\ +. nr #EPI_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#EPI_OFFSET_VALUE]) +. po \\n[#EPI_OFFSET]u +. \} +. \} +. ie \\n[#EPIGRAPH] \{\ +. ie !\\n[#EPI_ACTIVE] \{\ +. ns +. rr #EPI_ACTIVE +. \} +. el \{\ +. ie \\n[#EPI_FITS] \{ .ns \} +. el \{ .ALD \\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u \} +. \} +. \} +. el \{ .ns \} +. ns +. if \\n[#COLUMNS] \{\ +. nr #FN_COUNT_FOR_COLS 0 1 +. nr #L_MARGIN \\n[#DOC_L_MARGIN] +. if \\n[#RECTO_VERSO] \{ .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u \} +. nr #COL_NUM 0 1 +. mk dc +. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. if \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} +. ll \\n[#COL_L_LENGTH]u +. ta \\n(.lu +. if \\n[#QUOTE] \{\ +. po +(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u) +. \} +. if \\n[#EPIGRAPH] \{\ +. if \\n[#EPI_ACTIVE] \{\ +. ie \\n[#EPI_FITS] \{ . \} +. el \{ .nr dc -\\n[#EPI_LEAD_DIFF] \} +. \} +. po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+(\\n[#PP_INDENT]u*\\n[#EPI_OFFSET_VALUE]u) +. \} +. \} +. if \\n[#RESET_FN_COUNTERS]=1 \{\ +. rr #RESET_FN_COUNTERS +. PROCESS_FN_IN_DIVER +. nr #FN_COUNT \\n[#SAVED_FN_COUNT] 1 +. if \\n[#COLUMNS]=1 \{ .nr #FN_COUNT_FOR_COLS \\n[#SAVED_FN_COUNT_FOR_COLS] 1 \} +. ie \\n[#RESET_FN_NUMBER]=1 \{ .nr #FN_NUMBER \\n[#SAVED_FN_NUMBER] 1 \} +. el \{ .nr #FN_NUMBER \\n[#FN_NUMBER] 1 \} +. rm FN_IN_DIVER +. if dRUNON_FN_IN_DIVER \{ .rm RUNON_FN_IN_DIVER \} +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#SLANT_ON] \{\ +. if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \} +. \} +. \} +. rr #FROM_HEADER +. rr #DEFER_SPACE_ADDED +. if !\\n[#FN_DEPTH] \{\ +. if r#DIVERTED \{ .rr #DIVERTED \} +. \} +. if \\n[#MN_OVERFLOW_LEFT]=1 \{\ +. MN LEFT +. nf +. MN_OVERFLOW_LEFT +. MN +. \} +. if \\n[#MN_OVERFLOW_RIGHT]=1 \{\ +. MN RIGHT +. nf +. MN_OVERFLOW_RIGHT +. MN +. \} +. rm MN_OVERFLOW_LEFT +. rr #MN_OVERFLOW_LEFT +. rr #no-repeat-MN-left +. rm MN_OVERFLOW_RIGHT +. rr #MN_OVERFLOW_RIGHT +. rr #no-repeat-MN-right +.END +\# +\# ==================================================================== +\# +\# +++FOOTERS+++ +\# +\# FOOTERS (off or on) +\# ------------------- +\# *Arguments: +\# | +\# *Function: +\# Turns footers at the bottom of the page off or on. +\# *Notes: +\# Default is off. If on, page numbers automatically go at +\# the top, centered, unless pagination has been turned off, +\# or the pagenumber position has been changed to left or right. +\# +.MAC FOOTERS END +. ie '\\$1'' \{\ +. nr #FOOTERS_ON 1 +. PAGE_NUM_POS TOP CENTER +. \} +. el \{ .nr #FOOTERS_ON 0 \} +.END +\# +\# +\# FOOTER MARGIN +\# ------------- +\# *Argument: +\#